diff --git a/.github/workflows/niv-updater-rare.yml b/.github/workflows/niv-updater-rare.yml new file mode 100644 index 00000000000..4cd35ebfcdb --- /dev/null +++ b/.github/workflows/niv-updater-rare.yml @@ -0,0 +1,31 @@ +name: Update niv dependencies (weekly) +on: + # Manual override, one can start the workflow by running: + # curl -H "Accept: application/vnd.github.everest-preview+json" \ + # -H "Authorization: token " \ + # --request POST \ + # --data '{"event_type": "niv-updater-nudge", "client_payload": {}}' \ + # https://api.github.com/repos/dfinity-lab/motoko/dispatches + # https://help.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch + repository_dispatch: + types: niv-updater-nudge + schedule: + # * is a special character in YAML so you have to quote this string + # Run every monday + - cron: '0 0 * * 1' +jobs: + niv-updater: + name: 'Check for updates' + timeout-minutes: 2 # if this takes more than 2 minutes then something's wrong + runs-on: ubuntu-latest + steps: + - name: niv-updater-action + uses: knl/niv-updater-action@v10 + with: + # might be too noisy + whitelist: 'ic-ref,musl-wasi' + labels: | + automerge-squash + keep_updating: true + env: + GITHUB_TOKEN: ${{ secrets.NIV_UPDATER_TOKEN }} diff --git a/.github/workflows/niv-updater-trial.yml b/.github/workflows/niv-updater-trial.yml new file mode 100644 index 00000000000..3c2733a8317 --- /dev/null +++ b/.github/workflows/niv-updater-trial.yml @@ -0,0 +1,36 @@ +# these dependencies are bumped weekly. But to not add churn +# to master (e.g. downloading changed stuff in nix-shell), +# CI/Mergify is instructed to simply close them as soon as CI is green. +# +# This means that we get an open PR only if something breaks, which is all we +# want to know about. +name: Update niv dependencies (trial) +on: + # Manual override, one can start the workflow by running: + # curl -H "Accept: application/vnd.github.everest-preview+json" \ + # -H "Authorization: token " \ + # --request POST \ + # --data '{"event_type": "niv-updater-nudge", "client_payload": {}}' \ + # https://api.github.com/repos/dfinity-lab/motoko/dispatches + # https://help.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch + repository_dispatch: + types: niv-updater-nudge + schedule: + # * is a special character in YAML so you have to quote this string + # Run every monday + - cron: '0 0 * * 0' +jobs: + niv-updater: + name: 'Check for updates' + timeout-minutes: 2 # if this takes more than 2 minutes then something's wrong + runs-on: ubuntu-latest + steps: + - name: niv-updater-action + uses: knl/niv-updater-action@v10 + with: + whitelist: 'nixpkgs,musl-wasi,ic' + labels: | + autoclose + keep_updating: true + env: + GITHUB_TOKEN: ${{ secrets.NIV_UPDATER_TOKEN }} diff --git a/.github/workflows/niv-updater.yml b/.github/workflows/niv-updater.yml new file mode 100644 index 00000000000..3c9bbe10fb7 --- /dev/null +++ b/.github/workflows/niv-updater.yml @@ -0,0 +1,32 @@ +name: Update niv dependencies (daily) +on: + # Manual override, one can start the workflow by running: + # curl -H "Accept: application/vnd.github.everest-preview+json" \ + # -H "Authorization: token " \ + # --request POST \ + # --data '{"event_type": "niv-updater-nudge", "client_payload": {}}' \ + # https://api.github.com/repos/dfinity-lab/motoko/dispatches + # https://help.github.com/en/actions/reference/events-that-trigger-workflows#external-events-repository_dispatch + repository_dispatch: + types: niv-updater-nudge + schedule: + # * is a special character in YAML so you have to quote this string + # Run every day + - cron: '0 0 * * *' +jobs: + niv-updater: + name: 'Check for updates' + timeout-minutes: 2 # if this takes more than 2 minutes then something's wrong + runs-on: ubuntu-latest + steps: + - name: niv-updater-action + uses: knl/niv-updater-action@v10 + with: + # might be too noisy + blacklist: 'nixpkgs,ic-ref,musl-wasi,ic' + labels: | + automerge-squash + keep_updating: true + debug_output: true + env: + GITHUB_TOKEN: ${{ secrets.NIV_UPDATER_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000000..ff3652fffd0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,99 @@ +name: release + +# We trigger this on all tags and on the `master` branch. The job +# `changelog` will fail for tags that don’t have a +# changelog entry, so that seems good enough. +# For `master` this check is skipped as well as uploads. + +on: + push: + tags: + - '*' + branches: + - 'master' + +jobs: + # first check that the changelog is in good order and extract the changelog + # This will fail for non-release tags. + changelog: + runs-on: 'ubuntu-latest' + steps: + - uses: actions/checkout@v2 + + - name: Get the version + id: get_version + run: echo ::set-output name=version::${{ github.ref_name }} + + - name: Extract changelog + id: read_changelog + if: startsWith(github.ref, 'refs/tags/') + run: | + export VERSION='${{ steps.get_version.outputs.version }}' + perl -0777 -ne '/^# Motoko compiler changelog\n\n## (??{quotemeta($ENV{VERSION})}) \(\d\d\d\d-\d\d-\d\d\)\n\n(.*?)^##/sm or die "Changelog does not look right for this version\n" ; print $1' Changelog.md > changelog-extract.md + cat changelog-extract.md + # need to mangle to use with set-output, see https://github.com/svenstaro/upload-release-action/pull/49/files + r="$(cat changelog-extract.md)" + r="${r//'%'/'%25'}" + r="${r//$'\n'/'%0A'}" + r="${r//$'\r'/'%0D'}" + echo "::set-output name=release_body::$r" + + outputs: + version: ${{ steps.get_version.outputs.version }} + release_body: ${{ steps.read_changelog.outputs.release_body }} + + # Now build the release on both linux and darwin, with the version number set + build: + strategy: + matrix: + os: [ ubuntu-latest, macos-latest ] + needs: changelog + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - uses: cachix/install-nix-action@v16 + with: + extra_nix_config: | + experimental-features = nix-command + - uses: cachix/cachix-action@v10 + if: startsWith(github.ref, 'refs/heads/') + with: + name: ic-hs-test + # NB: No auth token, we don’t want to push new stuff here + - uses: cachix/cachix-action@v10 + if: startsWith(github.ref, 'refs/tags/') + with: + name: ic-hs-test + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - run: cachix watch-store ic-hs-test & + - name: "nix-build" + # these are the dependencies listed in release-files. Sorry for the duplication + run: | + nix-build --max-jobs 1 --argstr releaseVersion ${{needs.changelog.outputs.version}} \ + -A moc -A mo-ide -A mo-doc -A js.moc -A js.moc_interpreter + + # Finally do the upload. Hopefully the previous job has uploaded the + # build product to the cachix cache, as we cannot build the darwin products on + # linux + release: + if: startsWith(github.ref, 'refs/tags/') + runs-on: 'ubuntu-latest' + needs: [ changelog, build ] + steps: + - uses: actions/checkout@v2 + - uses: cachix/install-nix-action@v16 + - uses: cachix/cachix-action@v10 + with: + name: ic-hs-test + # NB: No auth token, we don’t expect to push new stuff here + + - run: nix-build --max-jobs 1 release-files.nix --argstr releaseVersion '${{ needs.changelog.outputs.version }}' + + - name: Upload Release Assets + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} + file: result/* + file_glob: true + body: ${{ needs.changelog.outputs.release_body }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000000..4ef54758051 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,79 @@ +name: "build" +on: + push: + branches: [ master ] + pull_request: {} +jobs: + tests: + strategy: + matrix: + os: [ ubuntu-latest, macos-latest ] + fail-fast: false + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + with: + # fetch full history so that git merge-base works + fetch-depth: 0 + # fetch PR commit, not predicted merge commit + ref: ${{ github.event.pull_request.head.sha }} + - uses: cachix/install-nix-action@v16 + with: + extra_nix_config: | + experimental-features = nix-command + + - run: nix-env -iA nix-build-uncached -f nix/ + + # We are using the ic-hs-test cachix cache that is also used by + # dfinity/ic-hs. This is partly laziness (on need to set up a separate + # cache), but also to get the ic-ref-test binary without rebuilding + - uses: cachix/cachix-action@v10 + with: + name: ic-hs-test + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + + # until https://github.com/cachix/cachix-action/issues/86 is fixed: + - run: cachix watch-store ic-hs-test & + + - name: "nix-build" + run: nix-build-uncached --max-jobs 4 -A all-systems-go -build-flags -L + + - name: Calculate performance delta + if: runner.os == 'Linux' && github.event_name == 'pull_request' + run: | + from="$(git merge-base origin/${{ github.base_ref }} HEAD)" + to="${{ github.event.pull_request.head.sha }}" + echo "Comparing changes from $from to $to" + nix-build --max-jobs 4 perf-delta.nix -o perf-delta.txt \ + --argstr ref HEAD \ + --argstr from "$from" \ + --argstr to "$to" + + - name: Read performance delta + if: runner.os == 'Linux' && github.event_name == 'pull_request' + id: perf + uses: juliangruber/read-file-action@v1 + with: + path: ./perf-delta.txt + + - name: Find performance comment + if: runner.os == 'Linux' && github.event_name == 'pull_request' + uses: peter-evans/find-comment@v1 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: '' + + # Forks can't add comments so this job does not run on forks, see + # motoko#2864. + - name: Create or update performance comment + if: runner.os == 'Linux' && github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository + uses: peter-evans/create-or-update-comment@v1 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + + ${{ steps.perf.outputs.content }} + edit-mode: replace diff --git a/.github/workflows/update-hash.yml b/.github/workflows/update-hash.yml new file mode 100644 index 00000000000..9674d950309 --- /dev/null +++ b/.github/workflows/update-hash.yml @@ -0,0 +1,38 @@ +name: Update nix hashes + +on: + push: + branches-ignore: + - master + - release + tags-ignore: + - '**' + +jobs: + update-hash: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + # This is needed to be able to push and trigger CI with that push + token: ${{ secrets.NIV_UPDATER_TOKEN }} + - uses: cachix/install-nix-action@v16 + with: + nix_path: nixpkgs=channel:nixos-21.11 + - uses: cachix/cachix-action@v10 + with: + name: ic-hs-test + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - name: Update drun cargo hash + run: | + cd nix + nix --extra-experimental-features nix-command shell -f . nix-update -c nix-update --version=skip drun + - name: Commit changes + uses: EndBug/add-and-commit@v7.5.0 + with: + author_name: Nix hash updater + author_email: "" + message: "Updating nix hashes" + # do not pull: if this branch is behind, then we might as well let + # the pushing fail + pull: "NO-PULL" diff --git a/base-doc/Array.html b/base-doc/Array.html new file mode 100644 index 00000000000..b5731543d25 --- /dev/null +++ b/base-doc/Array.html @@ -0,0 +1,340 @@ + +

Array

Provides extended utility functions on Arrays.

+

Note the difference between mutable and non-mutable arrays below.

+

WARNING: If you are looking for a list that can grow and shrink in size, +it is recommended you use either the Buffer class or the List class for +those purposes. Arrays must be created with a fixed size.

+

Import from the base library to use this module.

+
motoko name=import
+import Array "mo:base/Array";

public func init<X>(size : Nat, initValue : X) : [var X]

Create a mutable array with size copies of the initial value.

+
motoko include=import
+let array = Array.init<Nat>(4, 2);
+ +

Runtime: O(size) +Space: O(size)

+

public func tabulate<X>(size : Nat, generator : Nat -> X) : [X]

Create an immutable array of size size. Each element at index i +is created by applying generator to i.

+
motoko include=import
+let array : [Nat] = Array.tabulate<Nat>(4, func i = i * 2);
+ +

Runtime: O(size) +Space: O(size)

+

*Runtime and space assumes that generator runs in O(1) time and space.

+

public func tabulateVar<X>(size : Nat, generator : Nat -> X) : [var X]

Create a mutable array of size size. Each element at index i +is created by applying generator to i.

+
motoko include=import
+let array : [var Nat] = Array.tabulateVar<Nat>(4, func i = i * 2);
+array[2] := 0;
+array
+ +

Runtime: O(size) +Space: O(size)

+

*Runtime and space assumes that generator runs in O(1) time and space.

+

public func freeze<X>(varArray : [var X]) : [X]

Transforms a mutable array into an immutable array.

+
motoko include=import
+
+let varArray = [var 0, 1, 2];
+varArray[2] := 3;
+let array = Array.freeze<Nat>(varArray);
+ +

Runtime: O(size)

+

Space: O(1)

+

public func thaw<A>(array : [A]) : [var A]

Transforms an immutable array into a mutable array.

+
motoko include=import
+
+let array = [0, 1, 2];
+let varArray = Array.thaw<Nat>(array);
+varArray[2] := 3;
+varArray
+ +

Runtime: O(size)

+

Space: O(1)

+

public func equal<X>(
  array1 : [X],
  array2 : [X],
  equal : (X, X) -> Bool
) : Bool

Tests if two arrays contain equal values (i.e. they represent the same +list of elements). Uses equal to compare elements in the arrays.

+
motoko include=import
+// Use the equal function from the Nat module to compare Nats
+import {equal} "mo:base/Nat";
+
+let array1 = [0, 1, 2, 3];
+let array2 = [0, 1, 2, 3];
+Array.equal(array1, array2, equal)
+ +

Runtime: O(size1 + size2)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func find<X>(array : [X], predicate : X -> Bool) : ?X

Returns the first value in array for which predicate returns true. +If no element satisfies the predicate, returns null.

+
motoko include=import
+let array = [1, 9, 4, 8];
+Array.find<Nat>(array, func x = x > 8)

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func append<X>(array1 : [X], array2 : [X]) : [X]

Create a new array by appending the values of array1 and array2. +Note that Array.append copies its arguments and has linear complexity; +when used in a loop, consider using a Buffer, and Buffer.append, instead.

+
motoko include=import
+let array1 = [1, 2, 3];
+let array2 = [4, 5, 6];
+Array.append<Nat>(array1, array2)

Runtime: O(size1 + size2)

+

Space: O(size1 + size2)

+

public func sort<X>(array : [X], compare : (X, X) -> Order.Order) : [X]

Sorts the elements in the array according to compare. +Sort is deterministic and stable.

+
motoko include=import
+import Nat "mo:base/Nat";
+
+let array = [4, 2, 6];
+Array.sort(array, Nat.compare)

Runtime: O(size * log(size))

+

Space: O(size) +*Runtime and space assumes that compare runs in O(1) time and space.

+

public func sortInPlace<X>(array : [var X], compare : (X, X) -> Order.Order)

Sorts the elements in the array, in place, according to compare. +Sort is deterministic, stable, and in-place.

+
motoko include=import
+
+import {compare} "mo:base/Nat";
+
+let array = [var 4, 2, 6];
+Array.sortInPlace(array, compare);
+array

Runtime: O(size * log(size))

+

Space: O(size) +*Runtime and space assumes that compare runs in O(1) time and space.

+

public func reverse<X>(array : [X]) : [X]

Creates a new array by reversing the order of elements in array.

+
motoko include=import
+
+let array = [10, 11, 12];
+
+Array.reverse(array)
+ +

Runtime: O(size)

+

Space: O(1)

+

public func map<X, Y>(array : [X], f : X -> Y) : [Y]

Creates a new array by applying f to each element in array. f "maps" +each element it is applied to of type X to an element of type Y. +Retains original ordering of elements.

+
motoko include=import
+
+let array = [0, 1, 2, 3];
+Array.map<Nat, Nat>(array, func x = x * 3)
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func filter<X>(array : [X], predicate : X -> Bool) : [X]

Creates a new array by applying predicate to every element +in array, retaining the elements for which predicate returns true.

+
motoko include=import
+let array = [4, 2, 6, 1, 5];
+let evenElements = Array.filter<Nat>(array, func x = x % 2 == 0);

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func mapEntries<X, Y>(array : [X], f : (X, Nat) -> Y) : [Y]

Creates a new array by applying f to each element in array and its index. +Retains original ordering of elements.

+
motoko include=import
+
+let array = [10, 10, 10, 10];
+Array.mapEntries<Nat, Nat>(array, func (x, i) = i * x)
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<X, Y>(array : [X], f : X -> ?Y) : [Y]

Creates a new array by applying f to each element in array, +and keeping all non-null elements. The ordering is retained.

+
motoko include=import
+import {toText} "mo:base/Nat";
+
+let array = [4, 2, 0, 1];
+let newArray =
+  Array.mapFilter<Nat, Text>( // mapping from Nat to Text values
+    array,
+    func x = if (x == 0) { null } else { ?toText(100 / x) } // can't divide by 0, so return null
+  );

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapResult<X, Y, E>(array : [X], f : X -> Result.Result<Y, E>) : Result.Result<[Y], E>

Creates a new array by applying f to each element in array. +If any invocation of f produces an #err, returns an #err. Otherwise +returns an #ok containing the new array.

+
motoko include=import
+let array = [4, 3, 2, 1, 0];
+// divide 100 by every element in the array
+Array.mapResult<Nat, Nat, Text>(array, func x {
+  if (x > 0) {
+    #ok(100 / x)
+  } else {
+    #err "Cannot divide by zero"
+  }
+})
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func chain<X, Y>(array : [X], k : X -> [Y]) : [Y]

Creates a new array by applying k to each element in array, +and concatenating the resulting arrays in order. This operation +is similar to what in other functional languages is known as monadic bind.

+
motoko include=import
+import Nat "mo:base/Nat";
+
+let array = [1, 2, 3, 4];
+Array.chain<Nat, Int>(array, func x = [x, -x])
+
+

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that k runs in O(1) time and space.

+

public func foldLeft<X, A>(
  array : [X],
  base : A,
  combine : (A, X) -> A
) : A

Collapses the elements in array into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+
motoko include=import
+import {add} "mo:base/Nat";
+
+let array = [4, 2, 0, 1];
+let sum =
+  Array.foldLeft<Nat, Nat>(
+    array,
+    0, // start the sum at 0
+    func(sumSoFar, x) = sumSoFar + x // this entire function can be replaced with `add`!
+  );
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func foldRight<X, A>(
  array : [X],
  base : A,
  combine : (X, A) -> A
) : A

Collapses the elements in array into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +right to left.

+
motoko include=import
+import {toText} "mo:base/Nat";
+
+let array = [1, 9, 4, 8];
+let bookTitle = Array.foldRight<Nat, Text>(array, "", func(x, acc) = toText(x) # acc);
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func flatten<X>(arrays : [[X]]) : [X]

Flattens the array of arrays into a single array. Retains the original +ordering of the elements.

+
motoko include=import
+
+let arrays = [[0, 1, 2], [2, 3], [], [4]];
+Array.flatten<Nat>(arrays)
+ +

Runtime: O(number of elements in array)

+

Space: O(number of elements in array)

+

public func make<X>(element : X) : [X]

Create an array containing a single value.

+
motoko include=import
+Array.make(2)
+ +

Runtime: O(1)

+

Space: O(1)

+

public func vals<X>(array : [X]) : I.Iter<X>

Returns an Iterator (Iter) over the elements of array. +Iterator provides a single method next(), which returns +elements in order, or null when out of elements to iterate over.

+

NOTE: You can also use array.vals() instead of this function. See example +below.

+
motoko include=import
+
+let array = [10, 11, 12];
+
+var sum = 0;
+for (element in array.vals()) {
+  sum += element;
+};
+sum
+ +

Runtime: O(1)

+

Space: O(1)

+

public func keys<X>(array : [X]) : I.Iter<Nat>

Returns an Iterator (Iter) over the indices of array. +Iterator provides a single method next(), which returns +indices in order, or null when out of index to iterate over.

+

NOTE: You can also use array.keys() instead of this function. See example +below.

+
motoko include=import
+
+let array = [10, 11, 12];
+
+var sum = 0;
+for (element in array.keys()) {
+  sum += element;
+};
+sum
+ +

Runtime: O(1)

+

Space: O(1)

+

public func size<X>(array : [X]) : Nat

Returns the size of array.

+

NOTE: You can also use array.size() instead of this function. See example +below.

+
motoko include=import
+
+let array = [10, 11, 12];
+let size = Array.size(array);
+ +

Runtime: O(1)

+

Space: O(1)

+

public func subArray<X>(
  array : [X],
  start : Nat,
  length : Nat
) : [X]

Returns a new subarray from the given array provided the start index and length of elements in the subarray

+

Limitations: Traps if the start index + length is greater than the size of the array

+
motoko include=import
+
+let array = [1,2,3,4,5];
+let subArray = Array.subArray<Nat>(array, 2, 3);

Runtime: O(length); +Space: O(length);

+

public func indexOf<X>(
  element : X,
  array : [X],
  equal : (X, X) -> Bool
) : ?Nat

Returns the index of the first element in the array.

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.indexOf<Char>('c', array, Char.equal) == ?0;
+assert Array.indexOf<Char>('f', array, Char.equal) == ?2;
+assert Array.indexOf<Char>('g', array, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func nextIndexOf<X>(
  element : X,
  array : [X],
  fromInclusive : Nat,
  equal : (X, X) -> Bool
) : ?Nat

Returns the index of the next occurence of element in the array starting from the from index (inclusive).

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.nextIndexOf<Char>('c', array, 0, Char.equal) == ?0;
+assert Array.nextIndexOf<Char>('f', array, 0, Char.equal) == ?2;
+assert Array.nextIndexOf<Char>('f', array, 2, Char.equal) == ?2;
+assert Array.nextIndexOf<Char>('f', array, 3, Char.equal) == ?3;
+assert Array.nextIndexOf<Char>('f', array, 4, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func lastIndexOf<X>(
  element : X,
  array : [X],
  equal : (X, X) -> Bool
) : ?Nat

Returns the index of the last element in the array.

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.lastIndexOf<Char>('c', array, Char.equal) == ?0;
+assert Array.lastIndexOf<Char>('f', array, Char.equal) == ?3;
+assert Array.lastIndexOf<Char>('e', array, Char.equal) == ?5;
+assert Array.lastIndexOf<Char>('g', array, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func prevIndexOf<T>(
  element : T,
  array : [T],
  fromExclusive : Nat,
  equal : (T, T) -> Bool
) : ?Nat

Returns the index of the previous occurance of element in the array starting from the from index (exclusive).

+
motoko include=import
+import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.prevIndexOf<Char>('c', array, array.size(), Char.equal) == ?0;
+assert Array.prevIndexOf<Char>('e', array, array.size(), Char.equal) == ?5;
+assert Array.prevIndexOf<Char>('e', array, 5, Char.equal) == ?4;
+assert Array.prevIndexOf<Char>('e', array, 4, Char.equal) == null;
+ +

Runtime: O(array.size()); +Space: O(1);

+

public func slice<X>(
  array : [X],
  fromInclusive : Nat,
  toExclusive : Nat
) : I.Iter<X>

Returns an iterator over a slice of the given array.

+
motoko include=import
+let array = [1, 2, 3, 4, 5];
+let s = Array.slice<Nat>(array, 3, array.size());
+assert s.next() == ?4;
+assert s.next() == ?5;
+assert s.next() == null;
+
+let s = Array.slice<Nat>(array, 0, 0);
+assert s.next() == null;
+ +

Runtime: O(1) +Space: O(1)

+

public func take<T>(array : [T], length : Int) : [T]

Returns a new subarray of given length from the beginning or end of the given array

+

Returns the entire array if the length is greater than the size of the array

+
motoko include=import
+let array = [1, 2, 3, 4, 5];
+assert Array.take(array, 2) == [1, 2];
+assert Array.take(array, -2) == [4, 5];
+assert Array.take(array, 10) == [1, 2, 3, 4, 5];
+assert Array.take(array, -99) == [1, 2, 3, 4, 5];

Runtime: O(length); +Space: O(length);

+

\ No newline at end of file diff --git a/base-doc/AssocList.html b/base-doc/AssocList.html new file mode 100644 index 00000000000..fa9ec3db071 --- /dev/null +++ b/base-doc/AssocList.html @@ -0,0 +1,195 @@ + +

AssocList

Map implemented as a linked-list of key-value pairs ("Associations").

+

NOTE: This map implementation is mainly used as underlying buckets for other map +structures. Thus, other map implementations are easier to use in most cases.

+

type AssocList<K, V> = List.List<(K, V)>

Import from the base library to use this module.

+
motoko name=import
+import AssocList "mo:base/AssocList";
+import List "mo:base/List";
+import Nat "mo:base/Nat";
+
+type AssocList<K, V> = AssocList.AssocList<K, V>;
+ +

Initialize an empty map using an empty list.

+
motoko name=initialize include=import
+var map : AssocList<Nat, Nat> = List.nil(); // Empty list as an empty map
+map := null; // Alternative: null as empty list.
+map

public func find<K, V>(
  map : AssocList<K, V>,
  key : K,
  equal : (K, K) -> Bool
) : ?V

Find the value associated with key key, or null if no such key exists. +Compares keys using the provided function equal.

+

Example:

+
motoko include=import,initialize
+// Create map = [(0, 10), (1, 11), (2, 12)]
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+
+// Find value associated with key 1
+AssocList.find(map, 1, Nat.equal)

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func replace<K, V>(
  map : AssocList<K, V>,
  key : K,
  equal : (K, K) -> Bool,
  value : ?V
) : (AssocList<K, V>, ?V)

Maps key to value in map, and overwrites the old entry if the key +was already present. Returns the old value in an option if it existed and +null otherwise, as well as the new map. Compares keys using the provided +function equal.

+

Example:

+
motoko include=import,initialize
+// Add three entries to the map
+// map = [(0, 10), (1, 11), (2, 12)]
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+// Override second entry
+map := AssocList.replace(map, 1, Nat.equal, ?21).0;
+
+List.toArray(map)

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func diff<K, V, W>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  equal : (K, K) -> Bool
) : AssocList<K, V>

Produces a new map containing all entries from map1 whose keys are not +contained in map2. The "extra" entries in map2 are ignored. Compares +keys using the provided function equal.

+

Example:

+
motoko include=import,initialize
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Take the difference
+let newMap = AssocList.diff(map1, map2, Nat.equal);
+List.toArray(newMap)

Runtime: O(size1 * size2)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func mapAppend<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  f : (?V, ?W) -> X
) : AssocList<K, X>

@deprecated

+

public func disjDisjoint<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  f : (?V, ?W) -> X
) : AssocList<K, X>

Produces a new map by mapping entries in map1 and map2 using f and +concatenating the results. Assumes that there are no collisions between +keys in map1 and map2.

+

Example:

+
motoko include=import,initialize
+import { trap } "mo:base/Debug";
+
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(4, "14"), (3, "13")]
+var map2 : AssocList<Nat, Text> = null;
+map2 := AssocList.replace(map2, 4, Nat.equal, ?"14").0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?"13").0;
+
+// Map and append the two AssocLists
+let newMap =
+  AssocList.disjDisjoint<Nat, Nat, Text, Text>(
+    map1,
+    map2,
+    func((v1, v2) : (?Nat, ?Text)) {
+      switch(v1, v2) {
+        case(?v1, null) {
+          debug_show(v1) // convert values from map1 to Text
+        };
+        case(null, ?v2) {
+          v2 // keep values from map2 as Text
+        };
+        case _ {
+          trap "These cases will never happen in mapAppend"
+        }
+      }
+    }
+  );
+
+List.toArray(newMap)

Runtime: O(size1 + size2)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func disj<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  equal : (K, K) -> Bool,
  combine : (?V, ?W) -> X
) : AssocList<K, X>

Creates a new map by merging entries from map1 and map2, and mapping +them using combine. combine is also used to combine the values of colliding keys. +Keys are compared using the given equal function.

+

NOTE: combine will never be applied to (null, null).

+

Example:

+
motoko include=import,initialize
+import { trap } "mo:base/Debug";
+
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Merge the two maps using `combine`
+let newMap =
+  AssocList.disj<Nat, Nat, Nat, Nat>(
+    map1,
+    map2,
+    Nat.equal,
+    func((v1, v2) : (?Nat, ?Nat)) : Nat {
+      switch(v1, v2) {
+        case(?v1, ?v2) {
+          v1 + v2 // combine values of colliding keys by adding them
+        };
+        case(?v1, null) {
+          v1 // when a key doesn't collide, keep the original value
+        };
+        case(null, ?v2) {
+          v2
+        };
+        case _ {
+          trap "This case will never happen in disj"
+        }
+      }
+    }
+  );
+
+List.toArray(newMap)

Runtime: O(size1 * size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that equal and combine runs in O(1) time and space.

+

public func join<K, V, W, X>(
  map1 : AssocList<K, V>,
  map2 : AssocList<K, W>,
  equal : (K, K) -> Bool,
  combine : (V, W) -> X
) : AssocList<K, X>

Takes the intersection of map1 and map2, only keeping colliding keys +and combining values using the combine function. Keys are compared using +the equal function.

+

Example:

+
motoko include=import,initialize
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Take the intersection of the two maps, combining values by adding them
+let newMap = AssocList.join<Nat, Nat, Nat, Nat>(map1, map2, Nat.equal, Nat.add);
+
+List.toArray(newMap)

Runtime: O(size1 * size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that equal and combine runs in O(1) time and space.

+

public func fold<K, V, X>(
  map : AssocList<K, V>,
  base : X,
  combine : (K, V, X) -> X
) : X

Collapses the elements in map into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+

Example:

+
motoko include=import,initialize
+// Create map = [(0, 10), (1, 11), (2, 12)]
+var map : AssocList<Nat, Nat> = null;
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+
+// (0 * 10) + (1 * 11) + (2 * 12)
+AssocList.fold<Nat, Nat, Nat>(map, 0, func(k, v, sumSoFar) = (k * v) + sumSoFar)
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

\ No newline at end of file diff --git a/base-doc/Blob.html b/base-doc/Blob.html new file mode 100644 index 00000000000..16bc51b4483 --- /dev/null +++ b/base-doc/Blob.html @@ -0,0 +1,135 @@ + +

Blob

Module for working with Blobs: immutable sequence of bytes.

+

Blobs represent sequences of bytes. They are immutable, iterable, but not indexable and can be empty.

+

Byte sequences are also often represented as [Nat8], i.e. an array of bytes, but this representation is currently much less compact than Blob, taking 4 physical bytes to represent each logical byte in the sequence. +If you would like to manipulate Blobs, it is recommended that you convert +Blobs to [var Nat8] or Buffer<Nat8>, do the manipulation, then convert back.

+

Import from the base library to use this module.

+
motoko name=import
+import Blob "mo:base/Blob";
+ +

Some built in features not listed in this module:

+
  • You can create a Blob literal from a Text literal, provided the context expects an expression of type Blob.
  • b.size() : Nat returns the number of bytes in the blob b;
  • b.vals() : Iter.Iter<Nat8> returns an iterator to enumerate the bytes of the blob b.
+ +

For example:

+
motoko include=import
+import Debug "mo:base/Debug";
+import Nat8 "mo:base/Nat8";
+
+let blob = "\00\00\00\ff" : Blob; // blob literals, where each byte is delimited by a back-slash and represented in hex
+let blob2 = "charsもあり" : Blob; // you can also use characters in the literals
+let numBytes = blob.size(); // => 4 (returns the number of bytes in the Blob)
+for (byte : Nat8 in blob.vals()) { // iterator over the Blob
+  Debug.print(Nat8.toText(byte))
+}

type Blob = Prim.Types.Blob

public func fromArray(bytes : [Nat8]) : Blob

Creates a Blob from an array of bytes ([Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let bytes : [Nat8] = [0, 255, 0];
+let blob = Blob.fromArray(bytes); // => "\00\FF\00"

public func fromArrayMut(bytes : [var Nat8]) : Blob

Creates a Blob from a mutable array of bytes ([var Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let bytes : [var Nat8] = [var 0, 255, 0];
+let blob = Blob.fromArrayMut(bytes); // => "\00\FF\00"

public func toArray(blob : Blob) : [Nat8]

Converts a Blob to an array of bytes ([Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let blob = "\00\FF\00" : Blob;
+let bytes = Blob.toArray(blob); // => [0, 255, 0]

public func toArrayMut(blob : Blob) : [var Nat8]

Converts a Blob to a mutable array of bytes ([var Nat8]), by copying each element.

+

Example:

+
motoko include=import
+let blob = "\00\FF\00" : Blob;
+let bytes = Blob.toArrayMut(blob); // => [var 0, 255, 0]

public func hash(blob : Blob) : Nat32

Returns the (non-cryptographic) hash of blob.

+

Example:

+
motoko include=import
+let blob = "\00\FF\00" : Blob;
+Blob.hash(blob) // => 1_818_567_776

public func compare(b1 : Blob, b2 : Blob) : {#less; #equal; #greater}

General purpose comparison function for Blob by comparing the value of +the bytes. Returns the Order (either #less, #equal, or #greater) +by comparing blob1 with blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\00\00" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+Blob.compare(blob1, blob2) // => #less

public func equal(blob1 : Blob, blob2 : Blob) : Bool

Equality function for Blob types. +This is equivalent to blob1 == blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\FF\00" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.equal(blob1, blob2);
+blob1 == blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use == as a +function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Blob>(3);
+let buffer2 = Buffer.Buffer<Blob>(3);
+Buffer.equal(buffer1, buffer2, Blob.equal) // => true

public func notEqual(blob1 : Blob, blob2 : Blob) : Bool

Inequality function for Blob types. +This is equivalent to blob1 != blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.notEqual(blob1, blob2);
+blob1 != blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use != as a +function value at the moment.

+

public func less(blob1 : Blob, blob2 : Blob) : Bool

"Less than" function for Blob types. +This is equivalent to blob1 < blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.less(blob1, blob2);
+blob1 < blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use < as a +function value at the moment.

+

public func lessOrEqual(blob1 : Blob, blob2 : Blob) : Bool

"Less than or equal to" function for Blob types. +This is equivalent to blob1 <= blob2.

+

Example:

+
motoko include=import
+let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.lessOrEqual(blob1, blob2);
+blob1 <= blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use <= as a +function value at the moment.

+

public func greater(blob1 : Blob, blob2 : Blob) : Bool

"Greater than" function for Blob types. +This is equivalent to blob1 > blob2.

+

Example:

+
motoko include=import
+let blob1 = "\BB\AA\AA" : Blob;
+let blob2 = "\00\00\00" : Blob;
+ignore Blob.greater(blob1, blob2);
+blob1 > blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use > as a +function value at the moment.

+

public func greaterOrEqual(blob1 : Blob, blob2 : Blob) : Bool

"Greater than or equal to" function for Blob types. +This is equivalent to blob1 >= blob2.

+

Example:

+
motoko include=import
+let blob1 = "\BB\AA\AA" : Blob;
+let blob2 = "\00\00\00" : Blob;
+ignore Blob.greaterOrEqual(blob1, blob2);
+blob1 >= blob2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function value +to pass to a higher order function. It is not possible to use >= as a +function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Bool.html b/base-doc/Bool.html new file mode 100644 index 00000000000..87561f4afaf --- /dev/null +++ b/base-doc/Bool.html @@ -0,0 +1,16 @@ + +

Bool

Boolean type and operations.

+

While boolean operators _ and _ and _ or _ are short-circuiting, +avoiding computation of the right argument when possible, the functions +logand(_, _) and logor(_, _) are strict and will always evaluate both +of their arguments.

+

type Bool = Prim.Types.Bool

Booleans with constants true and false.

+

public func toText(x : Bool) : Text

Conversion.

+

public func logand(x : Bool, y : Bool) : Bool

Returns x and y.

+

public func logor(x : Bool, y : Bool) : Bool

Returns x or y.

+

public func logxor(x : Bool, y : Bool) : Bool

Returns exclusive or of x and y, x != y.

+

public func lognot(x : Bool) : Bool

Returns not x.

+

public func equal(x : Bool, y : Bool) : Bool

Returns x == y.

+

public func notEqual(x : Bool, y : Bool) : Bool

Returns x != y.

+

public func compare(x : Bool, y : Bool) : {#less; #equal; #greater}

Returns the order of x and y, where false < true.

+

\ No newline at end of file diff --git a/base-doc/Buffer.html b/base-doc/Buffer.html new file mode 100644 index 00000000000..f10d0fc0af6 --- /dev/null +++ b/base-doc/Buffer.html @@ -0,0 +1,1144 @@ + +

Buffer

Class Buffer<X> provides a mutable list of elements of type X. +The class wraps and resizes an underyling array that holds the elements, +and thus is comparable to ArrayLists or Vectors in other languages.

+

When required, the current state of a buffer object can be converted to a fixed-size array of its elements. +This is recommended for example when storing a buffer to a stable variable.

+

Throughout this documentation, two terms come up that can be confused: size +and capacity. size is the length of the list that the buffer represents. +capacity is the length of the underyling array that backs this list. +capacity >= size is an invariant for this class.

+

Like arrays, elements in the buffer are ordered by indices from 0 to size-1.

+

WARNING: Certain operations are amortized O(1) time, such as add, but run +in worst case O(n) time. These worst case runtimes may exceed the cycles limit +per message if the size of the buffer is large enough. Grow these structures +with discretion. All amortized operations below also list the worst case runtime.

+

Constructor: +The argument initCapacity determines the initial capacity of the array. +The underlying array grows by a factor of 1.5 when its current capacity is +exceeded. Further, when the size of the buffer shrinks to be less than 1/4th +of the capacity, the underyling array is shrunk by a factor of 2.

+

Example:

+
motoko name=initialize
+import Buffer "mo:base/Buffer";
+
+let buffer = Buffer.Buffer<Nat>(3); // Creates a new Buffer
+ +

Runtime: O(initCapacity)

+

Space: O(initCapacity)

+

class Buffer<X>(initCapacity : Nat)

public func size() : Nat

Returns the current number of elements in the buffer.

+

Example:

+
motoko include=initialize
+buffer.size() // => 0
+ +

Runtime: O(1)

+

Space: O(1)

+

public func add(element : X)

Adds a single element to the end of the buffer, doubling +the size of the array if capacity is exceeded.

+

Example:

+
motoko include=initialize
+
+buffer.add(0); // add 0 to buffer
+buffer.add(1);
+buffer.add(2);
+buffer.add(3); // causes underlying array to increase in capacity
+Buffer.toArray(buffer) // => [0, 1, 2, 3]
+ +

Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func get(index : Nat) : X

Returns the element at index index. Traps if index >= size. Indexing is zero-based.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.get(0); // => 10
+ +

Runtime: O(1)

+

Space: O(1)

+

public func getOpt(index : Nat) : ?X

Returns the element at index index as an option. +Returns null when index >= size. Indexing is zero-based.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+let x = buffer.getOpt(0); // => ?10
+let y = buffer.getOpt(2); // => null
+ +

Runtime: O(1)

+

Space: O(1)

+

public func put(index : Nat, element : X)

Overwrites the current element at index with element. Traps if +index >= size. Indexing is zero-based.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.put(0, 20); // overwrites 10 at index 0 with 20
+Buffer.toArray(buffer) // => [20]
+ +

Runtime: O(1)

+

Space: O(1)

+

public func removeLast() : ?X

Removes and returns the last item in the buffer or null if +the buffer is empty.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.removeLast(); // => ?11
+ +

Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func remove(index : Nat) : X

Removes and returns the element at index from the buffer. +All elements with index > index are shifted one position to the left. +This may cause a downsizing of the array.

+

Traps if index >= size.

+

WARNING: Repeated removal of elements using this method is ineffecient +and might be a sign that you should consider a different data-structure +for your use case.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+let x = buffer.remove(1); // evaluates to 11. 11 no longer in list.
+Buffer.toArray(buffer) // => [10, 12]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func clear()

Resets the buffer. Capacity is set to 8.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+buffer.clear(); // buffer is now empty
+Buffer.toArray(buffer) // => []
+ +

Runtime: O(1)

+

Space: O(1)

+

public func filterEntries(predicate : (Nat, X) -> Bool)

Removes all elements from the buffer for which the predicate returns false. +The predicate is given both the index of the element and the element itself. +This may cause a downsizing of the array.

+

Example:

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+buffer.filterEntries(func(_, x) = x % 2 == 0); // only keep even elements
+Buffer.toArray(buffer) // => [10, 12]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func capacity() : Nat

Returns the capacity of the buffer (the length of the underlying array).

+

Example:

+
motoko include=initialize
+
+let buffer = Buffer.Buffer<Nat>(2); // underlying array has capacity 2
+buffer.add(10);
+let c1 = buffer.capacity(); // => 2
+buffer.add(11);
+buffer.add(12); // causes capacity to increase by factor of 1.5
+let c2 = buffer.capacity(); // => 3
+ +

Runtime: O(1)

+

Space: O(1)

+

public func reserve(capacity : Nat)

Changes the capacity to capacity. Traps if capacity < size.

+
motoko include=initialize
+
+buffer.reserve(4);
+buffer.add(10);
+buffer.add(11);
+buffer.capacity(); // => 4
+ +

Runtime: O(capacity)

+

Space: O(capacity)

+

public func append(buffer2 : Buffer<X>)

Adds all elements in buffer b to this buffer.

+
motoko include=initialize
+let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer1.add(10);
+buffer1.add(11);
+buffer2.add(12);
+buffer2.add(13);
+buffer1.append(buffer2); // adds elements from buffer2 to buffer1
+Buffer.toArray(buffer1) // => [10, 11, 12, 13]
+ +

Amortized Runtime: O(size2), Worst Case Runtime: O(size1 + size2)

+

Amortized Space: O(1), Worst Case Space: O(size1 + size2)

+

public func insert(index : Nat, element : X)

Inserts element at index, shifts all elements to the right of +index over by one index. Traps if index is greater than size.

+
motoko include=initialize
+let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer.add(10);
+buffer.add(11);
+buffer.insert(1, 9);
+Buffer.toArray(buffer) // => [10, 9, 11]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

public func insertBuffer(index : Nat, buffer2 : Buffer<X>)

Inserts buffer2 at index, and shifts all elements to the right of +index over by size2. Traps if index is greater than size.

+
motoko include=initialize
+let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer1.add(10);
+buffer1.add(11);
+buffer2.add(12);
+buffer2.add(13);
+buffer1.insertBuffer(1, buffer2);
+Buffer.toArray(buffer1) // => [10, 12, 13, 11]
+ +

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size1 + size2)

+

public func sort(compare : (X, X) -> Order.Order)

Sorts the elements in the buffer according to compare. +Sort is deterministic, stable, and in-place.

+
motoko include=initialize
+
+import Nat "mo:base/Nat";
+
+buffer.add(11);
+buffer.add(12);
+buffer.add(10);
+buffer.sort(Nat.compare);
+Buffer.toArray(buffer) // => [10, 11, 12]
+ +

Runtime: O(size * log(size))

+

Space: O(size)

+

public func vals() : { next : () -> ?X }

Returns an Iterator (Iter) over the elements of this buffer. +Iterator provides a single method next(), which returns +elements in order, or null when out of elements to iterate over.

+
motoko include=initialize
+
+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+
+var sum = 0;
+for (element in buffer.vals()) {
+  sum += element;
+};
+sum // => 33
+ +

Runtime: O(1)

+

Space: O(1)

+

public func clone() : Buffer<X>

@deprecated Use static library function instead.

+

public func toArray() : [X]

@deprecated Use static library function instead.

+

public func toVarArray() : [var X]

@deprecated Use static library function instead.

+

public func isEmpty<X>(buffer : Buffer<X>) : Bool

Returns true if and only if the buffer is empty.

+

Example:

+
motoko include=initialize
+buffer.add(2);
+buffer.add(0);
+buffer.add(3);
+Buffer.isEmpty(buffer); // => false
+ +
motoko include=initialize
+Buffer.isEmpty(buffer); // => true
+ +

Runtime: O(1)

+

Space: O(1)

+

public func contains<X>(
  buffer : Buffer<X>,
  element : X,
  equal : (X, X) -> Bool
) : Bool

Returns true iff buffer contains element with respect to equality +defined by equal.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(2);
+buffer.add(0);
+buffer.add(3);
+Buffer.contains<Nat>(buffer, 2, Nat.equal); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func clone<X>(buffer : Buffer<X>) : Buffer<X>

Returns a copy of buffer, with the same capacity.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+
+let clone = Buffer.clone(buffer);
+Buffer.toArray(clone); // => [1]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func max<X>(buffer : Buffer<X>, compare : (X, X) -> Order) : ?X

Finds the greatest element in buffer defined by compare. +Returns null if buffer is empty.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+
+Buffer.max(buffer, Nat.compare); // => ?2
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func min<X>(buffer : Buffer<X>, compare : (X, X) -> Order) : ?X

Finds the least element in buffer defined by compare. +Returns null if buffer is empty.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+
+Buffer.min(buffer, Nat.compare); // => ?1
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func equal<X>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Defines equality for two buffers, using equal to recursively compare elements in the +buffers. Returns true iff the two buffers are of the same size, and equal +evaluates to true for every pair of elements in the two buffers of the same +index.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+
+let buffer2 = Buffer.Buffer<Nat>(5);
+buffer2.add(1);
+buffer2.add(2);
+
+Buffer.equal(buffer1, buffer2, Nat.equal); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func compare<X>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<X>,
  compare : (X, X) -> Order.Order
) : Order.Order

Defines comparison for two buffers, using compare to recursively compare elements in the +buffers. Comparison is defined lexicographically.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+
+let buffer2 = Buffer.Buffer<Nat>(3);
+buffer2.add(3);
+buffer2.add(4);
+
+Buffer.compare<Nat>(buffer1, buffer2, Nat.compare); // => #less
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func toText<X>(buffer : Buffer<X>, toText : X -> Text) : Text

Creates a textual representation of buffer, using toText to recursively +convert the elements into Text.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.toText(buffer, Nat.toText); // => "[1, 2, 3, 4]"
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that toText runs in O(1) time and space.

+

public func hash<X>(buffer : Buffer<X>, hash : X -> Nat32) : Nat32

Hashes buffer using hash to hash the underlying elements. +The deterministic hash function is a function of the elements in the Buffer, as well +as their ordering.

+

Example:

+
motoko include=initialize
+import Hash "mo:base/Hash";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(1000);
+
+Buffer.hash<Nat>(buffer, Hash.hash); // => 2_872_640_342
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that hash runs in O(1) time and space.

+

public func indexOf<X>(
  element : X,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : ?Nat

Finds the first index of element in buffer using equality of elements defined +by equal. Returns null if element is not found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.indexOf<Nat>(3, buffer, Nat.equal); // => ?2
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func lastIndexOf<X>(
  element : X,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : ?Nat

Finds the last index of element in buffer using equality of elements defined +by equal. Returns null if element is not found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(2);
+buffer.add(2);
+
+Buffer.lastIndexOf<Nat>(2, buffer, Nat.equal); // => ?5
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func indexOfBuffer<X>(
  subBuffer : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : ?Nat

Searches for subBuffer in buffer, and returns the starting index if it is found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(4);
+sub.add(5);
+sub.add(6);
+
+Buffer.indexOfBuffer<Nat>(sub, buffer, Nat.equal); // => ?3
+ +

Runtime: O(size of buffer + size of subBuffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func binarySearch<X>(
  element : X,
  buffer : Buffer<X>,
  compare : (X, X) -> Order.Order
) : ?Nat

Similar to indexOf, but runs in logarithmic time. Assumes that buffer is sorted. +Behavior is undefined if buffer is not sorted. Uses compare to +perform the search. Returns an index of element if it is found.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+Buffer.binarySearch<Nat>(5, buffer, Nat.compare); // => ?2
+ +

Runtime: O(log(size))

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func subBuffer<X>(
  buffer : Buffer<X>,
  start : Nat,
  length : Nat
) : Buffer<X>

Returns the sub-buffer of buffer starting at index start +of length length. Traps if start is out of bounds, or start + length +is greater than the size of buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.subBuffer(buffer, 3, 2);
+Buffer.toText(sub, Nat.toText); // => [4, 5]
+ +

Runtime: O(length)

+

Space: O(length)

+

public func isSubBufferOf<X>(
  subBuffer : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if subBuffer is a sub-Buffer of buffer. Uses equal to +compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(2);
+sub.add(3);
+Buffer.isSubBufferOf(sub, buffer, Nat.equal); // => true
+ +

Runtime: O(size of subBuffer + size of buffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func isStrictSubBufferOf<X>(
  subBuffer : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if subBuffer is a strict subBuffer of buffer, i.e. subBuffer must be +strictly contained inside both the first and last indices of buffer. +Uses equal to compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(2);
+sub.add(3);
+Buffer.isStrictSubBufferOf(sub, buffer, Nat.equal); // => true
+ +

Runtime: O(size of subBuffer + size of buffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func prefix<X>(buffer : Buffer<X>, length : Nat) : Buffer<X>

Returns the prefix of buffer of length length. Traps if length +is greater than the size of buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.prefix(buffer, 3); // => [1, 2, 3]
+Buffer.toText(pre, Nat.toText);
+ +

Runtime: O(length)

+

Space: O(length)

+

public func isPrefixOf<X>(
  prefix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if prefix is a prefix of buffer. Uses equal to +compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.Buffer<Nat>(2);
+pre.add(1);
+pre.add(2);
+Buffer.isPrefixOf(pre, buffer, Nat.equal); // => true
+ +

Runtime: O(size of prefix)

+

Space: O(size of prefix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func isStrictPrefixOf<X>(
  prefix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if prefix is a strict prefix of buffer. Uses equal to +compare elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.Buffer<Nat>(3);
+pre.add(1);
+pre.add(2);
+pre.add(3);
+Buffer.isStrictPrefixOf(pre, buffer, Nat.equal); // => true
+ +

Runtime: O(size of prefix)

+

Space: O(size of prefix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func suffix<X>(buffer : Buffer<X>, length : Nat) : Buffer<X>

Returns the suffix of buffer of length length. +Traps if lengthis greater than the size of buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.suffix(buffer, 3); // => [2, 3, 4]
+Buffer.toText(suf, Nat.toText);
+ +

Runtime: O(length)

+

Space: O(length)

+

public func isSuffixOf<X>(
  suffix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if suffix is a suffix of buffer. Uses equal to compare +elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.Buffer<Nat>(3);
+suf.add(2);
+suf.add(3);
+suf.add(4);
+Buffer.isSuffixOf(suf, buffer, Nat.equal); // => true
+ +

Runtime: O(length of suffix)

+

Space: O(length of suffix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func isStrictSuffixOf<X>(
  suffix : Buffer<X>,
  buffer : Buffer<X>,
  equal : (X, X) -> Bool
) : Bool

Checks if suffix is a strict suffix of buffer. Uses equal to compare +elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.Buffer<Nat>(3);
+suf.add(2);
+suf.add(3);
+suf.add(4);
+Buffer.isStrictSuffixOf(suf, buffer, Nat.equal); // => true
+ +

Runtime: O(length of suffix)

+

Space: O(length of suffix)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func forAll<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool

Returns true iff every element in buffer satisfies predicate.

+

Example:

+
motoko include=initialize
+
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forAll<Nat>(buffer, func x { x > 1 }); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func forSome<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool

Returns true iff some element in buffer satisfies predicate.

+

Example:

+
motoko include=initialize
+
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forSome<Nat>(buffer, func x { x > 3 }); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func forNone<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool

Returns true iff no element in buffer satisfies predicate.

+

Example:

+
motoko include=initialize
+
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forNone<Nat>(buffer, func x { x == 0 }); // => true
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func toArray<X>(buffer : Buffer<X>) : [X]

Creates an array containing elements from buffer.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.toArray<Nat>(buffer); // => [1, 2, 3]
+
+
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toVarArray<X>(buffer : Buffer<X>) : [var X]

Creates a mutable array containing elements from buffer.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.toVarArray<Nat>(buffer); // => [1, 2, 3]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromArray<X>(array : [X]) : Buffer<X>

Creates a buffer containing elements from array.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let array = [2, 3];
+
+let buf = Buffer.fromArray<Nat>(array); // => [2, 3]
+Buffer.toText(buf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromVarArray<X>(array : [var X]) : Buffer<X>

Creates a buffer containing elements from array.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let array = [var 1, 2, 3];
+
+let buf = Buffer.fromVarArray<Nat>(array); // => [1, 2, 3]
+Buffer.toText(buf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromIter<X>(iter : { next : () -> ?X }) : Buffer<X>

Creates a buffer containing elements from iter.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let array = [1, 1, 1];
+let iter = array.vals();
+
+let buf = Buffer.fromIter<Nat>(iter); // => [1, 1, 1]
+Buffer.toText(buf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

public func trimToSize<X>(buffer : Buffer<X>)

Reallocates the array underlying buffer such that capacity == size.

+

Example:

+
motoko include=initialize
+
+let buffer = Buffer.Buffer<Nat>(10);
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.trimToSize<Nat>(buffer);
+buffer.capacity(); // => 3
+ +

Runtime: O(size)

+

Space: O(size)

+

public func map<X, Y>(buffer : Buffer<X>, f : X -> Y) : Buffer<Y>

Creates a new buffer by applying f to each element in buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.map<Nat, Nat>(buffer, func (x) { x + 1 });
+Buffer.toText(newBuf, Nat.toText); // => [2, 3, 4]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func iterate<X>(buffer : Buffer<X>, f : X -> ())

Applies f to each element in buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.iterate<Nat>(buffer, func (x) {
+  Debug.print(Nat.toText(x)); // prints each element in buffer
+});
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapEntries<X, Y>(buffer : Buffer<X>, f : (Nat, X) -> Y) : Buffer<Y>

Applies f to each element in buffer and its index.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.mapEntries<Nat, Nat>(buffer, func (x, i) { x + i + 1 });
+Buffer.toText(newBuf, Nat.toText); // => [2, 4, 6]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<X, Y>(buffer : Buffer<X>, f : X -> ?Y) : Buffer<Y>

Creates a new buffer by applying f to each element in buffer, +and keeping all non-null elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.mapFilter<Nat, Nat>(buffer, func (x) {
+  if (x > 1) {
+    ?(x * 2);
+  } else {
+    null;
+  }
+});
+Buffer.toText(newBuf, Nat.toText); // => [4, 6]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapResult<X, Y, E>(buffer : Buffer<X>, f : X -> Result.Result<Y, E>) : Result.Result<Buffer<Y>, E>

Creates a new buffer by applying f to each element in buffer. +If any invocation of f produces an #err, returns an #err. Otherwise +Returns an #ok containing the new buffer.

+

Example:

+
motoko include=initialize
+import Result "mo:base/Result";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let result = Buffer.mapResult<Nat, Nat, Text>(buffer, func (k) {
+  if (k > 0) {
+    #ok(k);
+  } else {
+    #err("One or more elements are zero.");
+  }
+});
+
+Result.mapOk<Buffer.Buffer<Nat>, [Nat], Text>(result, func buffer = Buffer.toArray(buffer)) // => #ok([1, 2, 3])
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func chain<X, Y>(buffer : Buffer<X>, k : X -> Buffer<Y>) : Buffer<Y>

Creates a new buffer by applying k to each element in buffer, +and concatenating the resulting buffers in order. This operation +is similar to what in other functional languages is known as monadic bind.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let chain = Buffer.chain<Nat, Nat>(buffer, func (x) {
+  let b = Buffer.Buffer<Nat>(2);
+  b.add(x);
+  b.add(x * 2);
+  return b;
+});
+Buffer.toText(chain, Nat.toText); // => [1, 2, 2, 4, 3, 6]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that k runs in O(1) time and space.

+

public func foldLeft<A, X>(
  buffer : Buffer<X>,
  base : A,
  combine : (A, X) -> A
) : A

Collapses the elements in buffer into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.foldLeft<Text, Nat>(buffer, "", func (acc, x) { acc # Nat.toText(x)}); // => "123"
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func foldRight<X, A>(
  buffer : Buffer<X>,
  base : A,
  combine : (X, A) -> A
) : A

Collapses the elements in buffer into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +right to left.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.foldRight<Nat, Text>(buffer, "", func (x, acc) { Nat.toText(x) # acc }); // => "123"
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func first<X>(buffer : Buffer<X>) : X

Returns the first element of buffer. Traps if buffer is empty.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.first(buffer); // => 1
+ +

Runtime: O(1)

+

Space: O(1)

+

public func last<X>(buffer : Buffer<X>) : X

Returns the last element of buffer. Traps if buffer is empty.

+

Example:

+
motoko include=initialize
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.last(buffer); // => 3
+ +

Runtime: O(1)

+

Space: O(1)

+

public func make<X>(element : X) : Buffer<X>

Returns a new buffer with capacity and size 1, containing element.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer = Buffer.make<Nat>(1);
+Buffer.toText(buffer, Nat.toText); // => [1]
+ +

Runtime: O(1)

+

Space: O(1)

+

public func reverse<X>(buffer : Buffer<X>)

Reverses the order of elements in buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.reverse(buffer);
+Buffer.toText(buffer, Nat.toText); // => [3, 2, 1]
+ +

Runtime: O(size)

+

Space: O(1)

+

public func merge<X>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<X>,
  compare : (X, X) -> Order
) : Buffer<X>

Merges two sorted buffers into a single sorted buffer, using compare to define +the ordering. The final ordering is stable. Behavior is undefined if either +buffer1 or buffer2 is not sorted.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(4);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(2);
+buffer2.add(4);
+buffer2.add(6);
+
+let merged = Buffer.merge<Nat>(buffer1, buffer2, Nat.compare);
+Buffer.toText(merged, Nat.toText); // => [1, 2, 2, 4, 4, 6]
+ +

Runtime: O(size1 + size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func removeDuplicates<X>(buffer : Buffer<X>, compare : (X, X) -> Order)

Eliminates all duplicate elements in buffer as defined by compare. +Elimination is stable with respect to the original ordering of the elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.removeDuplicates<Nat>(buffer, Nat.compare);
+Buffer.toText(buffer, Nat.toText); // => [1, 2, 3]
+ +

Runtime: O(size * log(size))

+

Space: O(size)

+

public func partition<X>(buffer : Buffer<X>, predicate : X -> Bool) : (Buffer<X>, Buffer<X>)

Splits buffer into a pair of buffers where all elements in the left +buffer satisfy predicate and all elements in the right buffer do not.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let partitions = Buffer.partition<Nat>(buffer, func (x) { x % 2 == 0 });
+(Buffer.toArray(partitions.0), Buffer.toArray(partitions.1)) // => ([2, 4, 6], [1, 3, 5])
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func split<X>(buffer : Buffer<X>, index : Nat) : (Buffer<X>, Buffer<X>)

Splits the buffer into two buffers at index, where the left buffer contains +all elements with indices less than index, and the right buffer contains all +elements with indices greater than or equal to index. Traps if index is out +of bounds.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let split = Buffer.split<Nat>(buffer, 3);
+(Buffer.toArray(split.0), Buffer.toArray(split.1)) // => ([1, 2, 3], [4, 5, 6])
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that compare runs in O(1) time and space.

+

public func chunk<X>(buffer : Buffer<X>, size : Nat) : Buffer<Buffer<X>>

Breaks up buffer into buffers of size size. The last chunk may +have less than size elements if the number of elements is not divisible +by the chunk size.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let chunks = Buffer.chunk<Nat>(buffer, 3);
+Buffer.toText<Buffer.Buffer<Nat>>(chunks, func buf = Buffer.toText(buf, Nat.toText)); // => [[1, 2, 3], [4, 5, 6]]
+ +

Runtime: O(number of elements in buffer)

+

Space: O(number of elements in buffer)

+

public func groupBy<X>(buffer : Buffer<X>, equal : (X, X) -> Bool) : Buffer<Buffer<X>>

Groups equal and adjacent elements in the list into sub lists.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(2);
+buffer.add(4);
+buffer.add(5);
+buffer.add(5);
+
+let grouped = Buffer.groupBy<Nat>(buffer, func (x, y) { x == y });
+Buffer.toText<Buffer.Buffer<Nat>>(grouped, func buf = Buffer.toText(buf, Nat.toText)); // => [[1], [2, 2], [4], [5, 5]]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time and space.

+

public func flatten<X>(buffer : Buffer<Buffer<X>>) : Buffer<X>

Flattens the buffer of buffers into a single buffer.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+let buffer = Buffer.Buffer<Buffer.Buffer<Nat>>(1);
+
+let inner1 = Buffer.Buffer<Nat>(2);
+inner1.add(1);
+inner1.add(2);
+
+let inner2 = Buffer.Buffer<Nat>(2);
+inner2.add(3);
+inner2.add(4);
+
+buffer.add(inner1);
+buffer.add(inner2);
+// buffer = [[1, 2], [3, 4]]
+
+let flat = Buffer.flatten<Nat>(buffer);
+Buffer.toText<Nat>(flat, Nat.toText); // => [1, 2, 3, 4]
+ +

Runtime: O(number of elements in buffer)

+

Space: O(number of elements in buffer)

+

public func zip<X, Y>(buffer1 : Buffer<X>, buffer2 : Buffer<Y>) : Buffer<(X, Y)>

Combines the two buffers into a single buffer of pairs, pairing together +elements with the same index. If one buffer is longer than the other, the +remaining elements from the longer buffer are not included.

+

Example:

+
motoko include=initialize
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(3);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(4);
+buffer2.add(5);
+
+let zipped = Buffer.zip(buffer1, buffer2);
+Buffer.toArray(zipped); // => [(1, 4), (2, 5)]
+ +

Runtime: O(min(size1, size2))

+

Space: O(min(size1, size2))

+

public func zipWith<X, Y, Z>(
  buffer1 : Buffer<X>,
  buffer2 : Buffer<Y>,
  zip : (X, Y) -> Z
) : Buffer<Z>

Combines the two buffers into a single buffer, pairing together +elements with the same index and combining them using zip. If +one buffer is longer than the other, the remaining elements from +the longer buffer are not included.

+

Example:

+
motoko include=initialize
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(3);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(4);
+buffer2.add(5);
+buffer2.add(6);
+
+let zipped = Buffer.zipWith<Nat, Nat, Nat>(buffer1, buffer2, func (x, y) { x + y });
+Buffer.toArray(zipped) // => [5, 7, 9]
+ +

Runtime: O(min(size1, size2))

+

Space: O(min(size1, size2))

+

*Runtime and space assumes that zip runs in O(1) time and space.

+

public func takeWhile<X>(buffer : Buffer<X>, predicate : X -> Bool) : Buffer<X>

Creates a new buffer taking elements in order from buffer until predicate +returns false.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.takeWhile<Nat>(buffer, func (x) { x < 3 });
+Buffer.toText(newBuf, Nat.toText); // => [1, 2]
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

public func dropWhile<X>(buffer : Buffer<X>, predicate : X -> Bool) : Buffer<X>

Creates a new buffer excluding elements in order from buffer until predicate +returns false.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.dropWhile<Nat>(buffer, func x { x < 3 }); // => [3]
+Buffer.toText(newBuf, Nat.toText);
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) time and space.

+

\ No newline at end of file diff --git a/base-doc/CertifiedData.html b/base-doc/CertifiedData.html new file mode 100644 index 00000000000..8dd7c36c83d --- /dev/null +++ b/base-doc/CertifiedData.html @@ -0,0 +1,35 @@ + +

CertifiedData

Certified data.

+

The Internet Computer allows canister smart contracts to store a small amount of data during +update method processing so that during query call processing, the canister can obtain +a certificate about that data.

+

This module provides a low-level interface to this API, aimed at advanced +users and library implementors. See the Internet Computer Functional +Specification and corresponding documentation for how to use this to make query +calls to your canister tamperproof.

+

public let set : (data : Blob) -> ()

Set the certified data.

+

Must be called from an update method, else traps. +Must be passed a blob of at most 32 bytes, else traps.

+

Example:

+
motoko no-repl
+import CertifiedData "mo:base/CertifiedData";
+import Blob "mo:base/Blob";
+
+// Must be in an update call
+
+let array : [Nat8] = [1, 2, 3];
+let blob = Blob.fromArray(array);
+CertifiedData.set(blob);
+ +

See a full example on how to use certified variables here: https://github.com/dfinity/examples/tree/master/motoko/cert-var

+

public let getCertificate : () -> ?Blob

Gets a certificate

+

Returns null if no certificate is available, e.g. when processing an +update call or inter-canister call. This returns a non-null value only +when processing a query call.

+

Example:

+
motoko no-repl
+import CertifiedData "mo:base/CertifiedData";
+// Must be in a query call
+
+CertifiedData.getCertificate();

See a full example on how to use certified variables here: https://github.com/dfinity/examples/tree/master/motoko/cert-var

+

\ No newline at end of file diff --git a/base-doc/Char.html b/base-doc/Char.html new file mode 100644 index 00000000000..fcca913b65d --- /dev/null +++ b/base-doc/Char.html @@ -0,0 +1,21 @@ + +

Char

Characters

+

type Char = Prim.Types.Char

Characters represented as Unicode code points.

+

public let toNat32 : (c : Char) -> Nat32

Convert character c to a word containing its Unicode scalar value.

+

public let fromNat32 : (w : Nat32) -> Char

Convert w to a character. +Traps if w is not a valid Unicode scalar value. +Value w is valid if, and only if, w < 0xD800 or (0xE000 <= w and w <= 0x10FFFF).

+

public let toText : (c : Char) -> Text

Convert character c to single character text.

+

public func isDigit(c : Char) : Bool

Returns true when c is a decimal digit between 0 and 9, otherwise false.

+

public let isWhitespace : (c : Char) -> Bool

Returns the Unicode White_Space property of c.

+

public let isLowercase : (c : Char) -> Bool

Returns the Unicode Lowercase property of c.

+

public let isUppercase : (c : Char) -> Bool

Returns the Unicode Uppercase property of c.

+

public let isAlphabetic : (c : Char) -> Bool

Returns the Unicode Alphabetic property of c.

+

public func equal(x : Char, y : Char) : Bool

Returns x == y.

+

public func notEqual(x : Char, y : Char) : Bool

Returns x != y.

+

public func less(x : Char, y : Char) : Bool

Returns x < y.

+

public func lessOrEqual(x : Char, y : Char) : Bool

Returns x <= y.

+

public func greater(x : Char, y : Char) : Bool

Returns x > y.

+

public func greaterOrEqual(x : Char, y : Char) : Bool

Returns x >= y.

+

public func compare(x : Char, y : Char) : {#less; #equal; #greater}

Returns the order of x and y.

+

\ No newline at end of file diff --git a/base-doc/Debug.html b/base-doc/Debug.html new file mode 100644 index 00000000000..27dd1ad539f --- /dev/null +++ b/base-doc/Debug.html @@ -0,0 +1,34 @@ + +

Debug

Utility functions for debugging.

+

Import from the base library to use this module.

+
motoko name=import
+import Debug "mo:base/Debug";

public func print(text : Text)

Prints text to output stream.

+

NOTE: The output is placed in the replica log. When running on mainnet, +this function has no effect.

+
motoko include=import
+Debug.print "Hello New World!";
+Debug.print(debug_show(4)) // Often used with `debug_show` to convert values to Text

public func trap(errorMessage : Text) : None

trap(t) traps execution with a user-provided diagnostic message.

+

The caller of a future whose execution called trap(t) will +observe the trap as an Error value, thrown at await, with code +#canister_error and message m. Here m is a more descriptive Text +message derived from the provided t. See example for more details.

+

NOTE: Other execution environments that cannot handle traps may only +propagate the trap and terminate execution, with or without some +descriptive message.

+
import Debug "mo:base/Debug";
+import Error "mo:base/Error";
+
+actor {
+  func fail() : async () {
+    Debug.trap("user provided error message");
+  };
+
+  public func foo() : async () {
+    try {
+      await fail();
+    } catch e {
+      let code = Error.code(e); // evaluates to #canister_error
+      let message = Error.message(e); // contains user provided error message
+    }
+  };
+}

\ No newline at end of file diff --git a/base-doc/Deque.html b/base-doc/Deque.html new file mode 100644 index 00000000000..375bdf4fd18 --- /dev/null +++ b/base-doc/Deque.html @@ -0,0 +1,126 @@ + +

Deque

Double-ended queue (deque) of a generic element type T.

+

The interface to deques is purely functional, not imperative, and deques are immutable values. +In particular, deque operations such as push and pop do not update their input deque but, instead, return the +value of the modified deque, alongside any other data. +The input deque is left unchanged.

+

Examples of use-cases: +Queue (FIFO) by using pushBack() and popFront(). +Stack (LIFO) by using pushFront() and popFront().

+

A deque is internally implemented as two lists, a head access list and a (reversed) tail access list, +that are dynamically size-balanced by splitting.

+

Construction: Create a new deque with the empty<T>() function.

+

Note on the costs of push and pop functions:

+
  • Runtime: O(1) amortized costs, O(n)` worst case cost per single call.
  • Space: O(1) amortized costs, O(n)` worst case cost per single call.
+ +

n denotes the number of elements stored in the deque.

+

type Deque<T> = (List<T>, List<T>)

Double-ended queue (deque) data type.

+

public func empty<T>() : Deque<T>

Create a new empty deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.empty<Nat>()
+ +

Runtime: O(1).

+

Space: O(1).

+

public func isEmpty<T>(deque : Deque<T>) : Bool

Determine whether a deque is empty. +Returns true if deque is empty, otherwise false.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.empty<Nat>();
+Deque.isEmpty(deque) // => true
+ +

Runtime: O(1).

+

Space: O(1).

+

public func pushFront<T>(deque : Deque<T>, element : T) : Deque<T>

Insert a new element on the front end of a deque. +Returns the new deque with element in the front followed by the elements of deque.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1) // deque with elements [1, 2]
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

public func peekFront<T>(deque : Deque<T>) : ?T

Inspect the optional element on the front end of a deque. +Returns null if deque is empty. Otherwise, the front element of deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1);
+Deque.peekFront(deque) // => ?1
+ +

Runtime: O(1).

+

Space: O(1).

+

public func popFront<T>(deque : Deque<T>) : ?(T, Deque<T>)

Remove the element on the front end of a deque. +Returns null if deque is empty. Otherwise, it returns a pair of +the first element and a new deque that contains all the remaining elements of deque.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+import Debug "mo:base/Debug";
+let initial = Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1);
+// initial deque with elements [1, 2]
+let reduced = Deque.popFront(initial);
+switch reduced {
+  case null {
+    Debug.trap "Empty queue impossible"
+  };
+  case (?result) {
+    let removedElement = result.0; // 1
+    let reducedDeque = result.1; // deque with element [2].
+  }
+}
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

public func pushBack<T>(deque : Deque<T>, element : T) : Deque<T>

Insert a new element on the back end of a deque. +Returns the new deque with all the elements of deque, followed by element on the back.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2) // deque with elements [1, 2]
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

public func peekBack<T>(deque : Deque<T>) : ?T

Inspect the optional element on the back end of a deque. +Returns null if deque is empty. Otherwise, the back element of deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2);
+Deque.peekBack(deque) // => ?2
+ +

Runtime: O(1).

+

Space: O(1).

+

public func popBack<T>(deque : Deque<T>) : ?(Deque<T>, T)

Remove the element on the back end of a deque. +Returns null if deque is empty. Otherwise, it returns a pair of +a new deque that contains the remaining elements of deque +and, as the second pair item, the removed back element.

+

This may involve dynamic rebalancing of the two, internally used lists.

+

Example:

+
import Deque "mo:base/Deque";
+import Debug "mo:base/Debug";
+
+let initial = Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2);
+// initial deque with elements [1, 2]
+let reduced = Deque.popBack(initial);
+switch reduced {
+  case null {
+    Debug.trap "Empty queue impossible"
+  };
+  case (?result) {
+    let reducedDeque = result.0; // deque with element [1].
+    let removedElement = result.1; // 2
+  }
+}
+ +

Runtime: O(n) worst-case, amortized to O(1).

+

Space: O(n) worst-case, amortized to O(1).

+

n denotes the number of elements stored in the deque.

+

\ No newline at end of file diff --git a/base-doc/Error.html b/base-doc/Error.html new file mode 100644 index 00000000000..b1fae13cfd4 --- /dev/null +++ b/base-doc/Error.html @@ -0,0 +1,38 @@ + +

Error

Error values and inspection.

+

The Error type is the argument to throw, parameter of catch. +The Error type is opaque.

+

type Error = Prim.Types.Error

Error value resulting from async computations

+

type ErrorCode = Prim.ErrorCode

Error code to classify different kinds of user and system errors:

+
type ErrorCode = {
+  // Fatal error.
+  #system_fatal;
+  // Transient error.
+  #system_transient;
+  // Destination invalid.
+  #destination_invalid;
+  // Explicit reject by canister code.
+  #canister_reject;
+  // Canister trapped.
+  #canister_error;
+  // Future error code (with unrecognized numeric code).
+  #future : Nat32;
+  // Error issuing inter-canister call
+  // (indicating destination queue full or freezing threshold crossed).
+  #call_error : { err_code :  Nat32 }
+};

public let reject : (message : Text) -> Error

Create an error from the message with the code #canister_reject.

+

Example:

+
import Error "mo:base/Error";
+
+Error.reject("Example error") // can be used as throw argument

public let code : (error : Error) -> ErrorCode

Returns the code of an error.

+

Example:

+
import Error "mo:base/Error";
+
+let error = Error.reject("Example error");
+Error.code(error) // #canister_reject

public let message : (error : Error) -> Text

Returns the message of an error.

+

Example:

+
import Error "mo:base/Error";
+import Debug "mo:base/Debug";
+
+let error = Error.reject("Example error");
+Error.message(error) // "Example error"

\ No newline at end of file diff --git a/base-doc/ExperimentalCycles.html b/base-doc/ExperimentalCycles.html new file mode 100644 index 00000000000..a30a5f84966 --- /dev/null +++ b/base-doc/ExperimentalCycles.html @@ -0,0 +1,117 @@ + +

ExperimentalCycles

Managing cycles within actors on the Internet Computer (IC).

+

The usage of the Internet Computer is measured, and paid for, in cycles. +This library provides imperative operations for observing cycles, transferring cycles, and +observing refunds of cycles.

+

WARNING: This low-level API is experimental and likely to change or even disappear. +Dedicated syntactic support for manipulating cycles may be added to the language in future, obsoleting this library.

+

NOTE: Since cycles measure computational resources, the value of balance() can change from one call to the next.

+

Example for use on IC:

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    Debug.print("Main balance: " # debug_show(Cycles.balance()));
+    Cycles.add<system>(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+    Debug.print("Main refunded: " # debug_show(Cycles.refunded())); // 5_000_000
+    Debug.print("Main balance: " # debug_show(Cycles.balance())); // decreased by around 10_000_000
+  };
+
+  func operation() : async() {
+    Debug.print("Operation balance: " # debug_show(Cycles.balance()));
+    Debug.print("Operation available: " # debug_show(Cycles.available()));
+    let obtained = Cycles.accept<system>(10_000_000);
+    Debug.print("Operation obtained: " # debug_show(obtained)); // => 10_000_000
+    Debug.print("Operation balance: " # debug_show(Cycles.balance())); // increased by 10_000_000
+    Debug.print("Operation available: " # debug_show(Cycles.available())); // decreased by 10_000_000
+  }
+}

public let balance : () -> (amount : Nat)

Returns the actor's current balance of cycles as amount.

+

Example for use on the IC:

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    let balance = Cycles.balance();
+    Debug.print("Balance: " # debug_show(balance));
+  }
+}

public let available : () -> (amount : Nat)

Returns the currently available amount of cycles. +The amount available is the amount received in the current call, +minus the cumulative amount accepted by this call. +On exit from the current shared function or async expression via return or throw, +any remaining available amount is automatically refunded to the caller/context.

+

Example for use on the IC:

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    let available = Cycles.available();
+    Debug.print("Available: " # debug_show(available));
+  }
+}

public let accept : (amount : Nat) -> (accepted : Nat)

Transfers up to amount from available() to balance(). +Returns the amount actually transferred, which may be less than +requested, for example, if less is available, or if canister balance limits are reached.

+

Example for use on the IC (for simplicity, only transferring cycles to itself):

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    Cycles.add<system>(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+  };
+
+  func operation() : async() {
+    let obtained = Cycles.accept<system>(10_000_000);
+    Debug.print("Obtained: " # debug_show(obtained)); // => 10_000_000
+  }
+}

public let add : (amount : Nat) -> ()

Indicates additional amount of cycles to be transferred in +the next call, that is, evaluation of a shared function call or +async expression. +Traps if the current total would exceed 2 ** 128 cycles. +Upon the call, but not before, the total amount of cycles added since +the last call is deducted from balance(). +If this total exceeds balance(), the caller traps, aborting the call.

+

Note: The implicit register of added amounts is reset to zero on entry to +a shared function and after each shared function call or resume from an await.

+

Example for use on the IC (for simplicity, only transferring cycles to itself):

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+
+actor {
+  func operation() : async() {
+    ignore Cycles.accept<system>(10_000_000);
+  };
+
+  public func main() : async() {
+    Cycles.add<system>(15_000_000);
+    await operation();
+  }
+}

public let refunded : () -> (amount : Nat)

Reports amount of cycles refunded in the last await of the current +context, or zero if no await has occurred yet. +Calling refunded() is solely informational and does not affect balance(). +Instead, refunds are automatically added to the current balance, +whether or not refunded is used to observe them.

+

Example for use on the IC (for simplicity, only transferring cycles to itself):

+
motoko no-repl
+import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  func operation() : async() {
+    ignore Cycles.accept<system>(10_000_000);
+  };
+
+  public func main() : async() {
+    Cycles.add<system>(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+    Debug.print("Refunded: " # debug_show(Cycles.refunded())); // 5_000_000
+  }
+}

\ No newline at end of file diff --git a/base-doc/ExperimentalInternetComputer.html b/base-doc/ExperimentalInternetComputer.html new file mode 100644 index 00000000000..ed94eaff5ac --- /dev/null +++ b/base-doc/ExperimentalInternetComputer.html @@ -0,0 +1,52 @@ + +

ExperimentalInternetComputer

Low-level interface to the Internet Computer.

+

WARNING: This low-level API is experimental and likely to change or even disappear.

+

public let call : (canister : Principal, name : Text, data : Blob) -> async (reply : Blob)

Calls canister's update or query function, name, with the binary contents of data as IC argument. +Returns the response to the call, an IC reply or reject, as a Motoko future:

+
  • The message data of an IC reply determines the binary contents of reply.
  • The error code and textual message data of an IC reject determines the future's Error value.
+ +

Note: call is an asynchronous function and can only be applied in an asynchronous context.

+

Example:

+
motoko no-repl
+import IC "mo:base/ExperimentalInternetComputer";
+import Principal "mo:base/Principal";
+
+let ledger = Principal.fromText("ryjl3-tyaaa-aaaaa-aaaba-cai");
+let method = "decimals";
+let input = ();
+type OutputType = { decimals : Nat32 };
+
+let rawReply = await IC.call(ledger, method, to_candid(input)); // serialized Candid
+let output : ?OutputType = from_candid(rawReply); // { decimals = 8 }
+ +

Learn more about Candid serialization

+

public func countInstructions(comp : () -> ()) : Nat64

Given computation, comp, counts the number of actual and (for IC system calls) notional WebAssembly +instructions performed during the execution of comp().

+

More precisely, returns the difference between the state of the IC instruction counter (performance counter 0) before and after executing comp() +(see Performance Counter).

+

NB: countInstructions(comp) will not account for any deferred garbage collection costs incurred by comp().

+

Example:

+
motoko no-repl
+import IC "mo:base/ExperimentalInternetComputer";
+
+let count = IC.countInstructions(func() {
+  // ...
+});

public let performanceCounter : (counter : Nat32) -> (value : Nat64)

Returns the current value of IC performance counter counter.

+
  • Counter 0 is the current execution instruction counter, counting instructions only since the beginning of the current IC message. + This counter is reset to value 0 on shared function entry and every await. + It is therefore only suitable for measuring the cost of synchronous code.

    +
  • Counter 1 is the call context instruction counter for the current shared function call. + For replicated message executing, this excludes the cost of nested IC calls (even to the current canister). + For non-replicated messages, such as composite queries, it includes the cost of nested calls. + The current value of this counter is preserved across awaits (unlike counter 0).

    +
  • The function (currently) traps if counter >= 2.

    +
+ +

Consult Performance Counter for details.

+

Example:

+
motoko no-repl
+import IC "mo:base/ExperimentalInternetComputer";
+
+let c1 = IC.performanceCounter(1);
+work();
+let diff : Nat64 = IC.performanceCounter(1) - c1;

\ No newline at end of file diff --git a/base-doc/ExperimentalStableMemory.html b/base-doc/ExperimentalStableMemory.html new file mode 100644 index 00000000000..3e9298b1a69 --- /dev/null +++ b/base-doc/ExperimentalStableMemory.html @@ -0,0 +1,222 @@ + +

ExperimentalStableMemory

Byte-level access to (virtual) stable memory.

+

WARNING: As its name suggests, this library is experimental, subject to change +and may be replaced by safer alternatives in later versions of Motoko. +Use at your own risk and discretion.

+

DEPRECATION: Use of ExperimentalStableMemory library may be deprecated in future. +Going forward, users should consider using library Region.mo to allocate isolated regions of memory instead. +Using dedicated regions for different user applications ensures that writing +to one region will not affect the state of another, unrelated region.

+

This is a lightweight abstraction over IC stable memory and supports persisting +raw binary data across Motoko upgrades. +Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) IC stable memory internally, but does not interfere with this API.

+

Memory is allocated, using grow(pages), sequentially and on demand, in units of 64KiB pages, starting with 0 allocated pages. +New pages are zero initialized. +Growth is capped by a soft limit on page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or 4GiB).

+

Each load operation loads from byte address offset in little-endian +format using the natural bit-width of the type in question. +The operation traps if attempting to read beyond the current stable memory size.

+

Each store operation stores to byte address offset in little-endian format using the natural bit-width of the type in question. +The operation traps if attempting to write beyond the current stable memory size.

+

Text values can be handled by using Text.decodeUtf8 and Text.encodeUtf8, in conjunction with loadBlob and storeBlob.

+

The current page allocation and page contents is preserved across upgrades.

+

NB: The IC's actual stable memory size (ic0.stable_size) may exceed the +page size reported by Motoko function size(). +This (and the cap on growth) are to accommodate Motoko's stable variables. +Applications that plan to use Motoko stable variables sparingly or not at all can +increase --max-stable-pages as desired, approaching the IC maximum (initially 8GiB, then 32Gib, currently 64Gib). +All applications should reserve at least one page for stable variable data, even when no stable variables are used.

+

Usage:

+
motoko no-repl
+import StableMemory "mo:base/ExperimentalStableMemory";

public let size : () -> (pages : Nat64)

Current size of the stable memory, in pages. +Each page is 64KiB (65536 bytes). +Initially 0. +Preserved across upgrades, together with contents of allocated +stable memory.

+

Example:

+
motoko no-repl
+let beforeSize = StableMemory.size();
+ignore StableMemory.grow(10);
+let afterSize = StableMemory.size();
+afterSize - beforeSize // => 10

public let grow : (newPages : Nat64) -> (oldPages : Nat64)

Grow current size of stable memory by the given number of pages. +Each page is 64KiB (65536 bytes). +Returns the previous size when able to grow. +Returns 0xFFFF_FFFF_FFFF_FFFF if remaining pages insufficient. +Every new page is zero-initialized, containing byte 0x00 at every offset. +Function grow is capped by a soft limit on size controlled by compile-time flag + --max-stable-pages <n> (the default is 65536, or 4GiB).

+

Example:

+
motoko no-repl
+import Error "mo:base/Error";
+
+let beforeSize = StableMemory.grow(10);
+if (beforeSize == 0xFFFF_FFFF_FFFF_FFFF) {
+  throw Error.reject("Out of memory");
+};
+let afterSize = StableMemory.size();
+afterSize - beforeSize // => 10

public let stableVarQuery : () -> (shared query () -> async { size : Nat64 })

Returns a query that, when called, returns the number of bytes of (real) IC stable memory that would be +occupied by persisting its current stable variables before an upgrade. +This function may be used to monitor or limit real stable memory usage. +The query computes the estimate by running the first half of an upgrade, including any preupgrade system method. +Like any other query, its state changes are discarded so no actual upgrade (or other state change) takes place. +The query can only be called by the enclosing actor and will trap for other callers.

+

Example:

+
motoko no-repl
+actor {
+  stable var state = "";
+  public func example() : async Text {
+    let memoryUsage = StableMemory.stableVarQuery();
+    let beforeSize = (await memoryUsage()).size;
+    state #= "abcdefghijklmnopqrstuvwxyz";
+    let afterSize = (await memoryUsage()).size;
+    debug_show (afterSize - beforeSize)
+  };
+};

public let loadNat32 : (offset : Nat64) -> Nat32

Loads a Nat32 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat32(offset, value);
+StableMemory.loadNat32(offset) // => 123

public let storeNat32 : (offset : Nat64, value : Nat32) -> ()

Stores a Nat32 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat32(offset, value);
+StableMemory.loadNat32(offset) // => 123

public let loadNat8 : (offset : Nat64) -> Nat8

Loads a Nat8 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat8(offset, value);
+StableMemory.loadNat8(offset) // => 123

public let storeNat8 : (offset : Nat64, value : Nat8) -> ()

Stores a Nat8 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat8(offset, value);
+StableMemory.loadNat8(offset) // => 123

public let loadNat16 : (offset : Nat64) -> Nat16

Loads a Nat16 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat16(offset, value);
+StableMemory.loadNat16(offset) // => 123

public let storeNat16 : (offset : Nat64, value : Nat16) -> ()

Stores a Nat16 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat16(offset, value);
+StableMemory.loadNat16(offset) // => 123

public let loadNat64 : (offset : Nat64) -> Nat64

Loads a Nat64 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat64(offset, value);
+StableMemory.loadNat64(offset) // => 123

public let storeNat64 : (offset : Nat64, value : Nat64) -> ()

Stores a Nat64 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeNat64(offset, value);
+StableMemory.loadNat64(offset) // => 123

public let loadInt32 : (offset : Nat64) -> Int32

Loads an Int32 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt32(offset, value);
+StableMemory.loadInt32(offset) // => 123

public let storeInt32 : (offset : Nat64, value : Int32) -> ()

Stores an Int32 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt32(offset, value);
+StableMemory.loadInt32(offset) // => 123

public let loadInt8 : (offset : Nat64) -> Int8

Loads an Int8 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt8(offset, value);
+StableMemory.loadInt8(offset) // => 123

public let storeInt8 : (offset : Nat64, value : Int8) -> ()

Stores an Int8 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt8(offset, value);
+StableMemory.loadInt8(offset) // => 123

public let loadInt16 : (offset : Nat64) -> Int16

Loads an Int16 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt16(offset, value);
+StableMemory.loadInt16(offset) // => 123

public let storeInt16 : (offset : Nat64, value : Int16) -> ()

Stores an Int16 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt16(offset, value);
+StableMemory.loadInt16(offset) // => 123

public let loadInt64 : (offset : Nat64) -> Int64

Loads an Int64 value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt64(offset, value);
+StableMemory.loadInt64(offset) // => 123

public let storeInt64 : (offset : Nat64, value : Int64) -> ()

Stores an Int64 value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 123;
+StableMemory.storeInt64(offset, value);
+StableMemory.loadInt64(offset) // => 123

public let loadFloat : (offset : Nat64) -> Float

Loads a Float value from stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 1.25;
+StableMemory.storeFloat(offset, value);
+StableMemory.loadFloat(offset) // => 1.25

public let storeFloat : (offset : Nat64, value : Float) -> ()

Stores a Float value in stable memory at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let offset = 0;
+let value = 1.25;
+StableMemory.storeFloat(offset, value);
+StableMemory.loadFloat(offset) // => 1.25

public let loadBlob : (offset : Nat64, size : Nat) -> Blob

Load size bytes starting from offset as a Blob. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+import Blob "mo:base/Blob";
+
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+StableMemory.storeBlob(offset, value);
+Blob.toArray(StableMemory.loadBlob(offset, size)) // => [1, 2, 3]

public let storeBlob : (offset : Nat64, value : Blob) -> ()

Write bytes of blob beginning at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+import Blob "mo:base/Blob";
+
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+StableMemory.storeBlob(offset, value);
+Blob.toArray(StableMemory.loadBlob(offset, size)) // => [1, 2, 3]

\ No newline at end of file diff --git a/base-doc/Float.html b/base-doc/Float.html new file mode 100644 index 00000000000..20622d6dcc1 --- /dev/null +++ b/base-doc/Float.html @@ -0,0 +1,468 @@ + +

Float

Double precision (64-bit) floating-point numbers in IEEE 754 representation.

+

This module contains common floating-point constants and utility functions.

+

Notation for special values in the documentation below: ++inf: Positive infinity +-inf: Negative infinity +NaN: "not a number" (can have different sign bit values, but NaN != NaN regardless of the sign).

+

Note: +Floating point numbers have limited precision and operations may inherently result in numerical errors.

+

Examples of numerical errors:

+
  0.1 + 0.1 + 0.1 == 0.3 // => false
+  
+ +
 1e16 + 1.0 != 1e16 // => false
+  
+ +

(and many more cases)

+

Advice:

+
  • Floating point number comparisons by == or != are discouraged. Instead, it is better to compare + floating-point numbers with a numerical tolerance, called epsilon.
+ +

Example:

+
  import Float "mo:base/Float";
+  let x = 0.1 + 0.1 + 0.1;
+  let y = 0.3;
+
+  let epsilon = 1e-6; // This depends on the application case (needs a numerical error analysis).
+  Float.equalWithin(x, y, epsilon) // => true
+  
+ +
  • For absolute precision, it is recommened to encode the fraction number as a pair of a Nat for the base + and a Nat for the exponent (decimal point).
+ +

NaN sign:

+
  • The NaN sign is only applied by abs, neg, and copySign. Other operations can have an arbitrary + sign bit for NaN results.

type Float = Prim.Types.Float

64-bit floating point number type.

+

public let pi : Float

Ratio of the circumference of a circle to its diameter. +Note: Limited precision.

+

public let e : Float

Base of the natural logarithm. +Note: Limited precision.

+

public func isNaN(number : Float) : Bool

Determines whether the number is a NaN ("not a number" in the floating point representation). +Notes:

+
  • Equality test of NaN with itself or another number is always false.
  • There exist many internal NaN value representations, such as positive and negative NaN, + signalling and quiet NaNs, each with many different bit representations.
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.isNaN(0.0/0.0) // => true

public let abs : (x : Float) -> Float

Returns the absolute value of x.

+

Special cases:

+
abs(+inf) => +inf
+abs(-inf) => +inf
+abs(-NaN)  => +NaN
+abs(-0.0) => 0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.abs(-1.2) // => 1.2

public let sqrt : (x : Float) -> Float

Returns the square root of x.

+

Special cases:

+
sqrt(+inf) => +inf
+sqrt(-0.0) => -0.0
+sqrt(x)    => NaN if x < 0.0
+sqrt(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.sqrt(6.25) // => 2.5

public let ceil : (x : Float) -> Float

Returns the smallest integral float greater than or equal to x.

+

Special cases:

+
ceil(+inf) => +inf
+ceil(-inf) => -inf
+ceil(NaN)  => NaN
+ceil(0.0)  => 0.0
+ceil(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.ceil(1.2) // => 2.0

public let floor : (x : Float) -> Float

Returns the largest integral float less than or equal to x.

+

Special cases:

+
floor(+inf) => +inf
+floor(-inf) => -inf
+floor(NaN)  => NaN
+floor(0.0)  => 0.0
+floor(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.floor(1.2) // => 1.0

public let trunc : (x : Float) -> Float

Returns the nearest integral float not greater in magnitude than x. +This is equilvent to returning x with truncating its decimal places.

+

Special cases:

+
trunc(+inf) => +inf
+trunc(-inf) => -inf
+trunc(NaN)  => NaN
+trunc(0.0)  => 0.0
+trunc(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.trunc(2.75) // => 2.0

public let nearest : (x : Float) -> Float

Returns the nearest integral float to x. +A decimal place of exactly .5 is rounded up for x > 0 +and rounded down for x < 0

+

Special cases:

+
nearest(+inf) => +inf
+nearest(-inf) => -inf
+nearest(NaN)  => NaN
+nearest(0.0)  => 0.0
+nearest(-0.0) => -0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.nearest(2.75) // => 3.0

public let copySign : (x : Float, y : Float) -> Float

Returns x if x and y have same sign, otherwise x with negated sign.

+

The sign bit of zero, infinity, and NaN is considered.

+

Example:

+
import Float "mo:base/Float";
+
+Float.copySign(1.2, -2.3) // => -1.2

public let min : (x : Float, y : Float) -> Float

Returns the smaller value of x and y.

+

Special cases:

+
min(NaN, y) => NaN for any Float y
+min(x, NaN) => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.min(1.2, -2.3) // => -2.3 (with numerical imprecision)

public let max : (x : Float, y : Float) -> Float

Returns the larger value of x and y.

+

Special cases:

+
max(NaN, y) => NaN for any Float y
+max(x, NaN) => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.max(1.2, -2.3) // => 1.2

public let sin : (x : Float) -> Float

Returns the sine of the radian angle x.

+

Special cases:

+
sin(+inf) => NaN
+sin(-inf) => NaN
+sin(NaN) => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.sin(Float.pi / 2) // => 1.0

public let cos : (x : Float) -> Float

Returns the cosine of the radian angle x.

+

Special cases:

+
cos(+inf) => NaN
+cos(-inf) => NaN
+cos(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.cos(Float.pi / 2) // => 0.0 (with numerical imprecision)

public let tan : (x : Float) -> Float

Returns the tangent of the radian angle x.

+

Special cases:

+
tan(+inf) => NaN
+tan(-inf) => NaN
+tan(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.tan(Float.pi / 4) // => 1.0 (with numerical imprecision)

public let arcsin : (x : Float) -> Float

Returns the arc sine of x in radians.

+

Special cases:

+
arcsin(x)   => NaN if x > 1.0
+arcsin(x)   => NaN if x < -1.0
+arcsin(NaN) => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.arcsin(1.0) // => Float.pi / 2

public let arccos : (x : Float) -> Float

Returns the arc cosine of x in radians.

+

Special cases:

+
arccos(x)  => NaN if x > 1.0
+arccos(x)  => NaN if x < -1.0
+arcos(NaN) => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.arccos(1.0) // => 0.0

public let arctan : (x : Float) -> Float

Returns the arc tangent of x in radians.

+

Special cases:

+
arctan(+inf) => pi / 2
+arctan(-inf) => -pi / 2
+arctan(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.arctan(1.0) // => Float.pi / 4

public let arctan2 : (y : Float, x : Float) -> Float

Given (y,x), returns the arc tangent in radians of y/x based on the signs of both values to determine the correct quadrant.

+

Special cases:

+
arctan2(0.0, 0.0)   => 0.0
+arctan2(-0.0, 0.0)  => -0.0
+arctan2(0.0, -0.0)  => pi
+arctan2(-0.0, -0.0) => -pi
+arctan2(+inf, +inf) => pi / 4
+arctan2(+inf, -inf) => 3 * pi / 4
+arctan2(-inf, +inf) => -pi / 4
+arctan2(-inf, -inf) => -3 * pi / 4
+arctan2(NaN, x)     => NaN for any Float x
+arctan2(y, NaN)     => NaN for any Float y
+ +

Example:

+
import Float "mo:base/Float";
+
+let sqrt2over2 = Float.sqrt(2) / 2;
+Float.arctan2(sqrt2over2, sqrt2over2) // => Float.pi / 4

public let exp : (x : Float) -> Float

Returns the value of e raised to the x-th power.

+

Special cases:

+
exp(+inf) => +inf
+exp(-inf) => 0.0
+exp(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.exp(1.0) // => Float.e

public let log : (x : Float) -> Float

Returns the natural logarithm (base-e) of x.

+

Special cases:

+
log(0.0)  => -inf
+log(-0.0) => -inf
+log(x)    => NaN if x < 0.0
+log(+inf) => +inf
+log(NaN)  => NaN
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.log(Float.e) // => 1.0

public func format(fmt : {#fix : Nat8; #exp : Nat8; #gen : Nat8; #hex : Nat8; #exact}, x : Float) : Text

Formatting. format(fmt, x) formats x to Text according to the +formatting directive fmt, which can take one of the following forms:

+
  • #fix prec as fixed-point format with prec digits
  • #exp prec as exponential format with prec digits
  • #gen prec as generic format with prec digits
  • #hex prec as hexadecimal format with prec digits
  • #exact as exact format that can be decoded without loss.
+ +

-0.0 is formatted with negative sign bit. +Positive infinity is formatted as inf. +Negative infinity is formatted as -inf. +NaN is formatted as NaN or -NaN depending on its sign bit.

+

Example:

+
import Float "mo:base/Float";
+
+Float.format(#exp 3, 123.0) // => "1.230e+02"

public let toText : Float -> Text

Conversion to Text. Use format(fmt, x) for more detailed control.

+

-0.0 is formatted with negative sign bit. +Positive infinity is formatted as inf. +Negative infinity is formatted as -inf. +NaN is formatted as NaN or -NaN depending on its sign bit.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toText(0.12) // => "0.12"

public let toInt64 : Float -> Int64

Conversion to Int64 by truncating Float, equivalent to toInt64(trunc(f))

+

Traps if the floating point number is larger or smaller than the representable Int64. +Also traps for inf, -inf, and NaN.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toInt64(-12.3) // => -12

public let fromInt64 : Int64 -> Float

Conversion from Int64.

+

Note: The floating point number may be imprecise for large or small Int64.

+

Example:

+
import Float "mo:base/Float";
+
+Float.fromInt64(-42) // => -42.0

public let toInt : Float -> Int

Conversion to Int.

+

Traps for inf, -inf, and NaN.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toInt(1.2e6) // => +1_200_000

public let fromInt : Int -> Float

Conversion from Int. May result in Inf.

+

Note: The floating point number may be imprecise for large or small Int values. +Returns inf if the integer is greater than the maximum floating point number. +Returns -inf if the integer is less than the minimum floating point number.

+

Example:

+
import Float "mo:base/Float";
+
+Float.fromInt(-123) // => -123.0

public func equal(x : Float, y : Float) : Bool

Returns x == y. +@deprecated Use Float.equalWithin() as this function does not consider numerical errors.

+

public func notEqual(x : Float, y : Float) : Bool

Returns x != y. +@deprecated Use Float.notEqualWithin() as this function does not consider numerical errors.

+

public func equalWithin(
  x : Float,
  y : Float,
  epsilon : Float
) : Bool

Determines whether x is equal to y within the defined tolerance of epsilon. +The epsilon considers numerical erros, see comment above. +Equivalent to Float.abs(x - y) <= epsilon for a non-negative epsilon.

+

Traps if epsilon is negative or NaN.

+

Special cases:

+
equalWithin(+0.0, -0.0, epsilon) => true for any `epsilon >= 0.0`
+equalWithin(-0.0, +0.0, epsilon) => true for any `epsilon >= 0.0`
+equalWithin(+inf, +inf, epsilon) => true for any `epsilon >= 0.0`
+equalWithin(-inf, -inf, epsilon) => true for any `epsilon >= 0.0`
+equalWithin(x, NaN, epsilon)     => false for any x and `epsilon >= 0.0`
+equalWithin(NaN, y, epsilon)     => false for any y and `epsilon >= 0.0`
+ +

Example:

+
import Float "mo:base/Float";
+
+let epsilon = 1e-6;
+Float.equalWithin(-12.3, -1.23e1, epsilon) // => true

public func notEqualWithin(
  x : Float,
  y : Float,
  epsilon : Float
) : Bool

Determines whether x is not equal to y within the defined tolerance of epsilon. +The epsilon considers numerical erros, see comment above. +Equivalent to not equal(x, y, epsilon).

+

Traps if epsilon is negative or NaN.

+

Special cases:

+
notEqualWithin(+0.0, -0.0, epsilon) => false for any `epsilon >= 0.0`
+notEqualWithin(-0.0, +0.0, epsilon) => false for any `epsilon >= 0.0`
+notEqualWithin(+inf, +inf, epsilon) => false for any `epsilon >= 0.0`
+notEqualWithin(-inf, -inf, epsilon) => false for any `epsilon >= 0.0`
+notEqualWithin(x, NaN, epsilon)     => true for any x and `epsilon >= 0.0`
+notEqualWithin(NaN, y, epsilon)     => true for any y and `epsilon >= 0.0`
+ +

Example:

+
import Float "mo:base/Float";
+
+let epsilon = 1e-6;
+Float.notEqualWithin(-12.3, -1.23e1, epsilon) // => false

public func less(x : Float, y : Float) : Bool

Returns x < y.

+

Special cases:

+
less(+0.0, -0.0) => false
+less(-0.0, +0.0) => false
+less(NaN, y)     => false for any Float y
+less(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.less(Float.e, Float.pi) // => true

public func lessOrEqual(x : Float, y : Float) : Bool

Returns x <= y.

+

Special cases:

+
lessOrEqual(+0.0, -0.0) => true
+lessOrEqual(-0.0, +0.0) => true
+lessOrEqual(NaN, y)     => false for any Float y
+lessOrEqual(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.lessOrEqual(0.123, 0.1234) // => true

public func greater(x : Float, y : Float) : Bool

Returns x > y.

+

Special cases:

+
greater(+0.0, -0.0) => false
+greater(-0.0, +0.0) => false
+greater(NaN, y)     => false for any Float y
+greater(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.greater(Float.pi, Float.e) // => true

public func greaterOrEqual(x : Float, y : Float) : Bool

Returns x >= y.

+

Special cases:

+
greaterOrEqual(+0.0, -0.0) => true
+greaterOrEqual(-0.0, +0.0) => true
+greaterOrEqual(NaN, y)     => false for any Float y
+greaterOrEqual(x, NaN)     => false for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.greaterOrEqual(0.1234, 0.123) // => true

public func compare(x : Float, y : Float) : {#less; #equal; #greater}

Defines a total order of x and y for use in sorting.

+

Note: Using this operation to determine equality or inequality is discouraged for two reasons:

+
  • It does not consider numerical errors, see comment above. Use equalWithin(x, y, espilon) or + notEqualWithin(x, y, epsilon) to test for equality or inequality, respectively.
  • NaN are here considered equal if their sign matches, which is different to the standard equality + by == or when using equal() or notEqual().
+ +

Total order:

+
  • negative NaN (no distinction between signalling and quiet negative NaN)
  • negative infinity
  • negative numbers (including negative subnormal numbers in standard order)
  • negative zero (-0.0)
  • positive zero (+0.0)
  • positive numbers (including positive subnormal numbers in standard order)
  • positive infinity
  • positive NaN (no distinction between signalling and quiet positive NaN)
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.compare(0.123, 0.1234) // => #less

public func neg(x : Float) : Float

Returns the negation of x, -x .

+

Changes the sign bit for infinity.

+

Special cases:

+
neg(+inf) => -inf
+neg(-inf) => +inf
+neg(+NaN) => -NaN
+neg(-NaN) => +NaN
+neg(+0.0) => -0.0
+neg(-0.0) => +0.0
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.neg(1.23) // => -1.23

public func add(x : Float, y : Float) : Float

Returns the sum of x and y, x + y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
add(+inf, y)    => +inf if y is any Float except -inf and NaN
+add(-inf, y)    => -inf if y is any Float except +inf and NaN
+add(+inf, -inf) => NaN
+add(NaN, y)     => NaN for any Float y

The same cases apply commutatively, i.e. for add(y, x).

+

Example:

+
import Float "mo:base/Float";
+
+Float.add(1.23, 0.123) // => 1.353

public func sub(x : Float, y : Float) : Float

Returns the difference of x and y, x - y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
sub(+inf, y)    => +inf if y is any Float except +inf or NaN
+sub(-inf, y)    => -inf if y is any Float except -inf and NaN
+sub(x, +inf)    => -inf if x is any Float except +inf and NaN
+sub(x, -inf)    => +inf if x is any Float except -inf and NaN
+sub(+inf, +inf) => NaN
+sub(-inf, -inf) => NaN
+sub(NaN, y)     => NaN for any Float y
+sub(x, NaN)     => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.sub(1.23, 0.123) // => 1.107

public func mul(x : Float, y : Float) : Float

Returns the product of x and y, x * y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
mul(+inf, y) => +inf if y > 0.0
+mul(-inf, y) => -inf if y > 0.0
+mul(+inf, y) => -inf if y < 0.0
+mul(-inf, y) => +inf if y < 0.0
+mul(+inf, 0.0) => NaN
+mul(-inf, 0.0) => NaN
+mul(NaN, y) => NaN for any Float y

The same cases apply commutatively, i.e. for mul(y, x).

+

Example:

+
import Float "mo:base/Float";
+
+Float.mul(1.23, 1e2) // => 123.0

public func div(x : Float, y : Float) : Float

Returns the division of x by y, x / y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
div(0.0, 0.0) => NaN
+div(x, 0.0)   => +inf for x > 0.0
+div(x, 0.0)   => -inf for x < 0.0
+div(x, +inf)  => 0.0 for any x except +inf, -inf, and NaN
+div(x, -inf)  => 0.0 for any x except +inf, -inf, and NaN
+div(+inf, y)  => +inf if y >= 0.0
+div(+inf, y)  => -inf if y < 0.0
+div(-inf, y)  => -inf if y >= 0.0
+div(-inf, y)  => +inf if y < 0.0
+div(NaN, y)   => NaN for any Float y
+div(x, NaN)   => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.div(1.23, 1e2) // => 0.0123

public func rem(x : Float, y : Float) : Float

Returns the floating point division remainder x % y, +which is defined as x - trunc(x / y) * y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
rem(0.0, 0.0) => NaN
+rem(x, y)     => +inf if sign(x) == sign(y) for any x and y not being +inf, -inf, or NaN
+rem(x, y)     => -inf if sign(x) != sign(y) for any x and y not being +inf, -inf, or NaN
+rem(x, +inf)  => x for any x except +inf, -inf, and NaN
+rem(x, -inf)  => x for any x except +inf, -inf, and NaN
+rem(+inf, y)  => NaN for any Float y
+rem(-inf, y)  => NaN for any Float y
+rem(NaN, y)   => NaN for any Float y
+rem(x, NaN)   => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.rem(7.2, 2.3) // => 0.3 (with numerical imprecision)

public func pow(x : Float, y : Float) : Float

Returns x to the power of y, x ** y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
pow(+inf, y)    => +inf for any y > 0.0 including +inf
+pow(+inf, 0.0)  => 1.0
+pow(+inf, y)    => 0.0 for any y < 0.0 including -inf
+pow(x, +inf)    => +inf if x > 0.0 or x < 0.0
+pow(0.0, +inf)  => 0.0
+pow(x, -inf)    => 0.0 if x > 0.0 or x < 0.0
+pow(0.0, -inf)  => +inf
+pow(x, y)       => NaN if x < 0.0 and y is a non-integral Float
+pow(-inf, y)    => +inf if y > 0.0 and y is a non-integral or an even integral Float
+pow(-inf, y)    => -inf if y > 0.0 and y is an odd integral Float
+pow(-inf, 0.0)  => 1.0
+pow(-inf, y)    => 0.0 if y < 0.0
+pow(-inf, +inf) => +inf
+pow(-inf, -inf) => 1.0
+pow(NaN, y)     => NaN if y != 0.0
+pow(NaN, 0.0)   => 1.0
+pow(x, NaN)     => NaN for any Float x
+ +

Example:

+
import Float "mo:base/Float";
+
+Float.pow(2.5, 2.0) // => 6.25

\ No newline at end of file diff --git a/base-doc/Func.html b/base-doc/Func.html new file mode 100644 index 00000000000..8b4c339a4db --- /dev/null +++ b/base-doc/Func.html @@ -0,0 +1,23 @@ + +

Func

Functions on functions, creating functions from simpler inputs.

+

(Most commonly used when programming in functional style using higher-order +functions.)

+

public func compose<A, B, C>(f : B -> C, g : A -> B) : A -> C

Import from the base library to use this module.

+
motoko name=import
+import { compose; const; identity } = "mo:base/Func";
+import Text = "mo:base/Text";
+import Char = "mo:base/Char";

The composition of two functions f and g is a function that applies g and then f.

+

Example:

+
motoko include=import
+let textFromNat32 = compose(Text.fromChar, Char.fromNat32);
+assert textFromNat32(65) == "A";

public func identity<A>(x : A) : A

The identity function returns its argument. +Example:

+
motoko include=import
+assert identity(10) == 10;
+assert identity(true) == true;

public func const<A, B>(x : A) : B -> A

The const function is a curried function that accepts an argument x, +and then returns a function that discards its argument and always returns +the x.

+

Example:

+
motoko include=import
+assert const<Nat, Text>(10)("hello") == 10;
+assert const(true)(20) == true;

\ No newline at end of file diff --git a/base-doc/Hash.html b/base-doc/Hash.html new file mode 100644 index 00000000000..279297de400 --- /dev/null +++ b/base-doc/Hash.html @@ -0,0 +1,16 @@ + +

Hash

Hash values

+

type Hash = Nat32

Hash values represent a string of hash bits, packed into a Nat32.

+

public let length : Nat

The hash length, always 31.

+

public func bit(h : Hash, pos : Nat) : Bool

Project a given bit from the bit vector.

+

public func equal(ha : Hash, hb : Hash) : Bool

Test if two hashes are equal

+

public func hash(n : Nat) : Hash

Computes a hash from the least significant 32-bits of n, ignoring other bits. +@deprecated For large Nat values consider using a bespoke hash function that considers all of the argument's bits.

+

public func debugPrintBits(bits : Hash)

@deprecated This function will be removed in future.

+

public func debugPrintBitsRev(bits : Hash)

@deprecated This function will be removed in future.

+

public func hashNat8(key : [Hash]) : Hash

Jenkin's one at a time:

+

https://en.wikipedia.org/wiki/Jenkins_hash_function#one_at_a_time

+

The input type should actually be [Nat8]. +Note: Be sure to explode each Nat8 of a Nat32 into its own Nat32, and to shift into lower 8 bits. +@deprecated This function may be removed or changed in future.

+

\ No newline at end of file diff --git a/base-doc/HashMap.html b/base-doc/HashMap.html new file mode 100644 index 00000000000..f8f08077de6 --- /dev/null +++ b/base-doc/HashMap.html @@ -0,0 +1,206 @@ + +

HashMap

Class HashMap<K, V> provides a hashmap from keys of type K to values of type V. +The class is parameterized by the key's equality and hash functions, +and an initial capacity. However, the underlying allocation happens only when +the first key-value entry is inserted.

+

Internally, the map is represented as an array of AssocList (buckets). +The growth policy of the underyling array is very simple, for now: double +the current capacity when the expected bucket list size grows beyond a +certain constant.

+

WARNING: Certain operations are amortized O(1) time, such as put, but run +in worst case O(size) time. These worst case runtimes may exceed the cycles limit +per message if the size of the map is large enough. Further, this runtime analysis +assumes that the hash functions uniformly maps keys over the hash space. Grow these structures +with discretion, and with good hash functions. All amortized operations +below also list the worst case runtime.

+

For maps without amortization, see TrieMap.

+

Note on the constructor: +The argument initCapacity determines the initial number of buckets in the +underyling array. Also, the runtime and space anlyses in this documentation +assumes that the equality and hash functions for keys used to construct the +map run in O(1) time and space.

+

Example:

+
motoko name=initialize
+import HashMap "mo:base/HashMap";
+import Text "mo:base/Text";
+
+let map = HashMap.HashMap<Text, Nat>(5, Text.equal, Text.hash);
+ +

Runtime: O(1)

+

Space: O(1)

+

class HashMap<K, V>(
  initCapacity : Nat,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
)

public func size() : Nat

Returns the current number of key-value entries in the map.

+

Example:

+
motoko include=initialize
+map.size() // => 0
+ +

Runtime: O(1)

+

Space: O(1)

+

public func get(key : K) : (value : ?V)

Returns the value assocaited with key key if present and null otherwise.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.get("key") // => ?3
+ +

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Space: O(1)

+

public func put(key : K, value : V)

Insert the value value with key key. Overwrites any existing entry with key key.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.get("key") // => ?3
+ +

Expected Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Amortized Space: O(1), Worst Case Space: O(size)

+

Note: If this is the first entry into this map, this operation will cause +the initial allocation of the underlying array.

+

public func replace(key : K, value : V) : (oldValue : ?V)

Insert the value value with key key. Returns the previous value +associated with key key or null if no such value exists.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+ignore map.replace("key", 2); // => ?3
+map.get("key") // => ?2
+ +

Expected Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Amortized Space: O(1), Worst Case Space: O(size)

+

Note: If this is the first entry into this map, this operation will cause +the initial allocation of the underlying array.

+

public func delete(key : K)

Deletes the entry with the key key. Has no effect if key is not +present in the map.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.delete("key");
+map.get("key"); // => null
+ +

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Space: O(1), Worst Case Space: O(size)

+

public func remove(key : K) : (oldValue : ?V)

Deletes the entry with the key key. Returns the previous value +associated with key key or null if no such value exists.

+

Example:

+
motoko include=initialize
+map.put("key", 3);
+map.remove("key"); // => ?3
+ +

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Space: O(1), Worst Case Space: O(size)

+

public func keys() : Iter.Iter<K>

Returns an Iterator (Iter) over the keys of the map. +Iterator provides a single method next(), which returns +keys in no specific order, or null when out of keys to iterate over.

+

Example:

+
motoko include=initialize
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var keys = "";
+for (key in map.keys()) {
+  keys := key # " " # keys
+};
+keys // => "key3 key2 key1 "
+ +

Cost of iteration over all keys:

+

Runtime: O(size)

+

Space: O(1)

+

public func vals() : Iter.Iter<V>

Returns an Iterator (Iter) over the values of the map. +Iterator provides a single method next(), which returns +values in no specific order, or null when out of values to iterate over.

+

Example:

+
motoko include=initialize
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var sum = 0;
+for (value in map.vals()) {
+  sum += value;
+};
+sum // => 6
+ +

Cost of iteration over all values:

+

Runtime: O(size)

+

Space: O(1)

+

public func entries() : Iter.Iter<(K, V)>

Returns an Iterator (Iter) over the key-value pairs in the map. +Iterator provides a single method next(), which returns +pairs in no specific order, or null when out of pairs to iterate over.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var pairs = "";
+for ((key, value) in map.entries()) {
+  pairs := "(" # key # ", " # Nat.toText(value) # ") " # pairs
+};
+pairs // => "(key3, 3) (key2, 2) (key1, 1)"
+ +

Cost of iteration over all pairs:

+

Runtime: O(size)

+

Space: O(1)

+

public func clone<K, V>(
  map : HashMap<K, V>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : HashMap<K, V>

Returns a copy of map, initializing the copy with the provided equality +and hash functions.

+

Example:

+
motoko include=initialize
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 = HashMap.clone(map, Text.equal, Text.hash);
+map2.get("key1") // => ?1
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

public func fromIter<K, V>(
  iter : Iter.Iter<(K, V)>,
  initCapacity : Nat,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : HashMap<K, V>

Returns a new map, containing all entries given by the iterator iter. +The new map is initialized with the provided initial capacity, equality, +and hash functions.

+

Example:

+
motoko include=initialize
+let entries = [("key3", 3), ("key2", 2), ("key1", 1)];
+let iter = entries.vals();
+
+let map2 = HashMap.fromIter<Text, Nat>(iter, entries.size(), Text.equal, Text.hash);
+map2.get("key1") // => ?1
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

public func map<K, V1, V2>(
  hashMap : HashMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> V2
) : HashMap<K, V2>

Creates a new map by applying f to each entry in hashMap. Each entry +(k, v) in the old map is transformed into a new entry (k, v2), where +the new value v2 is created by applying f to (k, v).

+
motoko include=initialize
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 = HashMap.map<Text, Nat, Nat>(map, Text.equal, Text.hash, func (k, v) = v * 2);
+map2.get("key2") // => ?4
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<K, V1, V2>(
  hashMap : HashMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> ?V2
) : HashMap<K, V2>

Creates a new map by applying f to each entry in hashMap. For each entry +(k, v) in the old map, if f evaluates to null, the entry is discarded. +Otherwise, the entry is transformed into a new entry (k, v2), where +the new value v2 is the result of applying f to (k, v).

+
motoko include=initialize
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 =
+  HashMap.mapFilter<Text, Nat, Nat>(
+    map,
+    Text.equal,
+    Text.hash,
+    func (k, v) = if (v == 2) { null } else { ?(v * 2)}
+);
+map2.get("key3") // => ?6
+ +

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

\ No newline at end of file diff --git a/base-doc/Heap.html b/base-doc/Heap.html new file mode 100644 index 00000000000..7eb523970cd --- /dev/null +++ b/base-doc/Heap.html @@ -0,0 +1,103 @@ + +

Heap

Class Heap<X> provides a priority queue of elements of type X.

+

The class wraps a purely-functional implementation based on a leftist heap.

+

Note on the constructor: +The constructor takes in a comparison function compare that defines the +ordering between elements of type X. Most primitive types have a default +version of this comparison function defined in their modules (e.g. Nat.compare). +The runtime analysis in this documentation assumes that the compare function +runs in O(1) time and space.

+

Example:

+
motoko name=initialize
+import Heap "mo:base/Heap";
+import Text "mo:base/Text";
+
+let heap = Heap.Heap<Text>(Text.compare);
+ +

Runtime: O(1)

+

Space: O(1)

+

type Tree<X> = ?(Int, X, Tree<X>, Tree<X>)

class Heap<X>(compare : (X, X) -> O.Order)

public func put(x : X)

Inserts an element into the heap.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.peekMin() // => ?"apple"
+ +

Runtime: O(log(n))

+

Space: O(log(n))

+

public func peekMin() : ?X

Return the minimal element in the heap, or null if the heap is empty.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.peekMin() // => ?"apple"
+ +

Runtime: O(1)

+

Space: O(1)

+

public func deleteMin()

Delete the minimal element in the heap, if it exists.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.deleteMin();
+heap.peekMin(); // => ?"banana"
+ +

Runtime: O(log(n))

+

Space: O(log(n))

+

public func removeMin() : (minElement : ?X)

Delete and return the minimal element in the heap, if it exists.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.removeMin(); // => ?"apple"
+ +

Runtime: O(log(n))

+

Space: O(log(n))

+

public func share() : Tree<X>

Return a snapshot of the internal functional tree representation as sharable data. +The returned tree representation is not affected by subsequent changes of the Heap instance.

+

Example:

+
motoko include=initialize
+
+heap.put("banana");
+heap.share();
+ +

Useful for storing the heap as a stable variable, pretty-printing, and sharing it across async function calls, +i.e. passing it in async arguments or async results.

+

Runtime: O(1)

+

Space: O(1)

+

public func unsafeUnshare(tree : Tree<X>)

Rewraps a snapshot of a heap (obtained by share()) in a Heap instance. +The wrapping instance must be initialized with the same compare +function that created the snapshot.

+

Example:

+
motoko include=initialize
+
+heap.put("apple");
+heap.put("banana");
+let snapshot = heap.share();
+let heapCopy = Heap.Heap<Text>(Text.compare);
+heapCopy.unsafeUnshare(snapshot);
+heapCopy.peekMin() // => ?"apple"
+ +

Useful for loading a stored heap from a stable variable or accesing a heap +snapshot passed from an async function call.

+

Runtime: O(1).

+

Space: O(1).

+

public func fromIter<X>(iter : I.Iter<X>, compare : (X, X) -> O.Order) : Heap<X>

Returns a new Heap, containing all entries given by the iterator iter. +The new map is initialized with the provided compare function.

+

Example:

+
motoko include=initialize
+let entries = ["banana", "apple", "cantaloupe"];
+let iter = entries.vals();
+
+let newHeap = Heap.fromIter<Text>(iter, Text.compare);
+newHeap.peekMin() // => ?"apple"
+ +

Runtime: O(size)

+

Space: O(size)

+

\ No newline at end of file diff --git a/base-doc/Int.html b/base-doc/Int.html new file mode 100644 index 00000000000..17da4e2a66b --- /dev/null +++ b/base-doc/Int.html @@ -0,0 +1,184 @@ + +

Int

Signed integer numbers with infinite precision (also called big integers).

+

Most operations on integer numbers (e.g. addition) are available as built-in operators (e.g. -1 + 1). +This module provides equivalent functions and Text conversion.

+

Import from the base library to use this module.

+
motoko name=import
+import Int "mo:base/Int";

type Int = Prim.Types.Int

Infinite precision signed integers.

+

public func abs(x : Int) : Nat

Returns the absolute value of x.

+

Example:

+
motoko include=import
+Int.abs(-12) // => 12

public func toText(x : Int) : Text

Converts an integer number to its textual representation. Textual +representation do not contain underscores to represent commas.

+

Example:

+
motoko include=import
+Int.toText(-1234) // => "-1234"

public func min(x : Int, y : Int) : Int

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Int.min(2, -3) // => -3

public func max(x : Int, y : Int) : Int

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Int.max(2, -3) // => 2

public func hash(i : Int) : Hash.Hash

Computes a hash from the least significant 32-bits of i, ignoring other bits. +@deprecated For large Int values consider using a bespoke hash function that considers all of the argument's bits.

+

public func hashAcc(h1 : Hash.Hash, i : Int) : Hash.Hash

Computes an accumulated hash from h1 and the least significant 32-bits of i, ignoring other bits in i. +@deprecated For large Int values consider using a bespoke hash function that considers all of the argument's bits.

+

public func equal(x : Int, y : Int) : Bool

Equality function for Int types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+Int.equal(-1, -1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int.equal) // => true

public func notEqual(x : Int, y : Int) : Bool

Inequality function for Int types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+Int.notEqual(-1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Int, y : Int) : Bool

"Less than" function for Int types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+Int.less(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Int, y : Int) : Bool

"Less than or equal" function for Int types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+Int.lessOrEqual(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Int, y : Int) : Bool

"Greater than" function for Int types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+Int.greater(1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Int, y : Int) : Bool

"Greater than or equal" function for Int types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+Int.greaterOrEqual(1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Int, y : Int) : {#less; #equal; #greater}

General-purpose comparison function for Int. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Int.compare(-3, 2) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([1, -2, -3], Int.compare) // => [-3, -2, 1]

public func neg(x : Int) : Int

Returns the negation of x, -x .

+

Example:

+
motoko include=import
+Int.neg(123) // => -123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

public func add(x : Int, y : Int) : Int

Returns the sum of x and y, x + y.

+

No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.add(1, -2); // => -1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 0, Int.add) // => -4

public func sub(x : Int, y : Int) : Int

Returns the difference of x and y, x - y.

+

No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.sub(1, 2); // => -1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 0, Int.sub) // => 4

public func mul(x : Int, y : Int) : Int

Returns the product of x and y, x * y.

+

No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.mul(-2, 3); // => -6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 1, Int.mul) // => 6

public func div(x : Int, y : Int) : Int

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int.div(6, -2); // => -3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Int, y : Int) : Int

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int.rem(6, -4); // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Int, y : Int) : Int

Returns x to the power of y, x ** y.

+

Traps when y is negative or y > 2 ** 32 - 1. +No overflow since Int has infinite precision.

+

Example:

+
motoko include=import
+Int.pow(-2, 3); // => -8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Int16.html b/base-doc/Int16.html new file mode 100644 index 00000000000..063a7381412 --- /dev/null +++ b/base-doc/Int16.html @@ -0,0 +1,359 @@ + +

Int16

Provides utility functions on 16-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Int16 "mo:base/Int16";

type Int16 = Prim.Types.Int16

16-bit signed integers.

+

public let minimumValue : Int16

Minimum 16-bit integer value, -2 ** 15.

+

Example:

+
motoko include=import
+Int16.minimumValue // => -32_768 : Int16

public let maximumValue : Int16

Maximum 16-bit integer value, +2 ** 15 - 1.

+

Example:

+
motoko include=import
+Int16.maximumValue // => +32_767 : Int16

public let toInt : Int16 -> Int

Converts a 16-bit signed integer to a signed integer with infinite precision.

+

Example:

+
motoko include=import
+Int16.toInt(12_345) // => 12_345 : Int

public let fromInt : Int -> Int16

Converts a signed integer with infinite precision to a 16-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.fromInt(12_345) // => +12_345 : Int16

public let fromIntWrap : Int -> Int16

Converts a signed integer with infinite precision to a 16-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.fromIntWrap(-12_345) // => -12_345 : Int

public let fromInt8 : Int8 -> Int16

Converts a 8-bit signed integer to a 16-bit signed integer.

+

Example:

+
motoko include=import
+Int16.fromInt8(-123) // => -123 : Int16

public let toInt8 : Int16 -> Int8

Converts a 16-bit signed integer to a 8-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.toInt8(-123) // => -123 : Int8

public let fromInt32 : Int32 -> Int16

Converts a 32-bit signed integer to a 16-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.fromInt32(-12_345) // => -12_345 : Int16

public let toInt32 : Int16 -> Int32

Converts a 16-bit signed integer to a 32-bit signed integer.

+

Example:

+
motoko include=import
+Int16.toInt32(-12_345) // => -12_345 : Int32

public let fromNat16 : Nat16 -> Int16

Converts an unsigned 16-bit integer to a signed 16-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.fromNat16(12_345) // => +12_345 : Int16

public let toNat16 : Int16 -> Nat16

Converts a signed 16-bit integer to an unsigned 16-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.toNat16(-1) // => 65_535 : Nat16 // underflow

public func toText(x : Int16) : Text

Returns the Text representation of x. Textual representation do not +contain underscores to represent commas.

+

Example:

+
motoko include=import
+Int16.toText(-12345) // => "-12345"

public func abs(x : Int16) : Int16

Returns the absolute value of x.

+

Traps when x == -2 ** 15 (the minimum Int16 value).

+

Example:

+
motoko include=import
+Int16.abs(-12345) // => +12_345

public func min(x : Int16, y : Int16) : Int16

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Int16.min(+2, -3) // => -3

public func max(x : Int16, y : Int16) : Int16

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Int16.max(+2, -3) // => +2

public func equal(x : Int16, y : Int16) : Bool

Equality function for Int16 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+Int16.equal(-1, -1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int16>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int16>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int16.equal) // => true

public func notEqual(x : Int16, y : Int16) : Bool

Inequality function for Int16 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+Int16.notEqual(-1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Int16, y : Int16) : Bool

"Less than" function for Int16 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+Int16.less(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Int16, y : Int16) : Bool

"Less than or equal" function for Int16 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+Int16.lessOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Int16, y : Int16) : Bool

"Greater than" function for Int16 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+Int16.greater(-2, 1); // => false

public func greaterOrEqual(x : Int16, y : Int16) : Bool

"Greater than or equal" function for Int16 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+Int16.greaterOrEqual(-2, -2); // => true

public func compare(x : Int16, y : Int16) : {#less; #equal; #greater}

General-purpose comparison function for Int16. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Int16.compare(-3, 2) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int16], Int16.compare) // => [-3, -2, 1]

public func neg(x : Int16) : Int16

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 15).

+

Example:

+
motoko include=import
+Int16.neg(123) // => -123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

public func add(x : Int16, y : Int16) : Int16

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.add(100, 23) // => +123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int16, Int16>([1, -2, -3], 0, Int16.add) // => -4

public func sub(x : Int16, y : Int16) : Int16

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.sub(123, 100) // => +23
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int16, Int16>([1, -2, -3], 0, Int16.sub) // => 4

public func mul(x : Int16, y : Int16) : Int16

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.mul(12, 10) // => +120
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int16, Int16>([1, -2, -3], 1, Int16.mul) // => 6

public func div(x : Int16, y : Int16) : Int16

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int16.div(123, 10) // => +12
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Int16, y : Int16) : Int16

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int16.rem(123, 10) // => +3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Int16, y : Int16) : Int16

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 16.

+

Example:

+
motoko include=import
+Int16.pow(2, 10) // => +1_024
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Int16) : Int16

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+Int16.bitnot(-256 /* 0xff00 */) // => +255 // 0xff
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Int16, y : Int16) : Int16

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
motoko include=import
+Int16.bitand(0x0fff, 0x00f0) // => +240 // 0xf0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Int16, y : Int16) : Int16

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
motoko include=import
+Int16.bitor(0x0f0f, 0x00f0) // => +4_095 // 0x0fff

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Int16, y : Int16) : Int16

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
motoko include=import
+Int16.bitxor(0x0fff, 0x00f0) // => +3_855 // 0x0f0f

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Int16, y : Int16) : Int16

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 16, the semantics is the same as for bitshiftLeft(x, y % 16). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 16).

+

Example:

+
motoko include=import
+Int16.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Int16, y : Int16) : Int16

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 16, the semantics is the same as for bitshiftRight(x, y % 16). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 16).

+

Example:

+
motoko include=import
+Int16.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Int16, y : Int16) : Int16

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 16, the semantics is the same as for bitrotLeft(x, y % 16).

+

Example:

+
motoko include=import
+Int16.bitrotLeft(0x2001, 4) // => +18 // 0x12.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Int16, y : Int16) : Int16

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 16, the semantics is the same as for bitrotRight(x, y % 16).

+

Example:

+
motoko include=import
+Int16.bitrotRight(0x2010, 8) // => +4_128 // 0x01020.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Int16, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 16, the semantics is the same as for bittest(x, p % 16). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Int16.bittest(128, 7) // => true

public func bitset(x : Int16, p : Nat) : Int16

Returns the value of setting bit p in x to 1. +If p >= 16, the semantics is the same as for bitset(x, p % 16).

+

Example:

+
motoko include=import
+Int16.bitset(0, 7) // => +128

public func bitclear(x : Int16, p : Nat) : Int16

Returns the value of clearing bit p in x to 0. +If p >= 16, the semantics is the same as for bitclear(x, p % 16).

+

Example:

+
motoko include=import
+Int16.bitclear(-1, 7) // => -129

public func bitflip(x : Int16, p : Nat) : Int16

Returns the value of flipping bit p in x. +If p >= 16, the semantics is the same as for bitclear(x, p % 16).

+

Example:

+
motoko include=import
+Int16.bitflip(255, 7) // => +127

public let bitcountNonZero : (x : Int16) -> Int16

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Int16.bitcountNonZero(0xff) // => +8

public let bitcountLeadingZero : (x : Int16) -> Int16

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Int16.bitcountLeadingZero(0x80) // => +8

public let bitcountTrailingZero : (x : Int16) -> Int16

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Int16.bitcountTrailingZero(0x0100) // => +8

public func addWrap(x : Int16, y : Int16) : Int16

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.addWrap(2 ** 14, 2 ** 14) // => -32_768 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Int16, y : Int16) : Int16

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.subWrap(-2 ** 15, 1) // => +32_767 // underflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Int16, y : Int16) : Int16

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int16.mulWrap(2 ** 8, 2 ** 8) // => 0 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Int16, y : Int16) : Int16

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 16.

+

Example:

+
motoko include=import
+
+Int16.powWrap(2, 15) // => -32_768 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Int32.html b/base-doc/Int32.html new file mode 100644 index 00000000000..f7e24ec404b --- /dev/null +++ b/base-doc/Int32.html @@ -0,0 +1,374 @@ + +

Int32

Provides utility functions on 32-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Int32 "mo:base/Int32";

type Int32 = Prim.Types.Int32

32-bit signed integers.

+

public let minimumValue : Int32

Minimum 32-bit integer value, -2 ** 31.

+

Example:

+
motoko include=import
+Int32.minimumValue // => -2_147_483_648

public let maximumValue : Int32

Maximum 32-bit integer value, +2 ** 31 - 1.

+

Example:

+
motoko include=import
+Int32.maximumValue // => +2_147_483_647

public let toInt : Int32 -> Int

Converts a 32-bit signed integer to a signed integer with infinite precision.

+

Example:

+
motoko include=import
+Int32.toInt(123_456) // => 123_456 : Int

public let fromInt : Int -> Int32

Converts a signed integer with infinite precision to a 32-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.fromInt(123_456) // => +123_456 : Int32

public let fromIntWrap : Int -> Int32

Converts a signed integer with infinite precision to a 32-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.fromIntWrap(-123_456) // => -123_456 : Int

public let fromInt16 : Int16 -> Int32

Converts a 16-bit signed integer to a 32-bit signed integer.

+

Example:

+
motoko include=import
+Int32.fromInt16(-123) // => -123 : Int32

public let toInt16 : Int32 -> Int16

Converts a 32-bit signed integer to a 16-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.toInt16(-123) // => -123 : Int16

public let fromInt64 : Int64 -> Int32

Converts a 64-bit signed integer to a 32-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.fromInt64(-123_456) // => -123_456 : Int32

public let toInt64 : Int32 -> Int64

Converts a 32-bit signed integer to a 64-bit signed integer.

+

Example:

+
motoko include=import
+Int32.toInt64(-123_456) // => -123_456 : Int64

public let fromNat32 : Nat32 -> Int32

Converts an unsigned 32-bit integer to a signed 32-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.fromNat32(123_456) // => +123_456 : Int32

public let toNat32 : Int32 -> Nat32

Converts a signed 32-bit integer to an unsigned 32-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.toNat32(-1) // => 4_294_967_295 : Nat32 // underflow

public func toText(x : Int32) : Text

Returns the Text representation of x. Textual representation do not +contain underscores to represent commas.

+

Example:

+
motoko include=import
+Int32.toText(-123456) // => "-123456"

public func abs(x : Int32) : Int32

Returns the absolute value of x.

+

Traps when x == -2 ** 31 (the minimum Int32 value).

+

Example:

+
motoko include=import
+Int32.abs(-123456) // => +123_456

public func min(x : Int32, y : Int32) : Int32

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Int32.min(+2, -3) // => -3

public func max(x : Int32, y : Int32) : Int32

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Int32.max(+2, -3) // => +2

public func equal(x : Int32, y : Int32) : Bool

Equality function for Int32 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+Int32.equal(-1, -1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int32>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int32>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int32.equal) // => true

public func notEqual(x : Int32, y : Int32) : Bool

Inequality function for Int32 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+Int32.notEqual(-1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Int32, y : Int32) : Bool

"Less than" function for Int32 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+Int32.less(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Int32, y : Int32) : Bool

"Less than or equal" function for Int32 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+Int32.lessOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Int32, y : Int32) : Bool

"Greater than" function for Int32 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+Int32.greater(-2, -3); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Int32, y : Int32) : Bool

"Greater than or equal" function for Int32 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+Int32.greaterOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Int32, y : Int32) : {#less; #equal; #greater}

General-purpose comparison function for Int32. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Int32.compare(-3, 2) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int32], Int32.compare) // => [-3, -2, 1]

public func neg(x : Int32) : Int32

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 31).

+

Example:

+
motoko include=import
+Int32.neg(123) // => -123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

public func add(x : Int32, y : Int32) : Int32

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.add(100, 23) // => +123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int32, Int32>([1, -2, -3], 0, Int32.add) // => -4

public func sub(x : Int32, y : Int32) : Int32

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.sub(1234, 123) // => +1_111
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int32, Int32>([1, -2, -3], 0, Int32.sub) // => 6

public func mul(x : Int32, y : Int32) : Int32

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.mul(123, 100) // => +12_300
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int32, Int32>([1, -2, -3], 1, Int32.mul) // => 6

public func div(x : Int32, y : Int32) : Int32

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int32.div(123, 10) // => +12
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Int32, y : Int32) : Int32

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int32.rem(123, 10) // => +3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Int32, y : Int32) : Int32

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 32.

+

Example:

+
motoko include=import
+Int32.pow(2, 10) // => +1_024
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Int32) : Int32

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+Int32.bitnot(-256 /* 0xffff_ff00 */) // => +255 // 0xff
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Int32, y : Int32) : Int32

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
motoko include=import
+Int32.bitand(0xffff, 0x00f0) // => +240 // 0xf0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Int32, y : Int32) : Int32

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
motoko include=import
+Int32.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff
+ +

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Int32, y : Int32) : Int32

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
motoko include=import
+Int32.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Int32, y : Int32) : Int32

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 32, the semantics is the same as for bitshiftLeft(x, y % 32). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 32).

+

Example:

+
motoko include=import
+Int32.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Int32, y : Int32) : Int32

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 32, the semantics is the same as for bitshiftRight(x, y % 32). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 32).

+

Example:

+
motoko include=import
+Int32.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Int32, y : Int32) : Int32

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 32, the semantics is the same as for bitrotLeft(x, y % 32).

+

Example:

+
motoko include=import
+Int32.bitrotLeft(0x2000_0001, 4) // => +18 // 0x12.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Int32, y : Int32) : Int32

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 32, the semantics is the same as for bitrotRight(x, y % 32).

+

Example:

+
motoko include=import
+Int32.bitrotRight(0x0002_0001, 8) // => +16_777_728 // 0x0100_0200.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Int32, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 32, the semantics is the same as for bittest(x, p % 32). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Int32.bittest(128, 7) // => true

public func bitset(x : Int32, p : Nat) : Int32

Returns the value of setting bit p in x to 1. +If p >= 32, the semantics is the same as for bitset(x, p % 32).

+

Example:

+
motoko include=import
+Int32.bitset(0, 7) // => +128

public func bitclear(x : Int32, p : Nat) : Int32

Returns the value of clearing bit p in x to 0. +If p >= 32, the semantics is the same as for bitclear(x, p % 32).

+

Example:

+
motoko include=import
+Int32.bitclear(-1, 7) // => -129

public func bitflip(x : Int32, p : Nat) : Int32

Returns the value of flipping bit p in x. +If p >= 32, the semantics is the same as for bitclear(x, p % 32).

+

Example:

+
motoko include=import
+Int32.bitflip(255, 7) // => +127

public let bitcountNonZero : (x : Int32) -> Int32

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Int32.bitcountNonZero(0xffff) // => +16

public let bitcountLeadingZero : (x : Int32) -> Int32

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Int32.bitcountLeadingZero(0x8000) // => +16

public let bitcountTrailingZero : (x : Int32) -> Int32

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Int32.bitcountTrailingZero(0x0201_0000) // => +16

public func addWrap(x : Int32, y : Int32) : Int32

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.addWrap(2 ** 30, 2 ** 30) // => -2_147_483_648 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Int32, y : Int32) : Int32

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.subWrap(-2 ** 31, 1) // => +2_147_483_647 // underflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Int32, y : Int32) : Int32

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int32.mulWrap(2 ** 16, 2 ** 16) // => 0 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Int32, y : Int32) : Int32

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 32.

+

Example:

+
motoko include=import
+Int32.powWrap(2, 31) // => -2_147_483_648 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Int64.html b/base-doc/Int64.html new file mode 100644 index 00000000000..f8caee15cf8 --- /dev/null +++ b/base-doc/Int64.html @@ -0,0 +1,369 @@ + +

Int64

Provides utility functions on 64-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Int64 "mo:base/Int64";

type Int64 = Prim.Types.Int64

64-bit signed integers.

+

public let minimumValue : Int64

Minimum 64-bit integer value, -2 ** 63.

+

Example:

+
motoko include=import
+Int64.minimumValue // => -9_223_372_036_854_775_808

public let maximumValue : Int64

Maximum 64-bit integer value, +2 ** 63 - 1.

+

Example:

+
motoko include=import
+Int64.maximumValue // => +9_223_372_036_854_775_807

public let toInt : Int64 -> Int

Converts a 64-bit signed integer to a signed integer with infinite precision.

+

Example:

+
motoko include=import
+Int64.toInt(123_456) // => 123_456 : Int

public let fromInt : Int -> Int64

Converts a signed integer with infinite precision to a 64-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.fromInt(123_456) // => +123_456 : Int64

public let fromInt32 : Int32 -> Int64

Converts a 32-bit signed integer to a 64-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.fromInt32(-123_456) // => -123_456 : Int64

public let toInt32 : Int64 -> Int32

Converts a 64-bit signed integer to a 32-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.toInt32(-123_456) // => -123_456 : Int32

public let fromIntWrap : Int -> Int64

Converts a signed integer with infinite precision to a 64-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.fromIntWrap(-123_456) // => -123_456 : Int64

public let fromNat64 : Nat64 -> Int64

Converts an unsigned 64-bit integer to a signed 64-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.fromNat64(123_456) // => +123_456 : Int64

public let toNat64 : Int64 -> Nat64

Converts a signed 64-bit integer to an unsigned 64-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.toNat64(-1) // => 18_446_744_073_709_551_615 : Nat64 // underflow

public func toText(x : Int64) : Text

Returns the Text representation of x. Textual representation do not +contain underscores to represent commas.

+

Example:

+
motoko include=import
+Int64.toText(-123456) // => "-123456"

public func abs(x : Int64) : Int64

Returns the absolute value of x.

+

Traps when x == -2 ** 63 (the minimum Int64 value).

+

Example:

+
motoko include=import
+Int64.abs(-123456) // => +123_456

public func min(x : Int64, y : Int64) : Int64

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Int64.min(+2, -3) // => -3

public func max(x : Int64, y : Int64) : Int64

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Int64.max(+2, -3) // => +2

public func equal(x : Int64, y : Int64) : Bool

Equality function for Int64 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+Int64.equal(-1, -1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int64>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int64>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int64.equal) // => true

public func notEqual(x : Int64, y : Int64) : Bool

Inequality function for Int64 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+Int64.notEqual(-1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Int64, y : Int64) : Bool

"Less than" function for Int64 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+Int64.less(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Int64, y : Int64) : Bool

"Less than or equal" function for Int64 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+Int64.lessOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Int64, y : Int64) : Bool

"Greater than" function for Int64 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+Int64.greater(-2, -3); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Int64, y : Int64) : Bool

"Greater than or equal" function for Int64 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+Int64.greaterOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Int64, y : Int64) : {#less; #equal; #greater}

General-purpose comparison function for Int64. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Int64.compare(-3, 2) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int64], Int64.compare) // => [-3, -2, 1]

public func neg(x : Int64) : Int64

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 63).

+

Example:

+
motoko include=import
+Int64.neg(123) // => -123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

public func add(x : Int64, y : Int64) : Int64

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.add(1234, 123) // => +1_357
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int64, Int64>([1, -2, -3], 0, Int64.add) // => -4

public func sub(x : Int64, y : Int64) : Int64

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.sub(123, 100) // => +23
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int64, Int64>([1, -2, -3], 0, Int64.sub) // => 4

public func mul(x : Int64, y : Int64) : Int64

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.mul(123, 10) // => +1_230
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int64, Int64>([1, -2, -3], 1, Int64.mul) // => 6

public func div(x : Int64, y : Int64) : Int64

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int64.div(123, 10) // => +12
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Int64, y : Int64) : Int64

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int64.rem(123, 10) // => +3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Int64, y : Int64) : Int64

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 64.

+

Example:

+
motoko include=import
+Int64.pow(2, 10) // => +1_024
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Int64) : Int64

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+Int64.bitnot(-256 /* 0xffff_ffff_ffff_ff00 */) // => +255 // 0xff
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Int64, y : Int64) : Int64

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
motoko include=import
+Int64.bitand(0xffff, 0x00f0) // => +240 // 0xf0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Int64, y : Int64) : Int64

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
motoko include=import
+Int64.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff
+ +

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Int64, y : Int64) : Int64

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
motoko include=import
+Int64.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Int64, y : Int64) : Int64

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 64, the semantics is the same as for bitshiftLeft(x, y % 64). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 64).

+

Example:

+
motoko include=import
+Int64.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Int64, y : Int64) : Int64

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 64, the semantics is the same as for bitshiftRight(x, y % 64). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 64).

+

Example:

+
motoko include=import
+Int64.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Int64, y : Int64) : Int64

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 64, the semantics is the same as for bitrotLeft(x, y % 64).

+

Example:

+
motoko include=import
+
+Int64.bitrotLeft(0x2000_0000_0000_0001, 4) // => +18 // 0x12.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Int64, y : Int64) : Int64

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 64, the semantics is the same as for bitrotRight(x, y % 64).

+

Example:

+
motoko include=import
+Int64.bitrotRight(0x0002_0000_0000_0001, 48) // => +65538 // 0x1_0002.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Int64, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 64, the semantics is the same as for bittest(x, p % 64). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Int64.bittest(128, 7) // => true

public func bitset(x : Int64, p : Nat) : Int64

Returns the value of setting bit p in x to 1. +If p >= 64, the semantics is the same as for bitset(x, p % 64).

+

Example:

+
motoko include=import
+Int64.bitset(0, 7) // => +128

public func bitclear(x : Int64, p : Nat) : Int64

Returns the value of clearing bit p in x to 0. +If p >= 64, the semantics is the same as for bitclear(x, p % 64).

+

Example:

+
motoko include=import
+Int64.bitclear(-1, 7) // => -129

public func bitflip(x : Int64, p : Nat) : Int64

Returns the value of flipping bit p in x. +If p >= 64, the semantics is the same as for bitclear(x, p % 64).

+

Example:

+
motoko include=import
+Int64.bitflip(255, 7) // => +127

public let bitcountNonZero : (x : Int64) -> Int64

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Int64.bitcountNonZero(0xffff) // => +16

public let bitcountLeadingZero : (x : Int64) -> Int64

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Int64.bitcountLeadingZero(0x8000_0000) // => +32

public let bitcountTrailingZero : (x : Int64) -> Int64

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Int64.bitcountTrailingZero(0x0201_0000) // => +16

public func addWrap(x : Int64, y : Int64) : Int64

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.addWrap(2 ** 62, 2 ** 62) // => -9_223_372_036_854_775_808 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Int64, y : Int64) : Int64

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.subWrap(-2 ** 63, 1) // => +9_223_372_036_854_775_807 // underflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Int64, y : Int64) : Int64

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int64.mulWrap(2 ** 32, 2 ** 32) // => 0 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Int64, y : Int64) : Int64

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 64.

+

Example:

+
motoko include=import
+Int64.powWrap(2, 63) // => -9_223_372_036_854_775_808 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Int8.html b/base-doc/Int8.html new file mode 100644 index 00000000000..afbaa28572f --- /dev/null +++ b/base-doc/Int8.html @@ -0,0 +1,366 @@ + +

Int8

Provides utility functions on 8-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Int8 "mo:base/Int8";

type Int8 = Prim.Types.Int8

8-bit signed integers.

+

public let minimumValue : Int8

Minimum 8-bit integer value, -2 ** 7.

+

Example:

+
motoko include=import
+Int8.minimumValue // => -128

public let maximumValue : Int8

Maximum 8-bit integer value, +2 ** 7 - 1.

+

Example:

+
motoko include=import
+Int8.maximumValue // => +127

public let toInt : Int8 -> Int

Converts an 8-bit signed integer to a signed integer with infinite precision.

+

Example:

+
motoko include=import
+Int8.toInt(123) // => 123 : Int

public let fromInt : Int -> Int8

Converts a signed integer with infinite precision to an 8-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.fromInt(123) // => +123 : Int8

public let fromIntWrap : Int -> Int8

Converts a signed integer with infinite precision to an 8-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.fromIntWrap(-123) // => -123 : Int

public let fromInt16 : Int16 -> Int8

Converts a 16-bit signed integer to an 8-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.fromInt16(123) // => +123 : Int8

public let toInt16 : Int8 -> Int16

Converts an 8-bit signed integer to a 16-bit signed integer.

+

Example:

+
motoko include=import
+Int8.toInt16(123) // => +123 : Int16

public let fromNat8 : Nat8 -> Int8

Converts an unsigned 8-bit integer to a signed 8-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.fromNat8(123) // => +123 : Int8

public let toNat8 : Int8 -> Nat8

Converts a signed 8-bit integer to an unsigned 8-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.toNat8(-1) // => 255 : Nat8 // underflow

public func toText(x : Int8) : Text

Converts an integer number to its textual representation.

+

Example:

+
motoko include=import
+Int8.toText(-123) // => "-123"

public func abs(x : Int8) : Int8

Returns the absolute value of x.

+

Traps when x == -2 ** 7 (the minimum Int8 value).

+

Example:

+
motoko include=import
+Int8.abs(-123) // => +123

public func min(x : Int8, y : Int8) : Int8

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Int8.min(+2, -3) // => -3

public func max(x : Int8, y : Int8) : Int8

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Int8.max(+2, -3) // => +2

public func equal(x : Int8, y : Int8) : Bool

Equality function for Int8 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+Int8.equal(-1, -1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int8>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int8>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int8.equal) // => true

public func notEqual(x : Int8, y : Int8) : Bool

Inequality function for Int8 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+Int8.notEqual(-1, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Int8, y : Int8) : Bool

"Less than" function for Int8 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+Int8.less(-2, 1); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Int8, y : Int8) : Bool

"Less than or equal" function for Int8 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+Int8.lessOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Int8, y : Int8) : Bool

"Greater than" function for Int8 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+Int8.greater(-2, -3); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Int8, y : Int8) : Bool

"Greater than or equal" function for Int8 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+Int8.greaterOrEqual(-2, -2); // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Int8, y : Int8) : {#less; #equal; #greater}

General-purpose comparison function for Int8. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Int8.compare(-3, 2) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int8], Int8.compare) // => [-3, -2, 1]

public func neg(x : Int8) : Int8

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 7).

+

Example:

+
motoko include=import
+Int8.neg(123) // => -123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

public func add(x : Int8, y : Int8) : Int8

Returns the sum of x and y, x + y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.add(100, 23) // => +123
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int8, Int8>([1, -2, -3], 0, Int8.add) // => -4

public func sub(x : Int8, y : Int8) : Int8

Returns the difference of x and y, x - y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.sub(123, 23) // => +100
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int8, Int8>([1, -2, -3], 0, Int8.sub) // => 4

public func mul(x : Int8, y : Int8) : Int8

Returns the product of x and y, x * y.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.mul(12, 10) // => +120
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Int8, Int8>([1, -2, -3], 1, Int8.mul) // => 6

public func div(x : Int8, y : Int8) : Int8

Returns the signed integer division of x by y, x / y. +Rounds the quotient towards zero, which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int8.div(123, 10) // => +12
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Int8, y : Int8) : Int8

Returns the remainder of the signed integer division of x by y, x % y, +which is defined as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
motoko include=import
+Int8.rem(123, 10) // => +3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Int8, y : Int8) : Int8

Returns x to the power of y, x ** y.

+

Traps on overflow/underflow and when y < 0 or y >= 8.

+

Example:

+
motoko include=import
+Int8.pow(2, 6) // => +64
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Int8) : Int8

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+Int8.bitnot(-16 /* 0xf0 */) // => +15 // 0x0f
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Int8, y : Int8) : Int8

Returns the bitwise "and" of x and y, x & y.

+

Example:

+
motoko include=import
+Int8.bitand(0x1f, 0x70) // => +16 // 0x10
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Int8, y : Int8) : Int8

Returns the bitwise "or" of x and y, x | y.

+

Example:

+
motoko include=import
+Int8.bitor(0x0f, 0x70) // => +127 // 0x7f
+ +

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Int8, y : Int8) : Int8

Returns the bitwise "exclusive or" of x and y, x ^ y.

+

Example:

+
motoko include=import
+Int8.bitxor(0x70, 0x7f) // => +15 // 0x0f
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Int8, y : Int8) : Int8

Returns the bitwise left shift of x by y, x << y. +The right bits of the shift filled with zeros. +Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 8, the semantics is the same as for bitshiftLeft(x, y % 8). +For y < 0, the semantics is the same as for bitshiftLeft(x, y + y % 8).

+

Example:

+
motoko include=import
+Int8.bitshiftLeft(1, 4) // => +16 // 0x10 equivalent to `2 ** 4`.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Int8, y : Int8) : Int8

Returns the signed bitwise right shift of x by y, x >> y. +The sign bit is retained and the left side is filled with the sign bit. +Right-underflowing bits are discarded, i.e. not rotated to the left side.

+

For y >= 8, the semantics is the same as for bitshiftRight(x, y % 8). +For y < 0, the semantics is the same as for bitshiftRight (x, y + y % 8).

+

Example:

+
motoko include=import
+Int8.bitshiftRight(64, 4) // => +4 // equivalent to `64 / (2 ** 4)`
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Int8, y : Int8) : Int8

Returns the bitwise left rotatation of x by y, x <<> y. +Each left-overflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 8, the semantics is the same as for bitrotLeft(x, y % 8).

+

Example:

+
motoko include=import
+Int8.bitrotLeft(0x11 /* 0b0001_0001 */, 2) // => +68 // 0b0100_0100 == 0x44.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Int8, y : Int8) : Int8

Returns the bitwise right rotation of x by y, x <>> y. +Each right-underflowing bit is inserted again on the right side. +The sign bit is rotated like other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. +For y >= 8, the semantics is the same as for bitrotRight(x, y % 8).

+

Example:

+
motoko include=import
+Int8.bitrotRight(0x11 /* 0b0001_0001 */, 1) // => -120 // 0b1000_1000 == 0x88.
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Int8, p : Nat) : Bool

Returns the value of bit p in x, x & 2**p == 2**p. +If p >= 8, the semantics is the same as for bittest(x, p % 8). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Int8.bittest(64, 6) // => true

public func bitset(x : Int8, p : Nat) : Int8

Returns the value of setting bit p in x to 1. +If p >= 8, the semantics is the same as for bitset(x, p % 8).

+

Example:

+
motoko include=import
+Int8.bitset(0, 6) // => +64

public func bitclear(x : Int8, p : Nat) : Int8

Returns the value of clearing bit p in x to 0. +If p >= 8, the semantics is the same as for bitclear(x, p % 8).

+

Example:

+
motoko include=import
+Int8.bitclear(-1, 6) // => -65

public func bitflip(x : Int8, p : Nat) : Int8

Returns the value of flipping bit p in x. +If p >= 8, the semantics is the same as for bitclear(x, p % 8).

+

Example:

+
motoko include=import
+Int8.bitflip(127, 6) // => +63

public let bitcountNonZero : (x : Int8) -> Int8

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Int8.bitcountNonZero(0x0f) // => +4

public let bitcountLeadingZero : (x : Int8) -> Int8

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Int8.bitcountLeadingZero(0x08) // => +4

public let bitcountTrailingZero : (x : Int8) -> Int8

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Int8.bitcountTrailingZero(0x10) // => +4

public func addWrap(x : Int8, y : Int8) : Int8

Returns the sum of x and y, x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.addWrap(2 ** 6, 2 ** 6) // => -128 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Int8, y : Int8) : Int8

Returns the difference of x and y, x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.subWrap(-2 ** 7, 1) // => +127 // underflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Int8, y : Int8) : Int8

Returns the product of x and y, x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Int8.mulWrap(2 ** 4, 2 ** 4) // => 0 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Int8, y : Int8) : Int8

Returns x to the power of y, x **% y.

+

Wraps on overflow/underflow. +Traps if y < 0 or y >= 8.

+

Example:

+
motoko include=import
+Int8.powWrap(2, 7) // => -128 // overflow
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Iter.html b/base-doc/Iter.html new file mode 100644 index 00000000000..b23f3f6ae25 --- /dev/null +++ b/base-doc/Iter.html @@ -0,0 +1,66 @@ + +

Iter

Iterators

+

type Iter<T> = { next : () -> ?T }

An iterator that produces values of type T. Calling next returns +null when iteration is finished.

+

Iterators are inherently stateful. Calling next "consumes" a value from +the Iterator that cannot be put back, so keep that in mind when sharing +iterators between consumers.

+

An iterater i can be iterated over using

+
for (x in i) {
+  …do something with x…
+}

class range(x : Nat, y : Int)

public func next() : ?Nat

Creates an iterator that produces all Nats from x to y including +both of the bounds.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+assert(?1 == iter.next());
+assert(?2 == iter.next());
+assert(?3 == iter.next());
+assert(null == iter.next());

class revRange(x : Int, y : Int)

public func next() : ?Int

Like range but produces the values in the opposite +order.

+

public func iterate<A>(xs : Iter<A>, f : (A, Nat) -> ())

Calls a function f on every value produced by an iterator and discards +the results. If you're looking to keep these results use map instead.

+
import Iter "mo:base/Iter";
+var sum = 0;
+Iter.iterate<Nat>(Iter.range(1, 3), func(x, _index) {
+  sum += x;
+});
+assert(6 == sum)

public func size<A>(xs : Iter<A>) : Nat

Consumes an iterator and counts how many elements were produced +(discarding them in the process).

+

public func map<A, B>(xs : Iter<A>, f : A -> B) : Iter<B>

Takes a function and an iterator and returns a new iterator that lazily applies +the function to every element produced by the argument iterator.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+let mappedIter = Iter.map(iter, func (x : Nat) : Nat { x * 2 });
+assert(?2 == mappedIter.next());
+assert(?4 == mappedIter.next());
+assert(?6 == mappedIter.next());
+assert(null == mappedIter.next());

public func filter<A>(xs : Iter<A>, f : A -> Bool) : Iter<A>

Takes a function and an iterator and returns a new iterator that produces +elements from the original iterator if and only if the predicate is true.

+
import Iter "o:base/Iter";
+let iter = Iter.range(1, 3);
+let mappedIter = Iter.filter(iter, func (x : Nat) : Bool { x % 2 == 1 });
+assert(?1 == mappedIter.next());
+assert(?3 == mappedIter.next());
+assert(null == mappedIter.next());

public func make<A>(x : A) : Iter<A>

Creates an iterator that produces an infinite sequence of x.

+
import Iter "mo:base/Iter";
+let iter = Iter.make(10);
+assert(?10 == iter.next());
+assert(?10 == iter.next());
+assert(?10 == iter.next());
+// ...

public func fromArray<A>(xs : [A]) : Iter<A>

Creates an iterator that produces the elements of an Array in ascending index order.

+
import Iter "mo:base/Iter";
+let iter = Iter.fromArray([1, 2, 3]);
+assert(?1 == iter.next());
+assert(?2 == iter.next());
+assert(?3 == iter.next());
+assert(null == iter.next());

public func fromArrayMut<A>(xs : [var A]) : Iter<A>

Like fromArray but for Arrays with mutable elements. Captures +the elements of the Array at the time the iterator is created, so +further modifications won't be reflected in the iterator.

+

public let fromList :

Like fromArray but for Lists.

+

public func toArray<A>(xs : Iter<A>) : [A]

Consumes an iterator and collects its produced elements in an Array.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+assert([1, 2, 3] == Iter.toArray(iter));

public func toArrayMut<A>(xs : Iter<A>) : [var A]

Like toArray but for Arrays with mutable elements.

+

public func toList<A>(xs : Iter<A>) : List.List<A>

Like toArray but for Lists.

+

public func sort<A>(xs : Iter<A>, compare : (A, A) -> Order.Order) : Iter<A>

Sorted iterator. Will iterate over all elements to sort them, necessarily.

+

\ No newline at end of file diff --git a/base-doc/IterType.html b/base-doc/IterType.html new file mode 100644 index 00000000000..aff2577fd94 --- /dev/null +++ b/base-doc/IterType.html @@ -0,0 +1,3 @@ + +

IterType

The Iterator type

+

type Iter<T> = { next : () -> ?T }

\ No newline at end of file diff --git a/base-doc/List.html b/base-doc/List.html new file mode 100644 index 00000000000..2e9bf824201 --- /dev/null +++ b/base-doc/List.html @@ -0,0 +1,430 @@ + +

List

Purely-functional, singly-linked lists. +A list of type List<T> is either null or an optional pair of a value of type T and a tail, itself of type List<T>.

+

To use this library, import it using:

+
motoko name=initialize
+import List "mo:base/List";

type List<T> = ?(T, List<T>)

public func nil<T>() : List<T>

Create an empty list.

+

Example:

+
motoko include=initialize
+List.nil<Nat>() // => null
+ +

Runtime: O(1)

+

Space: O(1)

+

public func isNil<T>(l : List<T>) : Bool

Check whether a list is empty and return true if the list is empty.

+

Example:

+
motoko include=initialize
+List.isNil<Nat>(null) // => true
+ +

Runtime: O(1)

+

Space: O(1)

+

public func push<T>(x : T, l : List<T>) : List<T>

Add x to the head of list, and return the new list.

+

Example:

+
motoko include=initialize
+List.push<Nat>(0, null) // => ?(0, null);
+ +

Runtime: O(1)

+

Space: O(1)

+

public func last<T>(l : List<T>) : ?T

Return the last element of the list, if present. +Example:

+
motoko include=initialize
+List.last<Nat>(?(0, ?(1, null))) // => ?1
+ +

Runtime: O(size)

+

Space: O(1)

+

public func pop<T>(l : List<T>) : (?T, List<T>)

Remove the head of the list, returning the optioned head and the tail of the list in a pair. +Returns (null, null) if the list is empty.

+

Example:

+
motoko include=initialize
+List.pop<Nat>(?(0, ?(1, null))) // => (?0, ?(1, null))
+ +

Runtime: O(1)

+

Space: O(1)

+

public func size<T>(l : List<T>) : Nat

Return the length of the list.

+

Example:

+
motoko include=initialize
+List.size<Nat>(?(0, ?(1, null))) // => 2
+ +

Runtime: O(size)

+

Space: O(1)

+

public func get<T>(l : List<T>, n : Nat) : ?T

Access any item in a list, zero-based.

+

NOTE: Indexing into a list is a linear operation, and usually an +indication that a list might not be the best data structure +to use.

+

Example:

+
motoko include=initialize
+List.get<Nat>(?(0, ?(1, null)), 1) // => ?1
+ +

Runtime: O(size)

+

Space: O(1)

+

public func reverse<T>(l : List<T>) : List<T>

Reverses the list.

+

Example:

+
motoko include=initialize
+List.reverse<Nat>(?(0, ?(1, ?(2, null)))) // => ?(2, ?(1, ?(0, null)))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func iterate<T>(l : List<T>, f : T -> ())

Call the given function for its side effect, with each list element in turn.

+

Example:

+
motoko include=initialize
+var sum = 0;
+List.iterate<Nat>(?(0, ?(1, ?(2, null))), func n { sum += n });
+sum // => 3
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func map<T, U>(l : List<T>, f : T -> U) : List<U>

Call the given function f on each list element and collect the results +in a new list.

+

Example:

+
motoko include=initialize
+import Nat = "mo:base/Nat"
+List.map<Nat, Text>(?(0, ?(1, ?(2, null))), Nat.toText) // => ?("0", ?("1", ?("2", null))
+ +

Runtime: O(size)

+

Space: O(size) +*Runtime and space assumes that f runs in O(1) time and space.

+

public func filter<T>(l : List<T>, f : T -> Bool) : List<T>

Create a new list with only those elements of the original list for which +the given function (often called the predicate) returns true.

+

Example:

+
motoko include=initialize
+List.filter<Nat>(?(0, ?(1, ?(2, null))), func n { n != 1 }) // => ?(0, ?(2, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func partition<T>(l : List<T>, f : T -> Bool) : (List<T>, List<T>)

Create two new lists from the results of a given function (f). +The first list only includes the elements for which the given +function f returns true and the second list only includes +the elements for which the function returns false.

+

Example:

+
motoko include=initialize
+List.partition<Nat>(?(0, ?(1, ?(2, null))), func n { n != 1 }) // => (?(0, ?(2, null)), ?(1, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapFilter<T, U>(l : List<T>, f : T -> ?U) : List<U>

Call the given function on each list element, and collect the non-null results +in a new list.

+

Example:

+
motoko include=initialize
+List.mapFilter<Nat, Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n {
+    if (n > 1) {
+      ?(n * 2);
+    } else {
+      null
+    }
+  }
+) // => ?(4, ?(6, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func mapResult<T, R, E>(xs : List<T>, f : T -> Result.Result<R, E>) : Result.Result<List<R>, E>

Maps a Result-returning function f over a List and returns either +the first error or a list of successful values.

+

Example:

+
motoko include=initialize
+List.mapResult<Nat, Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  func n {
+    if (n > 0) {
+      #ok(n * 2);
+    } else {
+      #err("Some element is zero")
+    }
+  }
+); // => #ok ?(2, ?(4, ?(6, null))
+ +

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func append<T>(l : List<T>, m : List<T>) : List<T>

Append the elements from one list to another list.

+

Example:

+
motoko include=initialize
+List.append<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  ?(3, ?(4, ?(5, null)))
+) // => ?(0, ?(1, ?(2, ?(3, ?(4, ?(5, null))))))
+ +

Runtime: O(size(l))

+

Space: O(size(l))

+

public func flatten<T>(l : List<List<T>>) : List<T>

Flatten, or concatenate, a list of lists as a list.

+

Example:

+
motoko include=initialize
+List.flatten<Nat>(
+  ?(?(0, ?(1, ?(2, null))),
+    ?(?(3, ?(4, ?(5, null))),
+      null))
+); // => ?(0, ?(1, ?(2, ?(3, ?(4, ?(5, null))))))
+ +

Runtime: O(size*size)

+

Space: O(size*size)

+

public func take<T>(l : List<T>, n : Nat) : List<T>

Returns the first n elements of the given list. +If the given list has fewer than n elements, this function returns +a copy of the full input list.

+

Example:

+
motoko include=initialize
+List.take<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  2
+); // => ?(0, ?(1, null))
+ +

Runtime: O(n)

+

Space: O(n)

+

public func drop<T>(l : List<T>, n : Nat) : List<T>

Drop the first n elements from the given list.

+

Example:

+
motoko include=initialize
+List.drop<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  2
+); // => ?(2, null)
+ +

Runtime: O(n)

+

Space: O(1)

+

public func foldLeft<T, S>(
  list : List<T>,
  base : S,
  combine : (S, T) -> S
) : S

Collapses the elements in list into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +left to right.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.foldLeft<Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  "",
+  func (acc, x) { acc # Nat.toText(x)}
+) // => "123"
+ +

Runtime: O(size(list))

+

Space: O(1) heap, O(1) stack

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func foldRight<T, S>(
  list : List<T>,
  base : S,
  combine : (T, S) -> S
) : S

Collapses the elements in buffer into a single value by starting with base +and progessively combining elements into base with combine. Iteration runs +right to left.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.foldRight<Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  "",
+  func (x, acc) { Nat.toText(x) # acc}
+) // => "123"
+ +

Runtime: O(size(list))

+

Space: O(1) heap, O(size(list)) stack

+

*Runtime and space assumes that combine runs in O(1) time and space.

+

public func find<T>(l : List<T>, f : T -> Bool) : ?T

Return the first element for which the given predicate f is true, +if such an element exists.

+

Example:

+
motoko include=initialize
+
+List.find<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+); // => ?2
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func some<T>(l : List<T>, f : T -> Bool) : Bool

Return true if there exists a list element for which +the given predicate f is true.

+

Example:

+
motoko include=initialize
+
+List.some<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+) // => true
+ +

Runtime: O(size(list))

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func all<T>(l : List<T>, f : T -> Bool) : Bool

Return true if the given predicate f is true for all list +elements.

+

Example:

+
motoko include=initialize
+
+List.all<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+); // => false
+ +

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func merge<T>(
  l1 : List<T>,
  l2 : List<T>,
  lessThanOrEqual : (T, T) -> Bool
) : List<T>

Merge two ordered lists into a single ordered list. +This function requires both list to be ordered as specified +by the given relation lessThanOrEqual.

+

Example:

+
motoko include=initialize
+
+List.merge<Nat>(
+  ?(1, ?(2, ?(4, null))),
+  ?(2, ?(4, ?(6, null))),
+  func (n1, n2) { n1 <= n2 }
+); // => ?(1, ?(2, ?(2, ?(4, ?(4, ?(6, null))))))),
+ +

Runtime: O(size(l1) + size(l2))

+

Space: O(size(l1) + size(l2))

+

*Runtime and space assumes that lessThanOrEqual runs in O(1) time and space.

+

public func compare<T>(
  l1 : List<T>,
  l2 : List<T>,
  compare : (T, T) -> Order.Order
) : Order.Order

Compare two lists using lexicographic ordering specified by argument function compare.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.compare<Nat>(
+  ?(1, ?(2, null)),
+  ?(3, ?(4, null)),
+  Nat.compare
+) // => #less
+ +

Runtime: O(size(l1))

+

Space: O(1)

+

*Runtime and space assumes that argument compare runs in O(1) time and space.

+

public func equal<T>(
  l1 : List<T>,
  l2 : List<T>,
  equal : (T, T) -> Bool
) : Bool

Compare two lists for equality using the argument function equal to determine equality of their elements.

+

Example:

+
motoko include=initialize
+import Nat "mo:base/Nat";
+
+List.equal<Nat>(
+  ?(1, ?(2, null)),
+  ?(3, ?(4, null)),
+  Nat.equal
+); // => false
+ +

Runtime: O(size(l1))

+

Space: O(1)

+

*Runtime and space assumes that argument equal runs in O(1) time and space.

+

public func tabulate<T>(n : Nat, f : Nat -> T) : List<T>

Generate a list based on a length and a function that maps from +a list index to a list element.

+

Example:

+
motoko include=initialize
+List.tabulate<Nat>(
+  3,
+  func n { n * 2 }
+) // => ?(0, ?(2, (?4, null)))
+ +

Runtime: O(n)

+

Space: O(n)

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func make<T>(x : T) : List<T>

Create a list with exactly one element.

+

Example:

+
motoko include=initialize
+List.make<Nat>(
+  0
+) // => ?(0, null)
+ +

Runtime: O(1)

+

Space: O(1)

+

public func replicate<T>(n : Nat, x : T) : List<T>

Create a list of the given length with the same value in each position.

+

Example:

+
motoko include=initialize
+List.replicate<Nat>(
+  3,
+  0
+) // => ?(0, ?(0, ?(0, null)))
+ +

Runtime: O(n)

+

Space: O(n)

+

public func zip<T, U>(xs : List<T>, ys : List<U>) : List<(T, U)>

Create a list of pairs from a pair of lists.

+

If the given lists have different lengths, then the created list will have a +length equal to the length of the smaller list.

+

Example:

+
motoko include=initialize
+List.zip<Nat, Text>(
+  ?(0, ?(1, ?(2, null))),
+  ?("0", ?("1", null)),
+) // => ?((0, "0"), ?((1, "1"), null))
+ +

Runtime: O(min(size(xs), size(ys)))

+

Space: O(min(size(xs), size(ys)))

+

public func zipWith<T, U, V>(
  xs : List<T>,
  ys : List<U>,
  f : (T, U) -> V
) : List<V>

Create a list in which elements are created by applying function f to each pair (x, y) of elements +occuring at the same position in list xs and list ys.

+

If the given lists have different lengths, then the created list will have a +length equal to the length of the smaller list.

+

Example:

+
motoko include=initialize
+import Nat = "mo:base/Nat";
+import Char = "mo:base/Char";
+
+List.zipWith<Nat, Char, Text>(
+  ?(0, ?(1, ?(2, null))),
+  ?('a', ?('b', null)),
+  func (n, c) { Nat.toText(n) # Char.toText(c) }
+) // => ?("0a", ?("1b", null))
+ +

Runtime: O(min(size(xs), size(ys)))

+

Space: O(min(size(xs), size(ys)))

+

*Runtime and space assumes that f runs in O(1) time and space.

+

public func split<T>(n : Nat, xs : List<T>) : (List<T>, List<T>)

Split the given list at the given zero-based index.

+

Example:

+
motoko include=initialize
+List.split<Nat>(
+  2,
+  ?(0, ?(1, ?(2, null)))
+) // => (?(0, ?(1, null)), ?(2, null))
+ +

Runtime: O(n)

+

Space: O(n)

+

public func chunks<T>(n : Nat, xs : List<T>) : List<List<T>>

Split the given list into chunks of length n. +The last chunk will be shorter if the length of the given list +does not divide by n evenly.

+

Example:

+
motoko include=initialize
+List.chunks<Nat>(
+  2,
+  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+)
+/* => ?(?(0, ?(1, null)),
+        ?(?(2, ?(3, null)),
+          ?(?(4, null),
+            null)))
+*/
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromArray<T>(xs : [T]) : List<T>

Convert an array into a list.

+

Example:

+
motoko include=initialize
+List.fromArray<Nat>([ 0, 1, 2, 3, 4])
+// =>  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func fromVarArray<T>(xs : [var T]) : List<T>

Convert a mutable array into a list.

+

Example:

+
motoko include=initialize
+List.fromVarArray<Nat>([var 0, 1, 2, 3, 4])
+// =>  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toArray<T>(xs : List<T>) : [T]

Create an array from a list. +Example:

+
motoko include=initialize
+List.toArray<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))
+// => [0, 1, 2, 3, 4]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toVarArray<T>(xs : List<T>) : [var T]

Create a mutable array from a list. +Example:

+
motoko include=initialize
+List.toVarArray<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))
+// => [var 0, 1, 2, 3, 4]
+ +

Runtime: O(size)

+

Space: O(size)

+

public func toIter<T>(xs : List<T>) : Iter.Iter<T>

Create an iterator from a list. +Example:

+
motoko include=initialize
+var sum = 0;
+for (n in List.toIter<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))) {
+  sum += n;
+};
+sum
+// => 10
+ +

Runtime: O(1)

+

Space: O(1)

+

\ No newline at end of file diff --git a/base-doc/Nat.html b/base-doc/Nat.html new file mode 100644 index 00000000000..efc43fd788e --- /dev/null +++ b/base-doc/Nat.html @@ -0,0 +1,205 @@ + +

Nat

Natural numbers with infinite precision.

+

Most operations on natural numbers (e.g. addition) are available as built-in operators (e.g. 1 + 1). +This module provides equivalent functions and Text conversion.

+

Import from the base library to use this module.

+
motoko name=import
+import Nat "mo:base/Nat";

type Nat = Prim.Types.Nat

Infinite precision natural numbers.

+

public func toText(n : Nat) : Text

Converts a natural number to its textual representation. Textual +representation do not contain underscores to represent commas.

+

Example:

+
motoko include=import
+Nat.toText 1234 // => "1234"

public func fromText(text : Text) : ?Nat

Creates a natural number from its textual representation. Returns null +if the input is not a valid natural number.

+

Note: The textual representation must not contain underscores.

+

Example:

+
motoko include=import
+Nat.fromText "1234" // => ?1234

public func min(x : Nat, y : Nat) : Nat

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Nat.min(1, 2) // => 1

public func max(x : Nat, y : Nat) : Nat

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Nat.max(1, 2) // => 2

public func equal(x : Nat, y : Nat) : Bool

Equality function for Nat types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+ignore Nat.equal(1, 1); // => true
+1 == 1 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat>(3);
+let buffer2 = Buffer.Buffer<Nat>(3);
+Buffer.equal(buffer1, buffer2, Nat.equal) // => true

public func notEqual(x : Nat, y : Nat) : Bool

Inequality function for Nat types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+ignore Nat.notEqual(1, 2); // => true
+1 != 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Nat, y : Nat) : Bool

"Less than" function for Nat types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+ignore Nat.less(1, 2); // => true
+1 < 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Nat, y : Nat) : Bool

"Less than or equal" function for Nat types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+ignore Nat.lessOrEqual(1, 2); // => true
+1 <= 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Nat, y : Nat) : Bool

"Greater than" function for Nat types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+ignore Nat.greater(2, 1); // => true
+2 > 1 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Nat, y : Nat) : Bool

"Greater than or equal" function for Nat types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+ignore Nat.greaterOrEqual(2, 1); // => true
+2 >= 1 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Nat, y : Nat) : {#less; #equal; #greater}

General purpose comparison function for Nat. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Nat.compare(2, 3) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([2, 3, 1], Nat.compare) // => [1, 2, 3]

public func add(x : Nat, y : Nat) : Nat

Returns the sum of x and y, x + y. This operator will never overflow +because Nat is infinite precision.

+

Example:

+
motoko include=import
+ignore Nat.add(1, 2); // => 3
+1 + 2 // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 0, Nat.add) // => 6

public func sub(x : Nat, y : Nat) : Nat

Returns the difference of x and y, x - y. +Traps on underflow below 0.

+

Example:

+
motoko include=import
+ignore Nat.sub(2, 1); // => 1
+// Add a type annotation to avoid a warning about the subtraction
+2 - 1 : Nat // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 10, Nat.sub) // => 4

public func mul(x : Nat, y : Nat) : Nat

Returns the product of x and y, x * y. This operator will never +overflow because Nat is infinite precision.

+

Example:

+
motoko include=import
+ignore Nat.mul(2, 3); // => 6
+2 * 3 // => 6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 1, Nat.mul) // => 6

public func div(x : Nat, y : Nat) : Nat

Returns the unsigned integer division of x by y, x / y. +Traps when y is zero.

+

The quotient is rounded down, which is equivalent to truncating the +decimal places of the quotient.

+

Example:

+
motoko include=import
+ignore Nat.div(6, 2); // => 3
+6 / 2 // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Nat, y : Nat) : Nat

Returns the remainder of unsigned integer division of x by y, x % y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat.rem(6, 4); // => 2
+6 % 4 // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Nat, y : Nat) : Nat

Returns x to the power of y, x ** y. Traps when y > 2^32. This operator +will never overflow because Nat is infinite precision.

+

Example:

+
motoko include=import
+ignore Nat.pow(2, 3); // => 8
+2 ** 3 // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitshiftLeft(x : Nat, y : Nat32) : Nat

Returns the (conceptual) bitwise shift left of x by y, x * (2 ** y).

+

Example:

+
motoko include=import
+Nat.bitshiftLeft(1, 3); // => 8
+ +

Note: The reason why this function is defined in this library (in absence +of the << operator) is so that you can use it as a function +value to pass to a higher order function. While Nat is not defined in terms +of bit patterns, conceptually it can be regarded as such, and the operation +is provided as a high-performance version of the corresponding arithmetic +rule.

+

public func bitshiftRight(x : Nat, y : Nat32) : Nat

Returns the (conceptual) bitwise shift right of x by y, x / (2 ** y).

+

Example:

+
motoko include=import
+Nat.bitshiftRight(8, 3); // => 1
+ +

Note: The reason why this function is defined in this library (in absence +of the >> operator) is so that you can use it as a function +value to pass to a higher order function. While Nat is not defined in terms +of bit patterns, conceptually it can be regarded as such, and the operation +is provided as a high-performance version of the corresponding arithmetic +rule.

+

\ No newline at end of file diff --git a/base-doc/Nat16.html b/base-doc/Nat16.html new file mode 100644 index 00000000000..8328e317fd0 --- /dev/null +++ b/base-doc/Nat16.html @@ -0,0 +1,332 @@ + +

Nat16

Provides utility functions on 16-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Nat16 "mo:base/Nat16";

type Nat16 = Prim.Types.Nat16

16-bit natural numbers.

+

public let maximumValue : Nat16

Maximum 16-bit natural number. 2 ** 16 - 1.

+

Example:

+
motoko include=import
+Nat16.maximumValue; // => 65536 : Nat16

public let toNat : Nat16 -> Nat

Converts a 16-bit unsigned integer to an unsigned integer with infinite precision.

+

Example:

+
motoko include=import
+Nat16.toNat(123); // => 123 : Nat

public let fromNat : Nat -> Nat16

Converts an unsigned integer with infinite precision to a 16-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat16.fromNat(123); // => 123 : Nat16

public func fromNat8(x : Nat8) : Nat16

Converts an 8-bit unsigned integer to a 16-bit unsigned integer.

+

Example:

+
motoko include=import
+Nat16.fromNat8(123); // => 123 : Nat16

public func toNat8(x : Nat16) : Nat8

Converts a 16-bit unsigned integer to an 8-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat16.toNat8(123); // => 123 : Nat8

public func fromNat32(x : Nat32) : Nat16

Converts a 32-bit unsigned integer to a 16-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat16.fromNat32(123); // => 123 : Nat16

public func toNat32(x : Nat16) : Nat32

Converts a 16-bit unsigned integer to a 32-bit unsigned integer.

+

Example:

+
motoko include=import
+Nat16.toNat32(123); // => 123 : Nat32

public let fromIntWrap : Int -> Nat16

Converts a signed integer with infinite precision to a 16-bit unsigned integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Nat16.fromIntWrap(123 : Int); // => 123 : Nat16

public func toText(x : Nat16) : Text

Converts x to its textual representation. Textual representation do not +contain underscores to represent commas.

+

Example:

+
motoko include=import
+Nat16.toText(1234); // => "1234" : Text

public func min(x : Nat16, y : Nat16) : Nat16

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Nat16.min(123, 200); // => 123 : Nat16

public func max(x : Nat16, y : Nat16) : Nat16

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Nat16.max(123, 200); // => 200 : Nat16

public func equal(x : Nat16, y : Nat16) : Bool

Equality function for Nat16 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+ignore Nat16.equal(1, 1); // => true
+(1 : Nat16) == (1 : Nat16) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat16>(3);
+let buffer2 = Buffer.Buffer<Nat16>(3);
+Buffer.equal(buffer1, buffer2, Nat16.equal) // => true

public func notEqual(x : Nat16, y : Nat16) : Bool

Inequality function for Nat16 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+ignore Nat16.notEqual(1, 2); // => true
+(1 : Nat16) != (2 : Nat16) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Nat16, y : Nat16) : Bool

"Less than" function for Nat16 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+ignore Nat16.less(1, 2); // => true
+(1 : Nat16) < (2 : Nat16) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Nat16, y : Nat16) : Bool

"Less than or equal" function for Nat16 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+ignore Nat16.lessOrEqual(1, 2); // => true
+(1 : Nat16) <= (2 : Nat16) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Nat16, y : Nat16) : Bool

"Greater than" function for Nat16 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+ignore Nat16.greater(2, 1); // => true
+(2 : Nat16) > (1 : Nat16) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Nat16, y : Nat16) : Bool

"Greater than or equal" function for Nat16 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+ignore Nat16.greaterOrEqual(2, 1); // => true
+(2 : Nat16) >= (1 : Nat16) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Nat16, y : Nat16) : {#less; #equal; #greater}

General purpose comparison function for Nat16. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Nat16.compare(2, 3) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat16], Nat16.compare) // => [1, 2, 3]

public func add(x : Nat16, y : Nat16) : Nat16

Returns the sum of x and y, x + y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat16.add(1, 2); // => 3
+(1 : Nat16) + (2 : Nat16) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat16, Nat16>([2, 3, 1], 0, Nat16.add) // => 6

public func sub(x : Nat16, y : Nat16) : Nat16

Returns the difference of x and y, x - y. +Traps on underflow.

+

Example:

+
motoko include=import
+ignore Nat16.sub(2, 1); // => 1
+(2 : Nat16) - (1 : Nat16) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat16, Nat16>([2, 3, 1], 20, Nat16.sub) // => 14

public func mul(x : Nat16, y : Nat16) : Nat16

Returns the product of x and y, x * y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat16.mul(2, 3); // => 6
+(2 : Nat16) * (3 : Nat16) // => 6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat16, Nat16>([2, 3, 1], 1, Nat16.mul) // => 6

public func div(x : Nat16, y : Nat16) : Nat16

Returns the quotient of x divided by y, x / y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat16.div(6, 2); // => 3
+(6 : Nat16) / (2 : Nat16) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Nat16, y : Nat16) : Nat16

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat16.rem(6, 4); // => 2
+(6 : Nat16) % (4 : Nat16) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Nat16, y : Nat16) : Nat16

Returns the power of x to y, x ** y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat16.pow(2, 3); // => 8
+(2 : Nat16) ** (3 : Nat16) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Nat16) : Nat16

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+ignore Nat16.bitnot(0); // => 65535
+^(0 : Nat16) // => 65535
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Nat16, y : Nat16) : Nat16

Returns the bitwise and of x and y, x & y.

+

Example:

+
motoko include=import
+ignore Nat16.bitand(0, 1); // => 0
+(0 : Nat16) & (1 : Nat16) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Nat16, y : Nat16) : Nat16

Returns the bitwise or of x and y, x | y.

+

Example:

+
motoko include=import
+ignore Nat16.bitor(0, 1); // => 1
+(0 : Nat16) | (1 : Nat16) // => 1

public func bitxor(x : Nat16, y : Nat16) : Nat16

Returns the bitwise exclusive or of x and y, x ^ y.

+

Example:

+
motoko include=import
+ignore Nat16.bitxor(0, 1); // => 1
+(0 : Nat16) ^ (1 : Nat16) // => 1

public func bitshiftLeft(x : Nat16, y : Nat16) : Nat16

Returns the bitwise shift left of x by y, x << y.

+

Example:

+
motoko include=import
+ignore Nat16.bitshiftLeft(1, 3); // => 8
+(1 : Nat16) << (3 : Nat16) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Nat16, y : Nat16) : Nat16

Returns the bitwise shift right of x by y, x >> y.

+

Example:

+
motoko include=import
+ignore Nat16.bitshiftRight(8, 3); // => 1
+(8 : Nat16) >> (3 : Nat16) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Nat16, y : Nat16) : Nat16

Returns the bitwise rotate left of x by y, x <<> y.

+

Example:

+
motoko include=import
+ignore Nat16.bitrotLeft(2, 1); // => 4
+(2 : Nat16) <<> (1 : Nat16) // => 4
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Nat16, y : Nat16) : Nat16

Returns the bitwise rotate right of x by y, x <>> y.

+

Example:

+
motoko include=import
+ignore Nat16.bitrotRight(1, 1); // => 32768
+(1 : Nat16) <>> (1 : Nat16) // => 32768
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Nat16, p : Nat) : Bool

Returns the value of bit p mod 16 in x, (x & 2^(p mod 16)) == 2^(p mod 16). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Nat16.bittest(5, 2); // => true

public func bitset(x : Nat16, p : Nat) : Nat16

Returns the value of setting bit p mod 16 in x to 1.

+

Example:

+
motoko include=import
+Nat16.bitset(0, 2); // => 4

public func bitclear(x : Nat16, p : Nat) : Nat16

Returns the value of clearing bit p mod 16 in x to 0.

+

Example:

+
motoko include=import
+Nat16.bitclear(5, 2); // => 1

public func bitflip(x : Nat16, p : Nat) : Nat16

Returns the value of flipping bit p mod 16 in x.

+

Example:

+
motoko include=import
+Nat16.bitflip(5, 2); // => 1

public let bitcountNonZero : (x : Nat16) -> Nat16

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Nat16.bitcountNonZero(5); // => 2

public let bitcountLeadingZero : (x : Nat16) -> Nat16

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Nat16.bitcountLeadingZero(5); // => 13

public let bitcountTrailingZero : (x : Nat16) -> Nat16

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Nat16.bitcountTrailingZero(5); // => 0

public func addWrap(x : Nat16, y : Nat16) : Nat16

Returns the sum of x and y, x +% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat16.addWrap(65532, 5); // => 1
+(65532 : Nat16) +% (5 : Nat16) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Nat16, y : Nat16) : Nat16

Returns the difference of x and y, x -% y. Wraps on underflow.

+

Example:

+
motoko include=import
+ignore Nat16.subWrap(1, 2); // => 65535
+(1 : Nat16) -% (2 : Nat16) // => 65535
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Nat16, y : Nat16) : Nat16

Returns the product of x and y, x *% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat16.mulWrap(655, 101); // => 619
+(655 : Nat16) *% (101 : Nat16) // => 619
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Nat16, y : Nat16) : Nat16

Returns x to the power of y, x **% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat16.powWrap(2, 16); // => 0
+(2 : Nat16) **% (16 : Nat16) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Nat32.html b/base-doc/Nat32.html new file mode 100644 index 00000000000..114936f6df3 --- /dev/null +++ b/base-doc/Nat32.html @@ -0,0 +1,343 @@ + +

Nat32

Provides utility functions on 32-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Nat32 "mo:base/Nat32";

type Nat32 = Prim.Types.Nat32

32-bit natural numbers.

+

public let maximumValue : Nat32

Maximum 32-bit natural number. 2 ** 32 - 1.

+

Example:

+
motoko include=import
+Nat32.maximumValue; // => 4294967295 : Nat32

public let toNat : Nat32 -> Nat

Converts a 32-bit unsigned integer to an unsigned integer with infinite precision.

+

Example:

+
motoko include=import
+Nat32.toNat(123); // => 123 : Nat

public let fromNat : Nat -> Nat32

Converts an unsigned integer with infinite precision to a 32-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat32.fromNat(123); // => 123 : Nat32

public func fromNat16(x : Nat16) : Nat32

Converts a 16-bit unsigned integer to a 32-bit unsigned integer.

+

Example:

+
motoko include=import
+Nat32.fromNat16(123); // => 123 : Nat32

public func toNat16(x : Nat32) : Nat16

Converts a 32-bit unsigned integer to a 16-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat32.toNat16(123); // => 123 : Nat16

public func fromNat64(x : Nat64) : Nat32

Converts a 64-bit unsigned integer to a 32-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat32.fromNat64(123); // => 123 : Nat32

public func toNat64(x : Nat32) : Nat64

Converts a 32-bit unsigned integer to a 64-bit unsigned integer.

+

Example:

+
motoko include=import
+Nat32.toNat64(123); // => 123 : Nat64

public let fromIntWrap : Int -> Nat32

Converts a signed integer with infinite precision to a 32-bit unsigned integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Nat32.fromIntWrap(123); // => 123 : Nat32

public func toText(x : Nat32) : Text

Converts x to its textual representation. Textual representation do not +contain underscores to represent commas.

+

Example:

+
motoko include=import
+Nat32.toText(1234); // => "1234" : Text

public func min(x : Nat32, y : Nat32) : Nat32

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Nat32.min(123, 456); // => 123 : Nat32

public func max(x : Nat32, y : Nat32) : Nat32

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Nat32.max(123, 456); // => 456 : Nat32

public func equal(x : Nat32, y : Nat32) : Bool

Equality function for Nat32 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+ignore Nat32.equal(1, 1); // => true
+(1 : Nat32) == (1 : Nat32) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat32>(3);
+let buffer2 = Buffer.Buffer<Nat32>(3);
+Buffer.equal(buffer1, buffer2, Nat32.equal) // => true

public func notEqual(x : Nat32, y : Nat32) : Bool

Inequality function for Nat32 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+ignore Nat32.notEqual(1, 2); // => true
+(1 : Nat32) != (2 : Nat32) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Nat32, y : Nat32) : Bool

"Less than" function for Nat32 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+ignore Nat32.less(1, 2); // => true
+(1 : Nat32) < (2 : Nat32) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Nat32, y : Nat32) : Bool

"Less than or equal" function for Nat32 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+ignore Nat32.lessOrEqual(1, 2); // => true
+(1 : Nat32) <= (2 : Nat32) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Nat32, y : Nat32) : Bool

"Greater than" function for Nat32 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+ignore Nat32.greater(2, 1); // => true
+(2 : Nat32) > (1 : Nat32) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Nat32, y : Nat32) : Bool

"Greater than or equal" function for Nat32 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+ignore Nat32.greaterOrEqual(2, 1); // => true
+(2 : Nat32) >= (1 : Nat32) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Nat32, y : Nat32) : {#less; #equal; #greater}

General purpose comparison function for Nat32. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Nat32.compare(2, 3) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat32], Nat32.compare) // => [1, 2, 3]

public func add(x : Nat32, y : Nat32) : Nat32

Returns the sum of x and y, x + y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat32.add(1, 2); // => 3
+(1 : Nat32) + (2 : Nat32) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat32, Nat32>([2, 3, 1], 0, Nat32.add) // => 6

public func sub(x : Nat32, y : Nat32) : Nat32

Returns the difference of x and y, x - y. +Traps on underflow.

+

Example:

+
motoko include=import
+ignore Nat32.sub(2, 1); // => 1
+(2 : Nat32) - (1 : Nat32) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat32, Nat32>([2, 3, 1], 20, Nat32.sub) // => 14

public func mul(x : Nat32, y : Nat32) : Nat32

Returns the product of x and y, x * y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat32.mul(2, 3); // => 6
+(2 : Nat32) * (3 : Nat32) // => 6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat32, Nat32>([2, 3, 1], 1, Nat32.mul) // => 6

public func div(x : Nat32, y : Nat32) : Nat32

Returns the division of x by y, x / y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat32.div(6, 2); // => 3
+(6 : Nat32) / (2 : Nat32) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Nat32, y : Nat32) : Nat32

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat32.rem(6, 4); // => 2
+(6 : Nat32) % (4 : Nat32) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Nat32, y : Nat32) : Nat32

Returns x to the power of y, x ** y. Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat32.pow(2, 3); // => 8
+(2 : Nat32) ** (3 : Nat32) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Nat32) : Nat32

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+ignore Nat32.bitnot(0) // => 4294967295
+^(0 : Nat32) // => 4294967295
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Nat32, y : Nat32) : Nat32

Returns the bitwise and of x and y, x & y.

+

Example:

+
motoko include=import
+ignore Nat32.bitand(1, 3); // => 1
+(1 : Nat32) & (3 : Nat32) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Nat32, y : Nat32) : Nat32

Returns the bitwise or of x and y, x | y.

+

Example:

+
motoko include=import
+ignore Nat32.bitor(1, 3); // => 3
+(1 : Nat32) | (3 : Nat32) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Nat32, y : Nat32) : Nat32

Returns the bitwise exclusive or of x and y, x ^ y.

+

Example:

+
motoko include=import
+ignore Nat32.bitxor(1, 3); // => 2
+(1 : Nat32) ^ (3 : Nat32) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Nat32, y : Nat32) : Nat32

Returns the bitwise shift left of x by y, x << y.

+

Example:

+
motoko include=import
+ignore Nat32.bitshiftLeft(1, 3); // => 8
+(1 : Nat32) << (3 : Nat32) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Nat32, y : Nat32) : Nat32

Returns the bitwise shift right of x by y, x >> y.

+

Example:

+
motoko include=import
+ignore Nat32.bitshiftRight(8, 3); // => 1
+(8 : Nat32) >> (3 : Nat32) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Nat32, y : Nat32) : Nat32

Returns the bitwise rotate left of x by y, x <<> y.

+

Example:

+
motoko include=import
+ignore Nat32.bitrotLeft(1, 3); // => 8
+(1 : Nat32) <<> (3 : Nat32) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Nat32, y : Nat32) : Nat32

Returns the bitwise rotate right of x by y, x <>> y.

+

Example:

+
motoko include=import
+ignore Nat32.bitrotRight(1, 1); // => 2147483648
+(1 : Nat32) <>> (1 : Nat32) // => 2147483648
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Nat32, p : Nat) : Bool

Returns the value of bit p mod 32 in x, (x & 2^(p mod 32)) == 2^(p mod 32). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Nat32.bittest(5, 2); // => true

public func bitset(x : Nat32, p : Nat) : Nat32

Returns the value of setting bit p mod 32 in x to 1.

+

Example:

+
motoko include=import
+Nat32.bitset(5, 1); // => 7

public func bitclear(x : Nat32, p : Nat) : Nat32

Returns the value of clearing bit p mod 32 in x to 0.

+

Example:

+
motoko include=import
+Nat32.bitclear(5, 2); // => 1

public func bitflip(x : Nat32, p : Nat) : Nat32

Returns the value of flipping bit p mod 32 in x.

+

Example:

+
motoko include=import
+Nat32.bitflip(5, 2); // => 1

public let bitcountNonZero : (x : Nat32) -> Nat32

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Nat32.bitcountNonZero(5); // => 2

public let bitcountLeadingZero : (x : Nat32) -> Nat32

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Nat32.bitcountLeadingZero(5); // => 29

public let bitcountTrailingZero : (x : Nat32) -> Nat32

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Nat32.bitcountTrailingZero(16); // => 4

public func addWrap(x : Nat32, y : Nat32) : Nat32

Returns the sum of x and y, x +% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat32.addWrap(4294967295, 1); // => 0
+(4294967295 : Nat32) +% (1 : Nat32) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Nat32, y : Nat32) : Nat32

Returns the difference of x and y, x -% y. Wraps on underflow.

+

Example:

+
motoko include=import
+ignore Nat32.subWrap(0, 1); // => 4294967295
+(0 : Nat32) -% (1 : Nat32) // => 4294967295
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Nat32, y : Nat32) : Nat32

Returns the product of x and y, x *% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat32.mulWrap(2147483648, 2); // => 0
+(2147483648 : Nat32) *% (2 : Nat32) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Nat32, y : Nat32) : Nat32

Returns x to the power of y, x **% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat32.powWrap(2, 32); // => 0
+(2 : Nat32) **% (32 : Nat32) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Nat64.html b/base-doc/Nat64.html new file mode 100644 index 00000000000..923404b2eeb --- /dev/null +++ b/base-doc/Nat64.html @@ -0,0 +1,336 @@ + +

Nat64

Provides utility functions on 64-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Nat64 "mo:base/Nat64";

type Nat64 = Prim.Types.Nat64

64-bit natural numbers.

+

public let maximumValue : Nat64

Maximum 64-bit natural number. 2 ** 64 - 1.

+

Example:

+
motoko include=import
+Nat64.maximumValue; // => 18446744073709551615 : Nat64

public let toNat : Nat64 -> Nat

Converts a 64-bit unsigned integer to an unsigned integer with infinite precision.

+

Example:

+
motoko include=import
+Nat64.toNat(123); // => 123 : Nat

public let fromNat : Nat -> Nat64

Converts an unsigned integer with infinite precision to a 64-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat64.fromNat(123); // => 123 : Nat64

public func fromNat32(x : Nat32) : Nat64

Converts a 32-bit unsigned integer to a 64-bit unsigned integer.

+

Example:

+
motoko include=import
+Nat64.fromNat32(123); // => 123 : Nat64

public func toNat32(x : Nat64) : Nat32

Converts a 64-bit unsigned integer to a 32-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat64.toNat32(123); // => 123 : Nat32

public let fromIntWrap : Int -> Nat64

Converts a signed integer with infinite precision to a 64-bit unsigned integer.

+

Traps on overflow/underflow.

+

Example:

+
motoko include=import
+Nat64.fromIntWrap(123); // => 123 : Nat64

public func toText(x : Nat64) : Text

Converts x to its textual representation. Textual representation do not +contain underscores to represent commas.

+

Example:

+
motoko include=import
+Nat64.toText(1234); // => "1234" : Text

public func min(x : Nat64, y : Nat64) : Nat64

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Nat64.min(123, 456); // => 123 : Nat64

public func max(x : Nat64, y : Nat64) : Nat64

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Nat64.max(123, 456); // => 456 : Nat64

public func equal(x : Nat64, y : Nat64) : Bool

Equality function for Nat64 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+ignore Nat64.equal(1, 1); // => true
+(1 : Nat64) == (1 : Nat64) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat64>(3);
+let buffer2 = Buffer.Buffer<Nat64>(3);
+Buffer.equal(buffer1, buffer2, Nat64.equal) // => true

public func notEqual(x : Nat64, y : Nat64) : Bool

Inequality function for Nat64 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+ignore Nat64.notEqual(1, 2); // => true
+(1 : Nat64) != (2 : Nat64) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Nat64, y : Nat64) : Bool

"Less than" function for Nat64 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+ignore Nat64.less(1, 2); // => true
+(1 : Nat64) < (2 : Nat64) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Nat64, y : Nat64) : Bool

"Less than or equal" function for Nat64 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+ignore Nat64.lessOrEqual(1, 2); // => true
+(1 : Nat64) <= (2 : Nat64) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Nat64, y : Nat64) : Bool

"Greater than" function for Nat64 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+ignore Nat64.greater(2, 1); // => true
+(2 : Nat64) > (1 : Nat64) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Nat64, y : Nat64) : Bool

"Greater than or equal" function for Nat64 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+ignore Nat64.greaterOrEqual(2, 1); // => true
+(2 : Nat64) >= (1 : Nat64) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Nat64, y : Nat64) : {#less; #equal; #greater}

General purpose comparison function for Nat64. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Nat64.compare(2, 3) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat64], Nat64.compare) // => [1, 2, 3]

public func add(x : Nat64, y : Nat64) : Nat64

Returns the sum of x and y, x + y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat64.add(1, 2); // => 3
+(1 : Nat64) + (2 : Nat64) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat64, Nat64>([2, 3, 1], 0, Nat64.add) // => 6

public func sub(x : Nat64, y : Nat64) : Nat64

Returns the difference of x and y, x - y. +Traps on underflow.

+

Example:

+
motoko include=import
+ignore Nat64.sub(3, 1); // => 2
+(3 : Nat64) - (1 : Nat64) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat64, Nat64>([2, 3, 1], 10, Nat64.sub) // => 4

public func mul(x : Nat64, y : Nat64) : Nat64

Returns the product of x and y, x * y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat64.mul(2, 3); // => 6
+(2 : Nat64) * (3 : Nat64) // => 6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat64, Nat64>([2, 3, 1], 1, Nat64.mul) // => 6

public func div(x : Nat64, y : Nat64) : Nat64

Returns the quotient of x divided by y, x / y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat64.div(6, 2); // => 3
+(6 : Nat64) / (2 : Nat64) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Nat64, y : Nat64) : Nat64

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat64.rem(6, 4); // => 2
+(6 : Nat64) % (4 : Nat64) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Nat64, y : Nat64) : Nat64

Returns x to the power of y, x ** y. Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat64.pow(2, 3); // => 8
+(2 : Nat64) ** (3 : Nat64) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Nat64) : Nat64

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+ignore Nat64.bitnot(0); // => 18446744073709551615
+^(0 : Nat64) // => 18446744073709551615
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Nat64, y : Nat64) : Nat64

Returns the bitwise and of x and y, x & y.

+

Example:

+
motoko include=import
+ignore Nat64.bitand(1, 3); // => 1
+(1 : Nat64) & (3 : Nat64) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Nat64, y : Nat64) : Nat64

Returns the bitwise or of x and y, x | y.

+

Example:

+
motoko include=import
+ignore Nat64.bitor(1, 3); // => 3
+(1 : Nat64) | (3 : Nat64) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Nat64, y : Nat64) : Nat64

Returns the bitwise exclusive or of x and y, x ^ y.

+

Example:

+
motoko include=import
+ignore Nat64.bitxor(1, 3); // => 2
+(1 : Nat64) ^ (3 : Nat64) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Nat64, y : Nat64) : Nat64

Returns the bitwise shift left of x by y, x << y.

+

Example:

+
motoko include=import
+ignore Nat64.bitshiftLeft(1, 3); // => 8
+(1 : Nat64) << (3 : Nat64) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Nat64, y : Nat64) : Nat64

Returns the bitwise shift right of x by y, x >> y.

+

Example:

+
motoko include=import
+ignore Nat64.bitshiftRight(8, 3); // => 1
+(8 : Nat64) >> (3 : Nat64) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Nat64, y : Nat64) : Nat64

Returns the bitwise rotate left of x by y, x <<> y.

+

Example:

+
motoko include=import
+ignore Nat64.bitrotLeft(1, 3); // => 8
+(1 : Nat64) <<> (3 : Nat64) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Nat64, y : Nat64) : Nat64

Returns the bitwise rotate right of x by y, x <>> y.

+

Example:

+
motoko include=import
+ignore Nat64.bitrotRight(8, 3); // => 1
+(8 : Nat64) <>> (3 : Nat64) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Nat64, p : Nat) : Bool

Returns the value of bit p mod 64 in x, (x & 2^(p mod 64)) == 2^(p mod 64). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Nat64.bittest(5, 2); // => true

public func bitset(x : Nat64, p : Nat) : Nat64

Returns the value of setting bit p mod 64 in x to 1.

+

Example:

+
motoko include=import
+Nat64.bitset(5, 1); // => 7

public func bitclear(x : Nat64, p : Nat) : Nat64

Returns the value of clearing bit p mod 64 in x to 0.

+

Example:

+
motoko include=import
+Nat64.bitclear(5, 2); // => 1

public func bitflip(x : Nat64, p : Nat) : Nat64

Returns the value of flipping bit p mod 64 in x.

+

Example:

+
motoko include=import
+Nat64.bitflip(5, 2); // => 1

public let bitcountNonZero : (x : Nat64) -> Nat64

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Nat64.bitcountNonZero(5); // => 2

public let bitcountLeadingZero : (x : Nat64) -> Nat64

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Nat64.bitcountLeadingZero(5); // => 61

public let bitcountTrailingZero : (x : Nat64) -> Nat64

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Nat64.bitcountTrailingZero(16); // => 4

public func addWrap(x : Nat64, y : Nat64) : Nat64

Returns the sum of x and y, x +% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat64.addWrap(Nat64.maximumValue, 1); // => 0
+Nat64.maximumValue +% (1 : Nat64) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Nat64, y : Nat64) : Nat64

Returns the difference of x and y, x -% y. Wraps on underflow.

+

Example:

+
motoko include=import
+ignore Nat64.subWrap(0, 1); // => 18446744073709551615
+(0 : Nat64) -% (1 : Nat64) // => 18446744073709551615
+ +

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Nat64, y : Nat64) : Nat64

Returns the product of x and y, x *% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat64.mulWrap(4294967296, 4294967296); // => 0
+(4294967296 : Nat64) *% (4294967296 : Nat64) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Nat64, y : Nat64) : Nat64

Returns x to the power of y, x **% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat64.powWrap(2, 64); // => 0
+(2 : Nat64) **% (64 : Nat64) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/Nat8.html b/base-doc/Nat8.html new file mode 100644 index 00000000000..f9d38c4fcd9 --- /dev/null +++ b/base-doc/Nat8.html @@ -0,0 +1,334 @@ + +

Nat8

Provides utility functions on 8-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. 1 + 1).

+

Import from the base library to use this module.

+
motoko name=import
+import Nat8 "mo:base/Nat8";

type Nat8 = Prim.Types.Nat8

8-bit natural numbers.

+

public let maximumValue : Nat8

Maximum 8-bit natural number. 2 ** 8 - 1.

+

Example:

+
motoko include=import
+Nat8.maximumValue; // => 255 : Nat8

public let toNat : Nat8 -> Nat

Converts an 8-bit unsigned integer to an unsigned integer with infinite precision.

+

Example:

+
motoko include=import
+Nat8.toNat(123); // => 123 : Nat

public let fromNat : Nat -> Nat8

Converts an unsigned integer with infinite precision to an 8-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat8.fromNat(123); // => 123 : Nat8

public let fromNat16 : Nat16 -> Nat8

Converts a 16-bit unsigned integer to a 8-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
motoko include=import
+Nat8.fromNat16(123); // => 123 : Nat8

public let toNat16 : Nat8 -> Nat16

Converts an 8-bit unsigned integer to a 16-bit unsigned integer.

+

Example:

+
motoko include=import
+Nat8.toNat16(123); // => 123 : Nat16

public let fromIntWrap : Int -> Nat8

Converts a signed integer with infinite precision to an 8-bit unsigned integer.

+

Wraps on overflow/underflow.

+

Example:

+
motoko include=import
+Nat8.fromIntWrap(123); // => 123 : Nat8

public func toText(x : Nat8) : Text

Converts x to its textual representation.

+

Example:

+
motoko include=import
+Nat8.toText(123); // => "123" : Text

public func min(x : Nat8, y : Nat8) : Nat8

Returns the minimum of x and y.

+

Example:

+
motoko include=import
+Nat8.min(123, 200); // => 123 : Nat8

public func max(x : Nat8, y : Nat8) : Nat8

Returns the maximum of x and y.

+

Example:

+
motoko include=import
+Nat8.max(123, 200); // => 200 : Nat8

public func equal(x : Nat8, y : Nat8) : Bool

Equality function for Nat8 types. +This is equivalent to x == y.

+

Example:

+
motoko include=import
+ignore Nat8.equal(1, 1); // => true
+(1 : Nat8) == (1 : Nat8) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat8>(3);
+let buffer2 = Buffer.Buffer<Nat8>(3);
+Buffer.equal(buffer1, buffer2, Nat8.equal) // => true

public func notEqual(x : Nat8, y : Nat8) : Bool

Inequality function for Nat8 types. +This is equivalent to x != y.

+

Example:

+
motoko include=import
+ignore Nat8.notEqual(1, 2); // => true
+(1 : Nat8) != (2 : Nat8) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(x : Nat8, y : Nat8) : Bool

"Less than" function for Nat8 types. +This is equivalent to x < y.

+

Example:

+
motoko include=import
+ignore Nat8.less(1, 2); // => true
+(1 : Nat8) < (2 : Nat8) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(x : Nat8, y : Nat8) : Bool

"Less than or equal" function for Nat8 types. +This is equivalent to x <= y.

+

Example:

+
motoko include=import
+ignore Nat.lessOrEqual(1, 2); // => true
+1 <= 2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(x : Nat8, y : Nat8) : Bool

"Greater than" function for Nat8 types. +This is equivalent to x > y.

+

Example:

+
motoko include=import
+ignore Nat8.greater(2, 1); // => true
+(2 : Nat8) > (1 : Nat8) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(x : Nat8, y : Nat8) : Bool

"Greater than or equal" function for Nat8 types. +This is equivalent to x >= y.

+

Example:

+
motoko include=import
+ignore Nat8.greaterOrEqual(2, 1); // => true
+(2 : Nat8) >= (1 : Nat8) // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

public func compare(x : Nat8, y : Nat8) : {#less; #equal; #greater}

General purpose comparison function for Nat8. Returns the Order ( +either #less, #equal, or #greater) of comparing x with y.

+

Example:

+
motoko include=import
+Nat8.compare(2, 3) // => #less
+ +

This function can be used as value for a high order function, such as a sort function.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat8], Nat8.compare) // => [1, 2, 3]

public func add(x : Nat8, y : Nat8) : Nat8

Returns the sum of x and y, x + y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat8.add(1, 2); // => 3
+(1 : Nat8) + (2 : Nat8) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing + operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use + +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat8, Nat8>([2, 3, 1], 0, Nat8.add) // => 6

public func sub(x : Nat8, y : Nat8) : Nat8

Returns the difference of x and y, x - y. +Traps on underflow.

+

Example:

+
motoko include=import
+ignore Nat8.sub(2, 1); // => 1
+(2 : Nat8) - (1 : Nat8) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing - operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use - +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat8, Nat8>([2, 3, 1], 20, Nat8.sub) // => 14

public func mul(x : Nat8, y : Nat8) : Nat8

Returns the product of x and y, x * y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat8.mul(2, 3); // => 6
+(2 : Nat8) * (3 : Nat8) // => 6
+ +

Note: The reason why this function is defined in this library (in addition +to the existing * operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use * +as a function value at the moment.

+

Example:

+
motoko include=import
+import Array "mo:base/Array";
+Array.foldLeft<Nat8, Nat8>([2, 3, 1], 1, Nat8.mul) // => 6

public func div(x : Nat8, y : Nat8) : Nat8

Returns the quotient of x divided by y, x / y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat8.div(6, 2); // => 3
+(6 : Nat8) / (2 : Nat8) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing / operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use / +as a function value at the moment.

+

public func rem(x : Nat8, y : Nat8) : Nat8

Returns the remainder of x divided by y, x % y. +Traps when y is zero.

+

Example:

+
motoko include=import
+ignore Nat8.rem(6, 4); // => 2
+(6 : Nat8) % (4 : Nat8) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing % operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use % +as a function value at the moment.

+

public func pow(x : Nat8, y : Nat8) : Nat8

Returns x to the power of y, x ** y. +Traps on overflow.

+

Example:

+
motoko include=import
+ignore Nat8.pow(2, 3); // => 8
+(2 : Nat8) ** (3 : Nat8) // => 8
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ** operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ** +as a function value at the moment.

+

public func bitnot(x : Nat8) : Nat8

Returns the bitwise negation of x, ^x.

+

Example:

+
motoko include=import
+ignore Nat8.bitnot(0); // => 255
+^(0 : Nat8) // => 255
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitand(x : Nat8, y : Nat8) : Nat8

Returns the bitwise and of x and y, x & y.

+

Example:

+
motoko include=import
+ignore Nat8.bitand(3, 2); // => 2
+(3 : Nat8) & (2 : Nat8) // => 2
+ +

Note: The reason why this function is defined in this library (in addition +to the existing & operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use & +as a function value at the moment.

+

public func bitor(x : Nat8, y : Nat8) : Nat8

Returns the bitwise or of x and y, x | y.

+

Example:

+
motoko include=import
+ignore Nat8.bitor(3, 2); // => 3
+(3 : Nat8) | (2 : Nat8) // => 3
+ +

Note: The reason why this function is defined in this library (in addition +to the existing | operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use | +as a function value at the moment.

+

public func bitxor(x : Nat8, y : Nat8) : Nat8

Returns the bitwise exclusive or of x and y, x ^ y.

+

Example:

+
motoko include=import
+ignore Nat8.bitxor(3, 2); // => 1
+(3 : Nat8) ^ (2 : Nat8) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing ^ operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use ^ +as a function value at the moment.

+

public func bitshiftLeft(x : Nat8, y : Nat8) : Nat8

Returns the bitwise shift left of x by y, x << y.

+

Example:

+
motoko include=import
+ignore Nat8.bitshiftLeft(1, 2); // => 4
+(1 : Nat8) << (2 : Nat8) // => 4
+ +

Note: The reason why this function is defined in this library (in addition +to the existing << operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use << +as a function value at the moment.

+

public func bitshiftRight(x : Nat8, y : Nat8) : Nat8

Returns the bitwise shift right of x by y, x >> y.

+

Example:

+
motoko include=import
+ignore Nat8.bitshiftRight(4, 2); // => 1
+(4 : Nat8) >> (2 : Nat8) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >> +as a function value at the moment.

+

public func bitrotLeft(x : Nat8, y : Nat8) : Nat8

Returns the bitwise rotate left of x by y, x <<> y.

+

Example:

+
motoko include=import
+ignore Nat8.bitrotLeft(128, 1); // => 1
+(128 : Nat8) <<> (1 : Nat8) // => 1
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <<> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <<> +as a function value at the moment.

+

public func bitrotRight(x : Nat8, y : Nat8) : Nat8

Returns the bitwise rotate right of x by y, x <>> y.

+

Example:

+
motoko include=import
+ignore Nat8.bitrotRight(1, 1); // => 128
+(1 : Nat8) <>> (1 : Nat8) // => 128
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <>> operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <>> +as a function value at the moment.

+

public func bittest(x : Nat8, p : Nat) : Bool

Returns the value of bit p mod 8 in x, (x & 2^(p mod 8)) == 2^(p mod 8). +This is equivalent to checking if the p-th bit is set in x, using 0 indexing.

+

Example:

+
motoko include=import
+Nat8.bittest(5, 2); // => true

public func bitset(x : Nat8, p : Nat) : Nat8

Returns the value of setting bit p mod 8 in x to 1.

+

Example:

+
motoko include=import
+Nat8.bitset(5, 1); // => 7

public func bitclear(x : Nat8, p : Nat) : Nat8

Returns the value of clearing bit p mod 8 in x to 0.

+

Example:

+
motoko include=import
+Nat8.bitclear(5, 2); // => 1

public func bitflip(x : Nat8, p : Nat) : Nat8

Returns the value of flipping bit p mod 8 in x.

+

Example:

+
motoko include=import
+Nat8.bitflip(5, 2); // => 1

public let bitcountNonZero : (x : Nat8) -> Nat8

Returns the count of non-zero bits in x.

+

Example:

+
motoko include=import
+Nat8.bitcountNonZero(5); // => 2

public let bitcountLeadingZero : (x : Nat8) -> Nat8

Returns the count of leading zero bits in x.

+

Example:

+
motoko include=import
+Nat8.bitcountLeadingZero(5); // => 5

public let bitcountTrailingZero : (x : Nat8) -> Nat8

Returns the count of trailing zero bits in x.

+

Example:

+
motoko include=import
+Nat8.bitcountTrailingZero(6); // => 1

public func addWrap(x : Nat8, y : Nat8) : Nat8

Returns the sum of x and y, x +% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat8.addWrap(230, 26); // => 0
+(230 : Nat8) +% (26 : Nat8) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing +% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use +% +as a function value at the moment.

+

public func subWrap(x : Nat8, y : Nat8) : Nat8

Returns the difference of x and y, x -% y. Wraps on underflow.

+

Example:

+
motoko include=import
+ignore Nat8.subWrap(0, 1); // => 255
+(0 : Nat8) -% (1 : Nat8) // => 255

Note: The reason why this function is defined in this library (in addition +to the existing -% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use -% +as a function value at the moment.

+

public func mulWrap(x : Nat8, y : Nat8) : Nat8

Returns the product of x and y, x *% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat8.mulWrap(230, 26); // => 92
+(230 : Nat8) *% (26 : Nat8) // => 92
+ +

Note: The reason why this function is defined in this library (in addition +to the existing *% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use *% +as a function value at the moment.

+

public func powWrap(x : Nat8, y : Nat8) : Nat8

Returns x to the power of y, x **% y. Wraps on overflow.

+

Example:

+
motoko include=import
+ignore Nat8.powWrap(2, 8); // => 0
+(2 : Nat8) **% (8 : Nat8) // => 0
+ +

Note: The reason why this function is defined in this library (in addition +to the existing **% operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use **% +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/None.html b/base-doc/None.html new file mode 100644 index 00000000000..bc8a3514590 --- /dev/null +++ b/base-doc/None.html @@ -0,0 +1,8 @@ + +

None

The absent value

+

The None type represents a type with no value.

+

It is often used to type code that fails to return control (e.g. an infinite loop) +or to designate impossible values (e.g. the type ?None only contains null).

+

type None = Prim.Types.None

The empty type. A subtype of all types.

+

public let impossible : <A>None -> A

Turns an absurd value into an arbitrary type.

+

\ No newline at end of file diff --git a/base-doc/Option.html b/base-doc/Option.html new file mode 100644 index 00000000000..5b061f6f318 --- /dev/null +++ b/base-doc/Option.html @@ -0,0 +1,56 @@ + +

Option

Typesafe nulls

+

Optional values can be seen as a typesafe null. A value of type ?Int can +be constructed with either null or ?42. The simplest way to get at the +contents of an optional is to use pattern matching:

+
let optionalInt1 : ?Int = ?42;
+let optionalInt2 : ?Int = null;
+
+let int1orZero : Int = switch optionalInt1 {
+  case null 0;
+  case (?int) int;
+};
+assert int1orZero == 42;
+
+let int2orZero : Int = switch optionalInt2 {
+  case null 0;
+  case (?int) int;
+};
+assert int2orZero == 0;
+ +

The functions in this module capture some common operations when working +with optionals that can be more succinct than using pattern matching.

+

public func get<T>(x : ?T, default : T) : T

Unwraps an optional value, with a default value, i.e. get(?x, d) = x and +get(null, d) = d.

+

public func getMapped<A, B>(
  x : ?A,
  f : A -> B,
  default : B
) : B

Unwraps an optional value using a function, or returns the default, i.e. +option(?x, f, d) = f x and option(null, f, d) = d.

+

public func map<A, B>(x : ?A, f : A -> B) : ?B

Applies a function to the wrapped value. null's are left untouched.

+
import Option "mo:base/Option";
+assert Option.map<Nat, Nat>(?42, func x = x + 1) == ?43;
+assert Option.map<Nat, Nat>(null, func x = x + 1) == null;

public func iterate<A>(x : ?A, f : A -> ())

Applies a function to the wrapped value, but discards the result. Use +iterate if you're only interested in the side effect f produces.

+
import Option "mo:base/Option";
+var counter : Nat = 0;
+Option.iterate(?5, func (x : Nat) { counter += x });
+assert counter == 5;
+Option.iterate(null, func (x : Nat) { counter += x });
+assert counter == 5;

public func apply<A, B>(x : ?A, f : ?(A -> B)) : ?B

Applies an optional function to an optional value. Returns null if at +least one of the arguments is null.

+

public func chain<A, B>(x : ?A, f : A -> ?B) : ?B

Applies a function to an optional value. Returns null if the argument is +null, or the function returns null.

+

public func flatten<A>(x : ??A) : ?A

Given an optional optional value, removes one layer of optionality.

+
import Option "mo:base/Option";
+assert Option.flatten(?(?(42))) == ?42;
+assert Option.flatten(?(null)) == null;
+assert Option.flatten(null) == null;

public func make<A>(x : A) : ?A

Creates an optional value from a definite value.

+
import Option "mo:base/Option";
+assert Option.make(42) == ?42;

public func isSome(x : ?Any) : Bool

Returns true if the argument is not null, otherwise returns false.

+

public func isNull(x : ?Any) : Bool

Returns true if the argument is null, otherwise returns false.

+

public func equal<A>(
  x : ?A,
  y : ?A,
  eq : (A, A) -> Bool
) : Bool

Returns true if the optional arguments are equal according to the equality function provided, otherwise returns false.

+

public func assertSome(x : ?Any)

Asserts that the value is not null; fails otherwise. +@deprecated Option.assertSome will be removed soon; use an assert expression instead

+

public func assertNull(x : ?Any)

Asserts that the value is null; fails otherwise. +@deprecated Option.assertNull will be removed soon; use an assert expression instead

+

public func unwrap<T>(x : ?T) : T

Unwraps an optional value, i.e. unwrap(?x) = x.

+

@deprecated Option.unwrap is unsafe and fails if the argument is null; it will be removed soon; use a switch or do? expression instead

+

\ No newline at end of file diff --git a/base-doc/Order.html b/base-doc/Order.html new file mode 100644 index 00000000000..165c2183713 --- /dev/null +++ b/base-doc/Order.html @@ -0,0 +1,8 @@ + +

Order

Order

+

type Order = {#less; #equal; #greater}

A type to represent an order.

+

public func isLess(order : Order) : Bool

Check if an order is #less.

+

public func isEqual(order : Order) : Bool

Check if an order is #equal.

+

public func isGreater(order : Order) : Bool

Check if an order is #greater.

+

public func equal(o1 : Order, o2 : Order) : Bool

Returns true if only if o1 and o2 are the same ordering.

+

\ No newline at end of file diff --git a/base-doc/Prelude.html b/base-doc/Prelude.html new file mode 100644 index 00000000000..e651b408124 --- /dev/null +++ b/base-doc/Prelude.html @@ -0,0 +1,13 @@ + +

Prelude

General utilities

+

This prelude file proposes standard library features that may +belong in the language (compiler-internal) prelude sometime, after +some further experience and discussion. Until then, they live here.

+

public func nyi() : None

Not yet implemented

+

Mark incomplete code with the nyi and xxx functions.

+

Each have calls are well-typed in all typing contexts, which +trap in all execution contexts.

+

public func xxx() : None

public func unreachable() : None

Mark unreachable code with the unreachable function.

+

Calls are well-typed in all typing contexts, and they +trap in all execution contexts.

+

\ No newline at end of file diff --git a/base-doc/Principal.html b/base-doc/Principal.html new file mode 100644 index 00000000000..ce6895144c7 --- /dev/null +++ b/base-doc/Principal.html @@ -0,0 +1,150 @@ + +

Principal

Module for interacting with Principals (users and canisters).

+

Principals are used to identify entities that can interact with the Internet +Computer. These entities are either users or canisters.

+

Example textual representation of Principals:

+

un4fu-tqaaa-aaaab-qadjq-cai

+

In Motoko, there is a primitive Principal type called Principal. As an example +of where you might see Principals, you can access the Principal of the +caller of your shared function.

+
motoko no-repl
+shared(msg) func foo() {
+  let caller : Principal = msg.caller;
+};
+ +

Then, you can use this module to work with the Principal.

+

Import from the base library to use this module.

+
motoko name=import
+import Principal "mo:base/Principal";

type Principal = Prim.Types.Principal

public func fromActor(a : actor { }) : Principal

Get the Principal identifier of an actor.

+

Example:

+
motoko include=import no-repl
+actor MyCanister {
+  func getPrincipal() : Principal {
+    let principal = Principal.fromActor(MyCanister);
+  }
+}

public func toLedgerAccount(principal : Principal, subAccount : ?Blob) : Blob

Compute the Ledger account identifier of a principal. Optionally specify a sub-account.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let subAccount : Blob = "\4A\8D\3F\2B\6E\01\C8\7D\9E\03\B4\56\7C\F8\9A\01\D2\34\56\78\9A\BC\DE\F0\12\34\56\78\9A\BC\DE\F0";
+let account = Principal.toLedgerAccount(principal, ?subAccount); // => \8C\5C\20\C6\15\3F\7F\51\E2\0D\0F\0F\B5\08\51\5B\47\65\63\A9\62\B4\A9\91\5F\4F\02\70\8A\ED\4F\82

public func toBlob(p : Principal) : Blob

Convert a Principal to its Blob (bytes) representation.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let blob = Principal.toBlob(principal); // => \00\00\00\00\00\30\00\D3\01\01

public func fromBlob(b : Blob) : Principal

Converts a Blob (bytes) representation of a Principal to a Principal value.

+

Example:

+
motoko include=import
+let blob = "\00\00\00\00\00\30\00\D3\01\01" : Blob;
+let principal = Principal.fromBlob(blob);
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"

public func toText(p : Principal) : Text

Converts a Principal to its Text representation.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"

public func fromText(t : Text) : Principal

Converts a Text representation of a Principal to a Principal value.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"

public func isAnonymous(p : Principal) : Bool

Checks if the given principal represents an anonymous user.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.isAnonymous(principal) // => false

public func isController(p : Principal) : Bool

Checks if the given principal can control this canister.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.isController(principal) // => false

public func hash(principal : Principal) : Hash.Hash

Hashes the given principal by hashing its Blob representation.

+

Example:

+
motoko include=import
+let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.hash(principal) // => 2_742_573_646

public func compare(principal1 : Principal, principal2 : Principal) : {#less; #equal; #greater}

General purpose comparison function for Principal. Returns the Order ( +either #less, #equal, or #greater) of comparing principal1 with +principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.compare(principal1, principal2) // => #equal

public func equal(principal1 : Principal, principal2 : Principal) : Bool

Equality function for Principal types. +This is equivalent to principal1 == principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.equal(principal1, principal2);
+principal1 == principal2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing == operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use == +as a function value at the moment.

+

Example:

+
motoko include=import
+import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Principal>(3);
+let buffer2 = Buffer.Buffer<Principal>(3);
+Buffer.equal(buffer1, buffer2, Principal.equal) // => true

public func notEqual(principal1 : Principal, principal2 : Principal) : Bool

Inequality function for Principal types. +This is equivalent to principal1 != principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.notEqual(principal1, principal2);
+principal1 != principal2 // => false
+ +

Note: The reason why this function is defined in this library (in addition +to the existing != operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use != +as a function value at the moment.

+

public func less(principal1 : Principal, principal2 : Principal) : Bool

"Less than" function for Principal types. +This is equivalent to principal1 < principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.less(principal1, principal2);
+principal1 < principal2 // => false
+ +

Note: The reason why this function is defined in this library (in addition +to the existing < operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use < +as a function value at the moment.

+

public func lessOrEqual(principal1 : Principal, principal2 : Principal) : Bool

"Less than or equal to" function for Principal types. +This is equivalent to principal1 <= principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.lessOrEqual(principal1, principal2);
+principal1 <= principal2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing <= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use <= +as a function value at the moment.

+

public func greater(principal1 : Principal, principal2 : Principal) : Bool

"Greater than" function for Principal types. +This is equivalent to principal1 > principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.greater(principal1, principal2);
+principal1 > principal2 // => false
+ +

Note: The reason why this function is defined in this library (in addition +to the existing > operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use > +as a function value at the moment.

+

public func greaterOrEqual(principal1 : Principal, principal2 : Principal) : Bool

"Greater than or equal to" function for Principal types. +This is equivalent to principal1 >= principal2.

+

Example:

+
motoko include=import
+let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.greaterOrEqual(principal1, principal2);
+principal1 >= principal2 // => true
+ +

Note: The reason why this function is defined in this library (in addition +to the existing >= operator) is so that you can use it as a function +value to pass to a higher order function. It is not possible to use >= +as a function value at the moment.

+

\ No newline at end of file diff --git a/base-doc/RBTree.html b/base-doc/RBTree.html new file mode 100644 index 00000000000..7324f231ea6 --- /dev/null +++ b/base-doc/RBTree.html @@ -0,0 +1,250 @@ + +

RBTree

Key-value map implemented as a red-black tree (RBTree) with nodes storing key-value pairs.

+

A red-black tree is a balanced binary search tree ordered by the keys.

+

The tree data structure internally colors each of its nodes either red or black, +and uses this information to balance the tree during the modifying operations.

+

Creation: +Instantiate class RBTree<K, V> that provides a map from keys of type K to values of type V.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a new red-black tree mapping Nat to Text
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "tree");
+for (entry in tree.entries()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+ +

Performance:

+
  • Runtime: O(log(n)) worst case cost per insertion, removal, and retrieval operation.
  • Space: O(n) for storing the entire tree. +n denotes the number of key-value entries (i.e. nodes) stored in the tree.
+ +

Note:

+
  • Tree operations, such as retrieval, insertion, and removal create O(log(n)) temporary objects that become garbage.
+ +

Credits:

+

The core of this implementation is derived from:

+

type Color = {#R; #B}

Node color: Either red (#R) or black (#B).

+

type Tree<K, V> = {#node : (Color, Tree<K, V>, (K, ?V), Tree<K, V>); #leaf}

Red-black tree of nodes with key-value entries, ordered by the keys. +The keys have the generic type K and the values the generic type V. +Leaves are considered implicitly black.

+

class RBTree<K, V>(compare : (K, K) -> O.Order)

public func share() : Tree<K, V>

Return a snapshot of the internal functional tree representation as sharable data. +The returned tree representation is not affected by subsequent changes of the RBTree instance.

+

Example:

+
motoko include=initialize
+
+tree.put(1, "one");
+let treeSnapshot = tree.share();
+tree.put(2, "second");
+RBTree.size(treeSnapshot) // => 1 (Only the first insertion is part of the snapshot.)
+ +

Useful for storing the state of a tree object as a stable variable, determining its size, pretty-printing, and sharing it across async function calls, +i.e. passing it in async arguments or async results.

+

Runtime: O(1). +Space: O(1).

+

public func unshare(t : Tree<K, V>) : ()

Reset the current state of the tree object from a functional tree representation.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+let snapshot = tree.share(); // save the current state of the tree object in a snapshot
+tree.put(2, "two");
+tree.unshare(snapshot); // restore the tree object from the snapshot
+Iter.toArray(tree.entries()) // => [(1, "one")]
+ +

Useful for restoring the state of a tree object from stable data, saved, for example, in a stable variable.

+

Runtime: O(1). +Space: O(1).

+

public func get(key : K) : ?V

Retrieve the value associated with a given key, if present. Returns null, if the key is absent. +The key is searched according to the compare function defined on the class instantiation.

+

Example:

+
motoko include=initialize
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+tree.get(1) // => ?"one"
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func replace(key : K, value : V) : ?V

Replace the value associated with a given key, if the key is present. +Otherwise, if the key does not yet exist, insert the key-value entry.

+

Returns the previous value of the key, if the key already existed. +Otherwise, null, if the key did not yet exist before.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "old one");
+tree.put(2, "two");
+
+ignore tree.replace(1, "new one");
+Iter.toArray(tree.entries()) // => [(1, "new one"), (2, "two")]
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func put(key : K, value : V)

Insert a key-value entry in the tree. If the key already exists, it overwrites the associated value.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "three");
+Iter.toArray(tree.entries()) // now contains three entries
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func delete(key : K)

Delete the entry associated with a given key, if the key exists. +No effect if the key is absent. Same as remove(key) except that it +does not have a return value.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+tree.delete(1);
+Iter.toArray(tree.entries()) // => [(2, "two")].
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func remove(key : K) : ?V

Remove the entry associated with a given key, if the key exists, and return the associated value. +Returns null without any other effect if the key is absent.

+

Example:

+
motoko include=initialize
+import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+ignore tree.remove(1);
+Iter.toArray(tree.entries()) // => [(2, "two")].
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree and +assuming that the compare function implements an O(1) comparison.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

public func entries() : I.Iter<(K, V)>

An iterator for the key-value entries of the map, in ascending key order. +The iterator takes a snapshot view of the tree and is not affected by concurrent modifications.

+

Example:

+
motoko include=initialize
+import Debug "mo:base/Debug";
+
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in tree.entries()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=1 value="one"
+// Entry key=2 value="two"
+// Entry key=3 value="three"
+ +

Cost of iteration over all elements: +Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects that will be collected as garbage.

+

public func entriesRev() : I.Iter<(K, V)>

An iterator for the key-value entries of the map, in descending key order. +The iterator takes a snapshot view of the tree and is not affected by concurrent modifications.

+

Example:

+
motoko include=initialize
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in tree.entriesRev()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=3 value="three"
+// Entry key=2 value="two"
+// Entry key=1 value="one"
+ +

Cost of iteration over all elements: +Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects that will be collected as garbage.

+

A map from keys of type K to values of type V implemented as a red-black tree. +The entries of key-value pairs are ordered by compare function applied to the keys.

+

The class enables imperative usage in object-oriented-style. +However, internally, the class uses a functional implementation.

+

The compare function should implement a consistent total order among all possible values of K and +for efficiency, only involves O(1) runtime costs without space allocation.

+

Example:

+
motoko name=initialize
+import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a map of `Nat` to `Text` using the `Nat.compare` order
+ +

Costs of instantiation (only empty tree): +Runtime: O(1). +Space: O(1).

+

public func iter<X, Y>(tree : Tree<X, Y>, direction : {#fwd; #bwd}) : I.Iter<(X, Y)>

Get an iterator for the entries of the tree, in ascending (#fwd) or descending (#bwd) order as specified by direction. +The iterator takes a snapshot view of the tree and is not affected by concurrent modifications.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in RBTree.iter(tree.share(), #bwd)) { // backward iteration
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=3 value="three"
+// Entry key=2 value="two"
+// Entry key=1 value="one"
+ +

Cost of iteration over all elements: +Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects that will be collected as garbage.

+

public func size<X, Y>(t : Tree<X, Y>) : Nat

Determine the size of the tree as the number of key-value entries.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "three");
+
+RBTree.size(tree.share()) // 3 entries
+ +

Runtime: O(log(n)). +Space: O(1) retained memory plus garbage, see the note below. +where n denotes the number of key-value entries stored in the tree.

+

Note: Creates O(log(n)) temporary objects that will be collected as garbage.

+

\ No newline at end of file diff --git a/base-doc/Random.html b/base-doc/Random.html new file mode 100644 index 00000000000..4305cb302c6 --- /dev/null +++ b/base-doc/Random.html @@ -0,0 +1,81 @@ + +

Random

A module for obtaining randomness on the Internet Computer (IC).

+

This module provides the fundamentals for user abstractions to build on.

+

Dealing with randomness on a deterministic computing platform, such +as the IC, is intricate. Some basic rules need to be followed by the +user of this module to obtain (and maintain) the benefits of crypto- +graphic randomness:

+
  • cryptographic entropy (randomness source) is only obtainable + asyncronously in discrete chunks of 256 bits (32-byte sized Blobs)
  • all bets must be closed before entropy is being asked for in + order to decide them
  • this implies that the same entropy (i.e. Blob) - or surplus entropy + not utilised yet - cannot be used for a new round of bets without + losing the cryptographic guarantees.
+ +

Concretely, the below class Finite, as well as the +*From methods risk the carrying-over of state from previous rounds. +These are provided for performance (and convenience) reasons, and need +special care when used. Similar caveats apply for user-defined (pseudo) +random number generators.

+

Usage:

+
motoko no-repl
+import Random "mo:base/Random";

public let blob : shared () -> async Blob

Obtains a full blob (32 bytes) worth of fresh entropy.

+

Example:

+
motoko no-repl
+let random = Random.Finite(await Random.blob());

class Finite(entropy : Blob)

public func byte() : ?Nat8

Uniformly distributes outcomes in the numeric range [0 .. 255]. +Consumes 1 byte of entropy.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.byte() // => ?20

public func coin() : ?Bool

Simulates a coin toss. Both outcomes have equal probability. +Consumes 1 bit of entropy (amortised).

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.coin() // => ?false

public func range(p : Nat8) : ?Nat

Uniformly distributes outcomes in the numeric range [0 .. 2^p - 1]. +Consumes ⌈p/8⌉ bytes of entropy.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.range(32) // => ?348746249

public func binomial(n : Nat8) : ?Nat8

Counts the number of heads in n fair coin tosses. +Consumes ⌈n/8⌉ bytes of entropy.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.binomial(5) // => ?1

Drawing from a finite supply of entropy, Finite provides +methods to obtain random values. When the entropy is used up, +null is returned. Otherwise the outcomes' distributions are +stated for each method. The uniformity of outcomes is +guaranteed only when the supplied entropy is originally obtained +by the blob() call, and is never reused.

+

Example:

+
motoko no-repl
+import Random "mo:base/Random";
+
+let random = Random.Finite(await Random.blob());
+
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let seedRandom = Random.Finite(seed);

public func byteFrom(seed : Blob) : Nat8

Distributes outcomes in the numeric range [0 .. 255]. +Seed blob must contain at least a byte.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.byteFrom(seed) // => 20

public func coinFrom(seed : Blob) : Bool

Simulates a coin toss. +Seed blob must contain at least a byte.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.coinFrom(seed) // => false

public func rangeFrom(p : Nat8, seed : Blob) : Nat

Distributes outcomes in the numeric range [0 .. 2^p - 1]. +Seed blob must contain at least ((p+7) / 8) bytes.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.rangeFrom(32, seed) // => 348746249

public func binomialFrom(n : Nat8, seed : Blob) : Nat8

Counts the number of heads in n coin tosses. +Seed blob must contain at least ((n+7) / 8) bytes.

+

Example:

+
motoko no-repl
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.binomialFrom(5, seed) // => 1

\ No newline at end of file diff --git a/base-doc/Region.html b/base-doc/Region.html new file mode 100644 index 00000000000..62cf00388fb --- /dev/null +++ b/base-doc/Region.html @@ -0,0 +1,245 @@ + +

Region

Byte-level access to isolated, (virtual) stable memory regions.

+

This is a moderately lightweight abstraction over IC stable memory and supports persisting +regions of binary data across Motoko upgrades. +Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) IC stable memory internally, but does not interfere with this API. +It is also fully compatible with existing uses of the ExperimentalStableMemory library, which has a similar interface, but, +only supported a single memory region, without isolation between different applications.

+

The Region type is stable and can be used in stable data structures.

+

A new, empty Region is allocated using function new().

+

Regions are stateful objects and can be distinguished by the numeric identifier returned by function id(region). +Every region owns an initially empty, but growable sequence of virtual IC stable memory pages. +The current size, in pages, of a region is returned by function size(region). +The size of a region determines the range, [ 0, ..., size(region)*2^16 ), of valid byte-offsets into the region; these offsets are used as the source and destination of load/store operations on the region.

+

Memory is allocated to a region, using function grow(region, pages), sequentially and on demand, in units of 64KiB logical pages, starting with 0 allocated pages. +A call to grow may succeed, returning the previous size of the region, or fail, returning a sentinel value. New pages are zero initialized.

+

A size of a region can only grow and never shrink. +In addition, the stable memory pages allocated to a region will not be reclaimed by garbage collection, even +if the region object itself becomes unreachable.

+

Growth is capped by a soft limit on physical page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or 4GiB).

+

Each load operation loads from region relative byte address offset in little-endian +format using the natural bit-width of the type in question. +The operation traps if attempting to read beyond the current region size.

+

Each store operation stores to region relative byte address offset in little-endian format using the natural bit-width of the type in question. +The operation traps if attempting to write beyond the current region size.

+

Text values can be handled by using Text.decodeUtf8 and Text.encodeUtf8, in conjunction with loadBlob and storeBlob.

+

The current region allocation and region contents are preserved across upgrades.

+

NB: The IC's actual stable memory size (ic0.stable_size) may exceed the +total page size reported by summing all regions sizes. +This (and the cap on growth) are to accommodate Motoko's stable variables and bookkeeping for regions. +Applications that plan to use Motoko stable variables sparingly or not at all can +increase --max-stable-pages as desired, approaching the IC maximum (initially 8GiB, then 32Gib, currently 64Gib). +All applications should reserve at least one page for stable variable data, even when no stable variables are used.

+

Usage:

+
motoko no-repl
+import Region "mo:base/Region";

type Region = Prim.Types.Region

A stateful handle to an isolated region of IC stable memory. +Region is a stable type and regions can be stored in stable variables.

+

public let new : () -> Region

Allocate a new, isolated Region of size 0.

+

Example:

+
motoko no-repl
+let region = Region.new();
+assert Region.size(region) == 0;

public let id : Region -> Nat

Return a Nat identifying the given region. +Maybe be used for equality, comparison and hashing. +NB: Regions returned by new() are numbered from 16 +(regions 0..15 are currently reserved for internal use). +Allocate a new, isolated Region of size 0.

+

Example:

+
motoko no-repl
+let region = Region.new();
+assert Region.id(region) == 16;

public let size : (region : Region) -> (pages : Nat64)

Current size of region, in pages. +Each page is 64KiB (65536 bytes). +Initially 0. +Preserved across upgrades, together with contents of allocated +stable memory.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let beforeSize = Region.size(region);
+ignore Region.grow(region, 10);
+let afterSize = Region.size(region);
+afterSize - beforeSize // => 10

public let grow : (region : Region, newPages : Nat64) -> (oldPages : Nat64)

Grow current size of region by the given number of pages. +Each page is 64KiB (65536 bytes). +Returns the previous size when able to grow. +Returns 0xFFFF_FFFF_FFFF_FFFF if remaining pages insufficient. +Every new page is zero-initialized, containing byte 0x00 at every offset. +Function grow is capped by a soft limit on size controlled by compile-time flag + --max-stable-pages <n> (the default is 65536, or 4GiB).

+

Example:

+
motoko no-repl
+import Error "mo:base/Error";
+
+let region = Region.new();
+let beforeSize = Region.grow(region, 10);
+if (beforeSize == 0xFFFF_FFFF_FFFF_FFFF) {
+  throw Error.reject("Out of memory");
+};
+let afterSize = Region.size(region);
+afterSize - beforeSize // => 10

public let loadNat8 : (region : Region, offset : Nat64) -> Nat8

Within region, load a Nat8 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat8(region, offset, value);
+Region.loadNat8(region, offset) // => 123

public let storeNat8 : (region : Region, offset : Nat64, value : Nat8) -> ()

Within region, store a Nat8 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat8(region, offset, value);
+Region.loadNat8(region, offset) // => 123

public let loadNat16 : (region : Region, offset : Nat64) -> Nat16

Within region, load a Nat16 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat16(region, offset, value);
+Region.loadNat16(region, offset) // => 123

public let storeNat16 : (region : Region, offset : Nat64, value : Nat16) -> ()

Within region, store a Nat16 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat16(region, offset, value);
+Region.loadNat16(region, offset) // => 123

public let loadNat32 : (region : Region, offset : Nat64) -> Nat32

Within region, load a Nat32 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat32(region, offset, value);
+Region.loadNat32(region, offset) // => 123

public let storeNat32 : (region : Region, offset : Nat64, value : Nat32) -> ()

Within region, store a Nat32 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat32(region, offset, value);
+Region.loadNat32(region, offset) // => 123

public let loadNat64 : (region : Region, offset : Nat64) -> Nat64

Within region, load a Nat64 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat64(region, offset, value);
+Region.loadNat64(region, offset) // => 123

public let storeNat64 : (region : Region, offset : Nat64, value : Nat64) -> ()

Within region, store a Nat64 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat64(region, offset, value);
+Region.loadNat64(region, offset) // => 123

public let loadInt8 : (region : Region, offset : Nat64) -> Int8

Within region, load a Int8 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt8(region, offset, value);
+Region.loadInt8(region, offset) // => 123

public let storeInt8 : (region : Region, offset : Nat64, value : Int8) -> ()

Within region, store a Int8 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt8(region, offset, value);
+Region.loadInt8(region, offset) // => 123

public let loadInt16 : (region : Region, offset : Nat64) -> Int16

Within region, load a Int16 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt16(region, offset, value);
+Region.loadInt16(region, offset) // => 123

public let storeInt16 : (region : Region, offset : Nat64, value : Int16) -> ()

Within region, store a Int16 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt16(region, offset, value);
+Region.loadInt16(region, offset) // => 123

public let loadInt32 : (region : Region, offset : Nat64) -> Int32

Within region, load a Int32 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt32(region, offset, value);
+Region.loadInt32(region, offset) // => 123

public let storeInt32 : (region : Region, offset : Nat64, value : Int32) -> ()

Within region, store a Int32 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt32(region, offset, value);
+Region.loadInt32(region, offset) // => 123

public let loadInt64 : (region : Region, offset : Nat64) -> Int64

Within region, load a Int64 value from offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt64(region, offset, value);
+Region.loadInt64(region, offset) // => 123

public let storeInt64 : (region : Region, offset : Nat64, value : Int64) -> ()

Within region, store a Int64 value at offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt64(region, offset, value);
+Region.loadInt64(region, offset) // => 123

public let loadFloat : (region : Region, offset : Nat64) -> Float

Within region, loads a Float value from the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 1.25;
+Region.storeFloat(region, offset, value);
+Region.loadFloat(region, offset) // => 1.25

public let storeFloat : (region : Region, offset : Nat64, value : Float) -> ()

Within region, store float value at the given offset. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+let region = Region.new();
+let offset = 0;
+let value = 1.25;
+Region.storeFloat(region, offset, value);
+Region.loadFloat(region, offset) // => 1.25

public let loadBlob : (region : Region, offset : Nat64, size : Nat) -> Blob

Within region, load size bytes starting from offset as a Blob. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+import Blob "mo:base/Blob";
+
+let region = Region.new();
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+Region.storeBlob(region, offset, value);
+Blob.toArray(Region.loadBlob(region, offset, size)) // => [1, 2, 3]

public let storeBlob : (region : Region, offset : Nat64, value : Blob) -> ()

Within region, write blob.size()bytes ofblobbeginning atoffset`. +Traps on an out-of-bounds access.

+

Example:

+
motoko no-repl
+import Blob "mo:base/Blob";
+
+let region = Region.new();
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+Region.storeBlob(region, offset, value);
+Blob.toArray(Region.loadBlob(region, offset, size)) // => [1, 2, 3]

\ No newline at end of file diff --git a/base-doc/Result.html b/base-doc/Result.html new file mode 100644 index 00000000000..578bc9a61b1 --- /dev/null +++ b/base-doc/Result.html @@ -0,0 +1,55 @@ + +

Result

Error handling with the Result type.

+

type Result<Ok, Err> = {#ok : Ok; #err : Err}

Result<Ok, Err> is the type used for returning and propagating errors. It +is a type with the variants, #ok(Ok), representing success and containing +a value, and #err(Err), representing error and containing an error value.

+

The simplest way of working with Results is to pattern match on them:

+

For example, given a function createUser(user : User) : Result<Id, String> +where String is an error message we could use it like so:

+
motoko no-repl
+switch(createUser(myUser)) {
+  case (#ok(id)) { Debug.print("Created new user with id: " # id) };
+  case (#err(msg)) { Debug.print("Failed to create user with the error: " # msg) };
+}

public func equal<Ok, Err>(
  eqOk : (Ok, Ok) -> Bool,
  eqErr : (Err, Err) -> Bool,
  r1 : Result<Ok, Err>,
  r2 : Result<Ok, Err>
) : Bool

public func compare<Ok, Err>(
  compareOk : (Ok, Ok) -> Order.Order,
  compareErr : (Err, Err) -> Order.Order,
  r1 : Result<Ok, Err>,
  r2 : Result<Ok, Err>
) : Order.Order

public func chain<R1, R2, Error>(x : Result<R1, Error>, y : R1 -> Result<R2, Error>) : Result<R2, Error>

Allows sequencing of Result values and functions that return +Result's themselves.

+
import Result "mo:base/Result";
+type Result<T,E> = Result.Result<T, E>;
+func largerThan10(x : Nat) : Result<Nat, Text> =
+  if (x > 10) { #ok(x) } else { #err("Not larger than 10.") };
+
+func smallerThan20(x : Nat) : Result<Nat, Text> =
+  if (x < 20) { #ok(x) } else { #err("Not smaller than 20.") };
+
+func between10And20(x : Nat) : Result<Nat, Text> =
+  Result.chain(largerThan10(x), smallerThan20);
+
+assert(between10And20(15) == #ok(15));
+assert(between10And20(9) == #err("Not larger than 10."));
+assert(between10And20(21) == #err("Not smaller than 20."));

public func flatten<Ok, Error>(result : Result<Result<Ok, Error>, Error>) : Result<Ok, Error>

Flattens a nested Result.

+
import Result "mo:base/Result";
+assert(Result.flatten<Nat, Text>(#ok(#ok(10))) == #ok(10));
+assert(Result.flatten<Nat, Text>(#err("Wrong")) == #err("Wrong"));
+assert(Result.flatten<Nat, Text>(#ok(#err("Wrong"))) == #err("Wrong"));

public func mapOk<Ok1, Ok2, Error>(x : Result<Ok1, Error>, f : Ok1 -> Ok2) : Result<Ok2, Error>

Maps the Ok type/value, leaving any Error type/value unchanged.

+

public func mapErr<Ok, Error1, Error2>(x : Result<Ok, Error1>, f : Error1 -> Error2) : Result<Ok, Error2>

Maps the Err type/value, leaving any Ok type/value unchanged.

+

public func fromOption<R, E>(x : ?R, err : E) : Result<R, E>

Create a result from an option, including an error value to handle the null case.

+
import Result "mo:base/Result";
+assert(Result.fromOption(?42, "err") == #ok(42));
+assert(Result.fromOption(null, "err") == #err("err"));

public func toOption<R, E>(r : Result<R, E>) : ?R

Create an option from a result, turning all #err into null.

+
import Result "mo:base/Result";
+assert(Result.toOption(#ok(42)) == ?42);
+assert(Result.toOption(#err("err")) == null);

public func iterate<Ok, Err>(res : Result<Ok, Err>, f : Ok -> ())

Applies a function to a successful value, but discards the result. Use +iterate if you're only interested in the side effect f produces.

+
import Result "mo:base/Result";
+var counter : Nat = 0;
+Result.iterate<Nat, Text>(#ok(5), func (x : Nat) { counter += x });
+assert(counter == 5);
+Result.iterate<Nat, Text>(#err("Wrong"), func (x : Nat) { counter += x });
+assert(counter == 5);

public func isOk(r : Result<Any, Any>) : Bool

public func isErr(r : Result<Any, Any>) : Bool

public func assertOk(r : Result<Any, Any>)

Asserts that its argument is an #ok result, traps otherwise.

+

public func assertErr(r : Result<Any, Any>)

Asserts that its argument is an #err result, traps otherwise.

+

public func fromUpper<Ok, Err>(result : {#Ok : Ok; #Err : Err}) : Result<Ok, Err>

Converts an upper cased #Ok, #Err result type into a lowercased #ok, #err result type. +On the IC, a common convention is to use #Ok and #Err as the variants of a result type, +but in Motoko, we use #ok and #err instead.

+

public func toUpper<Ok, Err>(result : Result<Ok, Err>) : {#Ok : Ok; #Err : Err}

Converts a lower cased #ok, #err result type into an upper cased #Ok, #Err result type. +On the IC, a common convention is to use #Ok and #Err as the variants of a result type, +but in Motoko, we use #ok and #err instead.

+

\ No newline at end of file diff --git a/base-doc/Stack.html b/base-doc/Stack.html new file mode 100644 index 00000000000..e10e4deb0cb --- /dev/null +++ b/base-doc/Stack.html @@ -0,0 +1,46 @@ + +

Stack

Class Stack<X> provides a Minimal LIFO stack of elements of type X.

+

See library Deque for mixed LIFO/FIFO behavior.

+

Example:

+
motoko name=initialize
+import Stack "mo:base/Stack";
+
+let stack = Stack.Stack<Nat>(); // create a stack

Runtime: O(1)

+

Space: O(1)

+

class Stack<T>()

public func push(x : T)

Push an element on the top of the stack.

+

Example:

+
motoko include=initialize
+stack.push(1);
+stack.push(2);
+stack.push(3);
+stack.peek(); // examine the top most element
+ +

Runtime: O(1)

+

Space: O(1)

+

public func isEmpty() : Bool

True when the stack is empty and false otherwise.

+

Example:

+
motoko include=initialize
+stack.isEmpty();
+ +

Runtime: O(1)

+

Space: O(1)

+

public func peek() : ?T

Return (without removing) the top element, or return null if the stack is empty.

+

Example:

+
motoko include=initialize
+stack.push(1);
+stack.push(2);
+stack.push(3);
+stack.peek();
+ +

Runtime: O(1)

+

Space: O(1)

+

public func pop() : ?T

Remove and return the top element, or return null if the stack is empty.

+

Example:

+
motoko include=initialize
+stack.push(1);
+ignore stack.pop();
+stack.isEmpty();
+ +

Runtime: O(1)

+

Space: O(1)

+

\ No newline at end of file diff --git a/base-doc/Text.html b/base-doc/Text.html new file mode 100644 index 00000000000..51c1b77d027 --- /dev/null +++ b/base-doc/Text.html @@ -0,0 +1,142 @@ + +

Text

Utility functions for Text values.

+

A Text value represents human-readable text as a sequence of characters of type Char.

+
let text = "Hello!";
+let size = text.size(); // 6
+let iter = text.chars(); // iterator ('H', 'e', 'l', 'l', 'o', '!')
+let concat = text # " 👋"; // "Hello! 👋"
+ +

The "mo:base/Text" module defines additional operations on Text values.

+

Import the module from the base library:

+
motoko name=import
+import Text "mo:base/Text";
+ +

Note: Text values are represented as ropes of UTF-8 character sequences with O(1) concatenation.

+

type Text = Prim.Types.Text

The type corresponding to primitive Text values.

+
let hello = "Hello!";
+let emoji = "👋";
+let concat = hello # " " # emoji; // "Hello! 👋"

public let fromChar : (c : Char) -> Text

Converts the given Char to a Text value.

+
motoko include=import
+let text = Text.fromChar('A'); // "A"

public func toIter(t : Text) : Iter.Iter<Char>

Iterates over each Char value in the given Text.

+

Equivalent to calling the t.chars() method where t is a Text value.

+
motoko include=import
+import { print } "mo:base/Debug";
+
+for (c in Text.toIter("abc")) {
+  print(debug_show c);
+}

public func toArray(t : Text) : [Char]

Creates a new Array containing characters of the given Text.

+

Equivalent to Iter.toArray(t.chars()).

+
motoko include=import
+assert Text.toArray("Café") == ['C', 'a', 'f', 'é'];
+ +

Runtime: O(t.size()) +Space: O(t.size())

+

public func toVarArray(t : Text) : [var Char]

Creates a new mutable Array containing characters of the given Text.

+

Equivalent to Iter.toArrayMut(t.chars()).

+
motoko include=import
+assert Text.toVarArray("Café") == [var 'C', 'a', 'f', 'é'];
+ +

Runtime: O(t.size()) +Space: O(t.size())

+

public func fromIter(cs : Iter.Iter<Char>) : Text

Creates a Text value from a Char iterator.

+
motoko include=import
+let text = Text.fromIter(['a', 'b', 'c'].vals()); // "abc"

public func size(t : Text) : Nat

Returns the number of characters in the given Text.

+

Equivalent to calling t.size() where t is a Text value.

+
motoko include=import
+let size = Text.size("abc"); // 3

public func hash(t : Text) : Hash.Hash

Returns a hash obtained by using the djb2 algorithm (more details).

+
motoko include=import
+let hash = Text.hash("abc");
+ +

Note: this algorithm is intended for use in data structures rather than as a cryptographic hash function.

+

public func concat(t1 : Text, t2 : Text) : Text

Returns t1 # t2, where # is the Text concatenation operator.

+
motoko include=import
+let a = "Hello";
+let b = "There";
+let together = a # b; // "HelloThere"
+let withSpace = a # " " # b; // "Hello There"
+let togetherAgain = Text.concat(a, b); // "HelloThere"

public func equal(t1 : Text, t2 : Text) : Bool

Returns t1 == t2.

+

public func notEqual(t1 : Text, t2 : Text) : Bool

Returns t1 != t2.

+

public func less(t1 : Text, t2 : Text) : Bool

Returns t1 < t2.

+

public func lessOrEqual(t1 : Text, t2 : Text) : Bool

Returns t1 <= t2.

+

public func greater(t1 : Text, t2 : Text) : Bool

Returns t1 > t2.

+

public func greaterOrEqual(t1 : Text, t2 : Text) : Bool

Returns t1 >= t2.

+

public func compare(t1 : Text, t2 : Text) : {#less; #equal; #greater}

Compares t1 and t2 lexicographically.

+
motoko include=import
+import { print } "mo:base/Debug";
+
+print(debug_show Text.compare("abc", "abc")); // #equal
+print(debug_show Text.compare("abc", "def")); // #less
+print(debug_show Text.compare("abc", "ABC")); // #greater

public func join(sep : Text, ts : Iter.Iter<Text>) : Text

Join an iterator of Text values with a given delimiter.

+
motoko include=import
+let joined = Text.join(", ", ["a", "b", "c"].vals()); // "a, b, c"

public func map(t : Text, f : Char -> Char) : Text

Applies a function to each character in a Text value, returning the concatenated Char results.

+
motoko include=import
+// Replace all occurrences of '?' with '!'
+let result = Text.map("Motoko?", func(c) {
+  if (c == '?') '!'
+  else c
+});

public func translate(t : Text, f : Char -> Text) : Text

Returns the result of applying f to each character in ts, concatenating the intermediate text values.

+
motoko include=import
+// Replace all occurrences of '?' with "!!"
+let result = Text.translate("Motoko?", func(c) {
+  if (c == '?') "!!"
+  else Text.fromChar(c)
+}); // "Motoko!!"

type Pattern = {#char : Char; #text : Text; #predicate : (Char -> Bool)}

A pattern p describes a sequence of characters. A pattern has one of the following forms:

+
  • #char c matches the single character sequence, c.
  • #text t matches multi-character text sequence t.
  • #predicate p matches any single character sequence c satisfying predicate p(c).
+ +

A match for p is any sequence of characters matching the pattern p.

+
motoko include=import
+let charPattern = #char 'A';
+let textPattern = #text "phrase";
+let predicatePattern : Text.Pattern = #predicate (func(c) { c == 'A' or c == 'B' }); // matches "A" or "B"

public func split(t : Text, p : Pattern) : Iter.Iter<Text>

Splits the input Text with the specified Pattern.

+

Two fields are separated by exactly one match.

+
motoko include=import
+let words = Text.split("This is a sentence.", #char ' ');
+Text.join("|", words) // "This|is|a|sentence."

public func tokens(t : Text, p : Pattern) : Iter.Iter<Text>

Returns a sequence of tokens from the input Text delimited by the specified Pattern, derived from start to end. +A "token" is a non-empty maximal subsequence of t not containing a match for pattern p. +Two tokens may be separated by one or more matches of p.

+
motoko include=import
+let tokens = Text.tokens("this needs\n an   example", #predicate (func(c) { c == ' ' or c == '\n' }));
+Text.join("|", tokens) // "this|needs|an|example"

public func contains(t : Text, p : Pattern) : Bool

Returns true if the input Text contains a match for the specified Pattern.

+
motoko include=import
+Text.contains("Motoko", #text "oto") // true

public func startsWith(t : Text, p : Pattern) : Bool

Returns true if the input Text starts with a prefix matching the specified Pattern.

+
motoko include=import
+Text.startsWith("Motoko", #text "Mo") // true

public func endsWith(t : Text, p : Pattern) : Bool

Returns true if the input Text ends with a suffix matching the specified Pattern.

+
motoko include=import
+Text.endsWith("Motoko", #char 'o') // true

public func replace(
  t : Text,
  p : Pattern,
  r : Text
) : Text

Returns the input text t with all matches of pattern p replaced by text r.

+
motoko include=import
+let result = Text.replace("abcabc", #char 'a', "A"); // "AbcAbc"

public func stripStart(t : Text, p : Pattern) : ?Text

Strips one occurrence of the given Pattern from the beginning of the input Text. +If you want to remove multiple instances of the pattern, use Text.trimStart() instead.

+
motoko include=import
+// Try to strip a nonexistent character
+let none = Text.stripStart("abc", #char '-'); // null
+// Strip just one '-'
+let one = Text.stripStart("--abc", #char '-'); // ?"-abc"

public func stripEnd(t : Text, p : Pattern) : ?Text

Strips one occurrence of the given Pattern from the end of the input Text. +If you want to remove multiple instances of the pattern, use Text.trimEnd() instead.

+
motoko include=import
+// Try to strip a nonexistent character
+let none = Text.stripEnd("xyz", #char '-'); // null
+// Strip just one '-'
+let one = Text.stripEnd("xyz--", #char '-'); // ?"xyz-"

public func trimStart(t : Text, p : Pattern) : Text

Trims the given Pattern from the start of the input Text. +If you only want to remove a single instance of the pattern, use Text.stripStart() instead.

+
motoko include=import
+let trimmed = Text.trimStart("---abc", #char '-'); // "abc"

public func trimEnd(t : Text, p : Pattern) : Text

Trims the given Pattern from the end of the input Text. +If you only want to remove a single instance of the pattern, use Text.stripEnd() instead.

+
motoko include=import
+let trimmed = Text.trimEnd("xyz---", #char '-'); // "xyz"

public func trim(t : Text, p : Pattern) : Text

Trims the given Pattern from both the start and end of the input Text.

+
motoko include=import
+let trimmed = Text.trim("---abcxyz---", #char '-'); // "abcxyz"

public func compareWith(
  t1 : Text,
  t2 : Text,
  cmp : (Char, Char) -> {#less; #equal; #greater}
) : {#less; #equal; #greater}

Compares t1 and t2 using the provided character-wise comparison function.

+
motoko include=import
+import Char "mo:base/Char";
+
+Text.compareWith("abc", "ABC", func(c1, c2) { Char.compare(c1, c2) }) // #greater

public let encodeUtf8 : Text -> Blob

Returns a UTF-8 encoded Blob from the given Text.

+
motoko include=import
+let blob = Text.encodeUtf8("Hello");

public let decodeUtf8 : Blob -> ?Text

Tries to decode the given Blob as UTF-8. +Returns null if the blob is not valid UTF-8.

+
motoko include=import
+let text = Text.decodeUtf8("\48\65\6C\6C\6F"); // ?"Hello"

public let toLowercase : Text -> Text

Returns the text argument in lowercase. +WARNING: Unicode compliant only when compiled, not interpreted.

+
motoko include=import
+let text = Text.toLowercase("Good Day"); // ?"good day"

public let toUppercase : Text -> Text

Returns the text argument in uppercase. Unicode compliant. +WARNING: Unicode compliant only when compiled, not interpreted.

+
motoko include=import
+let text = Text.toUppercase("Good Day"); // ?"GOOD DAY"

\ No newline at end of file diff --git a/base-doc/Time.html b/base-doc/Time.html new file mode 100644 index 00000000000..4ca7d3e7df4 --- /dev/null +++ b/base-doc/Time.html @@ -0,0 +1,9 @@ + +

Time

System time

+

type Time = Int

System time is represent as nanoseconds since 1970-01-01.

+

public let now : () -> Time

Current system time given as nanoseconds since 1970-01-01. The system guarantees that:

+
  • the time, as observed by the canister smart contract, is monotonically increasing, even across canister upgrades.
  • within an invocation of one entry point, the time is constant.
+ +

The system times of different canisters are unrelated, and calls from one canister to another may appear to travel "backwards in time"

+

Note: While an implementation will likely try to keep the system time close to the real time, this is not formally guaranteed.

+

\ No newline at end of file diff --git a/base-doc/Timer.html b/base-doc/Timer.html new file mode 100644 index 00000000000..fecabd51a60 --- /dev/null +++ b/base-doc/Timer.html @@ -0,0 +1,27 @@ + +

Timer

Timers for one-off or periodic tasks.

+

Note: If moc is invoked with -no-timer, the importing will fail. +Note: The resolution of the timers is in the order of the block rate,

+
  so durations should be chosen well above that. For frequent
+  canister wake-ups the heatbeat mechanism should be considered.

type Duration = {#seconds : Nat; #nanoseconds : Nat}

type TimerId = Nat

public func setTimer(d : Duration, job : () -> async ()) : TimerId

Installs a one-off timer that upon expiration after given duration d +executes the future job().

+
motoko no-repl
+let now = Time.now();
+let thirtyMinutes = 1_000_000_000 * 60 * 30;
+func alarmUser() : async () {
+  // ...
+};
+appt.reminder = setTimer(#nanoseconds (Int.abs(appt.when - now - thirtyMinutes)), alarmUser);

public func recurringTimer(d : Duration, job : () -> async ()) : TimerId

Installs a recurring timer that upon expiration after given duration d +executes the future job() and reinserts itself for another expiration.

+

Note: A duration of 0 will only expire once.

+
motoko no-repl
+func checkAndWaterPlants() : async () {
+  // ...
+};
+let daily = recurringTimer(#seconds (24 * 60 * 60), checkAndWaterPlants);

public let cancelTimer : TimerId -> ()

Cancels a still active timer with (id : TimerId). For expired timers +and not recognised ids nothing happens.

+
motoko no-repl
+func deleteAppt(appt : Appointment) {
+  cancelTimer (appt.reminder);
+  // ...
+};

\ No newline at end of file diff --git a/base-doc/Trie.html b/base-doc/Trie.html new file mode 100644 index 00000000000..6ca734bf186 --- /dev/null +++ b/base-doc/Trie.html @@ -0,0 +1,485 @@ + +

Trie

Functional key-value hash maps.

+

This module provides an applicative (functional) hash map, called a trie. +Notably, each operation produces a new trie rather than destructively updating an existing trie.

+

Those looking for a more familiar (imperative, +object-oriented) hash map should consider TrieMap or HashMap instead.

+

The basic Trie operations consist of:

+
  • put - put a key-value into the trie, producing a new version.
  • get - get a key's value from the trie, or null if none.
  • remove - remove a key's value from the trie
  • iter - visit every key-value in the trie.
+ +

The put, get and remove operations work over Key records, +which group the hash of the key with its non-hash key value.

+

LIMITATIONS: This data structure allows at most MAX_LEAF_SIZE=8 hash collisions: +attempts to insert more than MAX_LEAF_SIZE keys (whether directly via put or indirectly via other operations) with the same hash value will trap.

+

CREDITS: Based on Section 6 of "Incremental computation via function caching", Pugh & Teitelbaum.

+

Example:

+
import Trie "mo:base/Trie";
+import Text "mo:base/Text";
+
+// we do this to have shorter type names and thus
+// better readibility
+type Trie<K, V> = Trie.Trie<K, V>;
+type Key<K> = Trie.Key<K>;
+
+// we have to provide `put`, `get` and `remove` with
+// a record of type `Key<K> = { hash : Hash.Hash; key : K }`;
+// thus we define the following function that takes a value of type `K`
+// (in this case `Text`) and returns a `Key<K>` record.
+func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
+
+// we start off by creating an empty `Trie`
+let t0 : Trie<Text, Nat> = Trie.empty();
+
+// `put` requires 4 arguments:
+// - the trie we want to insert the value into,
+// - the key of the value we want to insert (note that we use the `key` function defined above),
+// - a function that checks for equality of keys, and
+// - the value we want to insert.
+//
+// When inserting a value, `put` returns a tuple of type `(Trie<K, V>, ?V)`.
+// to get the new trie that contains the value,  we use the `0` projection
+// and assign it to `t1` and `t2` respectively.
+let t1 : Trie<Text, Nat> = Trie.put(t0, key "hello", Text.equal, 42).0;
+let t2 : Trie<Text, Nat> = Trie.put(t1, key "world", Text.equal, 24).0;
+
+// If for a given key there already was a value in the trie, `put` returns
+// that previous value as the second element of the tuple.
+// in our case we have already inserted the value 42 for the key "hello", so
+// `put` returns 42 as the second element of the tuple.
+let (t3, n) : (Trie<Text, Nat>, ?Nat) = Trie.put(
+  t2,
+  key "hello",
+  Text.equal,
+  0,
+);
+assert (n == ?42);
+
+// `get` requires 3 arguments:
+// - the trie we want to get the value from
+// - the key of the value we want to get (note that we use the `key` function defined above)
+// - a function that checks for equality of keys
+//
+// If the given key is nonexistent in the trie, `get` returns `null`.
+var value = Trie.get(t3, key "hello", Text.equal); // Returns `?42`
+assert(value == ?0);
+value := Trie.get(t3, key "universe", Text.equal); // Returns `null`
+assert(value == null);
+
+// `remove` requires 3 arguments:
+// - the trie we want to remove the value from,
+// - the key of the value we want to remove (note that we use the `key` function defined above), and
+// - a function that checks for equality of keys.
+//
+// In the case of keys of type `Text`, we can use `Text.equal`
+// to check for equality of keys. Function `remove` returns a tuple of type `(Trie<K, V>, ?V)`.
+// where the second element of the tuple is the value that was removed, or `null` if
+// there was no value for the given key.
+let removedValue : ?Nat = Trie.remove(
+  t3,
+  key "hello",
+  Text.equal,
+).1;
+assert (removedValue == ?0);
+
+// To iterate over the Trie, we use the `iter` function that takes a trie
+// of type `Trie<K,V>` and returns an iterator of type `Iter<(K,V)>`:
+var sum : Nat = 0;
+for (kv in Trie.iter(t3)) {
+  sum += kv.1;
+};
+assert(sum == 24);

type Trie<K, V> = {#empty; #leaf : Leaf<K, V>; #branch : Branch<K, V>}

Binary hash tries: either empty, a leaf node, or a branch node

+

type Leaf<K, V> = { size : Nat; keyvals : AssocList<Key<K>, V> }

Leaf nodes of trie consist of key-value pairs as a list.

+

type Branch<K, V> = { size : Nat; left : Trie<K, V>; right : Trie<K, V> }

Branch nodes of the trie discriminate on a bit position of the keys' hashes. +This bit position is not stored in the branch but determined from +the context of the branch.

+

type AssocList<K, V> = AssocList.AssocList<K, V>

type Key<K> = { hash : Hash.Hash; key : K }

A Key for the trie has an associated hash value

+
  • hash permits fast inequality checks, and permits collisions, while
  • key permits precise equality checks, but is only used on values with equal hashes.

public func equalKey<K>(keq : (K, K) -> Bool) : ((Key<K>, Key<K>) -> Bool)

Equality function for two Key<K>s, in terms of equality of K's.

+

public func isValid<K, V>(t : Trie<K, V>, _enforceNormal : Bool) : Bool

@deprecated isValid is an internal predicate and will be removed in future.

+

type Trie2D<K1, K2, V> = Trie<K1, Trie<K2, V>>

A 2D trie maps dimension-1 keys to another +layer of tries, each keyed on the dimension-2 keys.

+

type Trie3D<K1, K2, K3, V> = Trie<K1, Trie2D<K2, K3, V>>

A 3D trie maps dimension-1 keys to another +Composition of 2D tries, each keyed on the dimension-2 and dimension-3 keys.

+

public func empty<K, V>() : Trie<K, V>

An empty trie. This is usually the starting point for building a trie.

+

Example:

+
motoko name=initialize
+import { print } "mo:base/Debug";
+import Trie "mo:base/Trie";
+import Text "mo:base/Text";
+
+// we do this to have shorter type names and thus
+// better readibility
+type Trie<K, V> = Trie.Trie<K, V>;
+type Key<K> = Trie.Key<K>;
+
+// We have to provide `put`, `get` and `remove` with
+// a function of return type `Key<K> = { hash : Hash.Hash; key : K }`
+func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
+// We start off by creating an empty `Trie`
+var trie : Trie<Text, Nat> = Trie.empty();

public func size<K, V>(t : Trie<K, V>) : Nat

Get the size in O(1) time.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+var size = Trie.size(trie); // Returns 0, as `trie` is empty
+assert(size == 0);
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+size := Trie.size(trie); // Returns 1, as we just added a new entry
+assert(size == 1);

public func branch<K, V>(l : Trie<K, V>, r : Trie<K, V>) : Trie<K, V>

Construct a branch node, computing the size stored there.

+

public func leaf<K, V>(kvs : AssocList<Key<K>, V>, bitpos : Nat) : Trie<K, V>

Construct a leaf node, computing the size stored there.

+

This helper function automatically enforces the MAX_LEAF_SIZE +by constructing branches as necessary; to do so, it also needs the bitpos +of the leaf.

+

public func fromList<K, V>(
  kvc : ?Nat,
  kvs : AssocList<Key<K>, V>,
  bitpos : Nat
) : Trie<K, V>

Transform a list into a trie, splitting input list into small (leaf) lists, if necessary.

+

public func clone<K, V>(t : Trie<K, V>) : Trie<K, V>

Clone the trie efficiently, via sharing.

+

Purely-functional representation permits O(1) copy, via persistent sharing.

+

public func replace<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v : ?V
) : (Trie<K, V>, ?V)

Replace the given key's value option with the given value, returning the modified trie. +Also returns the replaced value if the key existed and null otherwise. +Compares keys using the provided function k_eq.

+

Note: Replacing a key's value by null removes the key and also shrinks the trie.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "test", Text.equal, 1).0;
+trie := Trie.replace(trie, key "test", Text.equal, 42).0;
+assert (Trie.get(trie, key "hello", Text.equal) == ?42);

public func put<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v : V
) : (Trie<K, V>, ?V)

Put the given key's value in the trie; return the new trie, and the previous value associated with the key, if any.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+let previousValue = Trie.put(trie, key "hello", Text.equal, 33).1; // Returns ?42
+assert(previousValue == ?42);

public func get<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool
) : ?V

Get the value of the given key in the trie, or return null if nonexistent.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+var value = Trie.get(trie, key "hello", Text.equal); // Returns `?42`
+assert(value == ?42);
+value := Trie.get(trie, key "world", Text.equal); // Returns `null`
+assert(value == null);

public func find<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool
) : ?V

Find the given key's value in the trie, or return null if nonexistent

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+var value = Trie.find(trie, key "hello", Text.equal); // Returns `?42`
+assert(value == ?42);
+value := Trie.find(trie, key "world", Text.equal); // Returns `null`
+assert(value == null);

public func merge<K, V>(
  tl : Trie<K, V>,
  tr : Trie<K, V>,
  k_eq : (K, K) -> Bool
) : Trie<K, V>

Merge tries, preferring the left trie where there are collisions +in common keys.

+

note: the disj operation generalizes this merge +operation in various ways, and does not (in general) lose +information; this operation is a simpler, special case.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 has a different value for "hello"
+trie2 := Trie.put(trie2, key "hello", Text.equal, 33).0;
+// mergedTrie has the value 42 for "hello", as the left trie is preferred
+// in the case of a collision
+var mergedTrie = Trie.merge(trie, trie2, Text.equal);
+var value = Trie.get(mergedTrie, key "hello", Text.equal);
+assert(value == ?42);

public func mergeDisjoint<K, V>(
  tl : Trie<K, V>,
  tr : Trie<K, V>,
  k_eq : (K, K) -> Bool
) : Trie<K, V>

+

Merge tries like merge, but traps if there are collisions in common keys between the +left and right inputs.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 has a different value for "hello"
+trie2 := Trie.put(trie2, key "hello", Text.equal, 33).0;
+// `mergeDisjoint` signals a dynamic errror
+// in the case of a collision
+var mergedTrie = Trie.mergeDisjoint(trie, trie2, Text.equal);

public func diff<K, V, W>(
  tl : Trie<K, V>,
  tr : Trie<K, W>,
  k_eq : (K, K) -> Bool
) : Trie<K, V>

Difference of tries. The output consists of pairs of +the left trie whose keys are not present in the right trie; the +values of the right trie are irrelevant.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 now has an additional key
+trie2 := Trie.put(trie2, key "ciao", Text.equal, 33).0;
+// `diff` returns a trie with the key "ciao",
+// as this key is not present in `trie`
+// (note that we pass `trie2` as the left trie)
+Trie.diff(trie2, trie, Text.equal);

public func disj<K, V, W, X>(
  tl : Trie<K, V>,
  tr : Trie<K, W>,
  k_eq : (K, K) -> Bool,
  vbin : (?V, ?W) -> X
) : Trie<K, X>

Map disjunction.

+

This operation generalizes the notion of "set union" to finite maps.

+

Produces a "disjunctive image" of the two tries, where the values of +matching keys are combined with the given binary operator.

+

For unmatched key-value pairs, the operator is still applied to +create the value in the image. To accomodate these various +situations, the operator accepts optional values, but is never +applied to (null, null).

+

Implements the database idea of an "outer join".

+

public func join<K, V, W, X>(
  tl : Trie<K, V>,
  tr : Trie<K, W>,
  k_eq : (K, K) -> Bool,
  vbin : (V, W) -> X
) : Trie<K, X>

Map join.

+

Implements the database idea of an "inner join".

+

This operation generalizes the notion of "set intersection" to +finite maps. The values of matching keys are combined with the given binary +operator, and unmatched key-value pairs are not present in the output.

+

public func foldUp<K, V, X>(
  t : Trie<K, V>,
  bin : (X, X) -> X,
  leaf : (K, V) -> X,
  empty : X
) : X

This operation gives a recursor for the internal structure of +tries. Many common operations are instantiations of this function, +either as clients, or as hand-specialized versions (e.g., see , map, +mapFilter, some and all below).

+

public func prod<K1, V1, K2, V2, K3, V3>(
  tl : Trie<K1, V1>,
  tr : Trie<K2, V2>,
  op : (K1, V1, K2, V2) -> ?(Key<K3>, V3),
  k3_eq : (K3, K3) -> Bool
) : Trie<K3, V3>

Map product.

+

Conditional catesian product, where the given +operation op conditionally creates output elements in the +resulting trie.

+

The keyed structure of the input tries are not relevant for this +operation: all pairs are considered, regardless of keys matching or +not. Moreover, the resulting trie may use keys that are unrelated to +these input keys.

+

public func iter<K, V>(t : Trie<K, V>) : I.Iter<(K, V)>

Returns an iterator of type Iter over the key-value entries of the trie.

+

Each iterator gets a persistent view of the mapping, independent of concurrent updates to the iterated map.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+// create an Iterator over key-value pairs of trie
+let iter = Trie.iter(trie);
+// add another key-value pair to `trie`.
+// because we created our iterator before
+// this update, it will not contain this new key-value pair
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+var sum : Nat = 0;
+for ((k,v) in iter) {
+  sum += v;
+};
+assert(sum == 74);

module Build

type Build<K, V> = {#skip; #put : (K, ?Hash.Hash, V); #seq : { size : Nat; left : Build<K, V>; right : Build<K, V> }}

The build of a trie, as an AST for a simple DSL.

+

public func size<K, V>(tb : Build<K, V>) : Nat

Size of the build, measured in #put operations

+

public func seq<K, V>(l : Build<K, V>, r : Build<K, V>) : Build<K, V>

Build sequence of two sub-builds

+

public func prod<K1, V1, K2, V2, K3, V3>(
  tl : Trie<K1, V1>,
  tr : Trie<K2, V2>,
  op : (K1, V1, K2, V2) -> ?(K3, V3),
  _k3_eq : (K3, K3) -> Bool
) : Build<K3, V3>

Like prod, except do not actually do the put calls, just +record them, as a (binary tree) data structure, isomorphic to the +recursion of this function (which is balanced, in expectation).

+

public func nth<K, V>(tb : Build<K, V>, i : Nat) : ?(K, ?Hash.Hash, V)

Project the nth key-value pair from the trie build.

+

This position is meaningful only when the build contains multiple uses of one or more keys, otherwise it is not.

+

public func projectInner<K1, K2, V>(t : Trie<K1, Build<K2, V>>) : Build<K2, V>

Like mergeDisjoint, except that it avoids the +work of actually merging any tries; rather, just record the work for +latter (if ever).

+

public func toArray<K, V, W>(tb : Build<K, V>, f : (K, V) -> W) : [W]

Gather the collection of key-value pairs into an array of a (possibly-distinct) type.

+

Represent the construction of tries as data.

+

This module provides optimized variants of normal tries, for +more efficient join queries.

+

The central insight is that for (unmaterialized) join query results, we +do not need to actually build any resulting trie of the resulting +data, but rather, just need a collection of what would be in that +trie. Since query results can be large (quadratic in the DB size), +avoiding the construction of this trie provides a considerable savings.

+

To get this savings, we use an ADT for the operations that would build this trie, +if evaluated. This structure specializes a rope: a balanced tree representing a +sequence. It is only as balanced as the tries from which we generate +these build ASTs. They have no intrinsic balance properties of their +own.

+

public func fold<K, V, X>(
  t : Trie<K, V>,
  f : (K, V, X) -> X,
  x : X
) : X

Fold over the key-value pairs of the trie, using an accumulator. +The key-value pairs have no reliable or meaningful ordering.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+// create an accumulator, in our case the sum of all values
+func calculateSum(k : Text, v : Nat, acc : Nat) : Nat = acc + v;
+// Fold over the trie using the accumulator.
+// Note that 0 is the initial value of the accumulator.
+let sum = Trie.fold(trie, calculateSum, 0);
+assert(sum == 77);

public func some<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Bool

Test whether a given key-value pair is present, or not.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+// `some` takes a function that returns a Boolean indicating whether
+// the key-value pair is present or not
+var isPresent = Trie.some(
+  trie,
+  func(k : Text, v : Nat) : Bool = k == "bye" and v == 32,
+);
+assert(isPresent == true);
+isPresent := Trie.some(
+  trie,
+  func(k : Text, v : Nat) : Bool = k == "hello" and v == 32,
+);
+assert(isPresent == false);

public func all<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Bool

Test whether all key-value pairs have a given property.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `all` takes a function that returns a boolean indicating whether
+// the key-value pairs all have a given property, in our case that
+// all values are greater than 9
+var hasProperty = Trie.all(
+  trie,
+  func(k : Text, v : Nat) : Bool = v > 9,
+);
+assert(hasProperty == true);
+// now we check if all values are greater than 100
+hasProperty := Trie.all(
+  trie,
+  func(k : Text, v : Nat) : Bool = v > 100,
+);
+assert(hasProperty == false);

public func nth<K, V>(t : Trie<K, V>, i : Nat) : ?(Key<K>, V)

Project the nth key-value pair from the trie.

+

Note: This position is not meaningful; it's only here so that we +can inject tries into arrays using functions like Array.tabulate.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+import Array "mo:base/Array";
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `tabulate` takes a size parameter, so we check the size of
+// the trie first
+let size = Trie.size(trie);
+// Now we can create an array of the same size passing `nth` as
+// the generator used to fill the array.
+// Note that `toArray` is a convenience function that does the
+// same thing without you having to check whether the tuple is
+// `null` or not, which we're not doing in this example
+let array = Array.tabulate<?(Key<Text>, Nat)>(
+  size,
+  func n = Trie.nth(trie, n)
+);

public func toArray<K, V, W>(t : Trie<K, V>, f : (K, V) -> W) : [W]

Gather the collection of key-value pairs into an array of a (possibly-distinct) type.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `toArray` takes a function that takes a key-value tuple
+// and returns a value of the type you want to use to fill
+// the array.
+// In our case we just return the value
+let array = Trie.toArray<Text, Nat, Nat>(
+  trie,
+  func (k, v) = v
+);

public func isEmpty<K, V>(t : Trie<K, V>) : Bool

Test for "deep emptiness": subtrees that have branching structure, +but no leaves. These can result from naive filtering operations; +filter uses this function to avoid creating such subtrees.

+

public func filter<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Trie<K, V>

Filter the key-value pairs by a given predicate.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `filter` takes a function that takes a key-value tuple
+// and returns true if the key-value pair should be included.
+// In our case those are pairs with a value greater than 20
+let filteredTrie = Trie.filter<Text, Nat>(
+  trie,
+  func (k, v) = v > 20
+);
+assert (Trie.all<Text, Nat>(filteredTrie, func(k, v) = v > 20) == true);

public func mapFilter<K, V, W>(t : Trie<K, V>, f : (K, V) -> ?W) : Trie<K, W>

Map and filter the key-value pairs by a given predicate.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `mapFilter` takes a function that takes a key-value tuple
+// and returns a possibly-distinct value if the key-value pair should be included.
+// In our case, we filter for values greater than 20 and map them to their square.
+let filteredTrie = Trie.mapFilter<Text, Nat, Nat>(
+  trie,
+  func (k, v) = if (v > 20) return ?(v**2) else return null
+);
+assert (Trie.all<Text, Nat>(filteredTrie, func(k, v) = v > 60) == true);

public func equalStructure<K, V>(
  tl : Trie<K, V>,
  tr : Trie<K, V>,
  keq : (K, K) -> Bool,
  veq : (V, V) -> Bool
) : Bool

Test for equality, but naively, based on structure. +Does not attempt to remove "junk" in the tree; +For instance, a "smarter" approach would equate + #bin {left = #empty; right = #empty} +with + #empty. +We do not observe that equality here.

+

public func replaceThen<K, V, X>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v2 : V,
  success : (Trie<K, V>, V) -> X,
  fail : () -> X
) : X

Replace the given key's value in the trie, +and only if successful, do the success continuation, +otherwise, return the failure value

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `replaceThen` takes the same arguments as `replace` but also a success continuation
+// and a failure connection that are called in the respective scenarios.
+// if the replace fails, that is the key is not present in the trie, the failure continuation is called.
+// if the replace succeeds, that is the key is present in the trie, the success continuation is called.
+// in this example we are simply returning the Text values `success` and `fail` respectively.
+var continuation = Trie.replaceThen<Text, Nat, Text>(
+  trie,
+  key "hello",
+  Text.equal,
+  12,
+  func (t, v) = "success",
+  func () = "fail"
+);
+assert (continuation == "success");
+continuation := Trie.replaceThen<Text, Nat, Text>(
+  trie,
+  key "shalom",
+  Text.equal,
+  12,
+  func (t, v) = "success",
+  func () = "fail"
+);
+assert (continuation == "fail");

public func putFresh<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  v : V
) : Trie<K, V>

Put the given key's value in the trie; return the new trie; assert that no prior value is associated with the key

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+// note that compared to `put`, `putFresh` does not return a tuple
+trie := Trie.putFresh(trie, key "hello", Text.equal, 42);
+trie := Trie.putFresh(trie, key "bye", Text.equal, 32);
+// this will fail as "hello" is already present in the trie
+trie := Trie.putFresh(trie, key "hello", Text.equal, 10);

public func put2D<K1, K2, V>(
  t : Trie2D<K1, K2, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool,
  v : V
) : Trie2D<K1, K2, V>

Put the given key's value in the 2D trie; return the new 2D trie.

+

public func put3D<K1, K2, K3, V>(
  t : Trie3D<K1, K2, K3, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool,
  k3 : Key<K3>,
  k3_eq : (K3, K3) -> Bool,
  v : V
) : Trie3D<K1, K2, K3, V>

Put the given key's value in the trie; return the new trie;

+

public func remove<K, V>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool
) : (Trie<K, V>, ?V)

Remove the entry for the given key from the trie, by returning the reduced trie. +Also returns the removed value if the key existed and null otherwise. +Compares keys using the provided function k_eq.

+

Note: The removal of an existing key shrinks the trie.

+

For a more detailed overview of how to use a Trie, +see the User's Overview.

+

Example:

+
motoko include=initialize
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+// remove the entry associated with "hello"
+trie := Trie.remove(trie, key "hello", Text.equal).0;
+assert (Trie.get(trie, key "hello", Text.equal) == null);

public func removeThen<K, V, X>(
  t : Trie<K, V>,
  k : Key<K>,
  k_eq : (K, K) -> Bool,
  success : (Trie<K, V>, V) -> X,
  fail : () -> X
) : X

Remove the given key's value in the trie, +and only if successful, do the success continuation, +otherwise, return the failure value

+

public func remove2D<K1, K2, V>(
  t : Trie2D<K1, K2, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool
) : (Trie2D<K1, K2, V>, ?V)

remove the given key-key pair's value in the 2D trie; return the +new trie, and the prior value, if any.

+

public func remove3D<K1, K2, K3, V>(
  t : Trie3D<K1, K2, K3, V>,
  k1 : Key<K1>,
  k1_eq : (K1, K1) -> Bool,
  k2 : Key<K2>,
  k2_eq : (K2, K2) -> Bool,
  k3 : Key<K3>,
  k3_eq : (K3, K3) -> Bool
) : (Trie3D<K1, K2, K3, V>, ?V)

Remove the given key-key pair's value in the 3D trie; return the +new trie, and the prior value, if any.

+

public func mergeDisjoint2D<K1, K2, V>(
  t : Trie2D<K1, K2, V>,
  _k1_eq : (K1, K1) -> Bool,
  k2_eq : (K2, K2) -> Bool
) : Trie<K2, V>

Like mergeDisjoint, except instead of merging a +pair, it merges the collection of dimension-2 sub-trees of a 2D +trie.

+

\ No newline at end of file diff --git a/base-doc/TrieMap.html b/base-doc/TrieMap.html new file mode 100644 index 00000000000..919e3a30a49 --- /dev/null +++ b/base-doc/TrieMap.html @@ -0,0 +1,212 @@ + +

TrieMap

Class TrieMap<K, V> provides a map from keys of type K to values of type V. +The class wraps and manipulates an underyling hash trie, found in the Trie +module. The trie is a binary tree in which the position of elements in the +tree are determined using the hash of the elements.

+

LIMITATIONS: This data structure allows at most MAX_LEAF_SIZE=8 hash collisions: +attempts to insert more than MAX_LEAF_SIZE keys (whether directly via put or indirectly via other operations) with the same hash value will trap. +This limitation is inherited from the underlying Trie data structure.

+

Note: The class TrieMap exposes the same interface as HashMap.

+

Creating a map: +The equality function is used to compare keys, and the hash function is used +to hash keys. See the example below.

+
motoko name=initialize
+import TrieMap "mo:base/TrieMap";
+import Nat "mo:base/Nat";
+import Hash "mo:base/Hash";
+import Iter "mo:base/Iter";
+
+let map = TrieMap.TrieMap<Nat, Nat>(Nat.equal, Hash.hash)

class TrieMap<K, V>(isEq : (K, K) -> Bool, hashOf : K -> Hash.Hash)

public func size() : Nat

Returns the number of entries in the map.

+

Example:

+
motoko include=initialize
+map.size()
+ +

Runtime: O(1) +Space: O(1)

+

public func put(key : K, value : V)

Maps key to value, and overwrites the old entry if the key +was already present.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(2, 12);
+Iter.toArray(map.entries())
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func replace(key : K, value : V) : ?V

Maps key to value. Overwrites and returns the old entry as an +option if the key was already present, and null otherwise.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.replace(0, 20)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func get(key : K) : ?V

Gets the value associated with the key key in an option, or null if it +doesn't exist.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.get(0)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func delete(key : K)

Delete the entry associated with key key, if it exists. If the key is +absent, there is no effect.

+

Note: The deletion of an existing key shrinks the trie map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.delete(0);
+map.get(0)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func remove(key : K) : ?V

Delete the entry associated with key key. Return the deleted value +as an option if it exists, and null otherwise.

+

Note: The deletion of an existing key shrinks the trie map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.remove(0)
+ +

Runtime: O(log(size)) +Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and the +map is using a constant time and space equality and hash function.

+

public func keys() : I.Iter<K>

Returns an iterator over the keys of the map.

+

Each iterator gets a snapshot view of the mapping, and is unaffected +by concurrent updates to the iterated map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the keys
+var sum = 0;
+for (key in map.keys()) {
+  sum += key;
+};
+// 0 + 1 + 2
+sum
+ +

Runtime: O(1) +Space: O(1)

+

*The above runtime and space are for the construction of the iterator. +The iteration itself takes linear time and logarithmic space to execute.

+

public func vals() : I.Iter<V>

Returns an iterator over the values in the map.

+

Each iterator gets a snapshot view of the mapping, and is unaffected +by concurrent updates to the iterated map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the values
+var sum = 0;
+for (key in map.vals()) {
+  sum += key;
+};
+// 10 + 11 + 12
+sum
+ +

Runtime: O(1) +Space: O(1)

+

*The above runtime and space are for the construction of the iterator. +The iteration itself takes linear time and logarithmic space to execute.

+

public func entries() : I.Iter<(K, V)>

Returns an iterator over the entries (key-value pairs) in the map.

+

Each iterator gets a snapshot view of the mapping, and is unaffected +by concurrent updates to the iterated map.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the products of key-value pairs
+var sum = 0;
+for ((key, value) in map.entries()) {
+  sum += key * value;
+};
+// (0 * 10) + (1 * 11) + (2 * 12)
+sum
+ +

Runtime: O(1) +Space: O(1)

+

*The above runtime and space are for the construction of the iterator. +The iteration itself takes linear time and logarithmic space to execute.

+

public func clone<K, V>(
  map : TrieMap<K, V>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : TrieMap<K, V>

Produce a copy of map, using keyEq to compare keys and keyHash to +hash keys.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// Clone using the same equality and hash functions used to initialize `map`
+let mapCopy = TrieMap.clone(map, Nat.equal, Hash.hash);
+Iter.toArray(mapCopy.entries())
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that the trie underlying map is reasonably +balanced and that keyEq and keyHash run in O(1) time and space.

+

public func fromEntries<K, V>(
  entries : I.Iter<(K, V)>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash
) : TrieMap<K, V>

Create a new map from the entries in entries, using keyEq to compare +keys and keyHash to hash keys.

+

Example:

+
motoko include=initialize
+let entries = [(0, 10), (1, 11), (2, 12)];
+let newMap = TrieMap.fromEntries<Nat, Nat>(entries.vals(), Nat.equal, Hash.hash);
+newMap.get(2)
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that entries returns elements in O(1) time, +and keyEq and keyHash run in O(1) time and space.

+

public func map<K, V1, V2>(
  map : TrieMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> V2
) : TrieMap<K, V2>

Transform (map) the values in map using function f, retaining the keys. +Uses keyEq to compare keys and keyHash to hash keys.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// double all the values in map
+let newMap = TrieMap.map<Nat, Nat, Nat>(map, Nat.equal, Hash.hash, func(key, value) = value * 2);
+Iter.toArray(newMap.entries())
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that f, keyEq, and keyHash run in O(1) +time and space.

+

public func mapFilter<K, V1, V2>(
  map : TrieMap<K, V1>,
  keyEq : (K, K) -> Bool,
  keyHash : K -> Hash.Hash,
  f : (K, V1) -> ?V2
) : TrieMap<K, V2>

Transform (map) the values in map using function f, discarding entries +for which f evaluates to null. Uses keyEq to compare keys and +keyHash to hash keys.

+

Example:

+
motoko include=initialize
+map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// double all the values in map, only keeping entries that have an even key
+let newMap =
+  TrieMap.mapFilter<Nat, Nat, Nat>(
+    map,
+    Nat.equal,
+    Hash.hash,
+    func(key, value) = if (key % 2 == 0) { ?(value * 2) } else { null }
+  );
+Iter.toArray(newMap.entries())
+ +

Runtime: O(size * log(size)) +Space: O(size)

+

*Runtime and space assumes that f, keyEq, and keyHash run in O(1) +time and space.

+

\ No newline at end of file diff --git a/base-doc/TrieSet.html b/base-doc/TrieSet.html new file mode 100644 index 00000000000..6a05a652eca --- /dev/null +++ b/base-doc/TrieSet.html @@ -0,0 +1,21 @@ + +

TrieSet

Functional set

+

Sets are partial maps from element type to unit type, +i.e., the partial map represents the set with its domain.

+

LIMITATIONS: This data structure allows at most MAX_LEAF_SIZE=8 hash collisions: +attempts to insert more than MAX_LEAF_SIZE elements (whether directly via put or indirectly via other operations) with the same hash value will trap. +This limitation is inherited from the underlying Trie data structure.

+

type Hash = Hash.Hash

type Set<T> = Trie.Trie<T, ()>

public func empty<T>() : Set<T>

Empty set.

+

public func put<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Set<T>

Put an element into the set.

+

public func delete<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Set<T>

Delete an element from the set.

+

public func equal<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Bool

Test if two sets are equal.

+

public func size<T>(s : Set<T>) : Nat

The number of set elements, set's cardinality.

+

public func isEmpty<T>(s : Set<T>) : Bool

Test if s is the empty set.

+

public func isSubset<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Bool

Test if s1 is a subset of s2.

+

public func mem<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Bool

@deprecated: use TrieSet.contains()

+

Test if a set contains a given element.

+

public func contains<T>(
  s : Set<T>,
  x : T,
  xh : Hash,
  eq : (T, T) -> Bool
) : Bool

Test if a set contains a given element.

+

public func union<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Set<T>

Set union.

+

public func diff<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Set<T>

Set difference.

+

public func intersect<T>(
  s1 : Set<T>,
  s2 : Set<T>,
  eq : (T, T) -> Bool
) : Set<T>

Set intersection.

+

public func fromArray<T>(
  arr : [T],
  elemHash : T -> Hash,
  eq : (T, T) -> Bool
) : Set<T>

public func toArray<T>(s : Set<T>) : [T]

\ No newline at end of file diff --git a/base-doc/index.html b/base-doc/index.html new file mode 100644 index 00000000000..24302e82199 --- /dev/null +++ b/base-doc/index.html @@ -0,0 +1,556 @@ + +

Index of modules

  • Array

    Provides extended utility functions on Arrays.

    +

    Note the difference between mutable and non-mutable arrays below.

    +

    WARNING: If you are looking for a list that can grow and shrink in size, +it is recommended you use either the Buffer class or the List class for +those purposes. Arrays must be created with a fixed size.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Array "mo:base/Array";
  • AssocList

    Map implemented as a linked-list of key-value pairs ("Associations").

    +

    NOTE: This map implementation is mainly used as underlying buckets for other map +structures. Thus, other map implementations are easier to use in most cases.

    +
  • Blob

    Module for working with Blobs: immutable sequence of bytes.

    +

    Blobs represent sequences of bytes. They are immutable, iterable, but not indexable and can be empty.

    +

    Byte sequences are also often represented as [Nat8], i.e. an array of bytes, but this representation is currently much less compact than Blob, taking 4 physical bytes to represent each logical byte in the sequence. +If you would like to manipulate Blobs, it is recommended that you convert +Blobs to [var Nat8] or Buffer<Nat8>, do the manipulation, then convert back.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Blob "mo:base/Blob";
    + +

    Some built in features not listed in this module:

    +
    • You can create a Blob literal from a Text literal, provided the context expects an expression of type Blob.
    • b.size() : Nat returns the number of bytes in the blob b;
    • b.vals() : Iter.Iter<Nat8> returns an iterator to enumerate the bytes of the blob b.
    + +

    For example:

    +
    motoko include=import
    +import Debug "mo:base/Debug";
    +import Nat8 "mo:base/Nat8";
    +
    +let blob = "\00\00\00\ff" : Blob; // blob literals, where each byte is delimited by a back-slash and represented in hex
    +let blob2 = "charsもあり" : Blob; // you can also use characters in the literals
    +let numBytes = blob.size(); // => 4 (returns the number of bytes in the Blob)
    +for (byte : Nat8 in blob.vals()) { // iterator over the Blob
    +  Debug.print(Nat8.toText(byte))
    +}
  • Bool

    Boolean type and operations.

    +

    While boolean operators _ and _ and _ or _ are short-circuiting, +avoiding computation of the right argument when possible, the functions +logand(_, _) and logor(_, _) are strict and will always evaluate both +of their arguments.

    +
  • Buffer

    Class Buffer<X> provides a mutable list of elements of type X. +The class wraps and resizes an underyling array that holds the elements, +and thus is comparable to ArrayLists or Vectors in other languages.

    +

    When required, the current state of a buffer object can be converted to a fixed-size array of its elements. +This is recommended for example when storing a buffer to a stable variable.

    +

    Throughout this documentation, two terms come up that can be confused: size +and capacity. size is the length of the list that the buffer represents. +capacity is the length of the underyling array that backs this list. +capacity >= size is an invariant for this class.

    +

    Like arrays, elements in the buffer are ordered by indices from 0 to size-1.

    +

    WARNING: Certain operations are amortized O(1) time, such as add, but run +in worst case O(n) time. These worst case runtimes may exceed the cycles limit +per message if the size of the buffer is large enough. Grow these structures +with discretion. All amortized operations below also list the worst case runtime.

    +

    Constructor: +The argument initCapacity determines the initial capacity of the array. +The underlying array grows by a factor of 1.5 when its current capacity is +exceeded. Further, when the size of the buffer shrinks to be less than 1/4th +of the capacity, the underyling array is shrunk by a factor of 2.

    +

    Example:

    +
    motoko name=initialize
    +import Buffer "mo:base/Buffer";
    +
    +let buffer = Buffer.Buffer<Nat>(3); // Creates a new Buffer
    + +

    Runtime: O(initCapacity)

    +

    Space: O(initCapacity)

    +
  • CertifiedData

    Certified data.

    +

    The Internet Computer allows canister smart contracts to store a small amount of data during +update method processing so that during query call processing, the canister can obtain +a certificate about that data.

    +

    This module provides a low-level interface to this API, aimed at advanced +users and library implementors. See the Internet Computer Functional +Specification and corresponding documentation for how to use this to make query +calls to your canister tamperproof.

    +
  • Char

    Characters

    +
  • Debug

    Utility functions for debugging.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Debug "mo:base/Debug";
  • Deque

    Double-ended queue (deque) of a generic element type T.

    +

    The interface to deques is purely functional, not imperative, and deques are immutable values. +In particular, deque operations such as push and pop do not update their input deque but, instead, return the +value of the modified deque, alongside any other data. +The input deque is left unchanged.

    +

    Examples of use-cases: +Queue (FIFO) by using pushBack() and popFront(). +Stack (LIFO) by using pushFront() and popFront().

    +

    A deque is internally implemented as two lists, a head access list and a (reversed) tail access list, +that are dynamically size-balanced by splitting.

    +

    Construction: Create a new deque with the empty<T>() function.

    +

    Note on the costs of push and pop functions:

    +
    • Runtime: O(1) amortized costs, O(n)` worst case cost per single call.
    • Space: O(1) amortized costs, O(n)` worst case cost per single call.
    + +

    n denotes the number of elements stored in the deque.

    +
  • Error

    Error values and inspection.

    +

    The Error type is the argument to throw, parameter of catch. +The Error type is opaque.

    +
  • ExperimentalCycles

    Managing cycles within actors on the Internet Computer (IC).

    +

    The usage of the Internet Computer is measured, and paid for, in cycles. +This library provides imperative operations for observing cycles, transferring cycles, and +observing refunds of cycles.

    +

    WARNING: This low-level API is experimental and likely to change or even disappear. +Dedicated syntactic support for manipulating cycles may be added to the language in future, obsoleting this library.

    +

    NOTE: Since cycles measure computational resources, the value of balance() can change from one call to the next.

    +

    Example for use on IC:

    +
    motoko no-repl
    +import Cycles "mo:base/ExperimentalCycles";
    +import Debug "mo:base/Debug";
    +
    +actor {
    +  public func main() : async() {
    +    Debug.print("Main balance: " # debug_show(Cycles.balance()));
    +    Cycles.add<system>(15_000_000);
    +    await operation(); // accepts 10_000_000 cycles
    +    Debug.print("Main refunded: " # debug_show(Cycles.refunded())); // 5_000_000
    +    Debug.print("Main balance: " # debug_show(Cycles.balance())); // decreased by around 10_000_000
    +  };
    +
    +  func operation() : async() {
    +    Debug.print("Operation balance: " # debug_show(Cycles.balance()));
    +    Debug.print("Operation available: " # debug_show(Cycles.available()));
    +    let obtained = Cycles.accept<system>(10_000_000);
    +    Debug.print("Operation obtained: " # debug_show(obtained)); // => 10_000_000
    +    Debug.print("Operation balance: " # debug_show(Cycles.balance())); // increased by 10_000_000
    +    Debug.print("Operation available: " # debug_show(Cycles.available())); // decreased by 10_000_000
    +  }
    +}
  • ExperimentalInternetComputer

    Low-level interface to the Internet Computer.

    +

    WARNING: This low-level API is experimental and likely to change or even disappear.

    +
  • ExperimentalStableMemory

    Byte-level access to (virtual) stable memory.

    +

    WARNING: As its name suggests, this library is experimental, subject to change +and may be replaced by safer alternatives in later versions of Motoko. +Use at your own risk and discretion.

    +

    DEPRECATION: Use of ExperimentalStableMemory library may be deprecated in future. +Going forward, users should consider using library Region.mo to allocate isolated regions of memory instead. +Using dedicated regions for different user applications ensures that writing +to one region will not affect the state of another, unrelated region.

    +

    This is a lightweight abstraction over IC stable memory and supports persisting +raw binary data across Motoko upgrades. +Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) IC stable memory internally, but does not interfere with this API.

    +

    Memory is allocated, using grow(pages), sequentially and on demand, in units of 64KiB pages, starting with 0 allocated pages. +New pages are zero initialized. +Growth is capped by a soft limit on page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or 4GiB).

    +

    Each load operation loads from byte address offset in little-endian +format using the natural bit-width of the type in question. +The operation traps if attempting to read beyond the current stable memory size.

    +

    Each store operation stores to byte address offset in little-endian format using the natural bit-width of the type in question. +The operation traps if attempting to write beyond the current stable memory size.

    +

    Text values can be handled by using Text.decodeUtf8 and Text.encodeUtf8, in conjunction with loadBlob and storeBlob.

    +

    The current page allocation and page contents is preserved across upgrades.

    +

    NB: The IC's actual stable memory size (ic0.stable_size) may exceed the +page size reported by Motoko function size(). +This (and the cap on growth) are to accommodate Motoko's stable variables. +Applications that plan to use Motoko stable variables sparingly or not at all can +increase --max-stable-pages as desired, approaching the IC maximum (initially 8GiB, then 32Gib, currently 64Gib). +All applications should reserve at least one page for stable variable data, even when no stable variables are used.

    +

    Usage:

    +
    motoko no-repl
    +import StableMemory "mo:base/ExperimentalStableMemory";
  • Float

    Double precision (64-bit) floating-point numbers in IEEE 754 representation.

    +

    This module contains common floating-point constants and utility functions.

    +

    Notation for special values in the documentation below: ++inf: Positive infinity +-inf: Negative infinity +NaN: "not a number" (can have different sign bit values, but NaN != NaN regardless of the sign).

    +

    Note: +Floating point numbers have limited precision and operations may inherently result in numerical errors.

    +

    Examples of numerical errors:

    +
      0.1 + 0.1 + 0.1 == 0.3 // => false
    +  
    + +
     1e16 + 1.0 != 1e16 // => false
    +  
    + +

    (and many more cases)

    +

    Advice:

    +
    • Floating point number comparisons by == or != are discouraged. Instead, it is better to compare + floating-point numbers with a numerical tolerance, called epsilon.
    + +

    Example:

    +
      import Float "mo:base/Float";
    +  let x = 0.1 + 0.1 + 0.1;
    +  let y = 0.3;
    +
    +  let epsilon = 1e-6; // This depends on the application case (needs a numerical error analysis).
    +  Float.equalWithin(x, y, epsilon) // => true
    +  
    + +
    • For absolute precision, it is recommened to encode the fraction number as a pair of a Nat for the base + and a Nat for the exponent (decimal point).
    + +

    NaN sign:

    +
    • The NaN sign is only applied by abs, neg, and copySign. Other operations can have an arbitrary + sign bit for NaN results.
  • Func

    Functions on functions, creating functions from simpler inputs.

    +

    (Most commonly used when programming in functional style using higher-order +functions.)

    +
  • Hash

    Hash values

    +
  • HashMap

    Class HashMap<K, V> provides a hashmap from keys of type K to values of type V. +The class is parameterized by the key's equality and hash functions, +and an initial capacity. However, the underlying allocation happens only when +the first key-value entry is inserted.

    +

    Internally, the map is represented as an array of AssocList (buckets). +The growth policy of the underyling array is very simple, for now: double +the current capacity when the expected bucket list size grows beyond a +certain constant.

    +

    WARNING: Certain operations are amortized O(1) time, such as put, but run +in worst case O(size) time. These worst case runtimes may exceed the cycles limit +per message if the size of the map is large enough. Further, this runtime analysis +assumes that the hash functions uniformly maps keys over the hash space. Grow these structures +with discretion, and with good hash functions. All amortized operations +below also list the worst case runtime.

    +

    For maps without amortization, see TrieMap.

    +

    Note on the constructor: +The argument initCapacity determines the initial number of buckets in the +underyling array. Also, the runtime and space anlyses in this documentation +assumes that the equality and hash functions for keys used to construct the +map run in O(1) time and space.

    +

    Example:

    +
    motoko name=initialize
    +import HashMap "mo:base/HashMap";
    +import Text "mo:base/Text";
    +
    +let map = HashMap.HashMap<Text, Nat>(5, Text.equal, Text.hash);
    + +

    Runtime: O(1)

    +

    Space: O(1)

    +
  • Heap

    Class Heap<X> provides a priority queue of elements of type X.

    +

    The class wraps a purely-functional implementation based on a leftist heap.

    +

    Note on the constructor: +The constructor takes in a comparison function compare that defines the +ordering between elements of type X. Most primitive types have a default +version of this comparison function defined in their modules (e.g. Nat.compare). +The runtime analysis in this documentation assumes that the compare function +runs in O(1) time and space.

    +

    Example:

    +
    motoko name=initialize
    +import Heap "mo:base/Heap";
    +import Text "mo:base/Text";
    +
    +let heap = Heap.Heap<Text>(Text.compare);
    + +

    Runtime: O(1)

    +

    Space: O(1)

    +
  • Int

    Signed integer numbers with infinite precision (also called big integers).

    +

    Most operations on integer numbers (e.g. addition) are available as built-in operators (e.g. -1 + 1). +This module provides equivalent functions and Text conversion.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Int "mo:base/Int";
  • Int16

    Provides utility functions on 16-bit signed integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Int16 "mo:base/Int16";
  • Int32

    Provides utility functions on 32-bit signed integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Int32 "mo:base/Int32";
  • Int64

    Provides utility functions on 64-bit signed integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Int64 "mo:base/Int64";
  • Int8

    Provides utility functions on 8-bit signed integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Int8 "mo:base/Int8";
  • Iter

    Iterators

    +
  • IterType

    The Iterator type

    +
  • List

    Purely-functional, singly-linked lists. +A list of type List<T> is either null or an optional pair of a value of type T and a tail, itself of type List<T>.

    +

    To use this library, import it using:

    +
    motoko name=initialize
    +import List "mo:base/List";
  • Nat

    Natural numbers with infinite precision.

    +

    Most operations on natural numbers (e.g. addition) are available as built-in operators (e.g. 1 + 1). +This module provides equivalent functions and Text conversion.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Nat "mo:base/Nat";
  • Nat16

    Provides utility functions on 16-bit unsigned integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Nat16 "mo:base/Nat16";
  • Nat32

    Provides utility functions on 32-bit unsigned integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Nat32 "mo:base/Nat32";
  • Nat64

    Provides utility functions on 64-bit unsigned integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Nat64 "mo:base/Nat64";
  • Nat8

    Provides utility functions on 8-bit unsigned integers.

    +

    Note that most operations are available as built-in operators (e.g. 1 + 1).

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Nat8 "mo:base/Nat8";
  • None

    The absent value

    +

    The None type represents a type with no value.

    +

    It is often used to type code that fails to return control (e.g. an infinite loop) +or to designate impossible values (e.g. the type ?None only contains null).

    +
  • Option

    Typesafe nulls

    +

    Optional values can be seen as a typesafe null. A value of type ?Int can +be constructed with either null or ?42. The simplest way to get at the +contents of an optional is to use pattern matching:

    +
    let optionalInt1 : ?Int = ?42;
    +let optionalInt2 : ?Int = null;
    +
    +let int1orZero : Int = switch optionalInt1 {
    +  case null 0;
    +  case (?int) int;
    +};
    +assert int1orZero == 42;
    +
    +let int2orZero : Int = switch optionalInt2 {
    +  case null 0;
    +  case (?int) int;
    +};
    +assert int2orZero == 0;
    + +

    The functions in this module capture some common operations when working +with optionals that can be more succinct than using pattern matching.

    +
  • Order

    Order

    +
  • Prelude

    General utilities

    +

    This prelude file proposes standard library features that may +belong in the language (compiler-internal) prelude sometime, after +some further experience and discussion. Until then, they live here.

    +
  • Principal

    Module for interacting with Principals (users and canisters).

    +

    Principals are used to identify entities that can interact with the Internet +Computer. These entities are either users or canisters.

    +

    Example textual representation of Principals:

    +

    un4fu-tqaaa-aaaab-qadjq-cai

    +

    In Motoko, there is a primitive Principal type called Principal. As an example +of where you might see Principals, you can access the Principal of the +caller of your shared function.

    +
    motoko no-repl
    +shared(msg) func foo() {
    +  let caller : Principal = msg.caller;
    +};
    + +

    Then, you can use this module to work with the Principal.

    +

    Import from the base library to use this module.

    +
    motoko name=import
    +import Principal "mo:base/Principal";
  • RBTree

    Key-value map implemented as a red-black tree (RBTree) with nodes storing key-value pairs.

    +

    A red-black tree is a balanced binary search tree ordered by the keys.

    +

    The tree data structure internally colors each of its nodes either red or black, +and uses this information to balance the tree during the modifying operations.

    +

    Creation: +Instantiate class RBTree<K, V> that provides a map from keys of type K to values of type V.

    +

    Example:

    +
    import RBTree "mo:base/RBTree";
    +import Nat "mo:base/Nat";
    +import Debug "mo:base/Debug";
    +
    +let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a new red-black tree mapping Nat to Text
    +tree.put(1, "one");
    +tree.put(2, "two");
    +tree.put(3, "tree");
    +for (entry in tree.entries()) {
    +  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
    +}
    + +

    Performance:

    +
    • Runtime: O(log(n)) worst case cost per insertion, removal, and retrieval operation.
    • Space: O(n) for storing the entire tree. +n denotes the number of key-value entries (i.e. nodes) stored in the tree.
    + +

    Note:

    +
    • Tree operations, such as retrieval, insertion, and removal create O(log(n)) temporary objects that become garbage.
    + +

    Credits:

    +

    The core of this implementation is derived from:

    +
  • Random

    A module for obtaining randomness on the Internet Computer (IC).

    +

    This module provides the fundamentals for user abstractions to build on.

    +

    Dealing with randomness on a deterministic computing platform, such +as the IC, is intricate. Some basic rules need to be followed by the +user of this module to obtain (and maintain) the benefits of crypto- +graphic randomness:

    +
    • cryptographic entropy (randomness source) is only obtainable + asyncronously in discrete chunks of 256 bits (32-byte sized Blobs)
    • all bets must be closed before entropy is being asked for in + order to decide them
    • this implies that the same entropy (i.e. Blob) - or surplus entropy + not utilised yet - cannot be used for a new round of bets without + losing the cryptographic guarantees.
    + +

    Concretely, the below class Finite, as well as the +*From methods risk the carrying-over of state from previous rounds. +These are provided for performance (and convenience) reasons, and need +special care when used. Similar caveats apply for user-defined (pseudo) +random number generators.

    +

    Usage:

    +
    motoko no-repl
    +import Random "mo:base/Random";
  • Region

    Byte-level access to isolated, (virtual) stable memory regions.

    +

    This is a moderately lightweight abstraction over IC stable memory and supports persisting +regions of binary data across Motoko upgrades. +Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) IC stable memory internally, but does not interfere with this API. +It is also fully compatible with existing uses of the ExperimentalStableMemory library, which has a similar interface, but, +only supported a single memory region, without isolation between different applications.

    +

    The Region type is stable and can be used in stable data structures.

    +

    A new, empty Region is allocated using function new().

    +

    Regions are stateful objects and can be distinguished by the numeric identifier returned by function id(region). +Every region owns an initially empty, but growable sequence of virtual IC stable memory pages. +The current size, in pages, of a region is returned by function size(region). +The size of a region determines the range, [ 0, ..., size(region)*2^16 ), of valid byte-offsets into the region; these offsets are used as the source and destination of load/store operations on the region.

    +

    Memory is allocated to a region, using function grow(region, pages), sequentially and on demand, in units of 64KiB logical pages, starting with 0 allocated pages. +A call to grow may succeed, returning the previous size of the region, or fail, returning a sentinel value. New pages are zero initialized.

    +

    A size of a region can only grow and never shrink. +In addition, the stable memory pages allocated to a region will not be reclaimed by garbage collection, even +if the region object itself becomes unreachable.

    +

    Growth is capped by a soft limit on physical page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or 4GiB).

    +

    Each load operation loads from region relative byte address offset in little-endian +format using the natural bit-width of the type in question. +The operation traps if attempting to read beyond the current region size.

    +

    Each store operation stores to region relative byte address offset in little-endian format using the natural bit-width of the type in question. +The operation traps if attempting to write beyond the current region size.

    +

    Text values can be handled by using Text.decodeUtf8 and Text.encodeUtf8, in conjunction with loadBlob and storeBlob.

    +

    The current region allocation and region contents are preserved across upgrades.

    +

    NB: The IC's actual stable memory size (ic0.stable_size) may exceed the +total page size reported by summing all regions sizes. +This (and the cap on growth) are to accommodate Motoko's stable variables and bookkeeping for regions. +Applications that plan to use Motoko stable variables sparingly or not at all can +increase --max-stable-pages as desired, approaching the IC maximum (initially 8GiB, then 32Gib, currently 64Gib). +All applications should reserve at least one page for stable variable data, even when no stable variables are used.

    +

    Usage:

    +
    motoko no-repl
    +import Region "mo:base/Region";
  • Result

    Error handling with the Result type.

    +
  • Stack

    Class Stack<X> provides a Minimal LIFO stack of elements of type X.

    +

    See library Deque for mixed LIFO/FIFO behavior.

    +

    Example:

    +
    motoko name=initialize
    +import Stack "mo:base/Stack";
    +
    +let stack = Stack.Stack<Nat>(); // create a stack

    Runtime: O(1)

    +

    Space: O(1)

    +
  • Text

    Utility functions for Text values.

    +

    A Text value represents human-readable text as a sequence of characters of type Char.

    +
    let text = "Hello!";
    +let size = text.size(); // 6
    +let iter = text.chars(); // iterator ('H', 'e', 'l', 'l', 'o', '!')
    +let concat = text # " 👋"; // "Hello! 👋"
    + +

    The "mo:base/Text" module defines additional operations on Text values.

    +

    Import the module from the base library:

    +
    motoko name=import
    +import Text "mo:base/Text";
    + +

    Note: Text values are represented as ropes of UTF-8 character sequences with O(1) concatenation.

    +
  • Time

    System time

    +
  • Timer

    Timers for one-off or periodic tasks.

    +

    Note: If moc is invoked with -no-timer, the importing will fail. +Note: The resolution of the timers is in the order of the block rate,

    +
      so durations should be chosen well above that. For frequent
    +  canister wake-ups the heatbeat mechanism should be considered.
  • Trie

    Functional key-value hash maps.

    +

    This module provides an applicative (functional) hash map, called a trie. +Notably, each operation produces a new trie rather than destructively updating an existing trie.

    +

    Those looking for a more familiar (imperative, +object-oriented) hash map should consider TrieMap or HashMap instead.

    +

    The basic Trie operations consist of:

    +
    • put - put a key-value into the trie, producing a new version.
    • get - get a key's value from the trie, or null if none.
    • remove - remove a key's value from the trie
    • iter - visit every key-value in the trie.
    + +

    The put, get and remove operations work over Key records, +which group the hash of the key with its non-hash key value.

    +

    LIMITATIONS: This data structure allows at most MAX_LEAF_SIZE=8 hash collisions: +attempts to insert more than MAX_LEAF_SIZE keys (whether directly via put or indirectly via other operations) with the same hash value will trap.

    +

    CREDITS: Based on Section 6 of "Incremental computation via function caching", Pugh & Teitelbaum.

    +

    Example:

    +
    import Trie "mo:base/Trie";
    +import Text "mo:base/Text";
    +
    +// we do this to have shorter type names and thus
    +// better readibility
    +type Trie<K, V> = Trie.Trie<K, V>;
    +type Key<K> = Trie.Key<K>;
    +
    +// we have to provide `put`, `get` and `remove` with
    +// a record of type `Key<K> = { hash : Hash.Hash; key : K }`;
    +// thus we define the following function that takes a value of type `K`
    +// (in this case `Text`) and returns a `Key<K>` record.
    +func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
    +
    +// we start off by creating an empty `Trie`
    +let t0 : Trie<Text, Nat> = Trie.empty();
    +
    +// `put` requires 4 arguments:
    +// - the trie we want to insert the value into,
    +// - the key of the value we want to insert (note that we use the `key` function defined above),
    +// - a function that checks for equality of keys, and
    +// - the value we want to insert.
    +//
    +// When inserting a value, `put` returns a tuple of type `(Trie<K, V>, ?V)`.
    +// to get the new trie that contains the value,  we use the `0` projection
    +// and assign it to `t1` and `t2` respectively.
    +let t1 : Trie<Text, Nat> = Trie.put(t0, key "hello", Text.equal, 42).0;
    +let t2 : Trie<Text, Nat> = Trie.put(t1, key "world", Text.equal, 24).0;
    +
    +// If for a given key there already was a value in the trie, `put` returns
    +// that previous value as the second element of the tuple.
    +// in our case we have already inserted the value 42 for the key "hello", so
    +// `put` returns 42 as the second element of the tuple.
    +let (t3, n) : (Trie<Text, Nat>, ?Nat) = Trie.put(
    +  t2,
    +  key "hello",
    +  Text.equal,
    +  0,
    +);
    +assert (n == ?42);
    +
    +// `get` requires 3 arguments:
    +// - the trie we want to get the value from
    +// - the key of the value we want to get (note that we use the `key` function defined above)
    +// - a function that checks for equality of keys
    +//
    +// If the given key is nonexistent in the trie, `get` returns `null`.
    +var value = Trie.get(t3, key "hello", Text.equal); // Returns `?42`
    +assert(value == ?0);
    +value := Trie.get(t3, key "universe", Text.equal); // Returns `null`
    +assert(value == null);
    +
    +// `remove` requires 3 arguments:
    +// - the trie we want to remove the value from,
    +// - the key of the value we want to remove (note that we use the `key` function defined above), and
    +// - a function that checks for equality of keys.
    +//
    +// In the case of keys of type `Text`, we can use `Text.equal`
    +// to check for equality of keys. Function `remove` returns a tuple of type `(Trie<K, V>, ?V)`.
    +// where the second element of the tuple is the value that was removed, or `null` if
    +// there was no value for the given key.
    +let removedValue : ?Nat = Trie.remove(
    +  t3,
    +  key "hello",
    +  Text.equal,
    +).1;
    +assert (removedValue == ?0);
    +
    +// To iterate over the Trie, we use the `iter` function that takes a trie
    +// of type `Trie<K,V>` and returns an iterator of type `Iter<(K,V)>`:
    +var sum : Nat = 0;
    +for (kv in Trie.iter(t3)) {
    +  sum += kv.1;
    +};
    +assert(sum == 24);
  • TrieMap

    Class TrieMap<K, V> provides a map from keys of type K to values of type V. +The class wraps and manipulates an underyling hash trie, found in the Trie +module. The trie is a binary tree in which the position of elements in the +tree are determined using the hash of the elements.

    +

    LIMITATIONS: This data structure allows at most MAX_LEAF_SIZE=8 hash collisions: +attempts to insert more than MAX_LEAF_SIZE keys (whether directly via put or indirectly via other operations) with the same hash value will trap. +This limitation is inherited from the underlying Trie data structure.

    +

    Note: The class TrieMap exposes the same interface as HashMap.

    +

    Creating a map: +The equality function is used to compare keys, and the hash function is used +to hash keys. See the example below.

    +
    motoko name=initialize
    +import TrieMap "mo:base/TrieMap";
    +import Nat "mo:base/Nat";
    +import Hash "mo:base/Hash";
    +import Iter "mo:base/Iter";
    +
    +let map = TrieMap.TrieMap<Nat, Nat>(Nat.equal, Hash.hash)
  • TrieSet

    Functional set

    +

    Sets are partial maps from element type to unit type, +i.e., the partial map represents the set with its domain.

    +

    LIMITATIONS: This data structure allows at most MAX_LEAF_SIZE=8 hash collisions: +attempts to insert more than MAX_LEAF_SIZE elements (whether directly via put or indirectly via other operations) with the same hash value will trap. +This limitation is inherited from the underlying Trie data structure.

    +
\ No newline at end of file diff --git a/base-doc/nix-support/hydra-build-products b/base-doc/nix-support/hydra-build-products new file mode 100644 index 00000000000..759301f9df6 --- /dev/null +++ b/base-doc/nix-support/hydra-build-products @@ -0,0 +1 @@ +report docs /nix/store/yqrg0mkpby9gp986vvjksxd5srqa9is1-base-doc index.html diff --git a/base-doc/styles.css b/base-doc/styles.css new file mode 100644 index 00000000000..65732bf1dbb --- /dev/null +++ b/base-doc/styles.css @@ -0,0 +1,162 @@ + +* { + box-sizing: border-box; +} + +body { + background: #fff; + color: #222; + font-family: Circular Std, sans-serif; + line-height: 1.15; + -webkit-font-smoothing: antialiased; + margin: 0; + font-size: 1.0625rem; +} + +.keyword { + color: #264059; +} + +.type { + color: #ad448e; +} + +.parameter { + color: #264059; +} + +.classname { + color: #2c8093; +} + +.fnname { + color: #9a6e31; +} + +.sidebar { + width: 200px; + position: fixed; + left: 0; + top: 0; + bottom: 0; + overflow: auto; + + background-color: #F1F1F1; +} + +.documentation { + margin-left: 230px; + max-width: 960px; +} + +.sidebar > ul { + margin: 0 10px; + padding: 0; + list-style: none; +} + +.sidebar a { + display: block; + text-overflow: ellipsis; + overflow: hidden; + line-height: 15px; + padding: 7px 5px; + font-size: 14px; + font-weight: 400; + transition: border 500ms ease-out; + color: #000; + text-decoration: none; +} + +.sidebar h3 { + border-bottom: 1px #dddddd solid; + font-weight: 500; + margin: 20px 0 15px 0; + padding-bottom: 6px; + text-align: center; +} + +.declaration { + border-bottom: 1px solid #f0f0f0; +} +.declaration:last-of-type { + border-bottom: none; +} + +.declaration :last-child { + border: none; +} + +h1 { + font-weight: 500; + padding-bottom: 6px; + border-bottom: 1px #D5D5D5 dashed; +} + +h4.function-declaration { + font-weight: 600; + margin-top: 16px; +} + +h4.value-declaration { + font-weight: 600; + margin-top: 16px; +} + +h4.type-declaration { + font-weight: 600; + margin-top: 16px; +} + +h4.class-declaration { + font-weight: 600; + margin-top: 16px; +} + +.class-declaration ~ div { + margin-left: 20px; +} + +.index-container { + display: flex; + flex-direction: column; + align-items: center; + font-size: 1.2rem; +} + +.index-header { + font-weight: 400; +} + +.index-listing { + padding: 0; + list-style: none; + max-width: 960px; +} + +.index-item { + margin-bottom: 5px; +} + +.index-item-link { + text-decoration: none; + font-weight: 400; +} + +.index-item-link::after { + content: " \2014\00A0"; +} + +.index-item-comment { + display: inline; +} + +.index-item-comment > * { + display: none; +} + +.index-item-comment > *:first-child { + display: inline; + white-space: nowrap; +} + diff --git a/coverage/codegen/compile.ml.html b/coverage/codegen/compile.ml.html new file mode 100644 index 00000000000..fb64c1ecca8 --- /dev/null +++ b/coverage/codegen/compile.ml.html @@ -0,0 +1,39034 @@ + + + + + compile.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+   10
+   11
+   12
+   13
+   14
+   15
+   16
+   17
+   18
+   19
+   20
+   21
+   22
+   23
+   24
+   25
+   26
+   27
+   28
+   29
+   30
+   31
+   32
+   33
+   34
+   35
+   36
+   37
+   38
+   39
+   40
+   41
+   42
+   43
+   44
+   45
+   46
+   47
+   48
+   49
+   50
+   51
+   52
+   53
+   54
+   55
+   56
+   57
+   58
+   59
+   60
+   61
+   62
+   63
+   64
+   65
+   66
+   67
+   68
+   69
+   70
+   71
+   72
+   73
+   74
+   75
+   76
+   77
+   78
+   79
+   80
+   81
+   82
+   83
+   84
+   85
+   86
+   87
+   88
+   89
+   90
+   91
+   92
+   93
+   94
+   95
+   96
+   97
+   98
+   99
+  100
+  101
+  102
+  103
+  104
+  105
+  106
+  107
+  108
+  109
+  110
+  111
+  112
+  113
+  114
+  115
+  116
+  117
+  118
+  119
+  120
+  121
+  122
+  123
+  124
+  125
+  126
+  127
+  128
+  129
+  130
+  131
+  132
+  133
+  134
+  135
+  136
+  137
+  138
+  139
+  140
+  141
+  142
+  143
+  144
+  145
+  146
+  147
+  148
+  149
+  150
+  151
+  152
+  153
+  154
+  155
+  156
+  157
+  158
+  159
+  160
+  161
+  162
+  163
+  164
+  165
+  166
+  167
+  168
+  169
+  170
+  171
+  172
+  173
+  174
+  175
+  176
+  177
+  178
+  179
+  180
+  181
+  182
+  183
+  184
+  185
+  186
+  187
+  188
+  189
+  190
+  191
+  192
+  193
+  194
+  195
+  196
+  197
+  198
+  199
+  200
+  201
+  202
+  203
+  204
+  205
+  206
+  207
+  208
+  209
+  210
+  211
+  212
+  213
+  214
+  215
+  216
+  217
+  218
+  219
+  220
+  221
+  222
+  223
+  224
+  225
+  226
+  227
+  228
+  229
+  230
+  231
+  232
+  233
+  234
+  235
+  236
+  237
+  238
+  239
+  240
+  241
+  242
+  243
+  244
+  245
+  246
+  247
+  248
+  249
+  250
+  251
+  252
+  253
+  254
+  255
+  256
+  257
+  258
+  259
+  260
+  261
+  262
+  263
+  264
+  265
+  266
+  267
+  268
+  269
+  270
+  271
+  272
+  273
+  274
+  275
+  276
+  277
+  278
+  279
+  280
+  281
+  282
+  283
+  284
+  285
+  286
+  287
+  288
+  289
+  290
+  291
+  292
+  293
+  294
+  295
+  296
+  297
+  298
+  299
+  300
+  301
+  302
+  303
+  304
+  305
+  306
+  307
+  308
+  309
+  310
+  311
+  312
+  313
+  314
+  315
+  316
+  317
+  318
+  319
+  320
+  321
+  322
+  323
+  324
+  325
+  326
+  327
+  328
+  329
+  330
+  331
+  332
+  333
+  334
+  335
+  336
+  337
+  338
+  339
+  340
+  341
+  342
+  343
+  344
+  345
+  346
+  347
+  348
+  349
+  350
+  351
+  352
+  353
+  354
+  355
+  356
+  357
+  358
+  359
+  360
+  361
+  362
+  363
+  364
+  365
+  366
+  367
+  368
+  369
+  370
+  371
+  372
+  373
+  374
+  375
+  376
+  377
+  378
+  379
+  380
+  381
+  382
+  383
+  384
+  385
+  386
+  387
+  388
+  389
+  390
+  391
+  392
+  393
+  394
+  395
+  396
+  397
+  398
+  399
+  400
+  401
+  402
+  403
+  404
+  405
+  406
+  407
+  408
+  409
+  410
+  411
+  412
+  413
+  414
+  415
+  416
+  417
+  418
+  419
+  420
+  421
+  422
+  423
+  424
+  425
+  426
+  427
+  428
+  429
+  430
+  431
+  432
+  433
+  434
+  435
+  436
+  437
+  438
+  439
+  440
+  441
+  442
+  443
+  444
+  445
+  446
+  447
+  448
+  449
+  450
+  451
+  452
+  453
+  454
+  455
+  456
+  457
+  458
+  459
+  460
+  461
+  462
+  463
+  464
+  465
+  466
+  467
+  468
+  469
+  470
+  471
+  472
+  473
+  474
+  475
+  476
+  477
+  478
+  479
+  480
+  481
+  482
+  483
+  484
+  485
+  486
+  487
+  488
+  489
+  490
+  491
+  492
+  493
+  494
+  495
+  496
+  497
+  498
+  499
+  500
+  501
+  502
+  503
+  504
+  505
+  506
+  507
+  508
+  509
+  510
+  511
+  512
+  513
+  514
+  515
+  516
+  517
+  518
+  519
+  520
+  521
+  522
+  523
+  524
+  525
+  526
+  527
+  528
+  529
+  530
+  531
+  532
+  533
+  534
+  535
+  536
+  537
+  538
+  539
+  540
+  541
+  542
+  543
+  544
+  545
+  546
+  547
+  548
+  549
+  550
+  551
+  552
+  553
+  554
+  555
+  556
+  557
+  558
+  559
+  560
+  561
+  562
+  563
+  564
+  565
+  566
+  567
+  568
+  569
+  570
+  571
+  572
+  573
+  574
+  575
+  576
+  577
+  578
+  579
+  580
+  581
+  582
+  583
+  584
+  585
+  586
+  587
+  588
+  589
+  590
+  591
+  592
+  593
+  594
+  595
+  596
+  597
+  598
+  599
+  600
+  601
+  602
+  603
+  604
+  605
+  606
+  607
+  608
+  609
+  610
+  611
+  612
+  613
+  614
+  615
+  616
+  617
+  618
+  619
+  620
+  621
+  622
+  623
+  624
+  625
+  626
+  627
+  628
+  629
+  630
+  631
+  632
+  633
+  634
+  635
+  636
+  637
+  638
+  639
+  640
+  641
+  642
+  643
+  644
+  645
+  646
+  647
+  648
+  649
+  650
+  651
+  652
+  653
+  654
+  655
+  656
+  657
+  658
+  659
+  660
+  661
+  662
+  663
+  664
+  665
+  666
+  667
+  668
+  669
+  670
+  671
+  672
+  673
+  674
+  675
+  676
+  677
+  678
+  679
+  680
+  681
+  682
+  683
+  684
+  685
+  686
+  687
+  688
+  689
+  690
+  691
+  692
+  693
+  694
+  695
+  696
+  697
+  698
+  699
+  700
+  701
+  702
+  703
+  704
+  705
+  706
+  707
+  708
+  709
+  710
+  711
+  712
+  713
+  714
+  715
+  716
+  717
+  718
+  719
+  720
+  721
+  722
+  723
+  724
+  725
+  726
+  727
+  728
+  729
+  730
+  731
+  732
+  733
+  734
+  735
+  736
+  737
+  738
+  739
+  740
+  741
+  742
+  743
+  744
+  745
+  746
+  747
+  748
+  749
+  750
+  751
+  752
+  753
+  754
+  755
+  756
+  757
+  758
+  759
+  760
+  761
+  762
+  763
+  764
+  765
+  766
+  767
+  768
+  769
+  770
+  771
+  772
+  773
+  774
+  775
+  776
+  777
+  778
+  779
+  780
+  781
+  782
+  783
+  784
+  785
+  786
+  787
+  788
+  789
+  790
+  791
+  792
+  793
+  794
+  795
+  796
+  797
+  798
+  799
+  800
+  801
+  802
+  803
+  804
+  805
+  806
+  807
+  808
+  809
+  810
+  811
+  812
+  813
+  814
+  815
+  816
+  817
+  818
+  819
+  820
+  821
+  822
+  823
+  824
+  825
+  826
+  827
+  828
+  829
+  830
+  831
+  832
+  833
+  834
+  835
+  836
+  837
+  838
+  839
+  840
+  841
+  842
+  843
+  844
+  845
+  846
+  847
+  848
+  849
+  850
+  851
+  852
+  853
+  854
+  855
+  856
+  857
+  858
+  859
+  860
+  861
+  862
+  863
+  864
+  865
+  866
+  867
+  868
+  869
+  870
+  871
+  872
+  873
+  874
+  875
+  876
+  877
+  878
+  879
+  880
+  881
+  882
+  883
+  884
+  885
+  886
+  887
+  888
+  889
+  890
+  891
+  892
+  893
+  894
+  895
+  896
+  897
+  898
+  899
+  900
+  901
+  902
+  903
+  904
+  905
+  906
+  907
+  908
+  909
+  910
+  911
+  912
+  913
+  914
+  915
+  916
+  917
+  918
+  919
+  920
+  921
+  922
+  923
+  924
+  925
+  926
+  927
+  928
+  929
+  930
+  931
+  932
+  933
+  934
+  935
+  936
+  937
+  938
+  939
+  940
+  941
+  942
+  943
+  944
+  945
+  946
+  947
+  948
+  949
+  950
+  951
+  952
+  953
+  954
+  955
+  956
+  957
+  958
+  959
+  960
+  961
+  962
+  963
+  964
+  965
+  966
+  967
+  968
+  969
+  970
+  971
+  972
+  973
+  974
+  975
+  976
+  977
+  978
+  979
+  980
+  981
+  982
+  983
+  984
+  985
+  986
+  987
+  988
+  989
+  990
+  991
+  992
+  993
+  994
+  995
+  996
+  997
+  998
+  999
+ 1000
+ 1001
+ 1002
+ 1003
+ 1004
+ 1005
+ 1006
+ 1007
+ 1008
+ 1009
+ 1010
+ 1011
+ 1012
+ 1013
+ 1014
+ 1015
+ 1016
+ 1017
+ 1018
+ 1019
+ 1020
+ 1021
+ 1022
+ 1023
+ 1024
+ 1025
+ 1026
+ 1027
+ 1028
+ 1029
+ 1030
+ 1031
+ 1032
+ 1033
+ 1034
+ 1035
+ 1036
+ 1037
+ 1038
+ 1039
+ 1040
+ 1041
+ 1042
+ 1043
+ 1044
+ 1045
+ 1046
+ 1047
+ 1048
+ 1049
+ 1050
+ 1051
+ 1052
+ 1053
+ 1054
+ 1055
+ 1056
+ 1057
+ 1058
+ 1059
+ 1060
+ 1061
+ 1062
+ 1063
+ 1064
+ 1065
+ 1066
+ 1067
+ 1068
+ 1069
+ 1070
+ 1071
+ 1072
+ 1073
+ 1074
+ 1075
+ 1076
+ 1077
+ 1078
+ 1079
+ 1080
+ 1081
+ 1082
+ 1083
+ 1084
+ 1085
+ 1086
+ 1087
+ 1088
+ 1089
+ 1090
+ 1091
+ 1092
+ 1093
+ 1094
+ 1095
+ 1096
+ 1097
+ 1098
+ 1099
+ 1100
+ 1101
+ 1102
+ 1103
+ 1104
+ 1105
+ 1106
+ 1107
+ 1108
+ 1109
+ 1110
+ 1111
+ 1112
+ 1113
+ 1114
+ 1115
+ 1116
+ 1117
+ 1118
+ 1119
+ 1120
+ 1121
+ 1122
+ 1123
+ 1124
+ 1125
+ 1126
+ 1127
+ 1128
+ 1129
+ 1130
+ 1131
+ 1132
+ 1133
+ 1134
+ 1135
+ 1136
+ 1137
+ 1138
+ 1139
+ 1140
+ 1141
+ 1142
+ 1143
+ 1144
+ 1145
+ 1146
+ 1147
+ 1148
+ 1149
+ 1150
+ 1151
+ 1152
+ 1153
+ 1154
+ 1155
+ 1156
+ 1157
+ 1158
+ 1159
+ 1160
+ 1161
+ 1162
+ 1163
+ 1164
+ 1165
+ 1166
+ 1167
+ 1168
+ 1169
+ 1170
+ 1171
+ 1172
+ 1173
+ 1174
+ 1175
+ 1176
+ 1177
+ 1178
+ 1179
+ 1180
+ 1181
+ 1182
+ 1183
+ 1184
+ 1185
+ 1186
+ 1187
+ 1188
+ 1189
+ 1190
+ 1191
+ 1192
+ 1193
+ 1194
+ 1195
+ 1196
+ 1197
+ 1198
+ 1199
+ 1200
+ 1201
+ 1202
+ 1203
+ 1204
+ 1205
+ 1206
+ 1207
+ 1208
+ 1209
+ 1210
+ 1211
+ 1212
+ 1213
+ 1214
+ 1215
+ 1216
+ 1217
+ 1218
+ 1219
+ 1220
+ 1221
+ 1222
+ 1223
+ 1224
+ 1225
+ 1226
+ 1227
+ 1228
+ 1229
+ 1230
+ 1231
+ 1232
+ 1233
+ 1234
+ 1235
+ 1236
+ 1237
+ 1238
+ 1239
+ 1240
+ 1241
+ 1242
+ 1243
+ 1244
+ 1245
+ 1246
+ 1247
+ 1248
+ 1249
+ 1250
+ 1251
+ 1252
+ 1253
+ 1254
+ 1255
+ 1256
+ 1257
+ 1258
+ 1259
+ 1260
+ 1261
+ 1262
+ 1263
+ 1264
+ 1265
+ 1266
+ 1267
+ 1268
+ 1269
+ 1270
+ 1271
+ 1272
+ 1273
+ 1274
+ 1275
+ 1276
+ 1277
+ 1278
+ 1279
+ 1280
+ 1281
+ 1282
+ 1283
+ 1284
+ 1285
+ 1286
+ 1287
+ 1288
+ 1289
+ 1290
+ 1291
+ 1292
+ 1293
+ 1294
+ 1295
+ 1296
+ 1297
+ 1298
+ 1299
+ 1300
+ 1301
+ 1302
+ 1303
+ 1304
+ 1305
+ 1306
+ 1307
+ 1308
+ 1309
+ 1310
+ 1311
+ 1312
+ 1313
+ 1314
+ 1315
+ 1316
+ 1317
+ 1318
+ 1319
+ 1320
+ 1321
+ 1322
+ 1323
+ 1324
+ 1325
+ 1326
+ 1327
+ 1328
+ 1329
+ 1330
+ 1331
+ 1332
+ 1333
+ 1334
+ 1335
+ 1336
+ 1337
+ 1338
+ 1339
+ 1340
+ 1341
+ 1342
+ 1343
+ 1344
+ 1345
+ 1346
+ 1347
+ 1348
+ 1349
+ 1350
+ 1351
+ 1352
+ 1353
+ 1354
+ 1355
+ 1356
+ 1357
+ 1358
+ 1359
+ 1360
+ 1361
+ 1362
+ 1363
+ 1364
+ 1365
+ 1366
+ 1367
+ 1368
+ 1369
+ 1370
+ 1371
+ 1372
+ 1373
+ 1374
+ 1375
+ 1376
+ 1377
+ 1378
+ 1379
+ 1380
+ 1381
+ 1382
+ 1383
+ 1384
+ 1385
+ 1386
+ 1387
+ 1388
+ 1389
+ 1390
+ 1391
+ 1392
+ 1393
+ 1394
+ 1395
+ 1396
+ 1397
+ 1398
+ 1399
+ 1400
+ 1401
+ 1402
+ 1403
+ 1404
+ 1405
+ 1406
+ 1407
+ 1408
+ 1409
+ 1410
+ 1411
+ 1412
+ 1413
+ 1414
+ 1415
+ 1416
+ 1417
+ 1418
+ 1419
+ 1420
+ 1421
+ 1422
+ 1423
+ 1424
+ 1425
+ 1426
+ 1427
+ 1428
+ 1429
+ 1430
+ 1431
+ 1432
+ 1433
+ 1434
+ 1435
+ 1436
+ 1437
+ 1438
+ 1439
+ 1440
+ 1441
+ 1442
+ 1443
+ 1444
+ 1445
+ 1446
+ 1447
+ 1448
+ 1449
+ 1450
+ 1451
+ 1452
+ 1453
+ 1454
+ 1455
+ 1456
+ 1457
+ 1458
+ 1459
+ 1460
+ 1461
+ 1462
+ 1463
+ 1464
+ 1465
+ 1466
+ 1467
+ 1468
+ 1469
+ 1470
+ 1471
+ 1472
+ 1473
+ 1474
+ 1475
+ 1476
+ 1477
+ 1478
+ 1479
+ 1480
+ 1481
+ 1482
+ 1483
+ 1484
+ 1485
+ 1486
+ 1487
+ 1488
+ 1489
+ 1490
+ 1491
+ 1492
+ 1493
+ 1494
+ 1495
+ 1496
+ 1497
+ 1498
+ 1499
+ 1500
+ 1501
+ 1502
+ 1503
+ 1504
+ 1505
+ 1506
+ 1507
+ 1508
+ 1509
+ 1510
+ 1511
+ 1512
+ 1513
+ 1514
+ 1515
+ 1516
+ 1517
+ 1518
+ 1519
+ 1520
+ 1521
+ 1522
+ 1523
+ 1524
+ 1525
+ 1526
+ 1527
+ 1528
+ 1529
+ 1530
+ 1531
+ 1532
+ 1533
+ 1534
+ 1535
+ 1536
+ 1537
+ 1538
+ 1539
+ 1540
+ 1541
+ 1542
+ 1543
+ 1544
+ 1545
+ 1546
+ 1547
+ 1548
+ 1549
+ 1550
+ 1551
+ 1552
+ 1553
+ 1554
+ 1555
+ 1556
+ 1557
+ 1558
+ 1559
+ 1560
+ 1561
+ 1562
+ 1563
+ 1564
+ 1565
+ 1566
+ 1567
+ 1568
+ 1569
+ 1570
+ 1571
+ 1572
+ 1573
+ 1574
+ 1575
+ 1576
+ 1577
+ 1578
+ 1579
+ 1580
+ 1581
+ 1582
+ 1583
+ 1584
+ 1585
+ 1586
+ 1587
+ 1588
+ 1589
+ 1590
+ 1591
+ 1592
+ 1593
+ 1594
+ 1595
+ 1596
+ 1597
+ 1598
+ 1599
+ 1600
+ 1601
+ 1602
+ 1603
+ 1604
+ 1605
+ 1606
+ 1607
+ 1608
+ 1609
+ 1610
+ 1611
+ 1612
+ 1613
+ 1614
+ 1615
+ 1616
+ 1617
+ 1618
+ 1619
+ 1620
+ 1621
+ 1622
+ 1623
+ 1624
+ 1625
+ 1626
+ 1627
+ 1628
+ 1629
+ 1630
+ 1631
+ 1632
+ 1633
+ 1634
+ 1635
+ 1636
+ 1637
+ 1638
+ 1639
+ 1640
+ 1641
+ 1642
+ 1643
+ 1644
+ 1645
+ 1646
+ 1647
+ 1648
+ 1649
+ 1650
+ 1651
+ 1652
+ 1653
+ 1654
+ 1655
+ 1656
+ 1657
+ 1658
+ 1659
+ 1660
+ 1661
+ 1662
+ 1663
+ 1664
+ 1665
+ 1666
+ 1667
+ 1668
+ 1669
+ 1670
+ 1671
+ 1672
+ 1673
+ 1674
+ 1675
+ 1676
+ 1677
+ 1678
+ 1679
+ 1680
+ 1681
+ 1682
+ 1683
+ 1684
+ 1685
+ 1686
+ 1687
+ 1688
+ 1689
+ 1690
+ 1691
+ 1692
+ 1693
+ 1694
+ 1695
+ 1696
+ 1697
+ 1698
+ 1699
+ 1700
+ 1701
+ 1702
+ 1703
+ 1704
+ 1705
+ 1706
+ 1707
+ 1708
+ 1709
+ 1710
+ 1711
+ 1712
+ 1713
+ 1714
+ 1715
+ 1716
+ 1717
+ 1718
+ 1719
+ 1720
+ 1721
+ 1722
+ 1723
+ 1724
+ 1725
+ 1726
+ 1727
+ 1728
+ 1729
+ 1730
+ 1731
+ 1732
+ 1733
+ 1734
+ 1735
+ 1736
+ 1737
+ 1738
+ 1739
+ 1740
+ 1741
+ 1742
+ 1743
+ 1744
+ 1745
+ 1746
+ 1747
+ 1748
+ 1749
+ 1750
+ 1751
+ 1752
+ 1753
+ 1754
+ 1755
+ 1756
+ 1757
+ 1758
+ 1759
+ 1760
+ 1761
+ 1762
+ 1763
+ 1764
+ 1765
+ 1766
+ 1767
+ 1768
+ 1769
+ 1770
+ 1771
+ 1772
+ 1773
+ 1774
+ 1775
+ 1776
+ 1777
+ 1778
+ 1779
+ 1780
+ 1781
+ 1782
+ 1783
+ 1784
+ 1785
+ 1786
+ 1787
+ 1788
+ 1789
+ 1790
+ 1791
+ 1792
+ 1793
+ 1794
+ 1795
+ 1796
+ 1797
+ 1798
+ 1799
+ 1800
+ 1801
+ 1802
+ 1803
+ 1804
+ 1805
+ 1806
+ 1807
+ 1808
+ 1809
+ 1810
+ 1811
+ 1812
+ 1813
+ 1814
+ 1815
+ 1816
+ 1817
+ 1818
+ 1819
+ 1820
+ 1821
+ 1822
+ 1823
+ 1824
+ 1825
+ 1826
+ 1827
+ 1828
+ 1829
+ 1830
+ 1831
+ 1832
+ 1833
+ 1834
+ 1835
+ 1836
+ 1837
+ 1838
+ 1839
+ 1840
+ 1841
+ 1842
+ 1843
+ 1844
+ 1845
+ 1846
+ 1847
+ 1848
+ 1849
+ 1850
+ 1851
+ 1852
+ 1853
+ 1854
+ 1855
+ 1856
+ 1857
+ 1858
+ 1859
+ 1860
+ 1861
+ 1862
+ 1863
+ 1864
+ 1865
+ 1866
+ 1867
+ 1868
+ 1869
+ 1870
+ 1871
+ 1872
+ 1873
+ 1874
+ 1875
+ 1876
+ 1877
+ 1878
+ 1879
+ 1880
+ 1881
+ 1882
+ 1883
+ 1884
+ 1885
+ 1886
+ 1887
+ 1888
+ 1889
+ 1890
+ 1891
+ 1892
+ 1893
+ 1894
+ 1895
+ 1896
+ 1897
+ 1898
+ 1899
+ 1900
+ 1901
+ 1902
+ 1903
+ 1904
+ 1905
+ 1906
+ 1907
+ 1908
+ 1909
+ 1910
+ 1911
+ 1912
+ 1913
+ 1914
+ 1915
+ 1916
+ 1917
+ 1918
+ 1919
+ 1920
+ 1921
+ 1922
+ 1923
+ 1924
+ 1925
+ 1926
+ 1927
+ 1928
+ 1929
+ 1930
+ 1931
+ 1932
+ 1933
+ 1934
+ 1935
+ 1936
+ 1937
+ 1938
+ 1939
+ 1940
+ 1941
+ 1942
+ 1943
+ 1944
+ 1945
+ 1946
+ 1947
+ 1948
+ 1949
+ 1950
+ 1951
+ 1952
+ 1953
+ 1954
+ 1955
+ 1956
+ 1957
+ 1958
+ 1959
+ 1960
+ 1961
+ 1962
+ 1963
+ 1964
+ 1965
+ 1966
+ 1967
+ 1968
+ 1969
+ 1970
+ 1971
+ 1972
+ 1973
+ 1974
+ 1975
+ 1976
+ 1977
+ 1978
+ 1979
+ 1980
+ 1981
+ 1982
+ 1983
+ 1984
+ 1985
+ 1986
+ 1987
+ 1988
+ 1989
+ 1990
+ 1991
+ 1992
+ 1993
+ 1994
+ 1995
+ 1996
+ 1997
+ 1998
+ 1999
+ 2000
+ 2001
+ 2002
+ 2003
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023
+ 2024
+ 2025
+ 2026
+ 2027
+ 2028
+ 2029
+ 2030
+ 2031
+ 2032
+ 2033
+ 2034
+ 2035
+ 2036
+ 2037
+ 2038
+ 2039
+ 2040
+ 2041
+ 2042
+ 2043
+ 2044
+ 2045
+ 2046
+ 2047
+ 2048
+ 2049
+ 2050
+ 2051
+ 2052
+ 2053
+ 2054
+ 2055
+ 2056
+ 2057
+ 2058
+ 2059
+ 2060
+ 2061
+ 2062
+ 2063
+ 2064
+ 2065
+ 2066
+ 2067
+ 2068
+ 2069
+ 2070
+ 2071
+ 2072
+ 2073
+ 2074
+ 2075
+ 2076
+ 2077
+ 2078
+ 2079
+ 2080
+ 2081
+ 2082
+ 2083
+ 2084
+ 2085
+ 2086
+ 2087
+ 2088
+ 2089
+ 2090
+ 2091
+ 2092
+ 2093
+ 2094
+ 2095
+ 2096
+ 2097
+ 2098
+ 2099
+ 2100
+ 2101
+ 2102
+ 2103
+ 2104
+ 2105
+ 2106
+ 2107
+ 2108
+ 2109
+ 2110
+ 2111
+ 2112
+ 2113
+ 2114
+ 2115
+ 2116
+ 2117
+ 2118
+ 2119
+ 2120
+ 2121
+ 2122
+ 2123
+ 2124
+ 2125
+ 2126
+ 2127
+ 2128
+ 2129
+ 2130
+ 2131
+ 2132
+ 2133
+ 2134
+ 2135
+ 2136
+ 2137
+ 2138
+ 2139
+ 2140
+ 2141
+ 2142
+ 2143
+ 2144
+ 2145
+ 2146
+ 2147
+ 2148
+ 2149
+ 2150
+ 2151
+ 2152
+ 2153
+ 2154
+ 2155
+ 2156
+ 2157
+ 2158
+ 2159
+ 2160
+ 2161
+ 2162
+ 2163
+ 2164
+ 2165
+ 2166
+ 2167
+ 2168
+ 2169
+ 2170
+ 2171
+ 2172
+ 2173
+ 2174
+ 2175
+ 2176
+ 2177
+ 2178
+ 2179
+ 2180
+ 2181
+ 2182
+ 2183
+ 2184
+ 2185
+ 2186
+ 2187
+ 2188
+ 2189
+ 2190
+ 2191
+ 2192
+ 2193
+ 2194
+ 2195
+ 2196
+ 2197
+ 2198
+ 2199
+ 2200
+ 2201
+ 2202
+ 2203
+ 2204
+ 2205
+ 2206
+ 2207
+ 2208
+ 2209
+ 2210
+ 2211
+ 2212
+ 2213
+ 2214
+ 2215
+ 2216
+ 2217
+ 2218
+ 2219
+ 2220
+ 2221
+ 2222
+ 2223
+ 2224
+ 2225
+ 2226
+ 2227
+ 2228
+ 2229
+ 2230
+ 2231
+ 2232
+ 2233
+ 2234
+ 2235
+ 2236
+ 2237
+ 2238
+ 2239
+ 2240
+ 2241
+ 2242
+ 2243
+ 2244
+ 2245
+ 2246
+ 2247
+ 2248
+ 2249
+ 2250
+ 2251
+ 2252
+ 2253
+ 2254
+ 2255
+ 2256
+ 2257
+ 2258
+ 2259
+ 2260
+ 2261
+ 2262
+ 2263
+ 2264
+ 2265
+ 2266
+ 2267
+ 2268
+ 2269
+ 2270
+ 2271
+ 2272
+ 2273
+ 2274
+ 2275
+ 2276
+ 2277
+ 2278
+ 2279
+ 2280
+ 2281
+ 2282
+ 2283
+ 2284
+ 2285
+ 2286
+ 2287
+ 2288
+ 2289
+ 2290
+ 2291
+ 2292
+ 2293
+ 2294
+ 2295
+ 2296
+ 2297
+ 2298
+ 2299
+ 2300
+ 2301
+ 2302
+ 2303
+ 2304
+ 2305
+ 2306
+ 2307
+ 2308
+ 2309
+ 2310
+ 2311
+ 2312
+ 2313
+ 2314
+ 2315
+ 2316
+ 2317
+ 2318
+ 2319
+ 2320
+ 2321
+ 2322
+ 2323
+ 2324
+ 2325
+ 2326
+ 2327
+ 2328
+ 2329
+ 2330
+ 2331
+ 2332
+ 2333
+ 2334
+ 2335
+ 2336
+ 2337
+ 2338
+ 2339
+ 2340
+ 2341
+ 2342
+ 2343
+ 2344
+ 2345
+ 2346
+ 2347
+ 2348
+ 2349
+ 2350
+ 2351
+ 2352
+ 2353
+ 2354
+ 2355
+ 2356
+ 2357
+ 2358
+ 2359
+ 2360
+ 2361
+ 2362
+ 2363
+ 2364
+ 2365
+ 2366
+ 2367
+ 2368
+ 2369
+ 2370
+ 2371
+ 2372
+ 2373
+ 2374
+ 2375
+ 2376
+ 2377
+ 2378
+ 2379
+ 2380
+ 2381
+ 2382
+ 2383
+ 2384
+ 2385
+ 2386
+ 2387
+ 2388
+ 2389
+ 2390
+ 2391
+ 2392
+ 2393
+ 2394
+ 2395
+ 2396
+ 2397
+ 2398
+ 2399
+ 2400
+ 2401
+ 2402
+ 2403
+ 2404
+ 2405
+ 2406
+ 2407
+ 2408
+ 2409
+ 2410
+ 2411
+ 2412
+ 2413
+ 2414
+ 2415
+ 2416
+ 2417
+ 2418
+ 2419
+ 2420
+ 2421
+ 2422
+ 2423
+ 2424
+ 2425
+ 2426
+ 2427
+ 2428
+ 2429
+ 2430
+ 2431
+ 2432
+ 2433
+ 2434
+ 2435
+ 2436
+ 2437
+ 2438
+ 2439
+ 2440
+ 2441
+ 2442
+ 2443
+ 2444
+ 2445
+ 2446
+ 2447
+ 2448
+ 2449
+ 2450
+ 2451
+ 2452
+ 2453
+ 2454
+ 2455
+ 2456
+ 2457
+ 2458
+ 2459
+ 2460
+ 2461
+ 2462
+ 2463
+ 2464
+ 2465
+ 2466
+ 2467
+ 2468
+ 2469
+ 2470
+ 2471
+ 2472
+ 2473
+ 2474
+ 2475
+ 2476
+ 2477
+ 2478
+ 2479
+ 2480
+ 2481
+ 2482
+ 2483
+ 2484
+ 2485
+ 2486
+ 2487
+ 2488
+ 2489
+ 2490
+ 2491
+ 2492
+ 2493
+ 2494
+ 2495
+ 2496
+ 2497
+ 2498
+ 2499
+ 2500
+ 2501
+ 2502
+ 2503
+ 2504
+ 2505
+ 2506
+ 2507
+ 2508
+ 2509
+ 2510
+ 2511
+ 2512
+ 2513
+ 2514
+ 2515
+ 2516
+ 2517
+ 2518
+ 2519
+ 2520
+ 2521
+ 2522
+ 2523
+ 2524
+ 2525
+ 2526
+ 2527
+ 2528
+ 2529
+ 2530
+ 2531
+ 2532
+ 2533
+ 2534
+ 2535
+ 2536
+ 2537
+ 2538
+ 2539
+ 2540
+ 2541
+ 2542
+ 2543
+ 2544
+ 2545
+ 2546
+ 2547
+ 2548
+ 2549
+ 2550
+ 2551
+ 2552
+ 2553
+ 2554
+ 2555
+ 2556
+ 2557
+ 2558
+ 2559
+ 2560
+ 2561
+ 2562
+ 2563
+ 2564
+ 2565
+ 2566
+ 2567
+ 2568
+ 2569
+ 2570
+ 2571
+ 2572
+ 2573
+ 2574
+ 2575
+ 2576
+ 2577
+ 2578
+ 2579
+ 2580
+ 2581
+ 2582
+ 2583
+ 2584
+ 2585
+ 2586
+ 2587
+ 2588
+ 2589
+ 2590
+ 2591
+ 2592
+ 2593
+ 2594
+ 2595
+ 2596
+ 2597
+ 2598
+ 2599
+ 2600
+ 2601
+ 2602
+ 2603
+ 2604
+ 2605
+ 2606
+ 2607
+ 2608
+ 2609
+ 2610
+ 2611
+ 2612
+ 2613
+ 2614
+ 2615
+ 2616
+ 2617
+ 2618
+ 2619
+ 2620
+ 2621
+ 2622
+ 2623
+ 2624
+ 2625
+ 2626
+ 2627
+ 2628
+ 2629
+ 2630
+ 2631
+ 2632
+ 2633
+ 2634
+ 2635
+ 2636
+ 2637
+ 2638
+ 2639
+ 2640
+ 2641
+ 2642
+ 2643
+ 2644
+ 2645
+ 2646
+ 2647
+ 2648
+ 2649
+ 2650
+ 2651
+ 2652
+ 2653
+ 2654
+ 2655
+ 2656
+ 2657
+ 2658
+ 2659
+ 2660
+ 2661
+ 2662
+ 2663
+ 2664
+ 2665
+ 2666
+ 2667
+ 2668
+ 2669
+ 2670
+ 2671
+ 2672
+ 2673
+ 2674
+ 2675
+ 2676
+ 2677
+ 2678
+ 2679
+ 2680
+ 2681
+ 2682
+ 2683
+ 2684
+ 2685
+ 2686
+ 2687
+ 2688
+ 2689
+ 2690
+ 2691
+ 2692
+ 2693
+ 2694
+ 2695
+ 2696
+ 2697
+ 2698
+ 2699
+ 2700
+ 2701
+ 2702
+ 2703
+ 2704
+ 2705
+ 2706
+ 2707
+ 2708
+ 2709
+ 2710
+ 2711
+ 2712
+ 2713
+ 2714
+ 2715
+ 2716
+ 2717
+ 2718
+ 2719
+ 2720
+ 2721
+ 2722
+ 2723
+ 2724
+ 2725
+ 2726
+ 2727
+ 2728
+ 2729
+ 2730
+ 2731
+ 2732
+ 2733
+ 2734
+ 2735
+ 2736
+ 2737
+ 2738
+ 2739
+ 2740
+ 2741
+ 2742
+ 2743
+ 2744
+ 2745
+ 2746
+ 2747
+ 2748
+ 2749
+ 2750
+ 2751
+ 2752
+ 2753
+ 2754
+ 2755
+ 2756
+ 2757
+ 2758
+ 2759
+ 2760
+ 2761
+ 2762
+ 2763
+ 2764
+ 2765
+ 2766
+ 2767
+ 2768
+ 2769
+ 2770
+ 2771
+ 2772
+ 2773
+ 2774
+ 2775
+ 2776
+ 2777
+ 2778
+ 2779
+ 2780
+ 2781
+ 2782
+ 2783
+ 2784
+ 2785
+ 2786
+ 2787
+ 2788
+ 2789
+ 2790
+ 2791
+ 2792
+ 2793
+ 2794
+ 2795
+ 2796
+ 2797
+ 2798
+ 2799
+ 2800
+ 2801
+ 2802
+ 2803
+ 2804
+ 2805
+ 2806
+ 2807
+ 2808
+ 2809
+ 2810
+ 2811
+ 2812
+ 2813
+ 2814
+ 2815
+ 2816
+ 2817
+ 2818
+ 2819
+ 2820
+ 2821
+ 2822
+ 2823
+ 2824
+ 2825
+ 2826
+ 2827
+ 2828
+ 2829
+ 2830
+ 2831
+ 2832
+ 2833
+ 2834
+ 2835
+ 2836
+ 2837
+ 2838
+ 2839
+ 2840
+ 2841
+ 2842
+ 2843
+ 2844
+ 2845
+ 2846
+ 2847
+ 2848
+ 2849
+ 2850
+ 2851
+ 2852
+ 2853
+ 2854
+ 2855
+ 2856
+ 2857
+ 2858
+ 2859
+ 2860
+ 2861
+ 2862
+ 2863
+ 2864
+ 2865
+ 2866
+ 2867
+ 2868
+ 2869
+ 2870
+ 2871
+ 2872
+ 2873
+ 2874
+ 2875
+ 2876
+ 2877
+ 2878
+ 2879
+ 2880
+ 2881
+ 2882
+ 2883
+ 2884
+ 2885
+ 2886
+ 2887
+ 2888
+ 2889
+ 2890
+ 2891
+ 2892
+ 2893
+ 2894
+ 2895
+ 2896
+ 2897
+ 2898
+ 2899
+ 2900
+ 2901
+ 2902
+ 2903
+ 2904
+ 2905
+ 2906
+ 2907
+ 2908
+ 2909
+ 2910
+ 2911
+ 2912
+ 2913
+ 2914
+ 2915
+ 2916
+ 2917
+ 2918
+ 2919
+ 2920
+ 2921
+ 2922
+ 2923
+ 2924
+ 2925
+ 2926
+ 2927
+ 2928
+ 2929
+ 2930
+ 2931
+ 2932
+ 2933
+ 2934
+ 2935
+ 2936
+ 2937
+ 2938
+ 2939
+ 2940
+ 2941
+ 2942
+ 2943
+ 2944
+ 2945
+ 2946
+ 2947
+ 2948
+ 2949
+ 2950
+ 2951
+ 2952
+ 2953
+ 2954
+ 2955
+ 2956
+ 2957
+ 2958
+ 2959
+ 2960
+ 2961
+ 2962
+ 2963
+ 2964
+ 2965
+ 2966
+ 2967
+ 2968
+ 2969
+ 2970
+ 2971
+ 2972
+ 2973
+ 2974
+ 2975
+ 2976
+ 2977
+ 2978
+ 2979
+ 2980
+ 2981
+ 2982
+ 2983
+ 2984
+ 2985
+ 2986
+ 2987
+ 2988
+ 2989
+ 2990
+ 2991
+ 2992
+ 2993
+ 2994
+ 2995
+ 2996
+ 2997
+ 2998
+ 2999
+ 3000
+ 3001
+ 3002
+ 3003
+ 3004
+ 3005
+ 3006
+ 3007
+ 3008
+ 3009
+ 3010
+ 3011
+ 3012
+ 3013
+ 3014
+ 3015
+ 3016
+ 3017
+ 3018
+ 3019
+ 3020
+ 3021
+ 3022
+ 3023
+ 3024
+ 3025
+ 3026
+ 3027
+ 3028
+ 3029
+ 3030
+ 3031
+ 3032
+ 3033
+ 3034
+ 3035
+ 3036
+ 3037
+ 3038
+ 3039
+ 3040
+ 3041
+ 3042
+ 3043
+ 3044
+ 3045
+ 3046
+ 3047
+ 3048
+ 3049
+ 3050
+ 3051
+ 3052
+ 3053
+ 3054
+ 3055
+ 3056
+ 3057
+ 3058
+ 3059
+ 3060
+ 3061
+ 3062
+ 3063
+ 3064
+ 3065
+ 3066
+ 3067
+ 3068
+ 3069
+ 3070
+ 3071
+ 3072
+ 3073
+ 3074
+ 3075
+ 3076
+ 3077
+ 3078
+ 3079
+ 3080
+ 3081
+ 3082
+ 3083
+ 3084
+ 3085
+ 3086
+ 3087
+ 3088
+ 3089
+ 3090
+ 3091
+ 3092
+ 3093
+ 3094
+ 3095
+ 3096
+ 3097
+ 3098
+ 3099
+ 3100
+ 3101
+ 3102
+ 3103
+ 3104
+ 3105
+ 3106
+ 3107
+ 3108
+ 3109
+ 3110
+ 3111
+ 3112
+ 3113
+ 3114
+ 3115
+ 3116
+ 3117
+ 3118
+ 3119
+ 3120
+ 3121
+ 3122
+ 3123
+ 3124
+ 3125
+ 3126
+ 3127
+ 3128
+ 3129
+ 3130
+ 3131
+ 3132
+ 3133
+ 3134
+ 3135
+ 3136
+ 3137
+ 3138
+ 3139
+ 3140
+ 3141
+ 3142
+ 3143
+ 3144
+ 3145
+ 3146
+ 3147
+ 3148
+ 3149
+ 3150
+ 3151
+ 3152
+ 3153
+ 3154
+ 3155
+ 3156
+ 3157
+ 3158
+ 3159
+ 3160
+ 3161
+ 3162
+ 3163
+ 3164
+ 3165
+ 3166
+ 3167
+ 3168
+ 3169
+ 3170
+ 3171
+ 3172
+ 3173
+ 3174
+ 3175
+ 3176
+ 3177
+ 3178
+ 3179
+ 3180
+ 3181
+ 3182
+ 3183
+ 3184
+ 3185
+ 3186
+ 3187
+ 3188
+ 3189
+ 3190
+ 3191
+ 3192
+ 3193
+ 3194
+ 3195
+ 3196
+ 3197
+ 3198
+ 3199
+ 3200
+ 3201
+ 3202
+ 3203
+ 3204
+ 3205
+ 3206
+ 3207
+ 3208
+ 3209
+ 3210
+ 3211
+ 3212
+ 3213
+ 3214
+ 3215
+ 3216
+ 3217
+ 3218
+ 3219
+ 3220
+ 3221
+ 3222
+ 3223
+ 3224
+ 3225
+ 3226
+ 3227
+ 3228
+ 3229
+ 3230
+ 3231
+ 3232
+ 3233
+ 3234
+ 3235
+ 3236
+ 3237
+ 3238
+ 3239
+ 3240
+ 3241
+ 3242
+ 3243
+ 3244
+ 3245
+ 3246
+ 3247
+ 3248
+ 3249
+ 3250
+ 3251
+ 3252
+ 3253
+ 3254
+ 3255
+ 3256
+ 3257
+ 3258
+ 3259
+ 3260
+ 3261
+ 3262
+ 3263
+ 3264
+ 3265
+ 3266
+ 3267
+ 3268
+ 3269
+ 3270
+ 3271
+ 3272
+ 3273
+ 3274
+ 3275
+ 3276
+ 3277
+ 3278
+ 3279
+ 3280
+ 3281
+ 3282
+ 3283
+ 3284
+ 3285
+ 3286
+ 3287
+ 3288
+ 3289
+ 3290
+ 3291
+ 3292
+ 3293
+ 3294
+ 3295
+ 3296
+ 3297
+ 3298
+ 3299
+ 3300
+ 3301
+ 3302
+ 3303
+ 3304
+ 3305
+ 3306
+ 3307
+ 3308
+ 3309
+ 3310
+ 3311
+ 3312
+ 3313
+ 3314
+ 3315
+ 3316
+ 3317
+ 3318
+ 3319
+ 3320
+ 3321
+ 3322
+ 3323
+ 3324
+ 3325
+ 3326
+ 3327
+ 3328
+ 3329
+ 3330
+ 3331
+ 3332
+ 3333
+ 3334
+ 3335
+ 3336
+ 3337
+ 3338
+ 3339
+ 3340
+ 3341
+ 3342
+ 3343
+ 3344
+ 3345
+ 3346
+ 3347
+ 3348
+ 3349
+ 3350
+ 3351
+ 3352
+ 3353
+ 3354
+ 3355
+ 3356
+ 3357
+ 3358
+ 3359
+ 3360
+ 3361
+ 3362
+ 3363
+ 3364
+ 3365
+ 3366
+ 3367
+ 3368
+ 3369
+ 3370
+ 3371
+ 3372
+ 3373
+ 3374
+ 3375
+ 3376
+ 3377
+ 3378
+ 3379
+ 3380
+ 3381
+ 3382
+ 3383
+ 3384
+ 3385
+ 3386
+ 3387
+ 3388
+ 3389
+ 3390
+ 3391
+ 3392
+ 3393
+ 3394
+ 3395
+ 3396
+ 3397
+ 3398
+ 3399
+ 3400
+ 3401
+ 3402
+ 3403
+ 3404
+ 3405
+ 3406
+ 3407
+ 3408
+ 3409
+ 3410
+ 3411
+ 3412
+ 3413
+ 3414
+ 3415
+ 3416
+ 3417
+ 3418
+ 3419
+ 3420
+ 3421
+ 3422
+ 3423
+ 3424
+ 3425
+ 3426
+ 3427
+ 3428
+ 3429
+ 3430
+ 3431
+ 3432
+ 3433
+ 3434
+ 3435
+ 3436
+ 3437
+ 3438
+ 3439
+ 3440
+ 3441
+ 3442
+ 3443
+ 3444
+ 3445
+ 3446
+ 3447
+ 3448
+ 3449
+ 3450
+ 3451
+ 3452
+ 3453
+ 3454
+ 3455
+ 3456
+ 3457
+ 3458
+ 3459
+ 3460
+ 3461
+ 3462
+ 3463
+ 3464
+ 3465
+ 3466
+ 3467
+ 3468
+ 3469
+ 3470
+ 3471
+ 3472
+ 3473
+ 3474
+ 3475
+ 3476
+ 3477
+ 3478
+ 3479
+ 3480
+ 3481
+ 3482
+ 3483
+ 3484
+ 3485
+ 3486
+ 3487
+ 3488
+ 3489
+ 3490
+ 3491
+ 3492
+ 3493
+ 3494
+ 3495
+ 3496
+ 3497
+ 3498
+ 3499
+ 3500
+ 3501
+ 3502
+ 3503
+ 3504
+ 3505
+ 3506
+ 3507
+ 3508
+ 3509
+ 3510
+ 3511
+ 3512
+ 3513
+ 3514
+ 3515
+ 3516
+ 3517
+ 3518
+ 3519
+ 3520
+ 3521
+ 3522
+ 3523
+ 3524
+ 3525
+ 3526
+ 3527
+ 3528
+ 3529
+ 3530
+ 3531
+ 3532
+ 3533
+ 3534
+ 3535
+ 3536
+ 3537
+ 3538
+ 3539
+ 3540
+ 3541
+ 3542
+ 3543
+ 3544
+ 3545
+ 3546
+ 3547
+ 3548
+ 3549
+ 3550
+ 3551
+ 3552
+ 3553
+ 3554
+ 3555
+ 3556
+ 3557
+ 3558
+ 3559
+ 3560
+ 3561
+ 3562
+ 3563
+ 3564
+ 3565
+ 3566
+ 3567
+ 3568
+ 3569
+ 3570
+ 3571
+ 3572
+ 3573
+ 3574
+ 3575
+ 3576
+ 3577
+ 3578
+ 3579
+ 3580
+ 3581
+ 3582
+ 3583
+ 3584
+ 3585
+ 3586
+ 3587
+ 3588
+ 3589
+ 3590
+ 3591
+ 3592
+ 3593
+ 3594
+ 3595
+ 3596
+ 3597
+ 3598
+ 3599
+ 3600
+ 3601
+ 3602
+ 3603
+ 3604
+ 3605
+ 3606
+ 3607
+ 3608
+ 3609
+ 3610
+ 3611
+ 3612
+ 3613
+ 3614
+ 3615
+ 3616
+ 3617
+ 3618
+ 3619
+ 3620
+ 3621
+ 3622
+ 3623
+ 3624
+ 3625
+ 3626
+ 3627
+ 3628
+ 3629
+ 3630
+ 3631
+ 3632
+ 3633
+ 3634
+ 3635
+ 3636
+ 3637
+ 3638
+ 3639
+ 3640
+ 3641
+ 3642
+ 3643
+ 3644
+ 3645
+ 3646
+ 3647
+ 3648
+ 3649
+ 3650
+ 3651
+ 3652
+ 3653
+ 3654
+ 3655
+ 3656
+ 3657
+ 3658
+ 3659
+ 3660
+ 3661
+ 3662
+ 3663
+ 3664
+ 3665
+ 3666
+ 3667
+ 3668
+ 3669
+ 3670
+ 3671
+ 3672
+ 3673
+ 3674
+ 3675
+ 3676
+ 3677
+ 3678
+ 3679
+ 3680
+ 3681
+ 3682
+ 3683
+ 3684
+ 3685
+ 3686
+ 3687
+ 3688
+ 3689
+ 3690
+ 3691
+ 3692
+ 3693
+ 3694
+ 3695
+ 3696
+ 3697
+ 3698
+ 3699
+ 3700
+ 3701
+ 3702
+ 3703
+ 3704
+ 3705
+ 3706
+ 3707
+ 3708
+ 3709
+ 3710
+ 3711
+ 3712
+ 3713
+ 3714
+ 3715
+ 3716
+ 3717
+ 3718
+ 3719
+ 3720
+ 3721
+ 3722
+ 3723
+ 3724
+ 3725
+ 3726
+ 3727
+ 3728
+ 3729
+ 3730
+ 3731
+ 3732
+ 3733
+ 3734
+ 3735
+ 3736
+ 3737
+ 3738
+ 3739
+ 3740
+ 3741
+ 3742
+ 3743
+ 3744
+ 3745
+ 3746
+ 3747
+ 3748
+ 3749
+ 3750
+ 3751
+ 3752
+ 3753
+ 3754
+ 3755
+ 3756
+ 3757
+ 3758
+ 3759
+ 3760
+ 3761
+ 3762
+ 3763
+ 3764
+ 3765
+ 3766
+ 3767
+ 3768
+ 3769
+ 3770
+ 3771
+ 3772
+ 3773
+ 3774
+ 3775
+ 3776
+ 3777
+ 3778
+ 3779
+ 3780
+ 3781
+ 3782
+ 3783
+ 3784
+ 3785
+ 3786
+ 3787
+ 3788
+ 3789
+ 3790
+ 3791
+ 3792
+ 3793
+ 3794
+ 3795
+ 3796
+ 3797
+ 3798
+ 3799
+ 3800
+ 3801
+ 3802
+ 3803
+ 3804
+ 3805
+ 3806
+ 3807
+ 3808
+ 3809
+ 3810
+ 3811
+ 3812
+ 3813
+ 3814
+ 3815
+ 3816
+ 3817
+ 3818
+ 3819
+ 3820
+ 3821
+ 3822
+ 3823
+ 3824
+ 3825
+ 3826
+ 3827
+ 3828
+ 3829
+ 3830
+ 3831
+ 3832
+ 3833
+ 3834
+ 3835
+ 3836
+ 3837
+ 3838
+ 3839
+ 3840
+ 3841
+ 3842
+ 3843
+ 3844
+ 3845
+ 3846
+ 3847
+ 3848
+ 3849
+ 3850
+ 3851
+ 3852
+ 3853
+ 3854
+ 3855
+ 3856
+ 3857
+ 3858
+ 3859
+ 3860
+ 3861
+ 3862
+ 3863
+ 3864
+ 3865
+ 3866
+ 3867
+ 3868
+ 3869
+ 3870
+ 3871
+ 3872
+ 3873
+ 3874
+ 3875
+ 3876
+ 3877
+ 3878
+ 3879
+ 3880
+ 3881
+ 3882
+ 3883
+ 3884
+ 3885
+ 3886
+ 3887
+ 3888
+ 3889
+ 3890
+ 3891
+ 3892
+ 3893
+ 3894
+ 3895
+ 3896
+ 3897
+ 3898
+ 3899
+ 3900
+ 3901
+ 3902
+ 3903
+ 3904
+ 3905
+ 3906
+ 3907
+ 3908
+ 3909
+ 3910
+ 3911
+ 3912
+ 3913
+ 3914
+ 3915
+ 3916
+ 3917
+ 3918
+ 3919
+ 3920
+ 3921
+ 3922
+ 3923
+ 3924
+ 3925
+ 3926
+ 3927
+ 3928
+ 3929
+ 3930
+ 3931
+ 3932
+ 3933
+ 3934
+ 3935
+ 3936
+ 3937
+ 3938
+ 3939
+ 3940
+ 3941
+ 3942
+ 3943
+ 3944
+ 3945
+ 3946
+ 3947
+ 3948
+ 3949
+ 3950
+ 3951
+ 3952
+ 3953
+ 3954
+ 3955
+ 3956
+ 3957
+ 3958
+ 3959
+ 3960
+ 3961
+ 3962
+ 3963
+ 3964
+ 3965
+ 3966
+ 3967
+ 3968
+ 3969
+ 3970
+ 3971
+ 3972
+ 3973
+ 3974
+ 3975
+ 3976
+ 3977
+ 3978
+ 3979
+ 3980
+ 3981
+ 3982
+ 3983
+ 3984
+ 3985
+ 3986
+ 3987
+ 3988
+ 3989
+ 3990
+ 3991
+ 3992
+ 3993
+ 3994
+ 3995
+ 3996
+ 3997
+ 3998
+ 3999
+ 4000
+ 4001
+ 4002
+ 4003
+ 4004
+ 4005
+ 4006
+ 4007
+ 4008
+ 4009
+ 4010
+ 4011
+ 4012
+ 4013
+ 4014
+ 4015
+ 4016
+ 4017
+ 4018
+ 4019
+ 4020
+ 4021
+ 4022
+ 4023
+ 4024
+ 4025
+ 4026
+ 4027
+ 4028
+ 4029
+ 4030
+ 4031
+ 4032
+ 4033
+ 4034
+ 4035
+ 4036
+ 4037
+ 4038
+ 4039
+ 4040
+ 4041
+ 4042
+ 4043
+ 4044
+ 4045
+ 4046
+ 4047
+ 4048
+ 4049
+ 4050
+ 4051
+ 4052
+ 4053
+ 4054
+ 4055
+ 4056
+ 4057
+ 4058
+ 4059
+ 4060
+ 4061
+ 4062
+ 4063
+ 4064
+ 4065
+ 4066
+ 4067
+ 4068
+ 4069
+ 4070
+ 4071
+ 4072
+ 4073
+ 4074
+ 4075
+ 4076
+ 4077
+ 4078
+ 4079
+ 4080
+ 4081
+ 4082
+ 4083
+ 4084
+ 4085
+ 4086
+ 4087
+ 4088
+ 4089
+ 4090
+ 4091
+ 4092
+ 4093
+ 4094
+ 4095
+ 4096
+ 4097
+ 4098
+ 4099
+ 4100
+ 4101
+ 4102
+ 4103
+ 4104
+ 4105
+ 4106
+ 4107
+ 4108
+ 4109
+ 4110
+ 4111
+ 4112
+ 4113
+ 4114
+ 4115
+ 4116
+ 4117
+ 4118
+ 4119
+ 4120
+ 4121
+ 4122
+ 4123
+ 4124
+ 4125
+ 4126
+ 4127
+ 4128
+ 4129
+ 4130
+ 4131
+ 4132
+ 4133
+ 4134
+ 4135
+ 4136
+ 4137
+ 4138
+ 4139
+ 4140
+ 4141
+ 4142
+ 4143
+ 4144
+ 4145
+ 4146
+ 4147
+ 4148
+ 4149
+ 4150
+ 4151
+ 4152
+ 4153
+ 4154
+ 4155
+ 4156
+ 4157
+ 4158
+ 4159
+ 4160
+ 4161
+ 4162
+ 4163
+ 4164
+ 4165
+ 4166
+ 4167
+ 4168
+ 4169
+ 4170
+ 4171
+ 4172
+ 4173
+ 4174
+ 4175
+ 4176
+ 4177
+ 4178
+ 4179
+ 4180
+ 4181
+ 4182
+ 4183
+ 4184
+ 4185
+ 4186
+ 4187
+ 4188
+ 4189
+ 4190
+ 4191
+ 4192
+ 4193
+ 4194
+ 4195
+ 4196
+ 4197
+ 4198
+ 4199
+ 4200
+ 4201
+ 4202
+ 4203
+ 4204
+ 4205
+ 4206
+ 4207
+ 4208
+ 4209
+ 4210
+ 4211
+ 4212
+ 4213
+ 4214
+ 4215
+ 4216
+ 4217
+ 4218
+ 4219
+ 4220
+ 4221
+ 4222
+ 4223
+ 4224
+ 4225
+ 4226
+ 4227
+ 4228
+ 4229
+ 4230
+ 4231
+ 4232
+ 4233
+ 4234
+ 4235
+ 4236
+ 4237
+ 4238
+ 4239
+ 4240
+ 4241
+ 4242
+ 4243
+ 4244
+ 4245
+ 4246
+ 4247
+ 4248
+ 4249
+ 4250
+ 4251
+ 4252
+ 4253
+ 4254
+ 4255
+ 4256
+ 4257
+ 4258
+ 4259
+ 4260
+ 4261
+ 4262
+ 4263
+ 4264
+ 4265
+ 4266
+ 4267
+ 4268
+ 4269
+ 4270
+ 4271
+ 4272
+ 4273
+ 4274
+ 4275
+ 4276
+ 4277
+ 4278
+ 4279
+ 4280
+ 4281
+ 4282
+ 4283
+ 4284
+ 4285
+ 4286
+ 4287
+ 4288
+ 4289
+ 4290
+ 4291
+ 4292
+ 4293
+ 4294
+ 4295
+ 4296
+ 4297
+ 4298
+ 4299
+ 4300
+ 4301
+ 4302
+ 4303
+ 4304
+ 4305
+ 4306
+ 4307
+ 4308
+ 4309
+ 4310
+ 4311
+ 4312
+ 4313
+ 4314
+ 4315
+ 4316
+ 4317
+ 4318
+ 4319
+ 4320
+ 4321
+ 4322
+ 4323
+ 4324
+ 4325
+ 4326
+ 4327
+ 4328
+ 4329
+ 4330
+ 4331
+ 4332
+ 4333
+ 4334
+ 4335
+ 4336
+ 4337
+ 4338
+ 4339
+ 4340
+ 4341
+ 4342
+ 4343
+ 4344
+ 4345
+ 4346
+ 4347
+ 4348
+ 4349
+ 4350
+ 4351
+ 4352
+ 4353
+ 4354
+ 4355
+ 4356
+ 4357
+ 4358
+ 4359
+ 4360
+ 4361
+ 4362
+ 4363
+ 4364
+ 4365
+ 4366
+ 4367
+ 4368
+ 4369
+ 4370
+ 4371
+ 4372
+ 4373
+ 4374
+ 4375
+ 4376
+ 4377
+ 4378
+ 4379
+ 4380
+ 4381
+ 4382
+ 4383
+ 4384
+ 4385
+ 4386
+ 4387
+ 4388
+ 4389
+ 4390
+ 4391
+ 4392
+ 4393
+ 4394
+ 4395
+ 4396
+ 4397
+ 4398
+ 4399
+ 4400
+ 4401
+ 4402
+ 4403
+ 4404
+ 4405
+ 4406
+ 4407
+ 4408
+ 4409
+ 4410
+ 4411
+ 4412
+ 4413
+ 4414
+ 4415
+ 4416
+ 4417
+ 4418
+ 4419
+ 4420
+ 4421
+ 4422
+ 4423
+ 4424
+ 4425
+ 4426
+ 4427
+ 4428
+ 4429
+ 4430
+ 4431
+ 4432
+ 4433
+ 4434
+ 4435
+ 4436
+ 4437
+ 4438
+ 4439
+ 4440
+ 4441
+ 4442
+ 4443
+ 4444
+ 4445
+ 4446
+ 4447
+ 4448
+ 4449
+ 4450
+ 4451
+ 4452
+ 4453
+ 4454
+ 4455
+ 4456
+ 4457
+ 4458
+ 4459
+ 4460
+ 4461
+ 4462
+ 4463
+ 4464
+ 4465
+ 4466
+ 4467
+ 4468
+ 4469
+ 4470
+ 4471
+ 4472
+ 4473
+ 4474
+ 4475
+ 4476
+ 4477
+ 4478
+ 4479
+ 4480
+ 4481
+ 4482
+ 4483
+ 4484
+ 4485
+ 4486
+ 4487
+ 4488
+ 4489
+ 4490
+ 4491
+ 4492
+ 4493
+ 4494
+ 4495
+ 4496
+ 4497
+ 4498
+ 4499
+ 4500
+ 4501
+ 4502
+ 4503
+ 4504
+ 4505
+ 4506
+ 4507
+ 4508
+ 4509
+ 4510
+ 4511
+ 4512
+ 4513
+ 4514
+ 4515
+ 4516
+ 4517
+ 4518
+ 4519
+ 4520
+ 4521
+ 4522
+ 4523
+ 4524
+ 4525
+ 4526
+ 4527
+ 4528
+ 4529
+ 4530
+ 4531
+ 4532
+ 4533
+ 4534
+ 4535
+ 4536
+ 4537
+ 4538
+ 4539
+ 4540
+ 4541
+ 4542
+ 4543
+ 4544
+ 4545
+ 4546
+ 4547
+ 4548
+ 4549
+ 4550
+ 4551
+ 4552
+ 4553
+ 4554
+ 4555
+ 4556
+ 4557
+ 4558
+ 4559
+ 4560
+ 4561
+ 4562
+ 4563
+ 4564
+ 4565
+ 4566
+ 4567
+ 4568
+ 4569
+ 4570
+ 4571
+ 4572
+ 4573
+ 4574
+ 4575
+ 4576
+ 4577
+ 4578
+ 4579
+ 4580
+ 4581
+ 4582
+ 4583
+ 4584
+ 4585
+ 4586
+ 4587
+ 4588
+ 4589
+ 4590
+ 4591
+ 4592
+ 4593
+ 4594
+ 4595
+ 4596
+ 4597
+ 4598
+ 4599
+ 4600
+ 4601
+ 4602
+ 4603
+ 4604
+ 4605
+ 4606
+ 4607
+ 4608
+ 4609
+ 4610
+ 4611
+ 4612
+ 4613
+ 4614
+ 4615
+ 4616
+ 4617
+ 4618
+ 4619
+ 4620
+ 4621
+ 4622
+ 4623
+ 4624
+ 4625
+ 4626
+ 4627
+ 4628
+ 4629
+ 4630
+ 4631
+ 4632
+ 4633
+ 4634
+ 4635
+ 4636
+ 4637
+ 4638
+ 4639
+ 4640
+ 4641
+ 4642
+ 4643
+ 4644
+ 4645
+ 4646
+ 4647
+ 4648
+ 4649
+ 4650
+ 4651
+ 4652
+ 4653
+ 4654
+ 4655
+ 4656
+ 4657
+ 4658
+ 4659
+ 4660
+ 4661
+ 4662
+ 4663
+ 4664
+ 4665
+ 4666
+ 4667
+ 4668
+ 4669
+ 4670
+ 4671
+ 4672
+ 4673
+ 4674
+ 4675
+ 4676
+ 4677
+ 4678
+ 4679
+ 4680
+ 4681
+ 4682
+ 4683
+ 4684
+ 4685
+ 4686
+ 4687
+ 4688
+ 4689
+ 4690
+ 4691
+ 4692
+ 4693
+ 4694
+ 4695
+ 4696
+ 4697
+ 4698
+ 4699
+ 4700
+ 4701
+ 4702
+ 4703
+ 4704
+ 4705
+ 4706
+ 4707
+ 4708
+ 4709
+ 4710
+ 4711
+ 4712
+ 4713
+ 4714
+ 4715
+ 4716
+ 4717
+ 4718
+ 4719
+ 4720
+ 4721
+ 4722
+ 4723
+ 4724
+ 4725
+ 4726
+ 4727
+ 4728
+ 4729
+ 4730
+ 4731
+ 4732
+ 4733
+ 4734
+ 4735
+ 4736
+ 4737
+ 4738
+ 4739
+ 4740
+ 4741
+ 4742
+ 4743
+ 4744
+ 4745
+ 4746
+ 4747
+ 4748
+ 4749
+ 4750
+ 4751
+ 4752
+ 4753
+ 4754
+ 4755
+ 4756
+ 4757
+ 4758
+ 4759
+ 4760
+ 4761
+ 4762
+ 4763
+ 4764
+ 4765
+ 4766
+ 4767
+ 4768
+ 4769
+ 4770
+ 4771
+ 4772
+ 4773
+ 4774
+ 4775
+ 4776
+ 4777
+ 4778
+ 4779
+ 4780
+ 4781
+ 4782
+ 4783
+ 4784
+ 4785
+ 4786
+ 4787
+ 4788
+ 4789
+ 4790
+ 4791
+ 4792
+ 4793
+ 4794
+ 4795
+ 4796
+ 4797
+ 4798
+ 4799
+ 4800
+ 4801
+ 4802
+ 4803
+ 4804
+ 4805
+ 4806
+ 4807
+ 4808
+ 4809
+ 4810
+ 4811
+ 4812
+ 4813
+ 4814
+ 4815
+ 4816
+ 4817
+ 4818
+ 4819
+ 4820
+ 4821
+ 4822
+ 4823
+ 4824
+ 4825
+ 4826
+ 4827
+ 4828
+ 4829
+ 4830
+ 4831
+ 4832
+ 4833
+ 4834
+ 4835
+ 4836
+ 4837
+ 4838
+ 4839
+ 4840
+ 4841
+ 4842
+ 4843
+ 4844
+ 4845
+ 4846
+ 4847
+ 4848
+ 4849
+ 4850
+ 4851
+ 4852
+ 4853
+ 4854
+ 4855
+ 4856
+ 4857
+ 4858
+ 4859
+ 4860
+ 4861
+ 4862
+ 4863
+ 4864
+ 4865
+ 4866
+ 4867
+ 4868
+ 4869
+ 4870
+ 4871
+ 4872
+ 4873
+ 4874
+ 4875
+ 4876
+ 4877
+ 4878
+ 4879
+ 4880
+ 4881
+ 4882
+ 4883
+ 4884
+ 4885
+ 4886
+ 4887
+ 4888
+ 4889
+ 4890
+ 4891
+ 4892
+ 4893
+ 4894
+ 4895
+ 4896
+ 4897
+ 4898
+ 4899
+ 4900
+ 4901
+ 4902
+ 4903
+ 4904
+ 4905
+ 4906
+ 4907
+ 4908
+ 4909
+ 4910
+ 4911
+ 4912
+ 4913
+ 4914
+ 4915
+ 4916
+ 4917
+ 4918
+ 4919
+ 4920
+ 4921
+ 4922
+ 4923
+ 4924
+ 4925
+ 4926
+ 4927
+ 4928
+ 4929
+ 4930
+ 4931
+ 4932
+ 4933
+ 4934
+ 4935
+ 4936
+ 4937
+ 4938
+ 4939
+ 4940
+ 4941
+ 4942
+ 4943
+ 4944
+ 4945
+ 4946
+ 4947
+ 4948
+ 4949
+ 4950
+ 4951
+ 4952
+ 4953
+ 4954
+ 4955
+ 4956
+ 4957
+ 4958
+ 4959
+ 4960
+ 4961
+ 4962
+ 4963
+ 4964
+ 4965
+ 4966
+ 4967
+ 4968
+ 4969
+ 4970
+ 4971
+ 4972
+ 4973
+ 4974
+ 4975
+ 4976
+ 4977
+ 4978
+ 4979
+ 4980
+ 4981
+ 4982
+ 4983
+ 4984
+ 4985
+ 4986
+ 4987
+ 4988
+ 4989
+ 4990
+ 4991
+ 4992
+ 4993
+ 4994
+ 4995
+ 4996
+ 4997
+ 4998
+ 4999
+ 5000
+ 5001
+ 5002
+ 5003
+ 5004
+ 5005
+ 5006
+ 5007
+ 5008
+ 5009
+ 5010
+ 5011
+ 5012
+ 5013
+ 5014
+ 5015
+ 5016
+ 5017
+ 5018
+ 5019
+ 5020
+ 5021
+ 5022
+ 5023
+ 5024
+ 5025
+ 5026
+ 5027
+ 5028
+ 5029
+ 5030
+ 5031
+ 5032
+ 5033
+ 5034
+ 5035
+ 5036
+ 5037
+ 5038
+ 5039
+ 5040
+ 5041
+ 5042
+ 5043
+ 5044
+ 5045
+ 5046
+ 5047
+ 5048
+ 5049
+ 5050
+ 5051
+ 5052
+ 5053
+ 5054
+ 5055
+ 5056
+ 5057
+ 5058
+ 5059
+ 5060
+ 5061
+ 5062
+ 5063
+ 5064
+ 5065
+ 5066
+ 5067
+ 5068
+ 5069
+ 5070
+ 5071
+ 5072
+ 5073
+ 5074
+ 5075
+ 5076
+ 5077
+ 5078
+ 5079
+ 5080
+ 5081
+ 5082
+ 5083
+ 5084
+ 5085
+ 5086
+ 5087
+ 5088
+ 5089
+ 5090
+ 5091
+ 5092
+ 5093
+ 5094
+ 5095
+ 5096
+ 5097
+ 5098
+ 5099
+ 5100
+ 5101
+ 5102
+ 5103
+ 5104
+ 5105
+ 5106
+ 5107
+ 5108
+ 5109
+ 5110
+ 5111
+ 5112
+ 5113
+ 5114
+ 5115
+ 5116
+ 5117
+ 5118
+ 5119
+ 5120
+ 5121
+ 5122
+ 5123
+ 5124
+ 5125
+ 5126
+ 5127
+ 5128
+ 5129
+ 5130
+ 5131
+ 5132
+ 5133
+ 5134
+ 5135
+ 5136
+ 5137
+ 5138
+ 5139
+ 5140
+ 5141
+ 5142
+ 5143
+ 5144
+ 5145
+ 5146
+ 5147
+ 5148
+ 5149
+ 5150
+ 5151
+ 5152
+ 5153
+ 5154
+ 5155
+ 5156
+ 5157
+ 5158
+ 5159
+ 5160
+ 5161
+ 5162
+ 5163
+ 5164
+ 5165
+ 5166
+ 5167
+ 5168
+ 5169
+ 5170
+ 5171
+ 5172
+ 5173
+ 5174
+ 5175
+ 5176
+ 5177
+ 5178
+ 5179
+ 5180
+ 5181
+ 5182
+ 5183
+ 5184
+ 5185
+ 5186
+ 5187
+ 5188
+ 5189
+ 5190
+ 5191
+ 5192
+ 5193
+ 5194
+ 5195
+ 5196
+ 5197
+ 5198
+ 5199
+ 5200
+ 5201
+ 5202
+ 5203
+ 5204
+ 5205
+ 5206
+ 5207
+ 5208
+ 5209
+ 5210
+ 5211
+ 5212
+ 5213
+ 5214
+ 5215
+ 5216
+ 5217
+ 5218
+ 5219
+ 5220
+ 5221
+ 5222
+ 5223
+ 5224
+ 5225
+ 5226
+ 5227
+ 5228
+ 5229
+ 5230
+ 5231
+ 5232
+ 5233
+ 5234
+ 5235
+ 5236
+ 5237
+ 5238
+ 5239
+ 5240
+ 5241
+ 5242
+ 5243
+ 5244
+ 5245
+ 5246
+ 5247
+ 5248
+ 5249
+ 5250
+ 5251
+ 5252
+ 5253
+ 5254
+ 5255
+ 5256
+ 5257
+ 5258
+ 5259
+ 5260
+ 5261
+ 5262
+ 5263
+ 5264
+ 5265
+ 5266
+ 5267
+ 5268
+ 5269
+ 5270
+ 5271
+ 5272
+ 5273
+ 5274
+ 5275
+ 5276
+ 5277
+ 5278
+ 5279
+ 5280
+ 5281
+ 5282
+ 5283
+ 5284
+ 5285
+ 5286
+ 5287
+ 5288
+ 5289
+ 5290
+ 5291
+ 5292
+ 5293
+ 5294
+ 5295
+ 5296
+ 5297
+ 5298
+ 5299
+ 5300
+ 5301
+ 5302
+ 5303
+ 5304
+ 5305
+ 5306
+ 5307
+ 5308
+ 5309
+ 5310
+ 5311
+ 5312
+ 5313
+ 5314
+ 5315
+ 5316
+ 5317
+ 5318
+ 5319
+ 5320
+ 5321
+ 5322
+ 5323
+ 5324
+ 5325
+ 5326
+ 5327
+ 5328
+ 5329
+ 5330
+ 5331
+ 5332
+ 5333
+ 5334
+ 5335
+ 5336
+ 5337
+ 5338
+ 5339
+ 5340
+ 5341
+ 5342
+ 5343
+ 5344
+ 5345
+ 5346
+ 5347
+ 5348
+ 5349
+ 5350
+ 5351
+ 5352
+ 5353
+ 5354
+ 5355
+ 5356
+ 5357
+ 5358
+ 5359
+ 5360
+ 5361
+ 5362
+ 5363
+ 5364
+ 5365
+ 5366
+ 5367
+ 5368
+ 5369
+ 5370
+ 5371
+ 5372
+ 5373
+ 5374
+ 5375
+ 5376
+ 5377
+ 5378
+ 5379
+ 5380
+ 5381
+ 5382
+ 5383
+ 5384
+ 5385
+ 5386
+ 5387
+ 5388
+ 5389
+ 5390
+ 5391
+ 5392
+ 5393
+ 5394
+ 5395
+ 5396
+ 5397
+ 5398
+ 5399
+ 5400
+ 5401
+ 5402
+ 5403
+ 5404
+ 5405
+ 5406
+ 5407
+ 5408
+ 5409
+ 5410
+ 5411
+ 5412
+ 5413
+ 5414
+ 5415
+ 5416
+ 5417
+ 5418
+ 5419
+ 5420
+ 5421
+ 5422
+ 5423
+ 5424
+ 5425
+ 5426
+ 5427
+ 5428
+ 5429
+ 5430
+ 5431
+ 5432
+ 5433
+ 5434
+ 5435
+ 5436
+ 5437
+ 5438
+ 5439
+ 5440
+ 5441
+ 5442
+ 5443
+ 5444
+ 5445
+ 5446
+ 5447
+ 5448
+ 5449
+ 5450
+ 5451
+ 5452
+ 5453
+ 5454
+ 5455
+ 5456
+ 5457
+ 5458
+ 5459
+ 5460
+ 5461
+ 5462
+ 5463
+ 5464
+ 5465
+ 5466
+ 5467
+ 5468
+ 5469
+ 5470
+ 5471
+ 5472
+ 5473
+ 5474
+ 5475
+ 5476
+ 5477
+ 5478
+ 5479
+ 5480
+ 5481
+ 5482
+ 5483
+ 5484
+ 5485
+ 5486
+ 5487
+ 5488
+ 5489
+ 5490
+ 5491
+ 5492
+ 5493
+ 5494
+ 5495
+ 5496
+ 5497
+ 5498
+ 5499
+ 5500
+ 5501
+ 5502
+ 5503
+ 5504
+ 5505
+ 5506
+ 5507
+ 5508
+ 5509
+ 5510
+ 5511
+ 5512
+ 5513
+ 5514
+ 5515
+ 5516
+ 5517
+ 5518
+ 5519
+ 5520
+ 5521
+ 5522
+ 5523
+ 5524
+ 5525
+ 5526
+ 5527
+ 5528
+ 5529
+ 5530
+ 5531
+ 5532
+ 5533
+ 5534
+ 5535
+ 5536
+ 5537
+ 5538
+ 5539
+ 5540
+ 5541
+ 5542
+ 5543
+ 5544
+ 5545
+ 5546
+ 5547
+ 5548
+ 5549
+ 5550
+ 5551
+ 5552
+ 5553
+ 5554
+ 5555
+ 5556
+ 5557
+ 5558
+ 5559
+ 5560
+ 5561
+ 5562
+ 5563
+ 5564
+ 5565
+ 5566
+ 5567
+ 5568
+ 5569
+ 5570
+ 5571
+ 5572
+ 5573
+ 5574
+ 5575
+ 5576
+ 5577
+ 5578
+ 5579
+ 5580
+ 5581
+ 5582
+ 5583
+ 5584
+ 5585
+ 5586
+ 5587
+ 5588
+ 5589
+ 5590
+ 5591
+ 5592
+ 5593
+ 5594
+ 5595
+ 5596
+ 5597
+ 5598
+ 5599
+ 5600
+ 5601
+ 5602
+ 5603
+ 5604
+ 5605
+ 5606
+ 5607
+ 5608
+ 5609
+ 5610
+ 5611
+ 5612
+ 5613
+ 5614
+ 5615
+ 5616
+ 5617
+ 5618
+ 5619
+ 5620
+ 5621
+ 5622
+ 5623
+ 5624
+ 5625
+ 5626
+ 5627
+ 5628
+ 5629
+ 5630
+ 5631
+ 5632
+ 5633
+ 5634
+ 5635
+ 5636
+ 5637
+ 5638
+ 5639
+ 5640
+ 5641
+ 5642
+ 5643
+ 5644
+ 5645
+ 5646
+ 5647
+ 5648
+ 5649
+ 5650
+ 5651
+ 5652
+ 5653
+ 5654
+ 5655
+ 5656
+ 5657
+ 5658
+ 5659
+ 5660
+ 5661
+ 5662
+ 5663
+ 5664
+ 5665
+ 5666
+ 5667
+ 5668
+ 5669
+ 5670
+ 5671
+ 5672
+ 5673
+ 5674
+ 5675
+ 5676
+ 5677
+ 5678
+ 5679
+ 5680
+ 5681
+ 5682
+ 5683
+ 5684
+ 5685
+ 5686
+ 5687
+ 5688
+ 5689
+ 5690
+ 5691
+ 5692
+ 5693
+ 5694
+ 5695
+ 5696
+ 5697
+ 5698
+ 5699
+ 5700
+ 5701
+ 5702
+ 5703
+ 5704
+ 5705
+ 5706
+ 5707
+ 5708
+ 5709
+ 5710
+ 5711
+ 5712
+ 5713
+ 5714
+ 5715
+ 5716
+ 5717
+ 5718
+ 5719
+ 5720
+ 5721
+ 5722
+ 5723
+ 5724
+ 5725
+ 5726
+ 5727
+ 5728
+ 5729
+ 5730
+ 5731
+ 5732
+ 5733
+ 5734
+ 5735
+ 5736
+ 5737
+ 5738
+ 5739
+ 5740
+ 5741
+ 5742
+ 5743
+ 5744
+ 5745
+ 5746
+ 5747
+ 5748
+ 5749
+ 5750
+ 5751
+ 5752
+ 5753
+ 5754
+ 5755
+ 5756
+ 5757
+ 5758
+ 5759
+ 5760
+ 5761
+ 5762
+ 5763
+ 5764
+ 5765
+ 5766
+ 5767
+ 5768
+ 5769
+ 5770
+ 5771
+ 5772
+ 5773
+ 5774
+ 5775
+ 5776
+ 5777
+ 5778
+ 5779
+ 5780
+ 5781
+ 5782
+ 5783
+ 5784
+ 5785
+ 5786
+ 5787
+ 5788
+ 5789
+ 5790
+ 5791
+ 5792
+ 5793
+ 5794
+ 5795
+ 5796
+ 5797
+ 5798
+ 5799
+ 5800
+ 5801
+ 5802
+ 5803
+ 5804
+ 5805
+ 5806
+ 5807
+ 5808
+ 5809
+ 5810
+ 5811
+ 5812
+ 5813
+ 5814
+ 5815
+ 5816
+ 5817
+ 5818
+ 5819
+ 5820
+ 5821
+ 5822
+ 5823
+ 5824
+ 5825
+ 5826
+ 5827
+ 5828
+ 5829
+ 5830
+ 5831
+ 5832
+ 5833
+ 5834
+ 5835
+ 5836
+ 5837
+ 5838
+ 5839
+ 5840
+ 5841
+ 5842
+ 5843
+ 5844
+ 5845
+ 5846
+ 5847
+ 5848
+ 5849
+ 5850
+ 5851
+ 5852
+ 5853
+ 5854
+ 5855
+ 5856
+ 5857
+ 5858
+ 5859
+ 5860
+ 5861
+ 5862
+ 5863
+ 5864
+ 5865
+ 5866
+ 5867
+ 5868
+ 5869
+ 5870
+ 5871
+ 5872
+ 5873
+ 5874
+ 5875
+ 5876
+ 5877
+ 5878
+ 5879
+ 5880
+ 5881
+ 5882
+ 5883
+ 5884
+ 5885
+ 5886
+ 5887
+ 5888
+ 5889
+ 5890
+ 5891
+ 5892
+ 5893
+ 5894
+ 5895
+ 5896
+ 5897
+ 5898
+ 5899
+ 5900
+ 5901
+ 5902
+ 5903
+ 5904
+ 5905
+ 5906
+ 5907
+ 5908
+ 5909
+ 5910
+ 5911
+ 5912
+ 5913
+ 5914
+ 5915
+ 5916
+ 5917
+ 5918
+ 5919
+ 5920
+ 5921
+ 5922
+ 5923
+ 5924
+ 5925
+ 5926
+ 5927
+ 5928
+ 5929
+ 5930
+ 5931
+ 5932
+ 5933
+ 5934
+ 5935
+ 5936
+ 5937
+ 5938
+ 5939
+ 5940
+ 5941
+ 5942
+ 5943
+ 5944
+ 5945
+ 5946
+ 5947
+ 5948
+ 5949
+ 5950
+ 5951
+ 5952
+ 5953
+ 5954
+ 5955
+ 5956
+ 5957
+ 5958
+ 5959
+ 5960
+ 5961
+ 5962
+ 5963
+ 5964
+ 5965
+ 5966
+ 5967
+ 5968
+ 5969
+ 5970
+ 5971
+ 5972
+ 5973
+ 5974
+ 5975
+ 5976
+ 5977
+ 5978
+ 5979
+ 5980
+ 5981
+ 5982
+ 5983
+ 5984
+ 5985
+ 5986
+ 5987
+ 5988
+ 5989
+ 5990
+ 5991
+ 5992
+ 5993
+ 5994
+ 5995
+ 5996
+ 5997
+ 5998
+ 5999
+ 6000
+ 6001
+ 6002
+ 6003
+ 6004
+ 6005
+ 6006
+ 6007
+ 6008
+ 6009
+ 6010
+ 6011
+ 6012
+ 6013
+ 6014
+ 6015
+ 6016
+ 6017
+ 6018
+ 6019
+ 6020
+ 6021
+ 6022
+ 6023
+ 6024
+ 6025
+ 6026
+ 6027
+ 6028
+ 6029
+ 6030
+ 6031
+ 6032
+ 6033
+ 6034
+ 6035
+ 6036
+ 6037
+ 6038
+ 6039
+ 6040
+ 6041
+ 6042
+ 6043
+ 6044
+ 6045
+ 6046
+ 6047
+ 6048
+ 6049
+ 6050
+ 6051
+ 6052
+ 6053
+ 6054
+ 6055
+ 6056
+ 6057
+ 6058
+ 6059
+ 6060
+ 6061
+ 6062
+ 6063
+ 6064
+ 6065
+ 6066
+ 6067
+ 6068
+ 6069
+ 6070
+ 6071
+ 6072
+ 6073
+ 6074
+ 6075
+ 6076
+ 6077
+ 6078
+ 6079
+ 6080
+ 6081
+ 6082
+ 6083
+ 6084
+ 6085
+ 6086
+ 6087
+ 6088
+ 6089
+ 6090
+ 6091
+ 6092
+ 6093
+ 6094
+ 6095
+ 6096
+ 6097
+ 6098
+ 6099
+ 6100
+ 6101
+ 6102
+ 6103
+ 6104
+ 6105
+ 6106
+ 6107
+ 6108
+ 6109
+ 6110
+ 6111
+ 6112
+ 6113
+ 6114
+ 6115
+ 6116
+ 6117
+ 6118
+ 6119
+ 6120
+ 6121
+ 6122
+ 6123
+ 6124
+ 6125
+ 6126
+ 6127
+ 6128
+ 6129
+ 6130
+ 6131
+ 6132
+ 6133
+ 6134
+ 6135
+ 6136
+ 6137
+ 6138
+ 6139
+ 6140
+ 6141
+ 6142
+ 6143
+ 6144
+ 6145
+ 6146
+ 6147
+ 6148
+ 6149
+ 6150
+ 6151
+ 6152
+ 6153
+ 6154
+ 6155
+ 6156
+ 6157
+ 6158
+ 6159
+ 6160
+ 6161
+ 6162
+ 6163
+ 6164
+ 6165
+ 6166
+ 6167
+ 6168
+ 6169
+ 6170
+ 6171
+ 6172
+ 6173
+ 6174
+ 6175
+ 6176
+ 6177
+ 6178
+ 6179
+ 6180
+ 6181
+ 6182
+ 6183
+ 6184
+ 6185
+ 6186
+ 6187
+ 6188
+ 6189
+ 6190
+ 6191
+ 6192
+ 6193
+ 6194
+ 6195
+ 6196
+ 6197
+ 6198
+ 6199
+ 6200
+ 6201
+ 6202
+ 6203
+ 6204
+ 6205
+ 6206
+ 6207
+ 6208
+ 6209
+ 6210
+ 6211
+ 6212
+ 6213
+ 6214
+ 6215
+ 6216
+ 6217
+ 6218
+ 6219
+ 6220
+ 6221
+ 6222
+ 6223
+ 6224
+ 6225
+ 6226
+ 6227
+ 6228
+ 6229
+ 6230
+ 6231
+ 6232
+ 6233
+ 6234
+ 6235
+ 6236
+ 6237
+ 6238
+ 6239
+ 6240
+ 6241
+ 6242
+ 6243
+ 6244
+ 6245
+ 6246
+ 6247
+ 6248
+ 6249
+ 6250
+ 6251
+ 6252
+ 6253
+ 6254
+ 6255
+ 6256
+ 6257
+ 6258
+ 6259
+ 6260
+ 6261
+ 6262
+ 6263
+ 6264
+ 6265
+ 6266
+ 6267
+ 6268
+ 6269
+ 6270
+ 6271
+ 6272
+ 6273
+ 6274
+ 6275
+ 6276
+ 6277
+ 6278
+ 6279
+ 6280
+ 6281
+ 6282
+ 6283
+ 6284
+ 6285
+ 6286
+ 6287
+ 6288
+ 6289
+ 6290
+ 6291
+ 6292
+ 6293
+ 6294
+ 6295
+ 6296
+ 6297
+ 6298
+ 6299
+ 6300
+ 6301
+ 6302
+ 6303
+ 6304
+ 6305
+ 6306
+ 6307
+ 6308
+ 6309
+ 6310
+ 6311
+ 6312
+ 6313
+ 6314
+ 6315
+ 6316
+ 6317
+ 6318
+ 6319
+ 6320
+ 6321
+ 6322
+ 6323
+ 6324
+ 6325
+ 6326
+ 6327
+ 6328
+ 6329
+ 6330
+ 6331
+ 6332
+ 6333
+ 6334
+ 6335
+ 6336
+ 6337
+ 6338
+ 6339
+ 6340
+ 6341
+ 6342
+ 6343
+ 6344
+ 6345
+ 6346
+ 6347
+ 6348
+ 6349
+ 6350
+ 6351
+ 6352
+ 6353
+ 6354
+ 6355
+ 6356
+ 6357
+ 6358
+ 6359
+ 6360
+ 6361
+ 6362
+ 6363
+ 6364
+ 6365
+ 6366
+ 6367
+ 6368
+ 6369
+ 6370
+ 6371
+ 6372
+ 6373
+ 6374
+ 6375
+ 6376
+ 6377
+ 6378
+ 6379
+ 6380
+ 6381
+ 6382
+ 6383
+ 6384
+ 6385
+ 6386
+ 6387
+ 6388
+ 6389
+ 6390
+ 6391
+ 6392
+ 6393
+ 6394
+ 6395
+ 6396
+ 6397
+ 6398
+ 6399
+ 6400
+ 6401
+ 6402
+ 6403
+ 6404
+ 6405
+ 6406
+ 6407
+ 6408
+ 6409
+ 6410
+ 6411
+ 6412
+ 6413
+ 6414
+ 6415
+ 6416
+ 6417
+ 6418
+ 6419
+ 6420
+ 6421
+ 6422
+ 6423
+ 6424
+ 6425
+ 6426
+ 6427
+ 6428
+ 6429
+ 6430
+ 6431
+ 6432
+ 6433
+ 6434
+ 6435
+ 6436
+ 6437
+ 6438
+ 6439
+ 6440
+ 6441
+ 6442
+ 6443
+ 6444
+ 6445
+ 6446
+ 6447
+ 6448
+ 6449
+ 6450
+ 6451
+ 6452
+ 6453
+ 6454
+ 6455
+ 6456
+ 6457
+ 6458
+ 6459
+ 6460
+ 6461
+ 6462
+ 6463
+ 6464
+ 6465
+ 6466
+ 6467
+ 6468
+ 6469
+ 6470
+ 6471
+ 6472
+ 6473
+ 6474
+ 6475
+ 6476
+ 6477
+ 6478
+ 6479
+ 6480
+ 6481
+ 6482
+ 6483
+ 6484
+ 6485
+ 6486
+ 6487
+ 6488
+ 6489
+ 6490
+ 6491
+ 6492
+ 6493
+ 6494
+ 6495
+ 6496
+ 6497
+ 6498
+ 6499
+ 6500
+ 6501
+ 6502
+ 6503
+ 6504
+ 6505
+ 6506
+ 6507
+ 6508
+ 6509
+ 6510
+ 6511
+ 6512
+ 6513
+ 6514
+ 6515
+ 6516
+ 6517
+ 6518
+ 6519
+ 6520
+ 6521
+ 6522
+ 6523
+ 6524
+ 6525
+ 6526
+ 6527
+ 6528
+ 6529
+ 6530
+ 6531
+ 6532
+ 6533
+ 6534
+ 6535
+ 6536
+ 6537
+ 6538
+ 6539
+ 6540
+ 6541
+ 6542
+ 6543
+ 6544
+ 6545
+ 6546
+ 6547
+ 6548
+ 6549
+ 6550
+ 6551
+ 6552
+ 6553
+ 6554
+ 6555
+ 6556
+ 6557
+ 6558
+ 6559
+ 6560
+ 6561
+ 6562
+ 6563
+ 6564
+ 6565
+ 6566
+ 6567
+ 6568
+ 6569
+ 6570
+ 6571
+ 6572
+ 6573
+ 6574
+ 6575
+ 6576
+ 6577
+ 6578
+ 6579
+ 6580
+ 6581
+ 6582
+ 6583
+ 6584
+ 6585
+ 6586
+ 6587
+ 6588
+ 6589
+ 6590
+ 6591
+ 6592
+ 6593
+ 6594
+ 6595
+ 6596
+ 6597
+ 6598
+ 6599
+ 6600
+ 6601
+ 6602
+ 6603
+ 6604
+ 6605
+ 6606
+ 6607
+ 6608
+ 6609
+ 6610
+ 6611
+ 6612
+ 6613
+ 6614
+ 6615
+ 6616
+ 6617
+ 6618
+ 6619
+ 6620
+ 6621
+ 6622
+ 6623
+ 6624
+ 6625
+ 6626
+ 6627
+ 6628
+ 6629
+ 6630
+ 6631
+ 6632
+ 6633
+ 6634
+ 6635
+ 6636
+ 6637
+ 6638
+ 6639
+ 6640
+ 6641
+ 6642
+ 6643
+ 6644
+ 6645
+ 6646
+ 6647
+ 6648
+ 6649
+ 6650
+ 6651
+ 6652
+ 6653
+ 6654
+ 6655
+ 6656
+ 6657
+ 6658
+ 6659
+ 6660
+ 6661
+ 6662
+ 6663
+ 6664
+ 6665
+ 6666
+ 6667
+ 6668
+ 6669
+ 6670
+ 6671
+ 6672
+ 6673
+ 6674
+ 6675
+ 6676
+ 6677
+ 6678
+ 6679
+ 6680
+ 6681
+ 6682
+ 6683
+ 6684
+ 6685
+ 6686
+ 6687
+ 6688
+ 6689
+ 6690
+ 6691
+ 6692
+ 6693
+ 6694
+ 6695
+ 6696
+ 6697
+ 6698
+ 6699
+ 6700
+ 6701
+ 6702
+ 6703
+ 6704
+ 6705
+ 6706
+ 6707
+ 6708
+ 6709
+ 6710
+ 6711
+ 6712
+ 6713
+ 6714
+ 6715
+ 6716
+ 6717
+ 6718
+ 6719
+ 6720
+ 6721
+ 6722
+ 6723
+ 6724
+ 6725
+ 6726
+ 6727
+ 6728
+ 6729
+ 6730
+ 6731
+ 6732
+ 6733
+ 6734
+ 6735
+ 6736
+ 6737
+ 6738
+ 6739
+ 6740
+ 6741
+ 6742
+ 6743
+ 6744
+ 6745
+ 6746
+ 6747
+ 6748
+ 6749
+ 6750
+ 6751
+ 6752
+ 6753
+ 6754
+ 6755
+ 6756
+ 6757
+ 6758
+ 6759
+ 6760
+ 6761
+ 6762
+ 6763
+ 6764
+ 6765
+ 6766
+ 6767
+ 6768
+ 6769
+ 6770
+ 6771
+ 6772
+ 6773
+ 6774
+ 6775
+ 6776
+ 6777
+ 6778
+ 6779
+ 6780
+ 6781
+ 6782
+ 6783
+ 6784
+ 6785
+ 6786
+ 6787
+ 6788
+ 6789
+ 6790
+ 6791
+ 6792
+ 6793
+ 6794
+ 6795
+ 6796
+ 6797
+ 6798
+ 6799
+ 6800
+ 6801
+ 6802
+ 6803
+ 6804
+ 6805
+ 6806
+ 6807
+ 6808
+ 6809
+ 6810
+ 6811
+ 6812
+ 6813
+ 6814
+ 6815
+ 6816
+ 6817
+ 6818
+ 6819
+ 6820
+ 6821
+ 6822
+ 6823
+ 6824
+ 6825
+ 6826
+ 6827
+ 6828
+ 6829
+ 6830
+ 6831
+ 6832
+ 6833
+ 6834
+ 6835
+ 6836
+ 6837
+ 6838
+ 6839
+ 6840
+ 6841
+ 6842
+ 6843
+ 6844
+ 6845
+ 6846
+ 6847
+ 6848
+ 6849
+ 6850
+ 6851
+ 6852
+ 6853
+ 6854
+ 6855
+ 6856
+ 6857
+ 6858
+ 6859
+ 6860
+ 6861
+ 6862
+ 6863
+ 6864
+ 6865
+ 6866
+ 6867
+ 6868
+ 6869
+ 6870
+ 6871
+ 6872
+ 6873
+ 6874
+ 6875
+ 6876
+ 6877
+ 6878
+ 6879
+ 6880
+ 6881
+ 6882
+ 6883
+ 6884
+ 6885
+ 6886
+ 6887
+ 6888
+ 6889
+ 6890
+ 6891
+ 6892
+ 6893
+ 6894
+ 6895
+ 6896
+ 6897
+ 6898
+ 6899
+ 6900
+ 6901
+ 6902
+ 6903
+ 6904
+ 6905
+ 6906
+ 6907
+ 6908
+ 6909
+ 6910
+ 6911
+ 6912
+ 6913
+ 6914
+ 6915
+ 6916
+ 6917
+ 6918
+ 6919
+ 6920
+ 6921
+ 6922
+ 6923
+ 6924
+ 6925
+ 6926
+ 6927
+ 6928
+ 6929
+ 6930
+ 6931
+ 6932
+ 6933
+ 6934
+ 6935
+ 6936
+ 6937
+ 6938
+ 6939
+ 6940
+ 6941
+ 6942
+ 6943
+ 6944
+ 6945
+ 6946
+ 6947
+ 6948
+ 6949
+ 6950
+ 6951
+ 6952
+ 6953
+ 6954
+ 6955
+ 6956
+ 6957
+ 6958
+ 6959
+ 6960
+ 6961
+ 6962
+ 6963
+ 6964
+ 6965
+ 6966
+ 6967
+ 6968
+ 6969
+ 6970
+ 6971
+ 6972
+ 6973
+ 6974
+ 6975
+ 6976
+ 6977
+ 6978
+ 6979
+ 6980
+ 6981
+ 6982
+ 6983
+ 6984
+ 6985
+ 6986
+ 6987
+ 6988
+ 6989
+ 6990
+ 6991
+ 6992
+ 6993
+ 6994
+ 6995
+ 6996
+ 6997
+ 6998
+ 6999
+ 7000
+ 7001
+ 7002
+ 7003
+ 7004
+ 7005
+ 7006
+ 7007
+ 7008
+ 7009
+ 7010
+ 7011
+ 7012
+ 7013
+ 7014
+ 7015
+ 7016
+ 7017
+ 7018
+ 7019
+ 7020
+ 7021
+ 7022
+ 7023
+ 7024
+ 7025
+ 7026
+ 7027
+ 7028
+ 7029
+ 7030
+ 7031
+ 7032
+ 7033
+ 7034
+ 7035
+ 7036
+ 7037
+ 7038
+ 7039
+ 7040
+ 7041
+ 7042
+ 7043
+ 7044
+ 7045
+ 7046
+ 7047
+ 7048
+ 7049
+ 7050
+ 7051
+ 7052
+ 7053
+ 7054
+ 7055
+ 7056
+ 7057
+ 7058
+ 7059
+ 7060
+ 7061
+ 7062
+ 7063
+ 7064
+ 7065
+ 7066
+ 7067
+ 7068
+ 7069
+ 7070
+ 7071
+ 7072
+ 7073
+ 7074
+ 7075
+ 7076
+ 7077
+ 7078
+ 7079
+ 7080
+ 7081
+ 7082
+ 7083
+ 7084
+ 7085
+ 7086
+ 7087
+ 7088
+ 7089
+ 7090
+ 7091
+ 7092
+ 7093
+ 7094
+ 7095
+ 7096
+ 7097
+ 7098
+ 7099
+ 7100
+ 7101
+ 7102
+ 7103
+ 7104
+ 7105
+ 7106
+ 7107
+ 7108
+ 7109
+ 7110
+ 7111
+ 7112
+ 7113
+ 7114
+ 7115
+ 7116
+ 7117
+ 7118
+ 7119
+ 7120
+ 7121
+ 7122
+ 7123
+ 7124
+ 7125
+ 7126
+ 7127
+ 7128
+ 7129
+ 7130
+ 7131
+ 7132
+ 7133
+ 7134
+ 7135
+ 7136
+ 7137
+ 7138
+ 7139
+ 7140
+ 7141
+ 7142
+ 7143
+ 7144
+ 7145
+ 7146
+ 7147
+ 7148
+ 7149
+ 7150
+ 7151
+ 7152
+ 7153
+ 7154
+ 7155
+ 7156
+ 7157
+ 7158
+ 7159
+ 7160
+ 7161
+ 7162
+ 7163
+ 7164
+ 7165
+ 7166
+ 7167
+ 7168
+ 7169
+ 7170
+ 7171
+ 7172
+ 7173
+ 7174
+ 7175
+ 7176
+ 7177
+ 7178
+ 7179
+ 7180
+ 7181
+ 7182
+ 7183
+ 7184
+ 7185
+ 7186
+ 7187
+ 7188
+ 7189
+ 7190
+ 7191
+ 7192
+ 7193
+ 7194
+ 7195
+ 7196
+ 7197
+ 7198
+ 7199
+ 7200
+ 7201
+ 7202
+ 7203
+ 7204
+ 7205
+ 7206
+ 7207
+ 7208
+ 7209
+ 7210
+ 7211
+ 7212
+ 7213
+ 7214
+ 7215
+ 7216
+ 7217
+ 7218
+ 7219
+ 7220
+ 7221
+ 7222
+ 7223
+ 7224
+ 7225
+ 7226
+ 7227
+ 7228
+ 7229
+ 7230
+ 7231
+ 7232
+ 7233
+ 7234
+ 7235
+ 7236
+ 7237
+ 7238
+ 7239
+ 7240
+ 7241
+ 7242
+ 7243
+ 7244
+ 7245
+ 7246
+ 7247
+ 7248
+ 7249
+ 7250
+ 7251
+ 7252
+ 7253
+ 7254
+ 7255
+ 7256
+ 7257
+ 7258
+ 7259
+ 7260
+ 7261
+ 7262
+ 7263
+ 7264
+ 7265
+ 7266
+ 7267
+ 7268
+ 7269
+ 7270
+ 7271
+ 7272
+ 7273
+ 7274
+ 7275
+ 7276
+ 7277
+ 7278
+ 7279
+ 7280
+ 7281
+ 7282
+ 7283
+ 7284
+ 7285
+ 7286
+ 7287
+ 7288
+ 7289
+ 7290
+ 7291
+ 7292
+ 7293
+ 7294
+ 7295
+ 7296
+ 7297
+ 7298
+ 7299
+ 7300
+ 7301
+ 7302
+ 7303
+ 7304
+ 7305
+ 7306
+ 7307
+ 7308
+ 7309
+ 7310
+ 7311
+ 7312
+ 7313
+ 7314
+ 7315
+ 7316
+ 7317
+ 7318
+ 7319
+ 7320
+ 7321
+ 7322
+ 7323
+ 7324
+ 7325
+ 7326
+ 7327
+ 7328
+ 7329
+ 7330
+ 7331
+ 7332
+ 7333
+ 7334
+ 7335
+ 7336
+ 7337
+ 7338
+ 7339
+ 7340
+ 7341
+ 7342
+ 7343
+ 7344
+ 7345
+ 7346
+ 7347
+ 7348
+ 7349
+ 7350
+ 7351
+ 7352
+ 7353
+ 7354
+ 7355
+ 7356
+ 7357
+ 7358
+ 7359
+ 7360
+ 7361
+ 7362
+ 7363
+ 7364
+ 7365
+ 7366
+ 7367
+ 7368
+ 7369
+ 7370
+ 7371
+ 7372
+ 7373
+ 7374
+ 7375
+ 7376
+ 7377
+ 7378
+ 7379
+ 7380
+ 7381
+ 7382
+ 7383
+ 7384
+ 7385
+ 7386
+ 7387
+ 7388
+ 7389
+ 7390
+ 7391
+ 7392
+ 7393
+ 7394
+ 7395
+ 7396
+ 7397
+ 7398
+ 7399
+ 7400
+ 7401
+ 7402
+ 7403
+ 7404
+ 7405
+ 7406
+ 7407
+ 7408
+ 7409
+ 7410
+ 7411
+ 7412
+ 7413
+ 7414
+ 7415
+ 7416
+ 7417
+ 7418
+ 7419
+ 7420
+ 7421
+ 7422
+ 7423
+ 7424
+ 7425
+ 7426
+ 7427
+ 7428
+ 7429
+ 7430
+ 7431
+ 7432
+ 7433
+ 7434
+ 7435
+ 7436
+ 7437
+ 7438
+ 7439
+ 7440
+ 7441
+ 7442
+ 7443
+ 7444
+ 7445
+ 7446
+ 7447
+ 7448
+ 7449
+ 7450
+ 7451
+ 7452
+ 7453
+ 7454
+ 7455
+ 7456
+ 7457
+ 7458
+ 7459
+ 7460
+ 7461
+ 7462
+ 7463
+ 7464
+ 7465
+ 7466
+ 7467
+ 7468
+ 7469
+ 7470
+ 7471
+ 7472
+ 7473
+ 7474
+ 7475
+ 7476
+ 7477
+ 7478
+ 7479
+ 7480
+ 7481
+ 7482
+ 7483
+ 7484
+ 7485
+ 7486
+ 7487
+ 7488
+ 7489
+ 7490
+ 7491
+ 7492
+ 7493
+ 7494
+ 7495
+ 7496
+ 7497
+ 7498
+ 7499
+ 7500
+ 7501
+ 7502
+ 7503
+ 7504
+ 7505
+ 7506
+ 7507
+ 7508
+ 7509
+ 7510
+ 7511
+ 7512
+ 7513
+ 7514
+ 7515
+ 7516
+ 7517
+ 7518
+ 7519
+ 7520
+ 7521
+ 7522
+ 7523
+ 7524
+ 7525
+ 7526
+ 7527
+ 7528
+ 7529
+ 7530
+ 7531
+ 7532
+ 7533
+ 7534
+ 7535
+ 7536
+ 7537
+ 7538
+ 7539
+ 7540
+ 7541
+ 7542
+ 7543
+ 7544
+ 7545
+ 7546
+ 7547
+ 7548
+ 7549
+ 7550
+ 7551
+ 7552
+ 7553
+ 7554
+ 7555
+ 7556
+ 7557
+ 7558
+ 7559
+ 7560
+ 7561
+ 7562
+ 7563
+ 7564
+ 7565
+ 7566
+ 7567
+ 7568
+ 7569
+ 7570
+ 7571
+ 7572
+ 7573
+ 7574
+ 7575
+ 7576
+ 7577
+ 7578
+ 7579
+ 7580
+ 7581
+ 7582
+ 7583
+ 7584
+ 7585
+ 7586
+ 7587
+ 7588
+ 7589
+ 7590
+ 7591
+ 7592
+ 7593
+ 7594
+ 7595
+ 7596
+ 7597
+ 7598
+ 7599
+ 7600
+ 7601
+ 7602
+ 7603
+ 7604
+ 7605
+ 7606
+ 7607
+ 7608
+ 7609
+ 7610
+ 7611
+ 7612
+ 7613
+ 7614
+ 7615
+ 7616
+ 7617
+ 7618
+ 7619
+ 7620
+ 7621
+ 7622
+ 7623
+ 7624
+ 7625
+ 7626
+ 7627
+ 7628
+ 7629
+ 7630
+ 7631
+ 7632
+ 7633
+ 7634
+ 7635
+ 7636
+ 7637
+ 7638
+ 7639
+ 7640
+ 7641
+ 7642
+ 7643
+ 7644
+ 7645
+ 7646
+ 7647
+ 7648
+ 7649
+ 7650
+ 7651
+ 7652
+ 7653
+ 7654
+ 7655
+ 7656
+ 7657
+ 7658
+ 7659
+ 7660
+ 7661
+ 7662
+ 7663
+ 7664
+ 7665
+ 7666
+ 7667
+ 7668
+ 7669
+ 7670
+ 7671
+ 7672
+ 7673
+ 7674
+ 7675
+ 7676
+ 7677
+ 7678
+ 7679
+ 7680
+ 7681
+ 7682
+ 7683
+ 7684
+ 7685
+ 7686
+ 7687
+ 7688
+ 7689
+ 7690
+ 7691
+ 7692
+ 7693
+ 7694
+ 7695
+ 7696
+ 7697
+ 7698
+ 7699
+ 7700
+ 7701
+ 7702
+ 7703
+ 7704
+ 7705
+ 7706
+ 7707
+ 7708
+ 7709
+ 7710
+ 7711
+ 7712
+ 7713
+ 7714
+ 7715
+ 7716
+ 7717
+ 7718
+ 7719
+ 7720
+ 7721
+ 7722
+ 7723
+ 7724
+ 7725
+ 7726
+ 7727
+ 7728
+ 7729
+ 7730
+ 7731
+ 7732
+ 7733
+ 7734
+ 7735
+ 7736
+ 7737
+ 7738
+ 7739
+ 7740
+ 7741
+ 7742
+ 7743
+ 7744
+ 7745
+ 7746
+ 7747
+ 7748
+ 7749
+ 7750
+ 7751
+ 7752
+ 7753
+ 7754
+ 7755
+ 7756
+ 7757
+ 7758
+ 7759
+ 7760
+ 7761
+ 7762
+ 7763
+ 7764
+ 7765
+ 7766
+ 7767
+ 7768
+ 7769
+ 7770
+ 7771
+ 7772
+ 7773
+ 7774
+ 7775
+ 7776
+ 7777
+ 7778
+ 7779
+ 7780
+ 7781
+ 7782
+ 7783
+ 7784
+ 7785
+ 7786
+ 7787
+ 7788
+ 7789
+ 7790
+ 7791
+ 7792
+ 7793
+ 7794
+ 7795
+ 7796
+ 7797
+ 7798
+ 7799
+ 7800
+ 7801
+ 7802
+ 7803
+ 7804
+ 7805
+ 7806
+ 7807
+ 7808
+ 7809
+ 7810
+ 7811
+ 7812
+ 7813
+ 7814
+ 7815
+ 7816
+ 7817
+ 7818
+ 7819
+ 7820
+ 7821
+ 7822
+ 7823
+ 7824
+ 7825
+ 7826
+ 7827
+ 7828
+ 7829
+ 7830
+ 7831
+ 7832
+ 7833
+ 7834
+ 7835
+ 7836
+ 7837
+ 7838
+ 7839
+ 7840
+ 7841
+ 7842
+ 7843
+ 7844
+ 7845
+ 7846
+ 7847
+ 7848
+ 7849
+ 7850
+ 7851
+ 7852
+ 7853
+ 7854
+ 7855
+ 7856
+ 7857
+ 7858
+ 7859
+ 7860
+ 7861
+ 7862
+ 7863
+ 7864
+ 7865
+ 7866
+ 7867
+ 7868
+ 7869
+ 7870
+ 7871
+ 7872
+ 7873
+ 7874
+ 7875
+ 7876
+ 7877
+ 7878
+ 7879
+ 7880
+ 7881
+ 7882
+ 7883
+ 7884
+ 7885
+ 7886
+ 7887
+ 7888
+ 7889
+ 7890
+ 7891
+ 7892
+ 7893
+ 7894
+ 7895
+ 7896
+ 7897
+ 7898
+ 7899
+ 7900
+ 7901
+ 7902
+ 7903
+ 7904
+ 7905
+ 7906
+ 7907
+ 7908
+ 7909
+ 7910
+ 7911
+ 7912
+ 7913
+ 7914
+ 7915
+ 7916
+ 7917
+ 7918
+ 7919
+ 7920
+ 7921
+ 7922
+ 7923
+ 7924
+ 7925
+ 7926
+ 7927
+ 7928
+ 7929
+ 7930
+ 7931
+ 7932
+ 7933
+ 7934
+ 7935
+ 7936
+ 7937
+ 7938
+ 7939
+ 7940
+ 7941
+ 7942
+ 7943
+ 7944
+ 7945
+ 7946
+ 7947
+ 7948
+ 7949
+ 7950
+ 7951
+ 7952
+ 7953
+ 7954
+ 7955
+ 7956
+ 7957
+ 7958
+ 7959
+ 7960
+ 7961
+ 7962
+ 7963
+ 7964
+ 7965
+ 7966
+ 7967
+ 7968
+ 7969
+ 7970
+ 7971
+ 7972
+ 7973
+ 7974
+ 7975
+ 7976
+ 7977
+ 7978
+ 7979
+ 7980
+ 7981
+ 7982
+ 7983
+ 7984
+ 7985
+ 7986
+ 7987
+ 7988
+ 7989
+ 7990
+ 7991
+ 7992
+ 7993
+ 7994
+ 7995
+ 7996
+ 7997
+ 7998
+ 7999
+ 8000
+ 8001
+ 8002
+ 8003
+ 8004
+ 8005
+ 8006
+ 8007
+ 8008
+ 8009
+ 8010
+ 8011
+ 8012
+ 8013
+ 8014
+ 8015
+ 8016
+ 8017
+ 8018
+ 8019
+ 8020
+ 8021
+ 8022
+ 8023
+ 8024
+ 8025
+ 8026
+ 8027
+ 8028
+ 8029
+ 8030
+ 8031
+ 8032
+ 8033
+ 8034
+ 8035
+ 8036
+ 8037
+ 8038
+ 8039
+ 8040
+ 8041
+ 8042
+ 8043
+ 8044
+ 8045
+ 8046
+ 8047
+ 8048
+ 8049
+ 8050
+ 8051
+ 8052
+ 8053
+ 8054
+ 8055
+ 8056
+ 8057
+ 8058
+ 8059
+ 8060
+ 8061
+ 8062
+ 8063
+ 8064
+ 8065
+ 8066
+ 8067
+ 8068
+ 8069
+ 8070
+ 8071
+ 8072
+ 8073
+ 8074
+ 8075
+ 8076
+ 8077
+ 8078
+ 8079
+ 8080
+ 8081
+ 8082
+ 8083
+ 8084
+ 8085
+ 8086
+ 8087
+ 8088
+ 8089
+ 8090
+ 8091
+ 8092
+ 8093
+ 8094
+ 8095
+ 8096
+ 8097
+ 8098
+ 8099
+ 8100
+ 8101
+ 8102
+ 8103
+ 8104
+ 8105
+ 8106
+ 8107
+ 8108
+ 8109
+ 8110
+ 8111
+ 8112
+ 8113
+ 8114
+ 8115
+ 8116
+ 8117
+ 8118
+ 8119
+ 8120
+ 8121
+ 8122
+ 8123
+ 8124
+ 8125
+ 8126
+ 8127
+ 8128
+ 8129
+ 8130
+ 8131
+ 8132
+ 8133
+ 8134
+ 8135
+ 8136
+ 8137
+ 8138
+ 8139
+ 8140
+ 8141
+ 8142
+ 8143
+ 8144
+ 8145
+ 8146
+ 8147
+ 8148
+ 8149
+ 8150
+ 8151
+ 8152
+ 8153
+ 8154
+ 8155
+ 8156
+ 8157
+ 8158
+ 8159
+ 8160
+ 8161
+ 8162
+ 8163
+ 8164
+ 8165
+ 8166
+ 8167
+ 8168
+ 8169
+ 8170
+ 8171
+ 8172
+ 8173
+ 8174
+ 8175
+ 8176
+ 8177
+ 8178
+ 8179
+ 8180
+ 8181
+ 8182
+ 8183
+ 8184
+ 8185
+ 8186
+ 8187
+ 8188
+ 8189
+ 8190
+ 8191
+ 8192
+ 8193
+ 8194
+ 8195
+ 8196
+ 8197
+ 8198
+ 8199
+ 8200
+ 8201
+ 8202
+ 8203
+ 8204
+ 8205
+ 8206
+ 8207
+ 8208
+ 8209
+ 8210
+ 8211
+ 8212
+ 8213
+ 8214
+ 8215
+ 8216
+ 8217
+ 8218
+ 8219
+ 8220
+ 8221
+ 8222
+ 8223
+ 8224
+ 8225
+ 8226
+ 8227
+ 8228
+ 8229
+ 8230
+ 8231
+ 8232
+ 8233
+ 8234
+ 8235
+ 8236
+ 8237
+ 8238
+ 8239
+ 8240
+ 8241
+ 8242
+ 8243
+ 8244
+ 8245
+ 8246
+ 8247
+ 8248
+ 8249
+ 8250
+ 8251
+ 8252
+ 8253
+ 8254
+ 8255
+ 8256
+ 8257
+ 8258
+ 8259
+ 8260
+ 8261
+ 8262
+ 8263
+ 8264
+ 8265
+ 8266
+ 8267
+ 8268
+ 8269
+ 8270
+ 8271
+ 8272
+ 8273
+ 8274
+ 8275
+ 8276
+ 8277
+ 8278
+ 8279
+ 8280
+ 8281
+ 8282
+ 8283
+ 8284
+ 8285
+ 8286
+ 8287
+ 8288
+ 8289
+ 8290
+ 8291
+ 8292
+ 8293
+ 8294
+ 8295
+ 8296
+ 8297
+ 8298
+ 8299
+ 8300
+ 8301
+ 8302
+ 8303
+ 8304
+ 8305
+ 8306
+ 8307
+ 8308
+ 8309
+ 8310
+ 8311
+ 8312
+ 8313
+ 8314
+ 8315
+ 8316
+ 8317
+ 8318
+ 8319
+ 8320
+ 8321
+ 8322
+ 8323
+ 8324
+ 8325
+ 8326
+ 8327
+ 8328
+ 8329
+ 8330
+ 8331
+ 8332
+ 8333
+ 8334
+ 8335
+ 8336
+ 8337
+ 8338
+ 8339
+ 8340
+ 8341
+ 8342
+ 8343
+ 8344
+ 8345
+ 8346
+ 8347
+ 8348
+ 8349
+ 8350
+ 8351
+ 8352
+ 8353
+ 8354
+ 8355
+ 8356
+ 8357
+ 8358
+ 8359
+ 8360
+ 8361
+ 8362
+ 8363
+ 8364
+ 8365
+ 8366
+ 8367
+ 8368
+ 8369
+ 8370
+ 8371
+ 8372
+ 8373
+ 8374
+ 8375
+ 8376
+ 8377
+ 8378
+ 8379
+ 8380
+ 8381
+ 8382
+ 8383
+ 8384
+ 8385
+ 8386
+ 8387
+ 8388
+ 8389
+ 8390
+ 8391
+ 8392
+ 8393
+ 8394
+ 8395
+ 8396
+ 8397
+ 8398
+ 8399
+ 8400
+ 8401
+ 8402
+ 8403
+ 8404
+ 8405
+ 8406
+ 8407
+ 8408
+ 8409
+ 8410
+ 8411
+ 8412
+ 8413
+ 8414
+ 8415
+ 8416
+ 8417
+ 8418
+ 8419
+ 8420
+ 8421
+ 8422
+ 8423
+ 8424
+ 8425
+ 8426
+ 8427
+ 8428
+ 8429
+ 8430
+ 8431
+ 8432
+ 8433
+ 8434
+ 8435
+ 8436
+ 8437
+ 8438
+ 8439
+ 8440
+ 8441
+ 8442
+ 8443
+ 8444
+ 8445
+ 8446
+ 8447
+ 8448
+ 8449
+ 8450
+ 8451
+ 8452
+ 8453
+ 8454
+ 8455
+ 8456
+ 8457
+ 8458
+ 8459
+ 8460
+ 8461
+ 8462
+ 8463
+ 8464
+ 8465
+ 8466
+ 8467
+ 8468
+ 8469
+ 8470
+ 8471
+ 8472
+ 8473
+ 8474
+ 8475
+ 8476
+ 8477
+ 8478
+ 8479
+ 8480
+ 8481
+ 8482
+ 8483
+ 8484
+ 8485
+ 8486
+ 8487
+ 8488
+ 8489
+ 8490
+ 8491
+ 8492
+ 8493
+ 8494
+ 8495
+ 8496
+ 8497
+ 8498
+ 8499
+ 8500
+ 8501
+ 8502
+ 8503
+ 8504
+ 8505
+ 8506
+ 8507
+ 8508
+ 8509
+ 8510
+ 8511
+ 8512
+ 8513
+ 8514
+ 8515
+ 8516
+ 8517
+ 8518
+ 8519
+ 8520
+ 8521
+ 8522
+ 8523
+ 8524
+ 8525
+ 8526
+ 8527
+ 8528
+ 8529
+ 8530
+ 8531
+ 8532
+ 8533
+ 8534
+ 8535
+ 8536
+ 8537
+ 8538
+ 8539
+ 8540
+ 8541
+ 8542
+ 8543
+ 8544
+ 8545
+ 8546
+ 8547
+ 8548
+ 8549
+ 8550
+ 8551
+ 8552
+ 8553
+ 8554
+ 8555
+ 8556
+ 8557
+ 8558
+ 8559
+ 8560
+ 8561
+ 8562
+ 8563
+ 8564
+ 8565
+ 8566
+ 8567
+ 8568
+ 8569
+ 8570
+ 8571
+ 8572
+ 8573
+ 8574
+ 8575
+ 8576
+ 8577
+ 8578
+ 8579
+ 8580
+ 8581
+ 8582
+ 8583
+ 8584
+ 8585
+ 8586
+ 8587
+ 8588
+ 8589
+ 8590
+ 8591
+ 8592
+ 8593
+ 8594
+ 8595
+ 8596
+ 8597
+ 8598
+ 8599
+ 8600
+ 8601
+ 8602
+ 8603
+ 8604
+ 8605
+ 8606
+ 8607
+ 8608
+ 8609
+ 8610
+ 8611
+ 8612
+ 8613
+ 8614
+ 8615
+ 8616
+ 8617
+ 8618
+ 8619
+ 8620
+ 8621
+ 8622
+ 8623
+ 8624
+ 8625
+ 8626
+ 8627
+ 8628
+ 8629
+ 8630
+ 8631
+ 8632
+ 8633
+ 8634
+ 8635
+ 8636
+ 8637
+ 8638
+ 8639
+ 8640
+ 8641
+ 8642
+ 8643
+ 8644
+ 8645
+ 8646
+ 8647
+ 8648
+ 8649
+ 8650
+ 8651
+ 8652
+ 8653
+ 8654
+ 8655
+ 8656
+ 8657
+ 8658
+ 8659
+ 8660
+ 8661
+ 8662
+ 8663
+ 8664
+ 8665
+ 8666
+ 8667
+ 8668
+ 8669
+ 8670
+ 8671
+ 8672
+ 8673
+ 8674
+ 8675
+ 8676
+ 8677
+ 8678
+ 8679
+ 8680
+ 8681
+ 8682
+ 8683
+ 8684
+ 8685
+ 8686
+ 8687
+ 8688
+ 8689
+ 8690
+ 8691
+ 8692
+ 8693
+ 8694
+ 8695
+ 8696
+ 8697
+ 8698
+ 8699
+ 8700
+ 8701
+ 8702
+ 8703
+ 8704
+ 8705
+ 8706
+ 8707
+ 8708
+ 8709
+ 8710
+ 8711
+ 8712
+ 8713
+ 8714
+ 8715
+ 8716
+ 8717
+ 8718
+ 8719
+ 8720
+ 8721
+ 8722
+ 8723
+ 8724
+ 8725
+ 8726
+ 8727
+ 8728
+ 8729
+ 8730
+ 8731
+ 8732
+ 8733
+ 8734
+ 8735
+ 8736
+ 8737
+ 8738
+ 8739
+ 8740
+ 8741
+ 8742
+ 8743
+ 8744
+ 8745
+ 8746
+ 8747
+ 8748
+ 8749
+ 8750
+ 8751
+ 8752
+ 8753
+ 8754
+ 8755
+ 8756
+ 8757
+ 8758
+ 8759
+ 8760
+ 8761
+ 8762
+ 8763
+ 8764
+ 8765
+ 8766
+ 8767
+ 8768
+ 8769
+ 8770
+ 8771
+ 8772
+ 8773
+ 8774
+ 8775
+ 8776
+ 8777
+ 8778
+ 8779
+ 8780
+ 8781
+ 8782
+ 8783
+ 8784
+ 8785
+ 8786
+ 8787
+ 8788
+ 8789
+ 8790
+ 8791
+ 8792
+ 8793
+ 8794
+ 8795
+ 8796
+ 8797
+ 8798
+ 8799
+ 8800
+ 8801
+ 8802
+ 8803
+ 8804
+ 8805
+ 8806
+ 8807
+ 8808
+ 8809
+ 8810
+ 8811
+ 8812
+ 8813
+ 8814
+ 8815
+ 8816
+ 8817
+ 8818
+ 8819
+ 8820
+ 8821
+ 8822
+ 8823
+ 8824
+ 8825
+ 8826
+ 8827
+ 8828
+ 8829
+ 8830
+ 8831
+ 8832
+ 8833
+ 8834
+ 8835
+ 8836
+ 8837
+ 8838
+ 8839
+ 8840
+ 8841
+ 8842
+ 8843
+ 8844
+ 8845
+ 8846
+ 8847
+ 8848
+ 8849
+ 8850
+ 8851
+ 8852
+ 8853
+ 8854
+ 8855
+ 8856
+ 8857
+ 8858
+ 8859
+ 8860
+ 8861
+ 8862
+ 8863
+ 8864
+ 8865
+ 8866
+ 8867
+ 8868
+ 8869
+ 8870
+ 8871
+ 8872
+ 8873
+ 8874
+ 8875
+ 8876
+ 8877
+ 8878
+ 8879
+ 8880
+ 8881
+ 8882
+ 8883
+ 8884
+ 8885
+ 8886
+ 8887
+ 8888
+ 8889
+ 8890
+ 8891
+ 8892
+ 8893
+ 8894
+ 8895
+ 8896
+ 8897
+ 8898
+ 8899
+ 8900
+ 8901
+ 8902
+ 8903
+ 8904
+ 8905
+ 8906
+ 8907
+ 8908
+ 8909
+ 8910
+ 8911
+ 8912
+ 8913
+ 8914
+ 8915
+ 8916
+ 8917
+ 8918
+ 8919
+ 8920
+ 8921
+ 8922
+ 8923
+ 8924
+ 8925
+ 8926
+ 8927
+ 8928
+ 8929
+ 8930
+ 8931
+ 8932
+ 8933
+ 8934
+ 8935
+ 8936
+ 8937
+ 8938
+ 8939
+ 8940
+ 8941
+ 8942
+ 8943
+ 8944
+ 8945
+ 8946
+ 8947
+ 8948
+ 8949
+ 8950
+ 8951
+ 8952
+ 8953
+ 8954
+ 8955
+ 8956
+ 8957
+ 8958
+ 8959
+ 8960
+ 8961
+ 8962
+ 8963
+ 8964
+ 8965
+ 8966
+ 8967
+ 8968
+ 8969
+ 8970
+ 8971
+ 8972
+ 8973
+ 8974
+ 8975
+ 8976
+ 8977
+ 8978
+ 8979
+ 8980
+ 8981
+ 8982
+ 8983
+ 8984
+ 8985
+ 8986
+ 8987
+ 8988
+ 8989
+ 8990
+ 8991
+ 8992
+ 8993
+ 8994
+ 8995
+ 8996
+ 8997
+ 8998
+ 8999
+ 9000
+ 9001
+ 9002
+ 9003
+ 9004
+ 9005
+ 9006
+ 9007
+ 9008
+ 9009
+ 9010
+ 9011
+ 9012
+ 9013
+ 9014
+ 9015
+ 9016
+ 9017
+ 9018
+ 9019
+ 9020
+ 9021
+ 9022
+ 9023
+ 9024
+ 9025
+ 9026
+ 9027
+ 9028
+ 9029
+ 9030
+ 9031
+ 9032
+ 9033
+ 9034
+ 9035
+ 9036
+ 9037
+ 9038
+ 9039
+ 9040
+ 9041
+ 9042
+ 9043
+ 9044
+ 9045
+ 9046
+ 9047
+ 9048
+ 9049
+ 9050
+ 9051
+ 9052
+ 9053
+ 9054
+ 9055
+ 9056
+ 9057
+ 9058
+ 9059
+ 9060
+ 9061
+ 9062
+ 9063
+ 9064
+ 9065
+ 9066
+ 9067
+ 9068
+ 9069
+ 9070
+ 9071
+ 9072
+ 9073
+ 9074
+ 9075
+ 9076
+ 9077
+ 9078
+ 9079
+ 9080
+ 9081
+ 9082
+ 9083
+ 9084
+ 9085
+ 9086
+ 9087
+ 9088
+ 9089
+ 9090
+ 9091
+ 9092
+ 9093
+ 9094
+ 9095
+ 9096
+ 9097
+ 9098
+ 9099
+ 9100
+ 9101
+ 9102
+ 9103
+ 9104
+ 9105
+ 9106
+ 9107
+ 9108
+ 9109
+ 9110
+ 9111
+ 9112
+ 9113
+ 9114
+ 9115
+ 9116
+ 9117
+ 9118
+ 9119
+ 9120
+ 9121
+ 9122
+ 9123
+ 9124
+ 9125
+ 9126
+ 9127
+ 9128
+ 9129
+ 9130
+ 9131
+ 9132
+ 9133
+ 9134
+ 9135
+ 9136
+ 9137
+ 9138
+ 9139
+ 9140
+ 9141
+ 9142
+ 9143
+ 9144
+ 9145
+ 9146
+ 9147
+ 9148
+ 9149
+ 9150
+ 9151
+ 9152
+ 9153
+ 9154
+ 9155
+ 9156
+ 9157
+ 9158
+ 9159
+ 9160
+ 9161
+ 9162
+ 9163
+ 9164
+ 9165
+ 9166
+ 9167
+ 9168
+ 9169
+ 9170
+ 9171
+ 9172
+ 9173
+ 9174
+ 9175
+ 9176
+ 9177
+ 9178
+ 9179
+ 9180
+ 9181
+ 9182
+ 9183
+ 9184
+ 9185
+ 9186
+ 9187
+ 9188
+ 9189
+ 9190
+ 9191
+ 9192
+ 9193
+ 9194
+ 9195
+ 9196
+ 9197
+ 9198
+ 9199
+ 9200
+ 9201
+ 9202
+ 9203
+ 9204
+ 9205
+ 9206
+ 9207
+ 9208
+ 9209
+ 9210
+ 9211
+ 9212
+ 9213
+ 9214
+ 9215
+ 9216
+ 9217
+ 9218
+ 9219
+ 9220
+ 9221
+ 9222
+ 9223
+ 9224
+ 9225
+ 9226
+ 9227
+ 9228
+ 9229
+ 9230
+ 9231
+ 9232
+ 9233
+ 9234
+ 9235
+ 9236
+ 9237
+ 9238
+ 9239
+ 9240
+ 9241
+ 9242
+ 9243
+ 9244
+ 9245
+ 9246
+ 9247
+ 9248
+ 9249
+ 9250
+ 9251
+ 9252
+ 9253
+ 9254
+ 9255
+ 9256
+ 9257
+ 9258
+ 9259
+ 9260
+ 9261
+ 9262
+ 9263
+ 9264
+ 9265
+ 9266
+ 9267
+ 9268
+ 9269
+ 9270
+ 9271
+ 9272
+ 9273
+ 9274
+ 9275
+ 9276
+ 9277
+ 9278
+ 9279
+ 9280
+ 9281
+ 9282
+ 9283
+ 9284
+ 9285
+ 9286
+ 9287
+ 9288
+ 9289
+ 9290
+ 9291
+ 9292
+ 9293
+ 9294
+ 9295
+ 9296
+ 9297
+ 9298
+ 9299
+ 9300
+ 9301
+ 9302
+ 9303
+ 9304
+ 9305
+ 9306
+ 9307
+ 9308
+ 9309
+ 9310
+ 9311
+ 9312
+ 9313
+ 9314
+ 9315
+ 9316
+ 9317
+ 9318
+ 9319
+ 9320
+ 9321
+ 9322
+ 9323
+ 9324
+ 9325
+ 9326
+ 9327
+ 9328
+ 9329
+ 9330
+ 9331
+ 9332
+ 9333
+ 9334
+ 9335
+ 9336
+ 9337
+ 9338
+ 9339
+ 9340
+ 9341
+ 9342
+ 9343
+ 9344
+ 9345
+ 9346
+ 9347
+ 9348
+ 9349
+ 9350
+ 9351
+ 9352
+ 9353
+ 9354
+ 9355
+ 9356
+ 9357
+ 9358
+ 9359
+ 9360
+ 9361
+ 9362
+ 9363
+ 9364
+ 9365
+ 9366
+ 9367
+ 9368
+ 9369
+ 9370
+ 9371
+ 9372
+ 9373
+ 9374
+ 9375
+ 9376
+ 9377
+ 9378
+ 9379
+ 9380
+ 9381
+ 9382
+ 9383
+ 9384
+ 9385
+ 9386
+ 9387
+ 9388
+ 9389
+ 9390
+ 9391
+ 9392
+ 9393
+ 9394
+ 9395
+ 9396
+ 9397
+ 9398
+ 9399
+ 9400
+ 9401
+ 9402
+ 9403
+ 9404
+ 9405
+ 9406
+ 9407
+ 9408
+ 9409
+ 9410
+ 9411
+ 9412
+ 9413
+ 9414
+ 9415
+ 9416
+ 9417
+ 9418
+ 9419
+ 9420
+ 9421
+ 9422
+ 9423
+ 9424
+ 9425
+ 9426
+ 9427
+ 9428
+ 9429
+ 9430
+ 9431
+ 9432
+ 9433
+ 9434
+ 9435
+ 9436
+ 9437
+ 9438
+ 9439
+ 9440
+ 9441
+ 9442
+ 9443
+ 9444
+ 9445
+ 9446
+ 9447
+ 9448
+ 9449
+ 9450
+ 9451
+ 9452
+ 9453
+ 9454
+ 9455
+ 9456
+ 9457
+ 9458
+ 9459
+ 9460
+ 9461
+ 9462
+ 9463
+ 9464
+ 9465
+ 9466
+ 9467
+ 9468
+ 9469
+ 9470
+ 9471
+ 9472
+ 9473
+ 9474
+ 9475
+ 9476
+ 9477
+ 9478
+ 9479
+ 9480
+ 9481
+ 9482
+ 9483
+ 9484
+ 9485
+ 9486
+ 9487
+ 9488
+ 9489
+ 9490
+ 9491
+ 9492
+ 9493
+ 9494
+ 9495
+ 9496
+ 9497
+ 9498
+ 9499
+ 9500
+ 9501
+ 9502
+ 9503
+ 9504
+ 9505
+ 9506
+ 9507
+ 9508
+ 9509
+ 9510
+ 9511
+ 9512
+ 9513
+ 9514
+ 9515
+ 9516
+ 9517
+ 9518
+ 9519
+ 9520
+ 9521
+ 9522
+ 9523
+ 9524
+ 9525
+ 9526
+ 9527
+ 9528
+ 9529
+ 9530
+ 9531
+ 9532
+ 9533
+ 9534
+ 9535
+ 9536
+ 9537
+ 9538
+ 9539
+ 9540
+ 9541
+ 9542
+ 9543
+ 9544
+ 9545
+ 9546
+ 9547
+ 9548
+ 9549
+ 9550
+ 9551
+ 9552
+ 9553
+ 9554
+ 9555
+ 9556
+ 9557
+ 9558
+ 9559
+ 9560
+ 9561
+ 9562
+ 9563
+ 9564
+ 9565
+ 9566
+ 9567
+ 9568
+ 9569
+ 9570
+ 9571
+ 9572
+ 9573
+ 9574
+ 9575
+ 9576
+ 9577
+ 9578
+ 9579
+ 9580
+ 9581
+ 9582
+ 9583
+ 9584
+ 9585
+ 9586
+ 9587
+ 9588
+ 9589
+ 9590
+ 9591
+ 9592
+ 9593
+ 9594
+ 9595
+ 9596
+ 9597
+ 9598
+ 9599
+ 9600
+ 9601
+ 9602
+ 9603
+ 9604
+ 9605
+ 9606
+ 9607
+ 9608
+ 9609
+ 9610
+ 9611
+ 9612
+ 9613
+ 9614
+ 9615
+ 9616
+ 9617
+ 9618
+ 9619
+ 9620
+ 9621
+ 9622
+ 9623
+ 9624
+ 9625
+ 9626
+ 9627
+ 9628
+ 9629
+ 9630
+ 9631
+ 9632
+ 9633
+ 9634
+ 9635
+ 9636
+ 9637
+ 9638
+ 9639
+ 9640
+ 9641
+ 9642
+ 9643
+ 9644
+ 9645
+ 9646
+ 9647
+ 9648
+ 9649
+ 9650
+ 9651
+ 9652
+ 9653
+ 9654
+ 9655
+ 9656
+ 9657
+ 9658
+ 9659
+ 9660
+ 9661
+ 9662
+ 9663
+ 9664
+ 9665
+ 9666
+ 9667
+ 9668
+ 9669
+ 9670
+ 9671
+ 9672
+ 9673
+ 9674
+ 9675
+ 9676
+ 9677
+ 9678
+ 9679
+ 9680
+ 9681
+ 9682
+ 9683
+ 9684
+ 9685
+ 9686
+ 9687
+ 9688
+ 9689
+ 9690
+ 9691
+ 9692
+ 9693
+ 9694
+ 9695
+ 9696
+ 9697
+ 9698
+ 9699
+ 9700
+ 9701
+ 9702
+ 9703
+ 9704
+ 9705
+ 9706
+ 9707
+ 9708
+ 9709
+ 9710
+ 9711
+ 9712
+ 9713
+ 9714
+ 9715
+ 9716
+ 9717
+ 9718
+ 9719
+ 9720
+ 9721
+ 9722
+ 9723
+ 9724
+ 9725
+ 9726
+ 9727
+ 9728
+ 9729
+ 9730
+ 9731
+ 9732
+ 9733
+ 9734
+ 9735
+ 9736
+ 9737
+ 9738
+ 9739
+ 9740
+ 9741
+ 9742
+ 9743
+ 9744
+ 9745
+ 9746
+ 9747
+ 9748
+ 9749
+ 9750
+ 9751
+ 9752
+ 9753
+ 9754
+ 9755
+ 9756
+ 9757
+ 9758
+ 9759
+ 9760
+ 9761
+ 9762
+ 9763
+ 9764
+ 9765
+ 9766
+ 9767
+ 9768
+ 9769
+ 9770
+ 9771
+ 9772
+ 9773
+ 9774
+ 9775
+ 9776
+ 9777
+ 9778
+ 9779
+ 9780
+ 9781
+ 9782
+ 9783
+ 9784
+ 9785
+ 9786
+ 9787
+ 9788
+ 9789
+ 9790
+ 9791
+ 9792
+ 9793
+ 9794
+ 9795
+ 9796
+ 9797
+ 9798
+ 9799
+ 9800
+ 9801
+ 9802
+ 9803
+ 9804
+ 9805
+ 9806
+ 9807
+ 9808
+ 9809
+ 9810
+ 9811
+ 9812
+ 9813
+ 9814
+ 9815
+ 9816
+ 9817
+ 9818
+ 9819
+ 9820
+ 9821
+ 9822
+ 9823
+ 9824
+ 9825
+ 9826
+ 9827
+ 9828
+ 9829
+ 9830
+ 9831
+ 9832
+ 9833
+ 9834
+ 9835
+ 9836
+ 9837
+ 9838
+ 9839
+ 9840
+ 9841
+ 9842
+ 9843
+ 9844
+ 9845
+ 9846
+ 9847
+ 9848
+ 9849
+ 9850
+ 9851
+ 9852
+ 9853
+ 9854
+ 9855
+ 9856
+ 9857
+ 9858
+ 9859
+ 9860
+ 9861
+ 9862
+ 9863
+ 9864
+ 9865
+ 9866
+ 9867
+ 9868
+ 9869
+ 9870
+ 9871
+ 9872
+ 9873
+ 9874
+ 9875
+ 9876
+ 9877
+ 9878
+ 9879
+ 9880
+ 9881
+ 9882
+ 9883
+ 9884
+ 9885
+ 9886
+ 9887
+ 9888
+ 9889
+ 9890
+ 9891
+ 9892
+ 9893
+ 9894
+ 9895
+ 9896
+ 9897
+ 9898
+ 9899
+ 9900
+ 9901
+ 9902
+ 9903
+ 9904
+ 9905
+ 9906
+ 9907
+ 9908
+ 9909
+ 9910
+ 9911
+ 9912
+ 9913
+ 9914
+ 9915
+ 9916
+ 9917
+ 9918
+ 9919
+ 9920
+ 9921
+ 9922
+ 9923
+ 9924
+ 9925
+ 9926
+ 9927
+ 9928
+ 9929
+ 9930
+ 9931
+ 9932
+ 9933
+ 9934
+ 9935
+ 9936
+ 9937
+ 9938
+ 9939
+ 9940
+ 9941
+ 9942
+ 9943
+ 9944
+ 9945
+ 9946
+ 9947
+ 9948
+ 9949
+ 9950
+ 9951
+ 9952
+ 9953
+ 9954
+ 9955
+ 9956
+ 9957
+ 9958
+ 9959
+ 9960
+ 9961
+ 9962
+ 9963
+ 9964
+ 9965
+ 9966
+ 9967
+ 9968
+ 9969
+ 9970
+ 9971
+ 9972
+ 9973
+ 9974
+ 9975
+ 9976
+ 9977
+ 9978
+ 9979
+ 9980
+ 9981
+ 9982
+ 9983
+ 9984
+ 9985
+ 9986
+ 9987
+ 9988
+ 9989
+ 9990
+ 9991
+ 9992
+ 9993
+ 9994
+ 9995
+ 9996
+ 9997
+ 9998
+ 9999
+10000
+10001
+10002
+10003
+10004
+10005
+10006
+10007
+10008
+10009
+10010
+10011
+10012
+10013
+10014
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
+10032
+10033
+10034
+10035
+10036
+10037
+10038
+10039
+10040
+10041
+10042
+10043
+10044
+10045
+10046
+10047
+10048
+10049
+10050
+10051
+10052
+10053
+10054
+10055
+10056
+10057
+10058
+10059
+10060
+10061
+10062
+10063
+10064
+10065
+10066
+10067
+10068
+10069
+10070
+10071
+10072
+10073
+10074
+10075
+10076
+10077
+10078
+10079
+10080
+10081
+10082
+10083
+10084
+10085
+10086
+10087
+10088
+10089
+10090
+10091
+10092
+10093
+10094
+10095
+10096
+10097
+10098
+10099
+10100
+10101
+10102
+10103
+10104
+10105
+10106
+10107
+10108
+10109
+10110
+10111
+10112
+10113
+10114
+10115
+10116
+10117
+10118
+10119
+10120
+10121
+10122
+10123
+10124
+10125
+10126
+10127
+10128
+10129
+10130
+10131
+10132
+10133
+10134
+10135
+10136
+10137
+10138
+10139
+10140
+10141
+10142
+10143
+10144
+10145
+10146
+10147
+10148
+10149
+10150
+10151
+10152
+10153
+10154
+10155
+10156
+10157
+10158
+10159
+10160
+10161
+10162
+10163
+10164
+10165
+10166
+10167
+10168
+10169
+10170
+10171
+10172
+10173
+10174
+10175
+10176
+10177
+10178
+10179
+10180
+10181
+10182
+10183
+10184
+10185
+10186
+10187
+10188
+10189
+10190
+10191
+10192
+10193
+10194
+10195
+10196
+10197
+10198
+10199
+10200
+10201
+10202
+10203
+10204
+10205
+10206
+10207
+10208
+10209
+10210
+10211
+10212
+10213
+10214
+10215
+10216
+10217
+10218
+10219
+10220
+10221
+10222
+10223
+10224
+10225
+10226
+10227
+10228
+10229
+10230
+10231
+10232
+10233
+10234
+10235
+10236
+10237
+10238
+10239
+10240
+10241
+10242
+10243
+10244
+10245
+10246
+10247
+10248
+10249
+10250
+10251
+10252
+10253
+10254
+10255
+10256
+10257
+10258
+10259
+10260
+10261
+10262
+10263
+10264
+10265
+10266
+10267
+10268
+10269
+10270
+10271
+10272
+10273
+10274
+10275
+10276
+10277
+10278
+10279
+10280
+10281
+10282
+10283
+10284
+10285
+10286
+10287
+10288
+10289
+10290
+10291
+10292
+10293
+10294
+10295
+10296
+10297
+10298
+10299
+10300
+10301
+10302
+10303
+10304
+10305
+10306
+10307
+10308
+10309
+10310
+10311
+10312
+10313
+10314
+10315
+10316
+10317
+10318
+10319
+10320
+10321
+10322
+10323
+10324
+10325
+10326
+10327
+10328
+10329
+10330
+10331
+10332
+10333
+10334
+10335
+10336
+10337
+10338
+10339
+10340
+10341
+10342
+10343
+10344
+10345
+10346
+10347
+10348
+10349
+10350
+10351
+10352
+10353
+10354
+10355
+10356
+10357
+10358
+10359
+10360
+10361
+10362
+10363
+10364
+10365
+10366
+10367
+10368
+10369
+10370
+10371
+10372
+10373
+10374
+10375
+10376
+10377
+10378
+10379
+10380
+10381
+10382
+10383
+10384
+10385
+10386
+10387
+10388
+10389
+10390
+10391
+10392
+10393
+10394
+10395
+10396
+10397
+10398
+10399
+10400
+10401
+10402
+10403
+10404
+10405
+10406
+10407
+10408
+10409
+10410
+10411
+10412
+10413
+10414
+10415
+10416
+10417
+10418
+10419
+10420
+10421
+10422
+10423
+10424
+10425
+10426
+10427
+10428
+10429
+10430
+10431
+10432
+10433
+10434
+10435
+10436
+10437
+10438
+10439
+10440
+10441
+10442
+10443
+10444
+10445
+10446
+10447
+10448
+10449
+10450
+10451
+10452
+10453
+10454
+10455
+10456
+10457
+10458
+10459
+10460
+10461
+10462
+10463
+10464
+10465
+10466
+10467
+10468
+10469
+10470
+10471
+10472
+10473
+10474
+10475
+10476
+10477
+10478
+10479
+10480
+10481
+10482
+10483
+10484
+10485
+10486
+10487
+10488
+10489
+10490
+10491
+10492
+10493
+10494
+10495
+10496
+10497
+10498
+10499
+10500
+10501
+10502
+10503
+10504
+10505
+10506
+10507
+10508
+10509
+10510
+10511
+10512
+10513
+10514
+10515
+10516
+10517
+10518
+10519
+10520
+10521
+10522
+10523
+10524
+10525
+10526
+10527
+10528
+10529
+10530
+10531
+10532
+10533
+10534
+10535
+10536
+10537
+10538
+10539
+10540
+10541
+10542
+10543
+10544
+10545
+10546
+10547
+10548
+10549
+10550
+10551
+10552
+10553
+10554
+10555
+10556
+10557
+10558
+10559
+10560
+10561
+10562
+10563
+10564
+10565
+10566
+10567
+10568
+10569
+10570
+10571
+10572
+10573
+10574
+10575
+10576
+10577
+10578
+10579
+10580
+10581
+10582
+10583
+10584
+10585
+10586
+10587
+10588
+10589
+10590
+10591
+10592
+10593
+10594
+10595
+10596
+10597
+10598
+10599
+10600
+10601
+10602
+10603
+10604
+10605
+10606
+10607
+10608
+10609
+10610
+10611
+10612
+10613
+10614
+10615
+10616
+10617
+10618
+10619
+10620
+10621
+10622
+10623
+10624
+10625
+10626
+10627
+10628
+10629
+10630
+10631
+10632
+10633
+10634
+10635
+10636
+10637
+10638
+10639
+10640
+10641
+10642
+10643
+10644
+10645
+10646
+10647
+10648
+10649
+10650
+10651
+10652
+10653
+10654
+10655
+10656
+10657
+10658
+10659
+10660
+10661
+10662
+10663
+10664
+10665
+10666
+10667
+10668
+10669
+10670
+10671
+10672
+10673
+10674
+10675
+10676
+10677
+10678
+10679
+10680
+10681
+10682
+10683
+10684
+10685
+10686
+10687
+10688
+10689
+10690
+10691
+10692
+10693
+10694
+10695
+10696
+10697
+10698
+10699
+10700
+10701
+10702
+10703
+10704
+10705
+10706
+10707
+10708
+10709
+10710
+10711
+10712
+10713
+10714
+10715
+10716
+10717
+10718
+10719
+10720
+10721
+10722
+10723
+10724
+10725
+10726
+10727
+10728
+10729
+10730
+10731
+10732
+10733
+10734
+10735
+10736
+10737
+10738
+10739
+10740
+10741
+10742
+10743
+10744
+10745
+10746
+10747
+10748
+10749
+10750
+10751
+10752
+10753
+10754
+10755
+10756
+10757
+10758
+10759
+10760
+10761
+10762
+10763
+10764
+10765
+10766
+10767
+10768
+10769
+10770
+10771
+10772
+10773
+10774
+10775
+10776
+10777
+10778
+10779
+10780
+10781
+10782
+10783
+10784
+10785
+10786
+10787
+10788
+10789
+10790
+10791
+10792
+10793
+10794
+10795
+10796
+10797
+10798
+10799
+10800
+10801
+10802
+10803
+10804
+10805
+10806
+10807
+10808
+10809
+10810
+10811
+10812
+10813
+10814
+10815
+10816
+10817
+10818
+10819
+10820
+10821
+10822
+10823
+10824
+10825
+10826
+10827
+10828
+10829
+10830
+10831
+10832
+10833
+10834
+10835
+10836
+10837
+10838
+10839
+10840
+10841
+10842
+10843
+10844
+10845
+10846
+10847
+10848
+10849
+10850
+10851
+10852
+10853
+10854
+10855
+10856
+10857
+10858
+10859
+10860
+10861
+10862
+10863
+10864
+10865
+10866
+10867
+10868
+10869
+10870
+10871
+10872
+10873
+10874
+10875
+10876
+10877
+10878
+10879
+10880
+10881
+10882
+10883
+10884
+10885
+10886
+10887
+10888
+10889
+10890
+10891
+10892
+10893
+10894
+10895
+10896
+10897
+10898
+10899
+10900
+10901
+10902
+10903
+10904
+10905
+10906
+10907
+10908
+10909
+10910
+10911
+10912
+10913
+10914
+10915
+10916
+10917
+10918
+10919
+10920
+10921
+10922
+10923
+10924
+10925
+10926
+10927
+10928
+10929
+10930
+10931
+10932
+10933
+10934
+10935
+10936
+10937
+10938
+10939
+10940
+10941
+10942
+10943
+10944
+10945
+10946
+10947
+10948
+10949
+10950
+10951
+10952
+10953
+10954
+10955
+10956
+10957
+10958
+10959
+10960
+10961
+10962
+10963
+10964
+10965
+10966
+10967
+10968
+10969
+10970
+10971
+10972
+10973
+10974
+10975
+10976
+10977
+10978
+10979
+10980
+10981
+10982
+10983
+10984
+10985
+10986
+10987
+10988
+10989
+10990
+10991
+10992
+10993
+10994
+10995
+10996
+10997
+10998
+10999
+11000
+11001
+11002
+11003
+11004
+11005
+11006
+11007
+11008
+11009
+11010
+11011
+11012
+11013
+11014
+11015
+11016
+11017
+11018
+11019
+11020
+11021
+11022
+11023
+11024
+11025
+11026
+11027
+11028
+11029
+11030
+11031
+11032
+11033
+11034
+11035
+11036
+11037
+11038
+11039
+11040
+11041
+11042
+11043
+11044
+11045
+11046
+11047
+11048
+11049
+11050
+11051
+11052
+11053
+11054
+11055
+11056
+11057
+11058
+11059
+11060
+11061
+11062
+11063
+11064
+11065
+11066
+11067
+11068
+11069
+11070
+11071
+11072
+11073
+11074
+11075
+11076
+11077
+11078
+11079
+11080
+11081
+11082
+11083
+11084
+11085
+11086
+11087
+11088
+11089
+11090
+11091
+11092
+11093
+11094
+11095
+11096
+11097
+11098
+11099
+11100
+11101
+11102
+11103
+11104
+11105
+11106
+11107
+11108
+11109
+11110
+11111
+11112
+11113
+11114
+11115
+11116
+11117
+11118
+11119
+11120
+11121
+11122
+11123
+11124
+11125
+11126
+11127
+11128
+11129
+11130
+11131
+11132
+11133
+11134
+11135
+11136
+11137
+11138
+11139
+11140
+11141
+11142
+11143
+11144
+11145
+11146
+11147
+11148
+11149
+11150
+11151
+11152
+11153
+11154
+11155
+11156
+11157
+11158
+11159
+11160
+11161
+11162
+11163
+11164
+11165
+11166
+11167
+11168
+11169
+11170
+11171
+11172
+11173
+11174
+11175
+11176
+11177
+11178
+11179
+11180
+11181
+11182
+11183
+11184
+11185
+11186
+11187
+11188
+11189
+11190
+11191
+11192
+11193
+11194
+11195
+11196
+11197
+11198
+11199
+11200
+11201
+11202
+11203
+11204
+11205
+11206
+11207
+11208
+11209
+11210
+11211
+11212
+11213
+11214
+11215
+11216
+11217
+11218
+11219
+11220
+11221
+11222
+11223
+11224
+11225
+11226
+11227
+11228
+11229
+11230
+11231
+11232
+11233
+11234
+11235
+11236
+11237
+11238
+11239
+11240
+11241
+11242
+11243
+11244
+11245
+11246
+11247
+11248
+11249
+11250
+11251
+11252
+11253
+11254
+11255
+11256
+11257
+11258
+11259
+11260
+11261
+11262
+11263
+11264
+11265
+11266
+11267
+11268
+11269
+11270
+11271
+11272
+11273
+11274
+11275
+11276
+11277
+11278
+11279
+11280
+11281
+11282
+11283
+11284
+11285
+11286
+11287
+11288
+11289
+11290
+11291
+11292
+11293
+11294
+11295
+11296
+11297
+11298
+11299
+11300
+11301
+11302
+11303
+11304
+11305
+11306
+11307
+11308
+11309
+11310
+11311
+11312
+11313
+11314
+11315
+11316
+11317
+11318
+11319
+11320
+11321
+11322
+11323
+11324
+11325
+11326
+11327
+11328
+11329
+11330
+11331
+11332
+11333
+11334
+11335
+11336
+11337
+11338
+11339
+11340
+11341
+11342
+11343
+11344
+11345
+11346
+11347
+11348
+11349
+11350
+11351
+11352
+11353
+11354
+11355
+11356
+11357
+11358
+11359
+11360
+11361
+11362
+11363
+11364
+11365
+11366
+11367
+11368
+11369
+11370
+11371
+11372
+11373
+11374
+11375
+11376
+11377
+11378
+11379
+11380
+11381
+11382
+11383
+11384
+11385
+11386
+11387
+11388
+11389
+11390
+11391
+11392
+11393
+11394
+11395
+11396
+11397
+11398
+11399
+11400
+11401
+11402
+11403
+11404
+11405
+11406
+11407
+11408
+11409
+11410
+11411
+11412
+11413
+11414
+11415
+11416
+11417
+11418
+11419
+11420
+11421
+11422
+11423
+11424
+11425
+11426
+11427
+11428
+11429
+11430
+11431
+11432
+11433
+11434
+11435
+11436
+11437
+11438
+11439
+11440
+11441
+11442
+11443
+11444
+11445
+11446
+11447
+11448
+11449
+11450
+11451
+11452
+11453
+11454
+11455
+11456
+11457
+11458
+11459
+11460
+11461
+11462
+11463
+11464
+11465
+11466
+11467
+11468
+11469
+11470
+11471
+11472
+11473
+11474
+11475
+11476
+11477
+11478
+11479
+11480
+11481
+11482
+11483
+11484
+11485
+11486
+11487
+11488
+11489
+11490
+11491
+11492
+11493
+11494
+11495
+11496
+11497
+11498
+11499
+11500
+11501
+11502
+11503
+11504
+11505
+11506
+11507
+11508
+11509
+11510
+11511
+11512
+11513
+11514
+11515
+11516
+11517
+11518
+11519
+11520
+11521
+11522
+11523
+11524
+11525
+11526
+11527
+11528
+11529
+11530
+11531
+11532
+11533
+11534
+11535
+11536
+11537
+11538
+11539
+11540
+11541
+11542
+11543
+11544
+11545
+11546
+11547
+11548
+11549
+11550
+11551
+11552
+11553
+11554
+11555
+11556
+11557
+11558
+11559
+11560
+11561
+11562
+11563
+11564
+11565
+11566
+11567
+11568
+11569
+11570
+11571
+11572
+11573
+11574
+11575
+11576
+11577
+11578
+11579
+11580
+11581
+11582
+11583
+11584
+11585
+11586
+11587
+11588
+11589
+11590
+11591
+11592
+11593
+11594
+11595
+11596
+11597
+11598
+11599
+11600
+11601
+11602
+11603
+11604
+11605
+11606
+11607
+11608
+11609
+11610
+11611
+11612
+11613
+11614
+11615
+11616
+11617
+11618
+11619
+11620
+11621
+11622
+11623
+11624
+11625
+11626
+11627
+11628
+11629
+11630
+11631
+11632
+11633
+11634
+11635
+11636
+11637
+11638
+11639
+11640
+11641
+11642
+11643
+11644
+11645
+11646
+11647
+11648
+11649
+11650
+11651
+11652
+11653
+11654
+11655
+11656
+11657
+11658
+11659
+11660
+11661
+11662
+11663
+11664
+11665
+11666
+11667
+11668
+11669
+11670
+11671
+11672
+11673
+11674
+11675
+11676
+11677
+11678
+11679
+11680
+11681
+11682
+11683
+11684
+11685
+11686
+11687
+11688
+11689
+11690
+11691
+11692
+11693
+11694
+11695
+11696
+11697
+11698
+11699
+11700
+11701
+11702
+11703
+11704
+11705
+11706
+11707
+11708
+11709
+11710
+11711
+11712
+11713
+11714
+11715
+11716
+11717
+11718
+11719
+11720
+11721
+11722
+11723
+11724
+11725
+11726
+11727
+11728
+11729
+11730
+11731
+11732
+11733
+11734
+11735
+11736
+11737
+11738
+11739
+11740
+11741
+11742
+11743
+11744
+11745
+11746
+11747
+11748
+11749
+11750
+11751
+11752
+11753
+11754
+11755
+11756
+11757
+11758
+11759
+11760
+11761
+11762
+11763
+11764
+11765
+11766
+11767
+11768
+11769
+11770
+11771
+11772
+11773
+11774
+11775
+11776
+11777
+11778
+11779
+11780
+11781
+11782
+11783
+11784
+11785
+11786
+11787
+11788
+11789
+11790
+11791
+11792
+11793
+11794
+11795
+11796
+11797
+11798
+11799
+11800
+11801
+11802
+11803
+11804
+11805
+11806
+11807
+11808
+11809
+11810
+11811
+11812
+11813
+11814
+11815
+11816
+11817
+11818
+11819
+11820
+11821
+11822
+11823
+11824
+11825
+11826
+11827
+11828
+11829
+11830
+11831
+11832
+11833
+11834
+11835
+11836
+11837
+11838
+11839
+11840
+11841
+11842
+11843
+11844
+11845
+11846
+11847
+11848
+11849
+11850
+11851
+11852
+11853
+11854
+11855
+11856
+11857
+11858
+11859
+11860
+11861
+11862
+11863
+11864
+11865
+11866
+11867
+11868
+11869
+11870
+11871
+11872
+11873
+11874
+11875
+11876
+11877
+11878
+11879
+11880
+11881
+11882
+11883
+11884
+11885
+11886
+11887
+11888
+11889
+11890
+11891
+11892
+11893
+11894
+11895
+11896
+11897
+11898
+11899
+11900
+11901
+11902
+11903
+11904
+11905
+11906
+11907
+11908
+11909
+11910
+11911
+11912
+11913
+11914
+11915
+11916
+11917
+11918
+11919
+11920
+11921
+11922
+11923
+11924
+11925
+11926
+11927
+11928
+11929
+11930
+11931
+11932
+11933
+11934
+11935
+11936
+11937
+11938
+11939
+11940
+11941
+11942
+11943
+11944
+11945
+11946
+11947
+11948
+11949
+11950
+11951
+11952
+11953
+11954
+11955
+11956
+11957
+11958
+11959
+11960
+11961
+11962
+11963
+11964
+11965
+11966
+11967
+11968
+11969
+11970
+11971
+11972
+11973
+11974
+11975
+11976
+11977
+11978
+11979
+11980
+11981
+11982
+11983
+11984
+11985
+11986
+11987
+11988
+11989
+11990
+11991
+11992
+11993
+11994
+11995
+11996
+11997
+11998
+11999
+12000
+12001
+12002
+12003
+12004
+12005
+12006
+12007
+12008
+12009
+12010
+12011
+12012
+12013
+12014
+12015
+12016
+12017
+12018
+12019
+12020
+12021
+12022
+12023
+12024
+12025
+12026
+12027
+12028
+12029
+12030
+12031
+12032
+12033
+12034
+12035
+12036
+12037
+12038
+12039
+12040
+12041
+12042
+12043
+12044
+12045
+12046
+12047
+12048
+12049
+12050
+12051
+12052
+12053
+12054
+12055
+12056
+12057
+12058
+12059
+12060
+12061
+12062
+12063
+12064
+12065
+12066
+12067
+12068
+12069
+12070
+12071
+12072
+12073
+12074
+12075
+12076
+12077
+12078
+12079
+12080
+12081
+12082
+12083
+12084
+12085
+12086
+12087
+12088
+12089
+12090
+12091
+12092
+12093
+12094
+12095
+12096
+12097
+12098
+12099
+12100
+12101
+12102
+12103
+12104
+12105
+12106
+12107
+12108
+12109
+12110
+12111
+12112
+12113
+12114
+12115
+12116
+12117
+12118
+12119
+12120
+12121
+12122
+12123
+12124
+12125
+12126
+12127
+12128
+12129
+12130
+12131
+12132
+12133
+12134
+12135
+12136
+12137
+12138
+12139
+12140
+12141
+12142
+12143
+12144
+12145
+12146
+12147
+12148
+12149
+12150
+12151
+12152
+12153
+12154
+12155
+12156
+12157
+12158
+12159
+12160
+12161
+12162
+12163
+12164
+12165
+12166
+12167
+12168
+12169
+12170
+12171
+12172
+12173
+12174
+12175
+12176
+12177
+12178
+12179
+12180
+12181
+12182
+12183
+12184
+12185
+12186
+12187
+12188
+12189
+12190
+12191
+12192
+12193
+12194
+12195
+12196
+12197
+12198
+12199
+12200
+12201
+12202
+12203
+12204
+12205
+12206
+12207
+12208
+12209
+12210
+12211
+12212
+12213
+12214
+12215
+12216
+12217
+12218
+12219
+12220
+12221
+12222
+12223
+12224
+12225
+12226
+12227
+12228
+12229
+12230
+12231
+12232
+12233
+12234
+12235
+12236
+12237
+12238
+12239
+12240
+12241
+12242
+12243
+12244
+12245
+12246
+12247
+12248
+12249
+12250
+12251
+12252
+12253
+12254
+12255
+12256
+12257
+12258
+12259
+12260
+12261
+12262
+12263
+12264
+12265
+12266
+12267
+12268
+12269
+12270
+12271
+12272
+12273
+12274
+12275
+12276
+12277
+12278
+12279
+12280
+12281
+12282
+12283
+12284
+12285
+12286
+12287
+12288
+12289
+12290
+12291
+12292
+12293
+12294
+12295
+12296
+12297
+12298
+12299
+12300
+12301
+12302
+12303
+12304
+12305
+12306
+12307
+12308
+12309
+12310
+12311
+12312
+12313
+12314
+12315
+12316
+12317
+12318
+12319
+12320
+12321
+12322
+12323
+12324
+12325
+12326
+12327
+12328
+12329
+12330
+12331
+12332
+12333
+12334
+12335
+12336
+12337
+12338
+12339
+12340
+12341
+12342
+12343
+12344
+12345
+12346
+12347
+12348
+12349
+12350
+12351
+12352
+12353
+12354
+12355
+12356
+12357
+12358
+12359
+12360
+12361
+12362
+12363
+12364
+12365
+12366
+12367
+12368
+12369
+12370
+12371
+12372
+12373
+12374
+12375
+12376
+12377
+12378
+12379
+12380
+12381
+12382
+12383
+12384
+12385
+12386
+12387
+12388
+12389
+12390
+12391
+12392
+12393
+12394
+12395
+12396
+12397
+12398
+12399
+12400
+12401
+12402
+12403
+12404
+12405
+12406
+12407
+12408
+12409
+12410
+12411
+12412
+12413
+12414
+12415
+12416
+12417
+12418
+12419
+12420
+12421
+12422
+12423
+12424
+12425
+12426
+12427
+12428
+12429
+12430
+12431
+12432
+12433
+12434
+12435
+12436
+12437
+12438
+12439
+12440
+12441
+12442
+12443
+12444
+12445
+12446
+12447
+12448
+12449
+12450
+12451
+12452
+12453
+12454
+12455
+12456
+12457
+12458
+12459
+12460
+12461
+12462
+12463
+12464
+12465
+12466
+12467
+12468
+12469
+12470
+12471
+12472
+12473
+12474
+12475
+12476
+12477
+12478
+12479
+12480
+12481
+12482
+12483
+12484
+12485
+12486
+12487
+12488
+12489
+12490
+12491
+12492
+12493
+12494
+12495
+12496
+12497
+12498
+12499
+12500
+12501
+12502
+12503
+12504
+12505
+12506
+12507
+12508
+12509
+12510
+12511
+12512
+12513
+12514
+12515
+12516
+12517
+12518
+12519
+12520
+12521
+12522
+12523
+12524
+12525
+12526
+12527
+12528
+12529
+12530
+12531
+12532
+12533
+12534
+12535
+12536
+12537
+12538
+12539
+12540
+12541
+12542
+12543
+12544
+12545
+12546
+12547
+12548
+12549
+12550
+12551
+12552
+12553
+12554
+12555
+12556
+12557
+12558
+12559
+12560
+12561
+12562
+12563
+12564
+12565
+12566
+12567
+12568
+12569
+12570
+12571
+12572
+12573
+12574
+12575
+12576
+12577
+12578
+12579
+12580
+12581
+12582
+12583
+12584
+12585
+12586
+12587
+12588
+12589
+12590
+12591
+12592
+12593
+12594
+12595
+12596
+12597
+12598
+12599
+12600
+12601
+12602
+12603
+12604
+12605
+12606
+12607
+12608
+12609
+12610
+12611
+12612
+12613
+12614
+12615
+12616
+12617
+12618
+12619
+12620
+12621
+12622
+12623
+12624
+12625
+12626
+12627
+12628
+12629
+12630
+12631
+12632
+12633
+12634
+12635
+12636
+12637
+12638
+12639
+12640
+12641
+12642
+12643
+12644
+12645
+12646
+12647
+12648
+12649
+12650
+12651
+12652
+12653
+12654
+12655
+12656
+12657
+12658
+12659
+12660
+12661
+12662
+12663
+12664
+12665
+12666
+12667
+12668
+12669
+12670
+12671
+12672
+12673
+12674
+12675
+12676
+12677
+12678
+12679
+12680
+12681
+12682
+12683
+12684
+12685
+12686
+12687
+12688
+12689
+12690
+12691
+12692
+12693
+12694
+12695
+12696
+12697
+12698
+12699
+12700
+12701
+12702
+12703
+12704
+12705
+12706
+12707
+12708
+12709
+12710
+12711
+12712
+12713
+12714
+12715
+12716
+12717
+12718
+12719
+12720
+12721
+12722
+12723
+12724
+12725
+12726
+12727
+12728
+12729
+12730
+12731
+12732
+12733
+12734
+12735
+12736
+12737
+12738
+12739
+12740
+12741
+12742
+12743
+12744
+12745
+12746
+12747
+12748
+12749
+12750
+12751
+12752
+12753
+12754
+12755
+12756
+12757
+12758
+12759
+12760
+12761
+12762
+12763
+12764
+12765
+12766
+12767
+12768
+12769
+12770
+12771
+12772
+12773
+12774
+12775
+12776
+12777
+12778
+12779
+12780
+12781
+12782
+12783
+12784
+12785
+12786
+12787
+12788
+12789
+12790
+12791
+12792
+12793
+12794
+12795
+12796
+12797
+12798
+12799
+12800
+12801
+12802
+12803
+12804
+12805
+12806
+12807
+12808
+12809
+12810
+12811
+12812
+12813
+12814
+12815
+12816
+12817
+12818
+12819
+12820
+12821
+12822
+12823
+12824
+12825
+12826
+12827
+12828
+12829
+12830
+12831
+12832
+12833
+
+
(*
+This module is the backend of the Motoko compiler. It takes a program in
+the intermediate representation (ir.ml), and produces a WebAssembly module,
+with Internet Computer extensions (customModule.ml). An important helper module is
+instrList.ml, which provides a more convenient way of assembling WebAssembly
+instruction lists, as it takes care of (1) source locations and (2) labels.
+
+This file is split up in a number of modules, purely for namespacing and
+grouping. Every module has a high-level prose comment explaining the concept;
+this keeps documentation close to the code (a lesson learned from Simon PJ).
+*)
+
+open Ir_def
+open Mo_values
+open Mo_types
+open Mo_config
+
+open Wasm_exts.Ast
+open Wasm.Types
+open Source
+(* Re-shadow Source.(@@), to get Stdlib.(@@) *)
+let (@@) = Stdlib.(@@)
+
+module G = InstrList
+let (^^) = G.(^^) (* is this how we import a single operator from a module that we otherwise use qualified? *)
+
+(* WebAssembly pages are 64kb. *)
+let page_size = Int32.of_int (64*1024)
+let page_size64 = Int64.of_int32 page_size
+let page_size_bits = 16
+
+(* Our code depends on OCaml int having at least 32 bits *)
+let _ = assert (Sys.int_size >= 32)
+
+(* Scalar Tagging Scheme *)
+
+(* Rationale:
+   Scalar tags are variable length LSBs.
+   A tag (in binary) is either
+   * 10 for Int (leaving 30 bits payload)
+   * 01(0+)0 for unsigned, e.g 0100 for Nat64
+   * 11(0+)0 for signed,   e.g.1100 for Int64
+   Types must be distinguished by tag.
+   LSB must always be 0.
+   Decoding the type of scalar is easy using `ctz` to count the trailing zeros, then
+   switching on the MSB of the tag for sign (if any).
+   We use the *longest* tag that accommodates the required payload bits, to allow room
+   for any future tags that may require more payload bits,
+   e.g. 01(0^14) for Nat8, 11(0^14) for Int8
+   01(0^30) is used for the unit tag (the payload is a trivial zero-length bit string).
+*)
+
+module TaggingScheme = struct
+
+  (*
+     Enable for development only to sanity check value tags and
+     locate unexpected tag errors to compile.ml source lines.
+     Flags.sanity_check will check tags, but not further locate them.
+  *)
+
+  let debug = false (* should never be true in master! *)
+
+  type bit = I | O
+  let _ = (I,O) (* silence warning on unused constructors *)
+
+  type tag =
+    TBool
+  | TRef
+  | TNum
+  | TNat64 | TInt64
+  | TNat32 | TInt32
+  | TChar
+  | TNat8 | TInt8
+  | TNat16 | TInt16
+  | TUnit
+  | TUnused
+
+  (* Leverage OCaml pattern match compilation to check tagging scheme is injective *)
+  let _decode u32 =
+    match u32 with
+    | ((O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O)) -> TBool (* false *)
+    | ((O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,I)) -> TBool (* true *)
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,I,I)) -> TRef  (* 30 bit *)
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,I,O)) -> TNum   (* 30 bit *)
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,O,I,O,O)) -> TNat64 (* 28 bit *)
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,I,I,O,O)) -> TInt64
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,O,I,O,O,O)) -> TNat32 (* 27 bit *)
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,I,I,O,O,O)) -> TInt32
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (_,_,_,_,_,O,I,O), (O,O,O,O,O,O,O,O)) -> TChar
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (O,I,O,O,O,O,O,O), (O,O,O,O,O,O,O,O)) -> TNat16
+    | ((_,_,_,_,_,_,_,_), (_,_,_,_,_,_,_,_), (I,I,O,O,O,O,O,O), (O,O,O,O,O,O,O,O)) -> TInt16
+    | ((_,_,_,_,_,_,_,_), (O,I,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O)) -> TNat8
+    | ((_,_,_,_,_,_,_,_), (I,I,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O)) -> TInt8
+    | ((O,I,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O), (O,O,O,O,O,O,O,O)) -> TUnit
+    | _                                                                            -> TUnused
+
+  let tag_of_typ pty = Type.(
+    if !Flags.rtti then
+      match pty with
+      | Nat
+      | Int ->                                    0b10l
+      | Nat64 ->                                0b0100l
+      | Int64 ->                                0b1100l
+      | Nat32 ->                               0b01000l
+      | Int32 ->                               0b11000l
+      | Char  ->                        0b010_00000000l
+      | Nat16 ->                   0b01000000_00000000l
+      | Int16 ->                   0b11000000_00000000l
+      | Nat8  ->          0b01000000_00000000_00000000l
+      | Int8  ->          0b11000000_00000000_00000000l
+      | _  -> assert false
+    else
+      (* no tag *)
+      match pty with
+      | Nat
+      | Int
+      | Nat64
+      | Int64
+      | Nat32
+      | Int32
+      | Char
+      | Nat16
+      | Int16
+      | Nat8
+      | Int8 -> 0l
+      | _  -> assert false)
+
+  let unit_tag () =
+    if !Flags.rtti then
+      (* all tag, no payload (none needed) *)
+      0b01000000_00000000_00000000_00000000l
+    else
+      (* no tag *)
+      0l
+
+  (* Number of payload bits in compact representation, including any sign *)
+  let ubits_of pty = Type.(
+    if !Flags.rtti then
+      match pty with
+      | Nat   | Int   -> 30
+      | Nat64 | Int64 -> 28
+      | Nat32 | Int32 -> 27
+      | Char          -> 21 (* suffices for 21-bit UTF8 codepoints *)
+      | Nat16 | Int16 -> 16
+      | Nat8  | Int8  ->  8
+      | _ -> assert false
+   else
+      match pty with
+      | Nat   | Int   -> 31
+      | Nat64 | Int64 -> 31
+      | Nat32 | Int32 -> 31
+      | Char          -> 21 (* suffices for 21-bit UTF8 codepoints *)
+      | Nat16 | Int16 -> 16
+      | Nat8  | Int8  ->  8
+      | _ -> assert false)
+end
+
+(*
+Pointers are skewed (translated) -1 relative to the actual offset.
+See documentation of module BitTagged for more detail.
+*)
+let ptr_skew = -1l
+let ptr_unskew = 1l
+
+(* Generating function names for functions parametrized by prim types *)
+let prim_fun_name p stem = Printf.sprintf "%s<%s>" stem (Type.string_of_prim p)
+
+(* Helper functions to produce annotated terms (Wasm.AST) *)
+let nr x = Wasm.Source.{ it = x; at = no_region }
+
+let todo fn se x = Printf.eprintf "%s: %s" fn (Wasm.Sexpr.to_string 80 se); x
+
+exception CodegenError of string
+let fatal fmt = Printf.ksprintf (fun s -> raise (CodegenError s)) fmt
+
+module StaticBytes = struct
+  (* A very simple DSL to describe static memory *)
+
+  type t_ =
+    | I32 of int32
+    | I64 of int64
+    | Seq of t
+    | Bytes of string
+
+  and t = t_ list
+
+  let i32s is = Seq (List.map (fun i -> I32 i) is)
+
+  let rec add : Buffer.t -> t_ -> unit = fun buf -> function
+    | I32 i -> Buffer.add_int32_le buf i
+    | I64 i -> Buffer.add_int64_le buf i
+    | Seq xs -> List.iter (add buf) xs
+    | Bytes b -> Buffer.add_string buf b
+
+  let as_bytes : t -> string = fun xs ->
+    let buf = Buffer.create 16 in
+    List.iter (add buf) xs;
+    Buffer.contents buf
+
+end (* StaticBytes *)
+
+module Const = struct
+
+  (* Literals, as used in constant values. This is a projection of Ir.Lit,
+     combining cases whose details we no longer care about.
+     Should be still precise enough to map to the cases supported by SR.t.
+
+     In other words: It is the smallest type that allows these three functions:
+
+       (* projection of Ir.list. NB: pure, no access to env *)
+       const_lit_of_lit : Ir.lit -> Const.lit (* NB: pure, no access to env *)
+
+       (* creates vanilla representation (e.g. to put in static data structures *)
+       vanilla_lit : E.env -> Const.lit -> i32
+
+       (* creates efficient stack representation *)
+       compile_lit : E.env -> Const.lit -> (SR.t, code)
+
+  *)
+
+  type lit =
+    | Vanilla of int32 (* small words, no static data, already in vanilla format *)
+    | BigInt of Big_int.big_int
+    | Bool of bool
+    | Word32 of Type.prim * int32
+    | Word64 of Type.prim * int64
+    | Float64 of Numerics.Float.t
+    | Blob of string
+    | Null
+
+  let lit_eq = function
+    | Vanilla i, Vanilla j -> i = j
+    | BigInt i, BigInt j -> Big_int.eq_big_int i j
+    | Word32 (tyi, i), Word32 (tyj, j) -> tyi = tyj && i = j
+    | Word64 (tyi, i), Word64 (tyj, j) -> tyi = tyj && i = j
+    | Float64 i, Float64 j -> i = j
+    | Bool i, Bool j -> i = j
+    | Blob s, Blob t -> s = t
+    | Null, Null -> true
+    | _ -> false
+
+  (* Inlineable functions
+
+     The prelude/prim.mo is full of functions simply wrapping a prim, e.g.
+
+        func int64ToNat64(n : Int64) : Nat64 = (prim "num_wrap_Int64_Nat64" : Int64 -> Nat64) n;
+
+     generating a Wasm function for them and calling them is absurdly expensive
+     when the prim is just a simple Wasm instruction. Also, it requires boxing
+     and unboxing arguments and results.
+
+     So we recognize such functions when creating the `const` summary, and use the prim
+     directly when calling such function.
+
+     Can be extended to cover more forms of inlineable functions.
+  *)
+  type fun_rhs =
+    | Complicated (* no inlining possible *)
+    | PrimWrapper of Ir.prim
+
+  (* Constant known values.
+
+     These are values that
+     * are completely known constantly
+     * do not require Wasm code to be executed (e.g. in `start`)
+     * can be used directly (e.g. Call, not CallIndirect)
+     * can be turned into Vanilla heap data on demand
+
+     See ir_passes/const.ml for what precisely we can compile as const now.
+  *)
+
+  type v =
+    | Fun of (unit -> int32) * fun_rhs (* function pointer calculated upon first use *)
+    | Message of int32 (* anonymous message, only temporary *)
+    | Obj of (string * t) list
+    | Unit
+    | Array of t list (* also tuples, but not nullary *)
+    | Tag of (string * t)
+    | Opt of t
+    | Lit of lit
+
+  (* A constant known value together with a vanilla pointer.
+     Typically a static memory location, could be an unboxed scalar.
+     Filled on demand.
+   *)
+  and t = (int32 Lib.Promise.t * v)
+
+  let t_of_v v = (Lib.Promise.make (), v)
+
+end (* Const *)
+
+module SR = struct
+  (* This goes with the StackRep module, but we need the types earlier *)
+
+  (* Value representation on the stack:
+
+     Compiling an expression means putting its value on the stack. But
+     there are various ways of putting a value onto the stack -- unboxed,
+     tupled etc.
+   *)
+  type t =
+    | Vanilla
+    | UnboxedTuple of int
+    | UnboxedWord64 of Type.prim
+    | UnboxedWord32 of Type.prim
+    | UnboxedFloat64
+    | Unreachable
+    | Const of Const.t
+
+  let unit = UnboxedTuple 0
+
+  let bool = Vanilla
+
+  (* Because t contains Const.t, and that contains Const.v, and that contains
+     Const.lit, and that contains Big_int, we cannot just use normal `=`. So we
+     have to write our own equality.
+
+     This equalty is, I believe, used when joining branches. So for Const, we
+     just compare the promises, and do not descend into the Const.v. This is
+     conservative; the only downside is that if a branch returns different
+     Const.t with (semantically) the same Const.v we do not propagate that as
+     Const, but materialize before the branch.
+     Which is not really expected or important.
+  *)
+  let eq (t1 : t) (t2 : t) = match t1, t2 with
+    | Const (p1, _), Const (p2, _) -> p1 == p2
+    | _ -> t1 = t2
+
+  let to_var_type : t -> value_type = function
+    | Vanilla -> I32Type
+    | UnboxedWord64 _ -> I64Type
+    | UnboxedWord32 _ -> I32Type
+    | UnboxedFloat64 -> F64Type
+    | UnboxedTuple n -> fatal "to_var_type: UnboxedTuple"
+    | Const _ -> fatal "to_var_type: Const"
+    | Unreachable -> fatal "to_var_type: Unreachable"
+
+end (* SR *)
+
+(*
+
+** The compiler environment.
+
+Of course, as we go through the code we have to track a few things; these are
+put in the compiler environment, type `E.t`. Some fields are valid globally, some
+only make sense locally, i.e. within a single function (but we still put them
+in one big record, for convenience).
+
+The fields fall into the following categories:
+
+ 1. Static global fields. Never change.
+    Example: whether we are compiling with -no-system-api
+
+ 2. Mutable global fields. Change only monotonically.
+    These are used to register things like functions. This should be monotone
+    in the sense that entries are only added, and that the order should not
+    matter in a significant way. In some instances, the list contains futures
+    so that we can reserve and know the _position_ of the thing before we have
+    to actually fill it in.
+
+ 3. Static local fields. Never change within a function.
+    Example: number of parameters and return values
+
+ 4. Mutable local fields. See above
+    Example: Name and type of locals.
+
+**)
+
+(* Before we can define the environment, we need some auxillary types *)
+
+module E = struct
+
+  (* Utilities, internal to E *)
+  let reg (ref : 'a list ref) (x : 'a) : int32 =
+      let i = Wasm.I32.of_int_u (List.length !ref) in
+      ref := !ref @ [ x ];
+      i
+
+  let reserve_promise (ref : 'a Lib.Promise.t list ref) _s : (int32 * ('a -> unit)) =
+      let p = Lib.Promise.make () in (* For debugging with named promises, use s here *)
+      let i = Wasm.I32.of_int_u (List.length !ref) in
+      ref := !ref @ [ p ];
+      (i, Lib.Promise.fulfill p)
+
+
+  (* The environment type *)
+  module NameEnv = Env.Make(String)
+  module StringEnv = Env.Make(String)
+  module LabSet = Set.Make(String)
+  module FeatureSet = Set.Make(String)
+
+  module FunEnv = Env.Make(Int32)
+  type local_names = (int32 * string) list (* For the debug section: Names of locals *)
+  type func_with_names = func * local_names
+  type lazy_function = (int32, func_with_names) Lib.AllocOnUse.t
+  type t = {
+    (* Global fields *)
+    (* Static *)
+    mode : Flags.compile_mode;
+    rts : Wasm_exts.CustomModule.extended_module option; (* The rts. Re-used when compiling actors *)
+    trap_with : t -> string -> G.t;
+      (* Trap with message; in the env for dependency injection *)
+
+    (* Per module fields (only valid/used inside a module) *)
+    (* Immutable *)
+
+    (* Mutable *)
+    func_types : func_type list ref;
+    func_imports : import list ref;
+    other_imports : import list ref;
+    exports : export list ref;
+    funcs : (func * string * local_names) Lib.Promise.t list ref;
+    func_ptrs : int32 FunEnv.t ref;
+    end_of_table : int32 ref;
+    globals : (global Lib.Promise.t * string) list ref;
+    global_names : int32 NameEnv.t ref;
+    named_imports : int32 NameEnv.t ref;
+    built_in_funcs : lazy_function NameEnv.t ref;
+    static_strings : int32 StringEnv.t ref;
+      (* Pool for shared static objects. Their lookup needs to be specifically
+         handled by using the tag and the payload without the forwarding pointer.
+         This is because the forwarding pointer depends on the allocation adddress.
+         The lookup is different to `static_string` that has no such
+         allocation-dependent content and can thus be immediately looked up by
+         the string value. *)
+    object_pool : int32 StringEnv.t ref;
+    end_of_static_memory : int32 ref; (* End of statically allocated memory *)
+    static_memory : (int32 * string) list ref; (* Content of static memory *)
+    static_memory_frozen : bool ref;
+      (* Sanity check: Nothing should bump end_of_static_memory once it has been read *)
+    static_roots : int32 list ref;
+      (* GC roots in static memory. (Everything that may be mutable.) *)
+
+    (* Types accumulated in global typtbl (for candid subtype checks)
+       See Note [Candid subtype checks]
+    *)
+    typtbl_typs : Type.typ list ref;
+
+    (* Metadata *)
+    args : (bool * string) option ref;
+    service : (bool * string) option ref;
+    stable_types : (bool * string) option ref;
+    labs : LabSet.t ref; (* Used labels (fields and variants),
+                            collected for Motoko custom section 0 *)
+
+    (* Local fields (only valid/used inside a function) *)
+    (* Static *)
+    n_param : int32; (* Number of parameters (to calculate indices of locals) *)
+    return_arity : int; (* Number of return values (for type of Return) *)
+
+    (* Mutable *)
+    locals : value_type list ref; (* Types of locals *)
+    local_names : (int32 * string) list ref; (* Names of locals *)
+
+    features : FeatureSet.t ref; (* Wasm features using wasmtime naming *)
+
+    (* requires stable memory (and emulation on wasm targets) *)
+    requires_stable_memory : bool ref;
+  }
+
+
+  (* The initial global environment *)
+  let mk_global mode rts trap_with dyn_mem : t = {
+    mode;
+    rts;
+    trap_with;
+    func_types = ref [];
+    func_imports = ref [];
+    other_imports = ref [];
+    exports = ref [];
+    funcs = ref [];
+    func_ptrs = ref FunEnv.empty;
+    end_of_table = ref 0l;
+    globals = ref [];
+    global_names = ref NameEnv.empty;
+    named_imports = ref NameEnv.empty;
+    built_in_funcs = ref NameEnv.empty;
+    static_strings = ref StringEnv.empty;
+    object_pool = ref StringEnv.empty;
+    end_of_static_memory = ref dyn_mem;
+    static_memory = ref [];
+    static_memory_frozen = ref false;
+    static_roots = ref [];
+    typtbl_typs = ref [];
+    (* Metadata *)
+    args = ref None;
+    service = ref None;
+    stable_types = ref None;
+    labs = ref LabSet.empty;
+    (* Actually unused outside mk_fun_env: *)
+    n_param = 0l;
+    return_arity = 0;
+    locals = ref [];
+    local_names = ref [];
+    features = ref FeatureSet.empty;
+    requires_stable_memory = ref false;
+  }
+
+  (* This wraps Mo_types.Hash.hash to also record which labels we have seen,
+      so that that data can be put in a custom section, useful for debugging.
+      Thus Mo_types.Hash.hash should not be called directly!
+   *)
+  let hash (env : t) lab =
+    env.labs := LabSet.add lab (!(env.labs));
+    Mo_types.Hash.hash lab
+
+  let get_labs env = LabSet.elements (!(env.labs))
+
+  let mk_fun_env env n_param return_arity =
+    { env with
+      n_param;
+      return_arity;
+      locals = ref [];
+      local_names = ref [];
+    }
+
+  (* We avoid accessing the fields of t directly from outside of E, so here are a
+     bunch of accessors. *)
+
+  let mode (env : t) = env.mode
+
+  let add_anon_local (env : t) ty =
+    let i = reg env.locals ty in
+    Wasm.I32.add env.n_param i
+
+  let add_local_name (env : t) li name =
+    let _ = reg env.local_names (li, name) in ()
+
+  let get_locals (env : t) = !(env.locals)
+  let get_local_names (env : t) : (int32 * string) list = !(env.local_names)
+
+  let _add_other_import (env : t) m =
+    ignore (reg env.other_imports m)
+
+  let add_export (env : t) e =
+    ignore (reg env.exports e)
+
+  let add_global (env : t) name g =
+    assert (not (NameEnv.mem name !(env.global_names)));
+    let gi = reg env.globals (g, name) in
+    env.global_names := NameEnv.add name gi !(env.global_names)
+
+  let add_global32_delayed (env : t) name mut : int32 -> unit =
+    let p = Lib.Promise.make () in
+    add_global env name p;
+    (fun init ->
+      Lib.Promise.fulfill p (nr {
+        gtype = GlobalType (I32Type, mut);
+        value = nr (G.to_instr_list (G.i (Const (nr (Wasm.Values.I32 init)))))
+      })
+    )
+
+  let add_global32 (env : t) name mut init =
+    add_global32_delayed env name mut init
+
+  (* TODO, refactor with previous two *)
+  let add_global64_delayed (env : t) name mut : int64 -> unit =
+    let p = Lib.Promise.make () in
+    add_global env name p;
+    (fun init ->
+      Lib.Promise.fulfill p (nr {
+        gtype = GlobalType (I64Type, mut);
+        value = nr (G.to_instr_list (G.i (Const (nr (Wasm.Values.I64 init)))))
+      })
+    )
+  let add_global64 (env : t) name mut init =
+    add_global64_delayed env name mut init
+
+  let get_global (env : t) name : int32 =
+    match NameEnv.find_opt name !(env.global_names) with
+    | Some gi -> gi
+    | None -> raise (Invalid_argument (Printf.sprintf "No global named %s declared" name))
+
+  let get_global32_lazy (env : t) name mut init : int32 =
+    match NameEnv.find_opt name !(env.global_names) with
+    | Some gi -> gi
+    | None -> add_global32 env name mut init; get_global env name
+
+  let export_global env name =
+    add_export env (nr {
+      name = Lib.Utf8.decode name;
+      edesc = nr (GlobalExport (nr (get_global env name)))
+    })
+
+  let get_globals (env : t) = List.map (fun (g,n) -> Lib.Promise.value g) !(env.globals)
+
+  let reserve_fun (env : t) name =
+    let (j, fill) = reserve_promise env.funcs name in
+    let n = Int32.of_int (List.length !(env.func_imports)) in
+    let fi = Int32.add j n in
+    let fill_ (f, local_names) = fill (f, name, local_names) in
+    (fi, fill_)
+
+  let add_fun (env : t) name (f, local_names) =
+    let (fi, fill) = reserve_fun env name in
+    fill (f, local_names);
+    fi
+
+  let make_lazy_function env name : lazy_function =
+    Lib.AllocOnUse.make (fun () -> reserve_fun env name)
+
+  let lookup_built_in (env : t) name : lazy_function =
+    match NameEnv.find_opt name !(env.built_in_funcs) with
+    | None ->
+      let lf = make_lazy_function env name in
+      env.built_in_funcs := NameEnv.add name lf !(env.built_in_funcs);
+      lf
+    | Some lf -> lf
+
+  let built_in (env : t) name : int32 =
+    Lib.AllocOnUse.use (lookup_built_in env name)
+
+  let define_built_in (env : t) name mk_fun : unit =
+    Lib.AllocOnUse.def  (lookup_built_in env name) mk_fun
+
+  let get_return_arity (env : t) = env.return_arity
+
+  let get_func_imports (env : t) = !(env.func_imports)
+  let get_other_imports (env : t) = !(env.other_imports)
+  let get_exports (env : t) = !(env.exports)
+  let get_funcs (env : t) = List.map Lib.Promise.value !(env.funcs)
+
+  let func_type (env : t) ty =
+    let rec go i = function
+      | [] -> env.func_types := !(env.func_types) @ [ ty ]; Int32.of_int i
+      | ty'::tys when ty = ty' -> Int32.of_int i
+      | _ :: tys -> go (i+1) tys
+       in
+    go 0 !(env.func_types)
+
+  let get_types (env : t) = !(env.func_types)
+
+  let add_func_import (env : t) modname funcname arg_tys ret_tys =
+    if !(env.funcs) <> [] then
+      raise (CodegenError "Add all imports before all functions!");
+
+    let i = {
+      module_name = Lib.Utf8.decode modname;
+      item_name = Lib.Utf8.decode funcname;
+      idesc = nr (FuncImport (nr (func_type env (FuncType (arg_tys, ret_tys)))))
+    } in
+    let fi = reg env.func_imports (nr i) in
+    let name = modname ^ "." ^ funcname in
+    assert (not (NameEnv.mem name !(env.named_imports)));
+    env.named_imports := NameEnv.add name fi !(env.named_imports)
+
+  let call_import (env : t) modname funcname =
+    let name = modname ^ "." ^ funcname in
+    match NameEnv.find_opt name !(env.named_imports) with
+      | Some fi -> G.i (Call (nr fi))
+      | _ ->
+        raise (Invalid_argument (Printf.sprintf "Function import not declared: %s\n" name))
+
+  let reuse_import (env : t) modname funcname =
+    let name = modname ^ "." ^ funcname in
+    match NameEnv.find_opt name !(env.named_imports) with
+      | Some fi -> fi
+      | _ ->
+        raise (Invalid_argument (Printf.sprintf "Function import not declared: %s\n" name))
+
+  let get_rts (env : t) = env.rts
+
+  let as_block_type env : stack_type -> block_type = function
+    | [] -> ValBlockType None
+    | [t] -> ValBlockType (Some t)
+    | ts -> VarBlockType (nr (func_type env (FuncType ([], ts))))
+
+  let if_ env tys thn els = G.if_ (as_block_type env tys) thn els
+
+  (* NB: confuses wasm-opt, don't use for now
+  let _multi_if_ env tys1 tys2 thn els =
+    G.if_
+      (VarBlockType (nr (func_type env (FuncType (tys1, tys2)))))
+      thn els
+  *)
+
+  let block_ env tys bdy = G.block_ (as_block_type env tys) bdy
+
+
+  let trap_with env msg = env.trap_with env msg
+  let then_trap_with env msg = G.if0 (trap_with env msg) G.nop
+  let else_trap_with env msg = G.if0 G.nop (trap_with env msg)
+
+  let reserve_static_memory (env : t) size : int32 =
+    if !(env.static_memory_frozen) then raise (Invalid_argument "Static memory frozen");
+    let ptr = !(env.end_of_static_memory) in
+    let aligned = Int32.logand (Int32.add size 3l) (Int32.lognot 3l) in
+    env.end_of_static_memory := Int32.add ptr aligned;
+    ptr
+
+  let write_static_memory (env : t) ptr data =
+    env.static_memory := !(env.static_memory) @ [ (ptr, data) ];
+    ()
+
+  let add_mutable_static_bytes (env : t) data : int32 =
+    let ptr = reserve_static_memory env (Int32.of_int (String.length data)) in
+    env.static_memory := !(env.static_memory) @ [ (ptr, data) ];
+    Int32.(add ptr ptr_skew) (* Return a skewed pointer *)
+
+  let add_fun_ptr (env : t) fi : int32 =
+    match FunEnv.find_opt fi !(env.func_ptrs) with
+    | Some fp -> fp
+    | None ->
+      let fp = !(env.end_of_table) in
+      env.func_ptrs := FunEnv.add fi fp !(env.func_ptrs);
+      env.end_of_table := Int32.add !(env.end_of_table) 1l;
+      fp
+
+  let get_elems env =
+    FunEnv.bindings !(env.func_ptrs)
+
+  let get_end_of_table env : int32 =
+    !(env.end_of_table)
+
+  let add_static (env : t) (data : StaticBytes.t) : int32 =
+    let b = StaticBytes.as_bytes data in
+    match StringEnv.find_opt b !(env.static_strings)  with
+    | Some ptr -> ptr
+    | None ->
+      let ptr = add_mutable_static_bytes env b  in
+      env.static_strings := StringEnv.add b ptr !(env.static_strings);
+      ptr
+
+  let object_pool_find (env: t) (key: string) : int32 option =
+    StringEnv.find_opt key !(env.object_pool)
+
+  let object_pool_add (env: t) (key: string) (ptr : int32)  : unit =
+    env.object_pool := StringEnv.add key ptr !(env.object_pool);
+    ()
+
+  let add_static_unskewed (env : t) (data : StaticBytes.t) : int32 =
+    Int32.add (add_static env data) ptr_unskew
+
+  let get_end_of_static_memory env : int32 =
+    env.static_memory_frozen := true;
+    !(env.end_of_static_memory)
+
+  let add_static_root (env : t) ptr =
+    env.static_roots := ptr :: !(env.static_roots)
+
+  let get_static_roots (env : t) =
+    !(env.static_roots)
+
+  let get_static_memory env =
+    !(env.static_memory)
+
+  let mem_size env =
+    Int32.(add (div (get_end_of_static_memory env) page_size) 1l)
+
+  let gc_strategy_name gc_strategy = match gc_strategy with
+    | Flags.MarkCompact -> "compacting"
+    | Flags.Copying -> "copying"
+    | Flags.Generational -> "generational"
+    | Flags.Incremental -> "incremental"
+
+  let collect_garbage env force =
+    (* GC function name = "schedule_"? ("compacting" | "copying" | "generational" | "incremental") "_gc" *)
+    let name = gc_strategy_name !Flags.gc_strategy in
+    let gc_fn = if force || !Flags.force_gc then name else "schedule_" ^ name in
+    call_import env "rts" (gc_fn ^ "_gc")
+
+  (* See Note [Candid subtype checks] *)
+  (* NB: we don't bother detecting duplicate registrations here because the code sharing machinery
+     ensures that `add_typtbl_typ t` is called at most once for any `t` with a distinct type hash *)
+  let add_typtbl_typ (env : t) ty : Int32.t =
+    reg env.typtbl_typs ty
+
+  let get_typtbl_typs (env : t) : Type.typ list =
+    !(env.typtbl_typs)
+
+  let add_feature (env : t) f =
+    env.features := FeatureSet.add f (!(env.features))
+
+  let get_features (env : t) = FeatureSet.elements (!(env.features))
+
+  let require_stable_memory (env : t)  =
+    if not !(env.requires_stable_memory)
+    then
+      (env.requires_stable_memory := true;
+       match mode env with
+       | Flags.ICMode | Flags.RefMode ->
+          ()
+       | Flags.WASIMode | Flags.WasmMode ->
+          add_feature env "bulk-memory";
+          add_feature env "multi-memory")
+
+  let requires_stable_memory (env : t) =
+    !(env.requires_stable_memory)
+
+  let get_memories (env : t) =
+    nr {mtype = MemoryType {min = mem_size env; max = None}}
+    ::
+    match mode env with
+    | Flags.WASIMode | Flags.WasmMode when !(env.requires_stable_memory) ->
+      [ nr {mtype = MemoryType {min = Int32.zero; max = None}} ]
+    | _ -> []
+end
+
+
+(* General code generation functions:
+   Rule of thumb: Here goes stuff that independent of the Motoko AST.
+*)
+
+(* Function called compile_* return a list of instructions (and maybe other stuff) *)
+
+let compile_unboxed_const i = G.i (Const (nr (Wasm.Values.I32 i)))
+let compile_const_64 i = G.i (Const (nr (Wasm.Values.I64 i)))
+let compile_unboxed_zero = compile_unboxed_const 0l
+let compile_unboxed_one = compile_unboxed_const 1l
+
+(* Some common arithmetic, used for pointer and index arithmetic *)
+let compile_op_const op i =
+    compile_unboxed_const i ^^
+    G.i (Binary (Wasm.Values.I32 op))
+let compile_add_const = compile_op_const I32Op.Add
+let compile_sub_const = compile_op_const I32Op.Sub
+let compile_mul_const = compile_op_const I32Op.Mul
+let compile_divU_const = compile_op_const I32Op.DivU
+let compile_shrU_const = compile_op_const I32Op.ShrU
+let compile_shrS_const = compile_op_const I32Op.ShrS
+let compile_shl_const = compile_op_const I32Op.Shl
+let compile_rotl_const = compile_op_const I32Op.Rotl
+let compile_rotr_const = compile_op_const I32Op.Rotr
+let compile_bitand_const = compile_op_const I32Op.And
+let compile_bitor_const = function
+  | 0l -> G.nop | n -> compile_op_const I32Op.Or n
+let compile_rel_const rel i =
+  compile_unboxed_const i ^^
+  G.i (Compare (Wasm.Values.I32 rel))
+let compile_eq_const = function
+  | 0l -> G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+  | i -> compile_rel_const I32Op.Eq i
+
+let compile_op64_const op i =
+    compile_const_64 i ^^
+    G.i (Binary (Wasm.Values.I64 op))
+let compile_add64_const = compile_op64_const I64Op.Add
+let compile_sub64_const = compile_op64_const I64Op.Sub
+let compile_mul64_const = compile_op64_const I64Op.Mul
+let _compile_divU64_const = compile_op64_const I64Op.DivU
+let compile_shrU64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.ShrU n
+let compile_shrS64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.ShrS n
+let compile_shl64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.Shl n
+let compile_bitand64_const = compile_op64_const I64Op.And
+let _compile_bitor64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.Or n
+let compile_xor64_const = function
+  | 0L -> G.nop | n -> compile_op64_const I64Op.Xor n
+let compile_eq64_const i =
+  compile_const_64 i ^^
+  G.i (Compare (Wasm.Values.I64 I64Op.Eq))
+
+(* more random utilities *)
+
+let bytes_of_int32 (i : int32) : string =
+  let b = Buffer.create 4 in
+  let i = Int32.to_int i in
+  Buffer.add_char b (Char.chr (i land 0xff));
+  Buffer.add_char b (Char.chr ((i lsr 8) land 0xff));
+  Buffer.add_char b (Char.chr ((i lsr 16) land 0xff));
+  Buffer.add_char b (Char.chr ((i lsr 24) land 0xff));
+  Buffer.contents b
+
+(* A common variant of todo *)
+
+let todo_trap env fn se = todo fn se (E.trap_with env ("TODO: " ^ fn))
+let _todo_trap_SR env fn se = todo fn se (SR.Unreachable, E.trap_with env ("TODO: " ^ fn))
+
+(* Locals *)
+
+let new_local_ env t name =
+  let i = E.add_anon_local env t in
+  E.add_local_name env i name;
+  ( G.i (LocalSet (nr i))
+  , G.i (LocalGet (nr i))
+  , i
+  )
+
+let new_local env name =
+  let (set_i, get_i, _) = new_local_ env I32Type name
+  in (set_i, get_i)
+
+let new_local64 env name =
+  let (set_i, get_i, _) = new_local_ env I64Type name
+  in (set_i, get_i)
+
+(* Some common code macros *)
+
+(* Iterates while cond is true. *)
+let compile_while env cond body =
+    G.loop0 (
+      cond ^^ G.if0 (body ^^ G.i (Br (nr 1l))) G.nop
+    )
+
+(* Expects a number n on the stack. Iterates from m to below that number. *)
+let from_m_to_n env m mk_body =
+    let (set_n, get_n) = new_local env "n" in
+    let (set_i, get_i) = new_local env "i" in
+    set_n ^^
+    compile_unboxed_const m ^^
+    set_i ^^
+
+    compile_while env
+      ( get_i ^^
+        get_n ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.LtU))
+      ) (
+        mk_body get_i ^^
+
+        get_i ^^
+        compile_add_const 1l ^^
+        set_i
+      )
+
+(* Expects a number on the stack. Iterates from zero to below that number. *)
+let from_0_to_n env mk_body = from_m_to_n env 0l mk_body
+
+(* Pointer reference and dereference  *)
+
+let load_unskewed_ptr : G.t =
+  G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None})
+
+let store_unskewed_ptr : G.t =
+  G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None})
+
+let load_ptr : G.t =
+  G.i (Load {ty = I32Type; align = 2; offset = ptr_unskew; sz = None})
+
+let store_ptr : G.t =
+  G.i (Store {ty = I32Type; align = 2; offset = ptr_unskew; sz = None})
+
+module FakeMultiVal = struct
+  (* For some use-cases (e.g. processing the compiler output with analysis
+     tools) it is useful to avoid the multi-value extension.
+
+     This module provides mostly transparent wrappers that put multiple values
+     in statically allocated globals and pull them off again.
+
+     So far only does I32Type (but that could be changed).
+
+     If the multi_value flag is on, these do not do anything.
+  *)
+  let ty tys =
+    if !Flags.multi_value || List.length tys <= 1
+    then tys
+    else []
+
+  let global env i =
+    E.get_global32_lazy env (Printf.sprintf "multi_val_%d" i) Mutable 0l
+
+  let store env tys =
+    if !Flags.multi_value || List.length tys <= 1 then G.nop else
+    G.concat_mapi (fun i ty ->
+      assert(ty = I32Type);
+      G.i (GlobalSet (nr (global env i)))
+    ) tys
+
+  let load env tys =
+    if !Flags.multi_value || List.length tys <= 1 then G.nop else
+    let n = List.length tys - 1 in
+    G.concat_mapi (fun i ty ->
+      assert(ty = I32Type);
+      G.i (GlobalGet (nr (global env (n - i))))
+    ) tys
+
+  (* A drop-in replacement for E.if_ *)
+  let if_ env bt thn els =
+    E.if_ env (ty bt) (thn ^^ store env bt) (els ^^ store env bt) ^^
+    load env bt
+
+  (* A block that can be exited from *)
+  let block_ env bt body =
+    E.block_ env (ty bt) (G.with_current_depth (fun depth ->
+      body (store env bt ^^ G.branch_to_ depth)
+    )) ^^
+    load env bt
+
+end (* FakeMultiVal *)
+
+module Func = struct
+  (* This module contains basic bookkeeping functionality to define functions,
+     in particular creating the environment, and finally adding it to the environment.
+  *)
+
+
+  let of_body env params retty mk_body =
+    let env1 = E.mk_fun_env env (Int32.of_int (List.length params)) (List.length retty) in
+    List.iteri (fun i (n,_t) -> E.add_local_name env1 (Int32.of_int i) n) params;
+    let ty = FuncType (List.map snd params, FakeMultiVal.ty retty) in
+    let body = G.to_instr_list (
+      mk_body env1 ^^ FakeMultiVal.store env1 retty
+    ) in
+    (nr { ftype = nr (E.func_type env ty);
+          locals = E.get_locals env1;
+          body }
+    , E.get_local_names env1)
+
+  let define_built_in env name params retty mk_body =
+    E.define_built_in env name (lazy (of_body env params retty mk_body))
+
+  type sharing =
+    Always (* i.e. never inline *)
+  | Never  (* i.e. always inline *)
+
+  (* (Almost) transparently lift code into a function and call this function,
+     unless sharing = Never and not (!Flags.share_code) in which case the code
+     is inlined.
+     NB: inlined code must not be recursive nor `return`.
+  *)
+  (* Also add a hack to support multiple return values *)
+  let share_code sharing env name params retty mk_body =
+    if sharing = Always || !Flags.share_code
+    then
+      let getters =
+        List.mapi
+          (fun i (n, t) -> (G.i (LocalGet (nr (Int32.of_int i)))))
+          params
+      in
+      define_built_in env name params retty (fun env -> mk_body env getters);
+      G.i (Call (nr (E.built_in env name))) ^^
+      FakeMultiVal.load env retty
+    else begin
+      assert (sharing = Never);
+      let locals =
+        List.map
+           (fun (n, t) -> new_local_ env t n)
+           params
+      in
+      let set_locals = List.fold_right (fun (set, get, _) is-> is ^^ set) locals G.nop in
+      let getters = List.map (fun (set, get, _) -> get) locals in
+      set_locals ^^
+      mk_body env getters ^^ FakeMultiVal.store env retty ^^
+      FakeMultiVal.load env retty
+   end
+
+  (* Shorthands for various arities *)
+  let [@warning "-8"] share_code0 sharing env name retty mk_body =
+    share_code sharing env name [] retty (fun env [] -> mk_body env)
+  let [@warning "-8"] share_code1 sharing env name p1 retty mk_body =
+    share_code sharing env name [p1] retty (fun env [g1] -> mk_body env
+        g1
+    )
+  let [@warning "-8"] share_code2 sharing env name (p1,p2) retty mk_body =
+    share_code sharing env name [p1; p2] retty (fun env [g1; g2] -> mk_body env
+      g1
+      g2
+    )
+  let [@warning "-8"] share_code3 sharing env name (p1, p2, p3) retty mk_body =
+    share_code sharing env name [p1; p2; p3] retty (fun env [g1; g2; g3] -> mk_body env
+      g1
+      g2
+      g3
+    )
+  let [@warning "-8"] _share_code4 sharing env name (p1, p2, p3, p4) retty mk_body =
+    share_code sharing env name [p1; p2; p3; p4] retty (fun env [g1; g2; g3; g4]-> mk_body env
+      g1
+      g2
+      g3
+      g4
+    )
+  let [@warning "-8"] share_code6 sharing env name (p1, p2, p3, p4, p5, p6) retty mk_body =
+    share_code sharing env name [p1; p2; p3; p4; p5; p6] retty (fun env [g1; g2; g3; g4; g5; g6] -> mk_body env
+      g1
+      g2
+      g3
+      g4
+      g5
+      g6
+    )
+  let [@warning "-8"] _share_code7 sharing env name (p1, p2, p3, p4, p5, p6, p7) retty mk_body =
+    share_code sharing env name [p1; p2; p3; p4; p5; p6; p7] retty (fun env [g1; g2; g3; g4; g5; g6; g7] -> mk_body env
+      g1
+      g2
+      g3
+      g4
+      g5
+      g6
+      g7
+    )
+
+  let [@warning "-8"] _share_code9 sharing env name (p1, p2, p3, p4, p5, p6, p7, p8, p9) retty mk_body =
+    share_code sharing env name [p1; p2; p3; p4; p5; p6; p7; p8; p9] retty (fun env [g1; g2; g3; g4; g5; g6; g7; g8; g9] -> mk_body env
+      g1
+      g2
+      g3
+      g4
+      g5
+      g6
+      g7
+      g8
+      g9
+    )
+
+
+end (* Func *)
+
+module RTS = struct
+  let incremental_gc_imports env =
+    E.add_func_import env "rts" "initialize_incremental_gc" [] [];
+    E.add_func_import env "rts" "schedule_incremental_gc" [] [];
+    E.add_func_import env "rts" "incremental_gc" [] [];
+    E.add_func_import env "rts" "write_with_barrier" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "allocation_barrier" [I32Type] [I32Type];
+    E.add_func_import env "rts" "stop_gc_on_upgrade" [] [];
+    E.add_func_import env "rts" "running_gc" [] [I32Type];
+    ()
+
+  let non_incremental_gc_imports env =
+    E.add_func_import env "rts" "initialize_copying_gc" [] [];
+    E.add_func_import env "rts" "initialize_compacting_gc" [] [];
+    E.add_func_import env "rts" "initialize_generational_gc" [] [];
+    E.add_func_import env "rts" "schedule_copying_gc" [] [];
+    E.add_func_import env "rts" "schedule_compacting_gc" [] [];
+    E.add_func_import env "rts" "schedule_generational_gc" [] [];
+    E.add_func_import env "rts" "copying_gc" [] [];
+    E.add_func_import env "rts" "compacting_gc" [] [];
+    E.add_func_import env "rts" "generational_gc" [] [];
+    E.add_func_import env "rts" "post_write_barrier" [I32Type] [];
+    ()
+
+  (* The connection to the C and Rust parts of the RTS *)
+  let system_imports env =
+    E.add_func_import env "rts" "memcpy" [I32Type; I32Type; I32Type] [I32Type]; (* standard libc memcpy *)
+    E.add_func_import env "rts" "memcmp" [I32Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "version" [] [I32Type];
+    E.add_func_import env "rts" "parse_idl_header" [I32Type; I32Type; I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "idl_sub_buf_words" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "idl_sub_buf_init" [I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "idl_sub"
+      [I32Type; I32Type; I32Type; I32Type; I32Type; I32Type; I32Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "leb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "sleb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_word32" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_int32" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_word32_wrap" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_word32_trap" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_word32_trap_with" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_word64" [I64Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_int64" [I64Type] [I32Type];
+    E.add_func_import env "rts" "bigint_of_float64" [F64Type] [I32Type];
+    E.add_func_import env "rts" "bigint_to_float64" [I32Type] [F64Type];
+    E.add_func_import env "rts" "bigint_to_word64_wrap" [I32Type] [I64Type];
+    E.add_func_import env "rts" "bigint_to_word64_trap" [I32Type] [I64Type];
+    E.add_func_import env "rts" "bigint_eq" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_isneg" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_count_bits" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_2complement_bits" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_lt" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_gt" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_le" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_ge" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_add" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sub" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_mul" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_rem" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_div" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_pow" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_neg" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_lsh" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_rsh" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_abs" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_leb128_size" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_leb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_leb128_stream_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_leb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_leb128_decode_word64" [I64Type; I64Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sleb128_size" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sleb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_sleb128_stream_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "bigint_sleb128_decode" [I32Type] [I32Type];
+    E.add_func_import env "rts" "bigint_sleb128_decode_word64" [I64Type; I64Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "leb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "sleb128_encode" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "utf8_valid" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "utf8_validate" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "skip_leb128" [I32Type] [];
+    E.add_func_import env "rts" "skip_any" [I32Type; I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "find_field" [I32Type; I32Type; I32Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "skip_fields" [I32Type; I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "remember_continuation" [I32Type] [I32Type];
+    E.add_func_import env "rts" "recall_continuation" [I32Type] [I32Type];
+    E.add_func_import env "rts" "peek_future_continuation" [I32Type] [I32Type];
+    E.add_func_import env "rts" "continuation_count" [] [I32Type];
+    E.add_func_import env "rts" "continuation_table_size" [] [I32Type];
+    E.add_func_import env "rts" "blob_of_text" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_compare" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "text_concat" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "text_iter_done" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_iter" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_iter_next" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_len" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_of_ptr_size" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "text_singleton" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_size" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_to_buf" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "text_lowercase" [I32Type] [I32Type];
+    E.add_func_import env "rts" "text_uppercase" [I32Type] [I32Type];
+    E.add_func_import env "rts" "region_init" [I32Type] [];
+    E.add_func_import env "rts" "alloc_region" [I64Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "init_region" [I32Type; I64Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "region_new" [] [I32Type];
+    E.add_func_import env "rts" "region_id" [I32Type] [I64Type];
+    E.add_func_import env "rts" "region_page_count" [I32Type] [I32Type];
+    E.add_func_import env "rts" "region_vec_pages" [I32Type] [I32Type];
+    E.add_func_import env "rts" "region_size" [I32Type] [I64Type];
+    E.add_func_import env "rts" "region_grow" [I32Type; I64Type] [I64Type];
+    E.add_func_import env "rts" "region_load_blob" [I32Type; I64Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "region_store_blob" [I32Type; I64Type; I32Type] [];
+    E.add_func_import env "rts" "region_load_word8" [I32Type; I64Type] [I32Type];
+    E.add_func_import env "rts" "region_store_word8" [I32Type; I64Type; I32Type] [];
+    E.add_func_import env "rts" "region_load_word16" [I32Type; I64Type] [I32Type];
+    E.add_func_import env "rts" "region_store_word16" [I32Type; I64Type; I32Type] [];
+    E.add_func_import env "rts" "region_load_word32" [I32Type; I64Type] [I32Type];
+    E.add_func_import env "rts" "region_store_word32" [I32Type; I64Type; I32Type] [];
+    E.add_func_import env "rts" "region_load_word64" [I32Type; I64Type] [I64Type];
+    E.add_func_import env "rts" "region_store_word64" [I32Type; I64Type; I64Type] [];
+    E.add_func_import env "rts" "region_load_float64" [I32Type; I64Type] [F64Type];
+    E.add_func_import env "rts" "region_store_float64" [I32Type; I64Type; F64Type] [];
+    E.add_func_import env "rts" "region0_get" [] [I32Type];
+    E.add_func_import env "rts" "blob_of_principal" [I32Type] [I32Type];
+    E.add_func_import env "rts" "principal_of_blob" [I32Type] [I32Type];
+    E.add_func_import env "rts" "compute_crc32" [I32Type] [I32Type];
+    E.add_func_import env "rts" "blob_iter_done" [I32Type] [I32Type];
+    E.add_func_import env "rts" "blob_iter" [I32Type] [I32Type];
+    E.add_func_import env "rts" "blob_iter_next" [I32Type] [I32Type];
+    E.add_func_import env "rts" "pow" [F64Type; F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "sin" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "cos" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "tan" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "asin" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "acos" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "atan" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "atan2" [F64Type; F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "exp" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "log" [F64Type] [F64Type]; (* musl *)
+    E.add_func_import env "rts" "fmod" [F64Type; F64Type] [F64Type]; (* remainder, musl *)
+    E.add_func_import env "rts" "float_fmt" [F64Type; I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "char_to_upper" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_to_lower" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_whitespace" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_lowercase" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_uppercase" [I32Type] [I32Type];
+    E.add_func_import env "rts" "char_is_alphabetic" [I32Type] [I32Type];
+    E.add_func_import env "rts" "get_max_live_size" [] [I32Type];
+    E.add_func_import env "rts" "get_reclaimed" [] [I64Type];
+    E.add_func_import env "rts" "alloc_words" [I32Type] [I32Type];
+    E.add_func_import env "rts" "get_total_allocations" [] [I64Type];
+    E.add_func_import env "rts" "get_heap_size" [] [I32Type];
+    E.add_func_import env "rts" "alloc_blob" [I32Type] [I32Type];
+    E.add_func_import env "rts" "alloc_array" [I32Type] [I32Type];
+    E.add_func_import env "rts" "alloc_stream" [I32Type] [I32Type];
+    E.add_func_import env "rts" "stream_write" [I32Type; I32Type; I32Type] [];
+    E.add_func_import env "rts" "stream_write_byte" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "stream_write_text" [I32Type; I32Type] [];
+    E.add_func_import env "rts" "stream_split" [I32Type] [I32Type];
+    E.add_func_import env "rts" "stream_shutdown" [I32Type] [];
+    E.add_func_import env "rts" "stream_reserve" [I32Type; I32Type] [I32Type];
+    E.add_func_import env "rts" "stream_stable_dest" [I32Type; I64Type; I64Type] [];
+    if !Flags.gc_strategy = Flags.Incremental then
+      incremental_gc_imports env
+    else
+      non_incremental_gc_imports env;
+    ()
+
+end (* RTS *)
+
+module GC = struct
+  (* Record mutator/gc instructions counts *)
+
+  let instruction_counter env =
+    compile_unboxed_zero ^^
+    E.call_import env "ic0" "performance_counter"
+
+  let register_globals env =
+    E.add_global64 env "__mutator_instructions" Mutable 0L;
+    E.add_global64 env "__collector_instructions" Mutable 0L;
+    if !Flags.gc_strategy <> Flags.Incremental then
+      E.add_global32 env "_HP" Mutable 0l
+
+  let get_mutator_instructions env =
+    G.i (GlobalGet (nr (E.get_global env "__mutator_instructions")))
+  let set_mutator_instructions env =
+    G.i (GlobalSet (nr (E.get_global env "__mutator_instructions")))
+
+  let get_collector_instructions env =
+    G.i (GlobalGet (nr (E.get_global env "__collector_instructions")))
+  let set_collector_instructions env =
+    G.i (GlobalSet (nr (E.get_global env "__collector_instructions")))
+
+  let get_heap_pointer env =
+    if !Flags.gc_strategy <> Flags.Incremental then
+      G.i (GlobalGet (nr (E.get_global env "_HP")))
+    else
+      assert false
+  let set_heap_pointer env =
+    if !Flags.gc_strategy <> Flags.Incremental then
+      G.i (GlobalSet (nr (E.get_global env "_HP")))
+    else
+      assert false
+
+  let record_mutator_instructions env =
+    match E.mode env with
+    | Flags.(ICMode | RefMode)  ->
+      instruction_counter env ^^
+      set_mutator_instructions env
+    | _ -> G.nop
+
+  let record_collector_instructions env =
+    match E.mode env with
+    | Flags.(ICMode | RefMode)  ->
+      instruction_counter env ^^
+      get_mutator_instructions env ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+      set_collector_instructions env
+    | _ -> G.nop
+
+  let collect_garbage env =
+    record_mutator_instructions env ^^
+    E.collect_garbage env false ^^
+    record_collector_instructions env
+
+end (* GC *)
+
+module Heap = struct
+  (* General heap object functionality (allocation, setting fields, reading fields) *)
+
+  (* Memory addresses are 32 bit (I32Type). *)
+  let word_size = 4l
+
+  (* The heap base global can only be used late, see conclude_module
+     and GHC.register *)
+  let get_heap_base env =
+    G.i (GlobalGet (nr (E.get_global env "__heap_base")))
+
+  let get_total_allocation env =
+    E.call_import env "rts" "get_total_allocations"
+
+  let get_reclaimed env =
+    E.call_import env "rts" "get_reclaimed"
+
+  let get_memory_size =
+    G.i MemorySize ^^
+    G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+    compile_mul64_const page_size64
+
+  let get_max_live_size env =
+    E.call_import env "rts" "get_max_live_size"
+
+  (* Static allocation (always words)
+     (uses dynamic allocation for smaller and more readable code) *)
+  let alloc env (n : int32) : G.t =
+    compile_unboxed_const n ^^
+    E.call_import env "rts" "alloc_words"
+
+  let ensure_allocated env =
+    alloc env 0l ^^ G.i Drop (* dummy allocation, ensures that the page HP points into is backed *)
+
+  (* Heap objects *)
+
+  (* At this level of abstraction, heap objects are just flat arrays of words *)
+
+  let load_field_unskewed (i : int32) : G.t =
+    let offset = Int32.mul word_size i in
+    G.i (Load {ty = I32Type; align = 2; offset; sz = None})
+
+  let load_field (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Load {ty = I32Type; align = 2; offset; sz = None})
+
+  let store_field (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Store {ty = I32Type; align = 2; offset; sz = None})
+
+  (* Although we occasionally want to treat two consecutive
+     32 bit fields as one 64 bit number *)
+
+  (* Requires little-endian encoding, see also `Stream` in `types.rs` *)
+  let load_field64_unskewed (i : int32) : G.t =
+    let offset = Int32.mul word_size i in
+    G.i (Load {ty = I64Type; align = 2; offset; sz = None})
+
+  let load_field64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Load {ty = I64Type; align = 2; offset; sz = None})
+
+  let store_field64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Store {ty = I64Type; align = 2; offset; sz = None})
+
+  (* Or even as a single 64 bit float *)
+
+  let load_field_float64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Load {ty = F64Type; align = 2; offset; sz = None})
+
+  let store_field_float64 (i : int32) : G.t =
+    let offset = Int32.(add (mul word_size i) ptr_unskew) in
+    G.i (Store {ty = F64Type; align = 2; offset; sz = None})
+
+  (* Convenience functions related to memory *)
+  (* Copying bytes (works on unskewed memory addresses) *)
+  let memcpy env = E.call_import env "rts" "memcpy" ^^ G.i Drop
+  (* Comparing bytes (works on unskewed memory addresses) *)
+  let memcmp env = E.call_import env "rts" "memcmp"
+
+  let register env =
+    let get_heap_base_fn = E.add_fun env "get_heap_base" (Func.of_body env [] [I32Type] (fun env ->
+      get_heap_base env
+    )) in
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "get_heap_base";
+      edesc = nr (FuncExport (nr get_heap_base_fn))
+    })
+
+  let get_heap_size env =
+    E.call_import env "rts" "get_heap_size"
+
+end (* Heap *)
+
+module Stack = struct
+  (* The RTS includes C code which requires a shadow stack in linear memory.
+     We reserve some space for it at the beginning of memory space (just like
+     wasm-l would), this way stack overflow would cause out-of-memory, and not
+     just overwrite static data.
+
+     We sometimes use the stack space if we need small amounts of scratch space.
+
+     All pointers here are unskewed.
+
+     (We report logical stack overflow as "RTS Stack underflow" as the stack
+     grows downwards.)
+  *)
+
+  let end_ () = Int32.mul (Int32.of_int (!Flags.rts_stack_pages)) page_size
+
+  let register_globals env =
+    (* stack pointer *)
+    E.add_global32 env "__stack_pointer" Mutable (end_());
+    (* frame pointer *)
+    E.add_global32 env "__frame_pointer" Mutable (end_());
+    (* low watermark *)
+    if !Flags.measure_rts_stack then
+      E.add_global32 env "__stack_min" Mutable (end_());
+    E.export_global env "__stack_pointer"
+
+  let get_stack_ptr env =
+    G.i (GlobalGet (nr (E.get_global env "__stack_pointer")))
+  let set_stack_ptr env =
+    G.i (GlobalSet (nr (E.get_global env "__stack_pointer")))
+
+  let get_min env =
+    G.i (GlobalGet (nr (E.get_global env "__stack_min")))
+  let set_min env =
+    G.i (GlobalSet (nr (E.get_global env "__stack_min")))
+
+  let get_max_stack_size env =
+    if !Flags.measure_rts_stack then
+      compile_unboxed_const (end_()) ^^
+      get_min env ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+    else (* report max available *)
+      compile_unboxed_const (end_())
+
+  let update_stack_min env =
+    if !Flags.measure_rts_stack then
+    get_stack_ptr env ^^
+    get_min env ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+    (G.if0
+       (get_stack_ptr env ^^
+        set_min env)
+      G.nop)
+    else G.nop
+
+  let stack_overflow env =
+    Func.share_code0 Func.Never env "stack_overflow" [] (fun env ->
+      (* read last word of reserved page to force trap *)
+      compile_unboxed_const 0xFFFF_FFFCl ^^
+      G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+      G.i Unreachable
+    )
+
+  let alloc_words env n =
+    let n_bytes = Int32.mul n Heap.word_size in
+    (* avoid absurd allocations *)
+    assert Int32.(to_int n_bytes < !Flags.rts_stack_pages * to_int page_size);
+    (* alloc words *)
+    get_stack_ptr env ^^
+    compile_unboxed_const n_bytes ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+    set_stack_ptr env ^^
+    update_stack_min env ^^
+    get_stack_ptr env ^^
+    (* check for stack overflow, if necessary *)
+    if n_bytes >= page_size then
+      get_stack_ptr env ^^
+      G.i (Unary (Wasm.Values.I32 I32Op.Clz)) ^^
+      G.if0
+        G.nop (* we found leading zeros, i.e. no wraparound *)
+        (stack_overflow env)
+    else
+      G.nop
+
+  let free_words env n =
+    get_stack_ptr env ^^
+    compile_unboxed_const (Int32.mul n Heap.word_size) ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_stack_ptr env
+
+  (* TODO: why not just remember and reset the stack pointer, instead of calling free_words? Also below *)
+  let with_words env name n f =
+    let (set_x, get_x) = new_local env name in
+    alloc_words env n ^^ set_x ^^
+    f get_x ^^
+    free_words env n
+
+
+  let dynamic_alloc_words env get_n =
+    get_stack_ptr env ^^
+    compile_divU_const Heap.word_size ^^
+    get_n ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+    (G.if0
+      (stack_overflow env)
+      G.nop) ^^
+    get_stack_ptr env ^^
+    get_n ^^
+    compile_mul_const Heap.word_size ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+    set_stack_ptr env ^^
+    update_stack_min env ^^
+    get_stack_ptr env
+
+  let dynamic_free_words env get_n =
+    get_stack_ptr env ^^
+    get_n ^^
+    compile_mul_const Heap.word_size ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_stack_ptr env
+
+  (* TODO: why not just remember and reset the stack pointer, instead of calling free_words? Also above*)
+  let dynamic_with_words env name f =
+    let (set_n, get_n) = new_local env "n" in
+    let (set_x, get_x) = new_local env name in
+    set_n ^^
+    dynamic_alloc_words env get_n ^^ set_x ^^
+    f get_x ^^
+    dynamic_free_words env get_n
+
+  let dynamic_with_bytes env name f =
+    (* round up to nearest wordsize *)
+    compile_add_const (Int32.sub Heap.word_size 1l) ^^
+    compile_divU_const Heap.word_size ^^
+    dynamic_with_words env name f
+
+  (* Stack Frames *)
+
+  (* Traditional frame pointer for accessing statically allocated locals/args (all words)
+     Used (sofar) only in serialization to compress Wasm stack
+     at cost of expanding Rust/C Stack (whose size we control)*)
+  let get_frame_ptr env =
+    G.i (GlobalGet (nr (E.get_global env "__frame_pointer")))
+  let set_frame_ptr env =
+    G.i (GlobalSet (nr (E.get_global env "__frame_pointer")))
+
+  (* Frame pointer operations *)
+
+  (* Enter/exit a new frame of `n` words, saving and restoring prev frame pointer *)
+  let with_frame env name n f =
+    (* reserve space for n words + saved frame_ptr *)
+    alloc_words env (Int32.add n 1l) ^^
+    (* store the current frame_ptr at offset 0*)
+    get_frame_ptr env ^^
+    G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+    get_stack_ptr env ^^
+    (* set_frame_ptr to stack_ptr *)
+    set_frame_ptr env ^^
+    (* do as f *)
+    f () ^^
+    (* assert frame_ptr == stack_ptr *)
+    get_frame_ptr env ^^
+    get_stack_ptr env ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    E.else_trap_with env "frame_ptr <> stack_ptr" ^^
+    (* restore the saved frame_ptr *)
+    get_frame_ptr env ^^
+    G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+    set_frame_ptr env ^^
+    (* free the frame *)
+    free_words env (Int32.add n 1l)
+
+  (* read local n of current frame *)
+  let get_local env n =
+    let offset = Int32.mul (Int32.add n 1l) Heap.word_size in
+    get_frame_ptr env ^^
+      G.i (Load { ty = I32Type; align = 2; offset; sz = None})
+
+  (* read local n of previous frame *)
+  let get_prev_local env n =
+    let offset = Int32.mul (Int32.add n 1l) Heap.word_size in
+    (* indirect through save frame_ptr at offset 0 *)
+    get_frame_ptr env ^^
+    G.i (Load { ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+    G.i (Load { ty = I32Type; align = 2; offset; sz = None})
+
+  (* set local n of current frame *)
+  let set_local env n =
+    let offset = Int32.mul (Int32.add n 1l) Heap.word_size in
+    Func.share_code1 Func.Never env ("set_local %i" ^ Int32.to_string n) ("val", I32Type) []
+      (fun env get_val ->
+         get_frame_ptr env ^^
+         get_val ^^
+         G.i (Store { ty = I32Type; align = 2; offset; sz = None}))
+
+end (* Stack *)
+
+
+module ContinuationTable = struct
+  (* See rts/motoko-rts/src/closure_table.rs *)
+  let remember env : G.t = E.call_import env "rts" "remember_continuation"
+  let recall env : G.t = E.call_import env "rts" "recall_continuation"
+  let peek_future env : G.t = E.call_import env "rts" "peek_future_continuation"
+  let count env : G.t = E.call_import env "rts" "continuation_count"
+  let size env : G.t = E.call_import env "rts" "continuation_table_size"
+end (* ContinuationTable *)
+
+module Bool = struct
+  (* Boolean literals are either 0 or 1, at StackRep Vanilla
+     They need not be shifted before put in the heap,
+     because the "zero page" never contains GC-ed objects
+  *)
+
+  let vanilla_lit = function
+    | false -> 0l
+    | true -> 1l
+
+  let lit b = compile_unboxed_const (vanilla_lit b)
+
+  let neg = G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+
+end (* Bool *)
+
+module BitTagged = struct
+
+  (* This module takes care of pointer tagging:
+
+     A pointer to an object at offset `i` on the heap is represented as
+     `i-1`, so the low two bits of the pointer are always set (0b…11).
+     We call `i-1` a *skewed* pointer, in a feeble attempt to avoid the term
+     shifted, which may sound like a logical shift.
+
+     We use the constants ptr_skew and ptr_unskew to change a pointer as a
+     signpost where we switch between raw pointers to skewed ones.
+
+     This means we can store a small unboxed scalar x as (x `lsl` 1), and still
+     tell it apart from a pointer by looking at the last bits: if set, it is a
+     pointer.
+
+     Small here means:
+
+     * 0 ≤ x < 2^(ubits ty) for an unsigned type ty with (ubits ty) payload bits
+     * -2^sbits ≤ x < 2^sbits, for a signed type ty with (sbits ty) (= (ubits ty) - 1) payload bits
+       (i.e. excluding sign bit),
+     with the exception that compact Nat is regarded as signed to support subtyping.
+
+     Tagging needs to happen with a
+     * shift left by (32-ubits ty) for a signed or unsigned type ty; then
+     * a logical or of the (variable length) tag bits for ty.
+
+     Untagging needs to happen with an
+     * logical right shift (for unsigned type ty in Nat{8,16,32,64}, Char).
+     * _arithmetic_ right shift (for signed type ty Int{8,16,32,64}, Int but also Nat).
+       This is the right thing to do for signed numbers.
+       Nat is treated as signed to allow coercion-free subtyping.
+
+     The low bits 32 - (ubits ty) store the tag bits of the value.
+
+     Boolean false is a non-pointer by construction.
+     Boolean true (1) needs not be shifted as GC will not consider it.
+
+     Summary:
+
+       0b…11: A pointer
+       0b…x0: A shifted scalar
+       0b000: `false`
+       0b001: `true`
+
+     Note that {Nat,Int}{8,16} and compact {Int,Nat}{32,64} and compact Int, Nat are explicitly tagged.
+     The bits are stored in the _most_ significant bits of the `i32`,
+     with the lower bits storing the variable length tag.
+
+     {Int,Nat}{32,64} are stored in signed and unsigned forms.
+
+     Compact {Int,Nat} are (both) stored in signed form to support coercion free subtyping of Nat < Int.
+     That means that one bit, the highest bit, of the compact Nat representation is unused and the
+     representable range for both compact Int and Nat values is -2^(sbits Int) ≤ x < 2^(sbits Int).
+
+     This describes the vanilla representation of small and compact scalars,
+     used as the uniform representation of values and when stored in heap structures.
+
+     See module TaggedSmallWord.
+
+     The stack representation of a small scalars, UnboxedWord32 {Int,Nat}{8,16},
+     on the other hand, always has all tag bits cleared, with the payload in the high bits of the word.
+
+     The stack representation of compact or unboxed scalars, UnboxedWord32 {Int,Nat}32 or
+     UnboxedWord64 {Int,Nat}64, on the other hand, is the natural (unpadded) machine representation.
+
+     All arithmetic is implemented directly on the stack (not vanilla) representation of scalars.
+     Proper tags bits are removed/added when loading from vanilla or storing to vanilla representation.
+
+  *)
+  let is_true_literal env =
+    compile_eq_const 1l
+
+  (* Note: `true` is not handled here, needs specific check where needed. *)
+  let if_tagged_scalar env retty is1 is2 =
+    compile_bitand_const 0x1l ^^
+    E.if_ env retty is2 is1
+
+  (* With two bit-tagged pointers on the stack, decide
+     whether both are scalars and invoke is1 (the fast path)
+     if so, and otherwise is2 (the slow path).
+     Note: `true` is not handled here, needs specific check where needed.
+  *)
+  let if_both_tagged_scalar env retty is1 is2 =
+    G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+    compile_bitand_const 0x1l ^^
+    E.if_ env retty is2 is1
+
+  let ubits_of pty = TaggingScheme.ubits_of pty
+
+  let sbits_of pty = (ubits_of pty) - 1
+
+  (* 64 bit numbers *)
+
+  (* static *)
+  let can_tag_const pty (n : int64) = Type.(
+    match pty with
+    | Nat | Int | Int64 | Int32 ->
+      let sbits = sbits_of pty in
+      let lower_bound = Int64.(neg (shift_left 1L sbits)) in
+      let upper_bound = Int64.shift_left 1L sbits in
+      lower_bound <= n && n < upper_bound
+    | Nat64 | Nat32 ->
+      let ubits = ubits_of pty in
+      let upper_bound = Int64.shift_left 1L ubits in
+      0L <= n && n < upper_bound
+    | _ -> assert false)
+
+  let tag_const pty i = Type.(
+    match pty with
+    |  Nat | Int | Int64 | Int32
+    |  Nat64 | Nat32 ->
+      Int32.shift_left (Int64.to_int32 i) (32 - ubits_of pty)
+      (* tag *)
+      |> Int32.logor (TaggingScheme.tag_of_typ pty)
+    | _ -> assert false)
+
+  (* dynamic *)
+  let sanity_check_can_tag_i64 env pty get_x =
+    if TaggingScheme.debug || !Flags.sanity then
+      get_x ^^
+      Func.share_code2 Func.Always env (prim_fun_name pty "check_can_tag_i64") (("res", I32Type), ("x", I64Type)) [I32Type]
+        (fun env get_res get_x -> Type.(
+          match pty with
+          | Nat | Int | Int64 | Int32 ->
+            let sbits = sbits_of pty in
+            let lower_bound = Int64.(neg (shift_left 1L sbits)) in
+            let upper_bound = Int64.shift_left 1L sbits in
+            (* lower_bound <= x < upper_bound *)
+            compile_const_64 lower_bound ^^
+            get_x ^^
+            G.i (Compare (Wasm.Values.I64 I32Op.LeS)) ^^
+            get_x ^^ compile_const_64 upper_bound ^^
+            G.i (Compare (Wasm.Values.I64 I32Op.LtS)) ^^
+            G.i (Binary (Wasm.Values.I32 I32Op.And))
+         | Nat64 | Nat32 ->
+            let ubits = ubits_of pty in
+            let upper_bound = Int64.shift_left 1L ubits in
+            (* 0 <= x < upper_bound *)
+            get_x ^^ compile_const_64 upper_bound ^^
+            G.i (Compare (Wasm.Values.I64 I32Op.LtU))
+         | _ ->
+            assert false) ^^
+         get_res ^^
+         G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+         E.else_trap_with env (prim_fun_name pty "check_can_tag_i64") ^^
+         get_res)
+    else
+      G.nop
+
+  let if_can_tag_i64 env pty retty is1 is2 = Type.(
+    match pty with
+    | Nat | Int | Int64 | Int32 ->
+      Func.share_code1 Func.Never env
+        (prim_fun_name pty "if_can_tag_i64") ("x", I64Type) [I32Type] (fun env get_x ->
+        (* checks that all but the low sbits are either all 0 or all 1 *)
+        get_x ^^
+        get_x ^^ compile_shrS64_const (Int64.of_int (64 - sbits_of pty)) ^^
+        G.i (Binary (Wasm.Values.I64 I32Op.Xor)) ^^
+        compile_shrU64_const (Int64.of_int (sbits_of pty)) ^^
+        G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+        sanity_check_can_tag_i64 env pty get_x) ^^
+      E.if_ env retty is1 is2
+    | Nat64 | Nat32 ->
+      Func.share_code1 Func.Never env
+         (prim_fun_name pty "if_can_tag_i64") ("x", I64Type) [I32Type] (fun env get_x ->
+          (* checks that all but the low ubits are 0 *)
+          get_x ^^ compile_shrU64_const (Int64.of_int (ubits_of pty)) ^^
+          G.i (Test (Wasm.Values.I64 I32Op.Eqz)) ^^
+          sanity_check_can_tag_i64 env pty get_x) ^^
+      E.if_ env retty is1 is2
+     | _ -> assert false)
+
+  let if_can_tag_u64 env pty retty is1 is2 = Type.(
+    match pty with
+    |  Nat | Int | Int64 | Int32 ->
+      let sbitsL = Int64.of_int (sbits_of pty) in
+      compile_shrU64_const sbitsL ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      E.if_ env retty is1 is2
+    | Nat64 | Nat32 ->
+      let ubitsL = Int64.of_int (ubits_of pty) in
+      compile_shrU64_const ubitsL ^^
+      E.if_ env retty is2 is1 (* NB: swapped branches *)
+    | _ -> assert false)
+
+  let tag env pty = (* TBR *)
+    let ubitsl = Int32.of_int (ubits_of pty) in
+    G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+    compile_shl_const (Int32.sub 32l ubitsl) ^^
+    (* tag *)
+    compile_bitor_const (TaggingScheme.tag_of_typ pty)
+
+  let sanity_check_tag line env ty =
+    if TaggingScheme.debug || !(Flags.sanity) then
+      let name =
+        (prim_fun_name ty "sanity_check_tag") ^
+          (if TaggingScheme.debug then Int.to_string line else "")
+      in
+      let tag_mask = Int32.(sub (shift_left 1l (32 - TaggingScheme.ubits_of ty)) one) in
+      (Func.share_code1 Func.Always env name ("v", I32Type) [I32Type] (fun env get_n ->
+         get_n ^^
+         compile_bitand_const tag_mask ^^
+         compile_eq_const (TaggingScheme.tag_of_typ ty) ^^
+         E.else_trap_with env "unexpected tag" ^^
+         get_n))
+    else G.nop
+
+  let untag line env pty = Type.(match pty with
+    | Nat | Int | Int64 | Int32 ->
+      let ubitsl = Int32.of_int (ubits_of pty) in
+      sanity_check_tag line env pty ^^
+      compile_shrS_const (Int32.sub 32l ubitsl) ^^
+      G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32))
+    | Nat64 | Nat32 ->
+      let ubitsl = Int32.of_int (ubits_of pty) in
+      sanity_check_tag line env pty ^^
+      compile_shrU_const (Int32.sub 32l ubitsl) ^^
+      G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+    | _ -> assert false)
+
+  (* 32 bit numbers, dynamic, w.r.t `Int` *)
+
+  let sanity_check_can_tag_i32 env pty get_x =
+    if TaggingScheme.debug || !Flags.sanity then
+      get_x ^^
+      Func.share_code2 Func.Always env (prim_fun_name pty "check_can_tag_i32") (("res", I32Type), ("x", I32Type)) [I32Type]
+        (fun env get_res get_x -> Type.(
+          match pty with
+          | Nat | Int | Int64 | Int32 ->
+            let sbits = sbits_of pty in
+            let lower_bound = Int32.(neg (shift_left 1l sbits)) in
+            let upper_bound = Int32.shift_left 1l sbits in
+            (* lower_bound <= x < upper_bound *)
+            compile_unboxed_const lower_bound ^^
+            get_x ^^
+            G.i (Compare (Wasm.Values.I32 I32Op.LeS)) ^^
+            get_x ^^ compile_unboxed_const upper_bound ^^
+            G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+            G.i (Binary (Wasm.Values.I32 I32Op.And))
+         | Nat64 | Nat32 ->
+            let ubits = ubits_of pty in
+            let upper_bound = Int32.shift_left 1l ubits in
+            (* 0 <= x < upper_bound *)
+            get_x ^^ compile_unboxed_const upper_bound ^^
+            G.i (Compare (Wasm.Values.I32 I32Op.LtU))
+         | _ ->
+            assert false) ^^
+         get_res ^^
+         G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+         E.else_trap_with env (prim_fun_name pty "check_can_tag_i32") ^^
+         get_res)
+    else
+      G.nop
+
+  let if_can_tag_i32 env pty retty is1 is2 = Type.(match pty with
+    | Nat | Int | Int64 | Int32 ->
+      Func.share_code1 Func.Never env
+        (prim_fun_name pty "if_can_tag_i32") ("x", I32Type) [I32Type] (fun env get_x ->
+          (* checks that all but the low sbits are both either 0 or 1 *)
+          get_x ^^
+          get_x ^^ compile_shrS_const (Int32.of_int (32 - sbits_of pty)) ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+          compile_shrU_const (Int32.of_int (sbits_of pty)) ^^
+          G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+          sanity_check_can_tag_i32 env pty get_x)
+      ^^
+      E.if_ env retty is1 is2
+    | Nat64 | Nat32 ->
+       Func.share_code1 Func.Never env
+         (prim_fun_name pty "if_can_tag_i32") ("x", I32Type) [I32Type] (fun env get_x ->
+          (* checks that all but the low ubits are 0 *)
+          get_x ^^ compile_shrU_const (Int32.of_int (ubits_of pty)) ^^
+          G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+          sanity_check_can_tag_i32 env pty get_x)
+      ^^
+      E.if_ env retty is1 is2
+    | _ -> assert false)
+
+  let if_can_tag_u32 env pty retty is1 is2 = Type.(
+    match pty with
+    | Nat | Int | Int64 | Int32 ->
+      let sbits = sbits_of pty in
+      compile_shrU_const (Int32.of_int sbits) ^^
+      E.if_ env retty is2 is1 (* NB: swapped branches *)
+    | Nat64 | Nat32 ->
+      let ubits = ubits_of pty in
+      compile_shrU_const (Int32.of_int ubits) ^^
+      E.if_ env retty is2 is1 (* NB: swapped branches *)
+    | _ -> assert false)
+
+  let tag_i32 env pty =
+    let ubits = ubits_of pty in
+    compile_shl_const (Int32.sub 32l (Int32.of_int ubits)) ^^
+    (* tag *)
+    compile_bitor_const (TaggingScheme.tag_of_typ pty)
+
+  let untag_i32 line env pty = Type.(match pty with
+    | Nat | Int | Int64 | Int32 ->
+      let ubits = ubits_of pty in
+      (* check tag *)
+      sanity_check_tag line env pty ^^
+      compile_shrS_const (Int32.sub 32l (Int32.of_int ubits))
+    | Nat64 | Nat32 ->
+      let ubits = ubits_of pty in
+      (* check tag *)
+      sanity_check_tag line env pty ^^
+      compile_shrU_const (Int32.sub 32l (Int32.of_int ubits))
+    | _ -> assert false)
+
+  let clear_tag env pty =
+    if TaggingScheme.tag_of_typ pty <> 0l then
+      let shift_amount = 32 - ubits_of pty in
+      let mask = Int32.(lognot (sub (shift_left one shift_amount) one)) in
+      compile_bitand_const mask
+    else G.nop
+
+end (* BitTagged *)
+
+module Tagged = struct
+  (* Tagged objects all have an object header consisting of a tag and a forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+     The tag is to describe their runtime type and serves to traverse the heap
+     (serialization, GC), but also for objectification of arrays.
+
+     The tag is a word at the beginning of the object.
+
+     The (skewed) forwarding pointer supports object moving in the incremental garbage collection.
+
+         obj header
+     ┌──────┬─────────┬──
+     │ tag  │ fwd ptr │ ...
+     └──────┴─────────┴──
+
+     The copying GC requires that all tagged objects in the dynamic heap space have at least
+     two words in order to replace them by `Indirection`. This condition is except for `Null`
+     that only lives in static heap space and is therefore not replaced by `Indirection` during
+     copying GC.
+
+     Attention: This mapping is duplicated in these places
+       * here
+       * motoko-rts/src/types.rs
+       * motoko-rts/src/stream.rs
+       * motoko-rts/src/text.rs
+       * motoko-rts/src/memory.rs
+       * motoko-rts/src/bigint.rs
+       * motoko-rts/src/blob-iter.rs
+       * motoko-rts/src/static-checks.rs
+       * In all GC implementations in motoko-rts/src/gc/
+     so update all!
+   *)
+
+  type [@warning "-37"] tag  =
+    | Object
+    | ObjInd (* The indirection used for object fields *)
+    | Array (* Also a tuple *)
+    | Bits64 (* Contains a 64 bit number *)
+    | MutBox (* used for mutable heap-allocated variables *)
+    | Closure
+    | Some (* For opt *)
+    | Variant
+    | Blob
+    | Indirection (* Only used by the GC *)
+    | Bits32 (* Contains a 32 bit unsigned number *)
+    | BigInt
+    | Concat (* String concatenation, used by rts/text.c *)
+    | Null (* For opt. Static singleton! *)
+    | OneWordFiller (* Only used by the RTS *)
+    | FreeSpace (* Only used by the RTS *)
+    | Region
+    | ArraySliceMinimum (* Used by the GC for incremental array marking *)
+    | StableSeen (* Marker that we have seen this thing before *)
+    | CoercionFailure (* Used in the Candid decoder. Static singleton! *)
+
+  (* Tags needs to have the lowest bit set, to allow distinguishing object
+     headers from heap locations (object or field addresses).
+
+     (Reminder: objects and fields are word-aligned so will have the lowest two
+     bits unset) *)
+  let int_of_tag = function
+    | Object -> 1l
+    | ObjInd -> 3l
+    | Array -> 5l
+    | Bits64 -> 7l
+    | MutBox -> 9l
+    | Closure -> 11l
+    | Some -> 13l
+    | Variant -> 15l
+    | Blob -> 17l
+    | Indirection -> 19l
+    | Bits32 -> 21l
+    | BigInt -> 23l
+    | Concat -> 25l
+    | Region -> 27l
+    | Null -> 29l
+    | OneWordFiller -> 31l
+    | FreeSpace -> 33l
+    | ArraySliceMinimum -> 34l
+    (* Next two tags won't be seen by the GC, so no need to set the lowest bit
+       for `CoercionFailure` and `StableSeen` *)
+    | CoercionFailure -> 0xfffffffel
+    | StableSeen -> 0xffffffffl
+
+  (* Declare `env` for lazy computation of the header size when the compile environment with compile flags are defined *)
+  let header_size env =
+    if !Flags.gc_strategy = Flags.Incremental then 2l else 1l
+
+  (* The tag *)
+  let tag_field = 0l
+  let forwarding_pointer_field env =
+    assert (!Flags.gc_strategy = Flags.Incremental);
+    1l
+
+  (* Note: post-allocation barrier must be applied after initialization *)
+  let alloc env size tag =
+    assert (size > 1l);
+    let name = Printf.sprintf "alloc_size<%d>_tag<%d>" (Int32.to_int size) (Int32.to_int (int_of_tag tag)) in
+    (* Computes a (conservative) mask for the bumped HP, so that the existence of non-zero bits under it
+       guarantees that a page boundary crossing didn't happen (i.e. no ripple-carry). *)
+    let overflow_mask increment =
+      let n = Int32.to_int increment in
+      assert (n > 0 && n < 0x8000);
+      let page_mask = Int32.sub page_size 1l in
+      (* We can extend the mask to the right if the bump increment is a power of two. *)
+      let ext = if Numerics.Nat16.(to_int (popcnt (of_int n))) = 1 then increment else 0l in
+      Int32.(logor ext (logand page_mask (shift_left minus_one (16 - Numerics.Nat16.(to_int (clz (of_int n))))))) in
+    (* always inline *)
+    Func.share_code0 Func.Never env name [I32Type] (fun env ->
+      let set_object, get_object = new_local env "new_object" in
+      let size_in_bytes = Int32.(mul size Heap.word_size) in
+      let half_page_size = Int32.div page_size 2l in
+      (if !Flags.gc_strategy <> Flags.Incremental && size_in_bytes < half_page_size then
+         GC.get_heap_pointer env ^^
+         GC.get_heap_pointer env ^^
+         compile_add_const size_in_bytes ^^
+         GC.set_heap_pointer env ^^
+         GC.get_heap_pointer env ^^
+         compile_bitand_const (overflow_mask size_in_bytes) ^^
+         G.if0
+           G.nop (* no page crossing *)
+           (Heap.ensure_allocated env) (* ensure that HP's page is allocated *)
+       else
+         Heap.alloc env size) ^^
+      set_object ^^ get_object ^^
+      compile_unboxed_const (int_of_tag tag) ^^
+      Heap.store_field tag_field ^^
+      (if !Flags.gc_strategy = Flags.Incremental then
+        get_object ^^ (* object pointer *)
+        get_object ^^ (* forwarding pointer *)
+        Heap.store_field (forwarding_pointer_field env)
+      else
+        G.nop) ^^
+      get_object
+    )
+
+  let load_forwarding_pointer env =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      Heap.load_field (forwarding_pointer_field env)
+    else
+      G.nop)
+
+  let store_tag env tag =
+    load_forwarding_pointer env ^^
+    compile_unboxed_const (int_of_tag tag) ^^
+    Heap.store_field tag_field
+
+  let load_tag env =
+    load_forwarding_pointer env ^^
+    Heap.load_field tag_field
+
+  let check_forwarding env unskewed =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      let name = "check_forwarding_" ^ if unskewed then "unskewed" else "skewed" in
+      Func.share_code1 Func.Always env name ("object", I32Type) [I32Type] (fun env get_object ->
+        let set_object = G.setter_for get_object in
+        (if unskewed then
+          get_object ^^
+          compile_unboxed_const ptr_skew ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+          set_object
+        else G.nop) ^^
+        get_object ^^
+        load_forwarding_pointer env ^^
+        get_object ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+        E.else_trap_with env "missing object forwarding" ^^
+        get_object ^^
+        (if unskewed then
+          compile_unboxed_const ptr_unskew ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add))
+        else G.nop))
+    else G.nop)
+
+  let check_forwarding_for_store env typ =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      let (set_value, get_value, _) = new_local_ env typ "value" in
+      set_value ^^ check_forwarding env false ^^ get_value
+    else G.nop)
+
+  let load_field env index =
+    (if !Flags.sanity then check_forwarding env false else G.nop) ^^
+    Heap.load_field index
+
+  let store_field env index =
+    (if !Flags.sanity then check_forwarding_for_store env I32Type else G.nop) ^^
+    Heap.store_field index
+
+  let load_field_unskewed env index =
+    (if !Flags.sanity then check_forwarding env true else G.nop) ^^
+    Heap.load_field_unskewed index
+
+  let load_field64_unskewed env index =
+    (if !Flags.sanity then check_forwarding env true else G.nop) ^^
+    Heap.load_field64_unskewed index
+
+  let load_field64 env index =
+    (if !Flags.sanity then check_forwarding env false else G.nop) ^^
+    Heap.load_field64 index
+
+  let store_field64 env index =
+    (if !Flags.sanity then check_forwarding_for_store env I64Type else G.nop) ^^
+    Heap.store_field64 index
+
+  let load_field_float64 env index =
+    (if !Flags.sanity then check_forwarding env false else G.nop) ^^
+    Heap.load_field_float64 index
+
+  let store_field_float64 env index =
+    (if !Flags.sanity then check_forwarding_for_store env F64Type else G.nop) ^^
+    Heap.store_field_float64 index
+
+  (* Branches based on the tag of the object pointed to,
+     leaving the object on the stack afterwards. *)
+  let branch_default env retty def (cases : (tag * G.t) list) : G.t =
+    let (set_tag, get_tag) = new_local env "tag" in
+
+    let rec go = function
+      | [] -> def
+      | ((tag, code) :: cases) ->
+        get_tag ^^
+        compile_eq_const (int_of_tag tag) ^^
+        E.if_ env retty code (go cases)
+    in
+    load_tag env ^^
+    set_tag ^^
+    go cases
+
+  (* like branch_default but also pushes the scrutinee on the stack for the
+   * branch's consumption *)
+  let _branch_default_with env retty def cases =
+    let (set_o, get_o) = new_local env "o" in
+    let prep (t, code) = (t, get_o ^^ code)
+    in set_o ^^ get_o ^^ branch_default env retty def (List.map prep cases)
+
+  (* like branch_default_with but the tag is known statically *)
+  let branch_with env retty = function
+    | [] -> G.i Unreachable
+    | [_, code] -> code
+    | (_, code) :: cases ->
+       let (set_o, get_o) = new_local env "o" in
+       let prep (t, code) = (t, get_o ^^ code)
+       in set_o ^^ get_o ^^ branch_default env retty (get_o ^^ code) (List.map prep cases)
+
+  (* Can a value of this type be represented by a heap object with this tag? *)
+  (* Needs to be conservative, i.e. return `true` if unsure *)
+  (* This function can also be used as assertions in a lint mode, e.g. in compile_exp *)
+  let can_have_tag ty tag =
+    let open Mo_types.Type in
+    match (tag : tag) with
+    | Region ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Prim Region) -> true
+      | (Prim _ | Obj _ | Array _ | Tup _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | Array ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Array _ | Tup _) -> true
+      | (Prim _ |  Obj _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | Blob ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Prim (Text|Blob|Principal)) -> true
+      | (Prim _ | Obj _ | Array _ | Tup _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | Object ->
+      begin match normalize ty with
+      | (Con _ | Any) -> true
+      | (Obj _) -> true
+      | (Prim _ | Array _ | Tup _ | Opt _ | Variant _ | Func _ | Non) -> false
+      | (Pre | Async _ | Mut _ | Var _ | Typ _) -> assert false
+      end
+    | _ -> true
+
+  (* like branch_with but with type information to statically skip some branches *)
+  let _branch_typed_with env ty retty branches =
+    branch_with env retty (List.filter (fun (tag,c) -> can_have_tag ty tag) branches)
+
+  let allocation_barrier env =
+    (if !Flags.gc_strategy = Flags.Incremental then
+      E.call_import env "rts" "allocation_barrier"
+    else
+      G.nop)
+
+  let write_with_barrier env =
+    let (set_value, get_value) = new_local env "written_value" in
+    let (set_location, get_location) = new_local env "write_location" in
+    set_value ^^ set_location ^^
+    (* performance gain by first checking the GC state *)
+    E.call_import env "rts" "running_gc" ^^
+    G.if0 (
+      get_location ^^ get_value ^^
+      E.call_import env "rts" "write_with_barrier"
+    ) (
+      get_location ^^ get_value ^^
+      store_unskewed_ptr
+    )
+
+  let obj env tag element_instructions : G.t =
+    let n = List.length element_instructions in
+    let size = (Int32.add (Wasm.I32.of_int_u n) (header_size env)) in
+    let (set_object, get_object) = new_local env "new_object" in
+    alloc env size tag ^^
+    set_object ^^
+    let init_elem idx instrs : G.t =
+      get_object ^^
+      instrs ^^
+      Heap.store_field (Int32.add (Wasm.I32.of_int_u idx) (header_size env))
+    in
+    G.concat_mapi init_elem element_instructions ^^
+    get_object ^^
+    allocation_barrier env
+
+  let new_static_obj env tag payload =
+    let payload = StaticBytes.as_bytes payload in
+    let header_size = Int32.(mul Heap.word_size (header_size env)) in
+    let size = Int32.(add header_size (Int32.of_int (String.length payload))) in
+    let unskewed_ptr = E.reserve_static_memory env size in
+    let skewed_ptr = Int32.(add unskewed_ptr ptr_skew) in
+    let tag = bytes_of_int32 (int_of_tag tag) in
+    let forward = bytes_of_int32 skewed_ptr in (* forwarding pointer *)
+    (if !Flags.gc_strategy = Flags.Incremental then
+      let incremental_gc_data = tag ^ forward ^ payload in
+      E.write_static_memory env unskewed_ptr incremental_gc_data
+    else
+      let non_incremental_gc_data = tag ^ payload in
+      E.write_static_memory env unskewed_ptr non_incremental_gc_data
+    );
+    skewed_ptr
+
+  let shared_static_obj env tag payload =
+    let tag_word = bytes_of_int32 (int_of_tag tag) in
+    let payload_bytes = StaticBytes.as_bytes payload in
+    let key = tag_word ^ payload_bytes in
+    match E.object_pool_find env key with
+    | Some ptr -> ptr (* no forwarding pointer dereferencing needed as static objects do not move *)
+    | None ->
+      let ptr = new_static_obj env tag payload in
+      E.object_pool_add env key ptr;
+      ptr
+
+end (* Tagged *)
+
+module MutBox = struct
+  (*
+      Mutable heap objects
+
+       ┌──────┬─────┬─────────┐
+       │ obj header │ payload │
+       └──────┴─────┴─────────┘
+
+     The object header includes the obj tag (MutBox) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+  *)
+
+  let field = Tagged.header_size
+
+  let alloc env =
+    Tagged.obj env Tagged.MutBox [ compile_unboxed_zero ]
+
+  let static env =
+    let ptr = Tagged.new_static_obj env Tagged.MutBox StaticBytes.[
+      I32 0l; (* zero *)
+    ] in
+    E.add_static_root env ptr;
+    ptr
+
+  let load_field env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (field env)
+
+  let store_field env =
+    let (set_mutbox_value, get_mutbox_value) = new_local env "mutbox_value" in
+    set_mutbox_value ^^
+    Tagged.load_forwarding_pointer env ^^
+    get_mutbox_value ^^
+    Tagged.store_field env (field env)
+end
+
+
+module Opt = struct
+  (* The Option type. Optional values are represented as
+
+    1. ┌──────┐
+       │ null │
+       └──────┘
+
+       A special null value. It is fully static, and because it is unique, can
+       be recognized by pointer comparison (only the GC will care about the heap
+       tag).
+
+
+    2. ┌──────┬─────────┐
+       │ some │ payload │
+       └──────┴─────────┘
+
+       A heap-allocated box for `?v` values. Should only ever contain null or
+       another such box.
+
+    3. Anything else (pointer or unboxed scalar): Constituent value, implicitly
+       injected into the opt type.
+
+    This way, `?t` is represented without allocation, with the only exception of
+    the value `?ⁿnull` for n>0.
+
+    NB: `?ⁿnull` is essentially represented by the unary encoding of the number
+    of n. This could be optimized further, by storing `n` in the Some payload,
+    instead of a pointer, but unlikely worth it.
+
+  *)
+
+  let some_payload_field = Tagged.header_size
+
+  (* This relies on the fact that add_static deduplicates *)
+  let null_vanilla_lit env : int32 =
+    Tagged.shared_static_obj env Tagged.Null []
+
+  let null_lit env =
+    compile_unboxed_const (null_vanilla_lit env)
+
+  let vanilla_lit env ptr : int32 =
+    Tagged.shared_static_obj env Tagged.Some StaticBytes.[
+      I32 ptr
+    ]
+
+ let is_some env =
+    null_lit env ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Ne))
+
+  let inject env e =
+    e ^^
+    Func.share_code1 Func.Never env "opt_inject" ("x", I32Type) [I32Type] (fun env get_x ->
+      get_x ^^ BitTagged.if_tagged_scalar env [I32Type]
+        ( get_x ) (* scalar, no wrapping *)
+        ( get_x ^^ BitTagged.is_true_literal env ^^ (* exclude true literal since `branch_default` follows the forwarding pointer *)
+          E.if_ env [I32Type]
+            ( get_x ) (* true literal, no wrapping *)
+            ( get_x ^^ Tagged.branch_default env [I32Type]
+              ( get_x ) (* default tag, no wrapping *)
+              [ Tagged.Null,
+                (* NB: even ?null does not require allocation: We use a static
+                  singleton for that: *)
+                compile_unboxed_const (vanilla_lit env (null_vanilla_lit env))
+              ; Tagged.Some,
+                Tagged.obj env Tagged.Some [get_x]
+              ]
+            )
+        )
+    )
+
+  (* This function is used where conceptually, Opt.inject should be used, but
+  we know for sure that it wouldn’t do anything anyways, except dereferencing the forwarding pointer *)
+  let inject_simple env e =
+    e ^^ Tagged.load_forwarding_pointer env
+
+  let load_some_payload_field env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (some_payload_field env)
+
+  let project env =
+    Func.share_code1 Func.Never env "opt_project" ("x", I32Type) [I32Type] (fun env get_x ->
+      get_x ^^ BitTagged.if_tagged_scalar env [I32Type]
+        ( get_x ) (* scalar, no wrapping *)
+        ( get_x ^^ BitTagged.is_true_literal env ^^ (* exclude true literal since `branch_default` follows the forwarding pointer *)
+          E.if_ env [I32Type]
+            ( get_x ) (* true literal, no wrapping *)
+            ( get_x ^^ Tagged.branch_default env [I32Type]
+              ( get_x ) (* default tag, no wrapping *)
+              [ Tagged.Some,
+                get_x ^^ load_some_payload_field env
+              ; Tagged.Null,
+                E.trap_with env "Internal error: opt_project: null!"
+              ]
+            )
+        )
+    )
+
+end (* Opt *)
+
+module Variant = struct
+  (* The Variant type. We store the variant tag in a first word; we can later
+     optimize and squeeze it in the Tagged tag. We can also later support unboxing
+     variants with an argument of type ().
+
+       ┌──────┬─────┬────────────┬─────────┐
+       │ obj header │ varianttag │ payload │
+       └──────┴─────┴────────────┴─────────┘
+
+     The object header includes the obj tag (TAG_VARIANT) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+  *)
+
+  let variant_tag_field = Tagged.header_size
+  let payload_field env = Int32.add (variant_tag_field env) 1l
+
+  let hash_variant_label env : Mo_types.Type.lab -> int32 =
+    E.hash env
+
+  let inject env l e =
+    Tagged.obj env Tagged.Variant [compile_unboxed_const (hash_variant_label env l); e]
+
+  let get_variant_tag env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (variant_tag_field env)
+
+  let project env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (payload_field env)
+
+  (* Test if the top of the stack points to a variant with this label *)
+  let test_is env l =
+    get_variant_tag env ^^
+    compile_eq_const (hash_variant_label env l)
+
+  let vanilla_lit env i ptr =
+    Tagged.shared_static_obj env Tagged.Variant StaticBytes.[
+      I32 (hash_variant_label env i);
+      I32 ptr
+    ]
+
+end (* Variant *)
+
+
+module Closure = struct
+  (* In this module, we deal with closures, i.e. functions that capture parts
+     of their environment.
+
+     The structure of a closure is:
+
+       ┌──────┬─────┬───────┬──────┬──────────────┐
+       │ obj header │ funid │ size │ captured ... │
+       └──────┴─────┴───────┴──────┴──────────────┘
+
+     The object header includes the object tag (TAG_CLOSURE) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+  *)
+  let header_size env = Int32.add (Tagged.header_size env) 2l
+
+  let funptr_field = Tagged.header_size
+  let len_field env = Int32.add 1l (Tagged.header_size env)
+
+  let load_data env i =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (Int32.add (header_size env) i)
+
+  let store_data env i =
+    let (set_closure_data, get_closure_data) = new_local env "closure_data" in
+    set_closure_data ^^
+    Tagged.load_forwarding_pointer env ^^
+    get_closure_data ^^
+    Tagged.store_field env (Int32.add (header_size env) i)
+
+  let prepare_closure_call env =
+    Tagged.load_forwarding_pointer env
+
+  (* Expect on the stack
+     * the function closure (using prepare_closure_call)
+     * and arguments (n-ary!)
+     * the function closure again!
+  *)
+  let call_closure env n_args n_res =
+    (* Calculate the wasm type for a given calling convention.
+       An extra first argument for the closure! *)
+    let ty = E.func_type env (FuncType (
+      I32Type :: Lib.List.make n_args I32Type,
+      FakeMultiVal.ty (Lib.List.make n_res I32Type))) in
+    (* get the table index *)
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (funptr_field env) ^^
+    (* All done: Call! *)
+    G.i (CallIndirect (nr ty)) ^^
+    FakeMultiVal.load env (Lib.List.make n_res I32Type)
+
+  let static_closure env fi : int32 =
+    Tagged.shared_static_obj env Tagged.Closure StaticBytes.[
+      I32 (E.add_fun_ptr env fi);
+      I32 0l
+    ]
+
+end (* Closure *)
+
+
+module BoxedWord64 = struct
+  (* We store large word64s, nat64s and int64s in immutable boxed 64bit heap objects.
+
+     Small values are stored unboxed, tagged, see BitTagged. The bit-tagging logic is
+     contained in BitTagged; here we just do the boxing.
+
+     The heap layout of a BoxedWord64 is:
+
+       ┌──────┬─────┬─────┬─────┐
+       │ obj header │    i64    │
+       └──────┴─────┴─────┴─────┘
+
+     The object header includes the object tag (Bits64) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+  *)
+
+  let payload_field = Tagged.header_size
+
+  let heap_tag env pty = Tagged.Bits64 (* TODO *)
+
+  let vanilla_lit env pty i =
+    if BitTagged.can_tag_const pty i
+    then BitTagged.tag_const pty i
+    else
+      Tagged.shared_static_obj env (heap_tag env pty) StaticBytes.[
+        I64 i
+      ]
+
+  let compile_box env pty compile_elem : G.t =
+    let (set_i, get_i) = new_local env "boxed_i64" in
+    let size = if !Flags.gc_strategy = Flags.Incremental then 4l else 3l in
+    Tagged.alloc env size (heap_tag env pty) ^^
+    set_i ^^
+    get_i ^^ compile_elem ^^ Tagged.store_field64 env (payload_field env) ^^
+    get_i ^^
+    Tagged.allocation_barrier env
+
+  let box env pty =
+    Func.share_code1 Func.Never env
+      (prim_fun_name pty "box64") ("n", I64Type) [I32Type] (fun env get_n ->
+      get_n ^^ BitTagged.if_can_tag_i64 env pty [I32Type]
+        (get_n ^^ BitTagged.tag env pty)
+        (compile_box env pty get_n)
+    )
+
+  let unbox env pty =
+    Func.share_code1 Func.Never env
+      (prim_fun_name pty "unbox64") ("n", I32Type) [I64Type] (fun env get_n ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I64Type]
+        (get_n ^^ BitTagged.untag __LINE__ env pty)
+        (get_n ^^ Tagged.load_forwarding_pointer env ^^ Tagged.load_field64 env (payload_field env))
+    )
+end (* BoxedWord64 *)
+
+module Word64 = struct
+
+  let compile_add env = G.i (Binary (Wasm.Values.I64 I64Op.Add))
+  let compile_signed_sub env = G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+  let compile_mul env = G.i (Binary (Wasm.Values.I64 I64Op.Mul))
+  let compile_signed_div env = G.i (Binary (Wasm.Values.I64 I64Op.DivS))
+  let compile_signed_mod env = G.i (Binary (Wasm.Values.I64 I64Op.RemS))
+  let compile_unsigned_div env = G.i (Binary (Wasm.Values.I64 I64Op.DivU))
+  let compile_unsigned_rem env = G.i (Binary (Wasm.Values.I64 I64Op.RemU))
+  let compile_unsigned_sub env =
+    Func.share_code2 Func.Never env "nat_sub" (("n1", I64Type), ("n2", I64Type)) [I64Type] (fun env get_n1 get_n2 ->
+      get_n1 ^^ get_n2 ^^ G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+      E.then_trap_with env "Natural subtraction underflow" ^^
+      get_n1 ^^ get_n2 ^^ G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+    )
+
+  let compile_unsigned_pow env =
+    let name = prim_fun_name Type.Nat64 "wpow_nat" in
+    Func.share_code2 Func.Always env name (("n", I64Type), ("exp", I64Type)) [I64Type]
+      (fun env get_n get_exp ->
+        let set_n = G.setter_for get_n in
+        let set_exp = G.setter_for get_exp in
+        let (set_acc, get_acc) = new_local64 env "acc" in
+
+        (* start with result = 1 *)
+        compile_const_64 1L ^^ set_acc ^^
+
+        (* handle exp == 0 *)
+        get_exp ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+        G.if1 I64Type get_acc (* done *)
+        begin
+          G.loop0 begin
+            (* Are we done? *)
+            get_exp ^^ compile_const_64 1L ^^ G.i (Compare (Wasm.Values.I64 I64Op.LeU)) ^^
+            G.if0 G.nop (* done *)
+            begin
+              (* Check low bit of exp to see if we need to multiply *)
+              get_exp ^^ compile_shl64_const 63L ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+              G.if0 G.nop
+              begin
+                (* Multiply! *)
+                get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^ set_acc
+              end ^^
+              (* Square n, and shift exponent *)
+              get_n ^^ get_n ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^ set_n ^^
+              get_exp ^^ compile_shrU64_const 1L ^^ set_exp ^^
+              (* And loop *)
+              G.i (Br (nr 1l))
+            end
+          end ^^
+          (* Multiply a last time *)
+          get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul))
+        end
+      )
+
+
+  let compile_signed_wpow env =
+    Func.share_code2 Func.Never env "wrap_pow_Int64" (("n", I64Type), ("exp", I64Type)) [I64Type]
+      (fun env get_n get_exp ->
+        get_exp ^^
+        compile_const_64 0L ^^
+        G.i (Compare (Wasm.Values.I64 I64Op.GeS)) ^^
+        E.else_trap_with env "negative power" ^^
+        get_n ^^ get_exp ^^ compile_unsigned_pow env
+      )
+
+  let _compile_eq env = G.i (Compare (Wasm.Values.I64 I64Op.Eq))
+  let compile_relop env i64op = G.i (Compare (Wasm.Values.I64 i64op))
+
+  let btst_kernel env =
+    let (set_b, get_b) = new_local64 env "b" in
+    set_b ^^ compile_const_64 1L ^^ get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+    G.i (Binary (Wasm.Values.I64 I64Op.And))
+
+end (* BoxedWord64 *)
+
+
+module BoxedSmallWord = struct
+  (* We store proper 32bit Word32 in immutable boxed 32bit heap objects.
+
+     Small values are stored unboxed, tagged, see BitTagged.
+
+     The heap layout of a BoxedSmallWord is:
+
+       ┌──────┬─────┬─────┐
+       │ obj header │ i32 │
+       └──────┴─────┴─────┘
+
+     The object header includes the object tag (Bits32) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+  *)
+
+  let heap_tag env pty = Tagged.Bits32 (* TODO *)
+
+  let payload_field env = Tagged.header_size env
+
+  let vanilla_lit env pty i =
+    if BitTagged.can_tag_const pty (Int64.of_int (Int32.to_int i))
+    then BitTagged.tag_const pty (Int64.of_int (Int32.to_int i))
+    else
+      Tagged.shared_static_obj env (heap_tag env pty) StaticBytes.[
+        I32 i
+      ]
+
+  let compile_box env pty compile_elem : G.t =
+    let (set_i, get_i) = new_local env "boxed_i32" in
+    let size = if !Flags.gc_strategy = Flags.Incremental then 3l else 2l in
+    Tagged.alloc env size (heap_tag env pty) ^^
+    set_i ^^
+    get_i ^^ compile_elem ^^ Tagged.store_field env (payload_field env) ^^
+    get_i ^^
+    Tagged.allocation_barrier env
+
+  let box env pty =
+    Func.share_code1 Func.Never env
+      (prim_fun_name pty "box") ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^ BitTagged.if_can_tag_i32 env pty [I32Type]
+        (get_n ^^ BitTagged.tag_i32 env pty)
+        (compile_box env pty get_n)
+    )
+
+  let unbox env pty =
+    Func.share_code1 Func.Never env
+      (prim_fun_name pty "unbox") ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I32Type]
+        (get_n ^^ BitTagged.untag_i32 __LINE__ env pty)
+        (get_n ^^ Tagged.load_forwarding_pointer env ^^ Tagged.load_field env (payload_field env))
+    )
+
+  let _lit env pty n = compile_unboxed_const n ^^ box env pty
+
+end (* BoxedSmallWord *)
+
+module TaggedSmallWord = struct
+  (* While smaller-than-32bit words are treated as i32 from the WebAssembly
+     perspective, there are certain differences that are type based. This module
+     provides helpers to abstract over those.
+
+     Caution: Some functions here are also used for unboxed Nat32/Int32, while others
+     are _only_ used for the small ones. Check call-sites!
+  *)
+
+  let toNat = Type.(function
+    | Int8 | Nat8 -> Nat8
+    | Int16 | Nat16 -> Nat16
+    | Int32 | Nat32 -> Nat32
+    | _ -> assert false)
+
+  let bits_of_type = Type.(function
+    | Int8 | Nat8 -> 8
+    | Int16 | Nat16 -> 16
+    | Char -> 21
+    (* unboxed on stack *)
+    | Nat32 | Int32 -> 32
+    | _  -> assert false)
+
+  let tag_of_type pty = Type.(match pty with
+    | Int8 | Nat8
+    | Int16 | Nat16
+    | Char ->
+      TaggingScheme.tag_of_typ pty
+    (* unboxed on stack *)
+    | Int32 | Nat32 -> 0l
+    | _ -> assert false)
+
+  let shift_of_type ty = Int32.of_int (32 - bits_of_type ty)
+
+  let bitwidth_mask_of_type = function
+    | Type.(Int8|Nat8) -> 0b111l
+    | Type.(Int16|Nat16) -> 0b1111l
+    | p -> todo "bitwidth_mask_of_type" (Arrange_type.prim p) 0l
+
+  let const_of_type ty n = Int32.(shift_left n (to_int (shift_of_type ty)))
+
+  let padding_of_type ty = Int32.(sub (const_of_type ty 1l) one)
+
+  let mask_of_type ty = Int32.lognot (padding_of_type ty)
+
+  (* Makes sure that we only shift/rotate the maximum number of bits available in the word. *)
+  let clamp_shift_amount = function
+    | Type.(Nat32|Int32) -> G.nop
+    | ty -> compile_bitand_const (bitwidth_mask_of_type ty)
+
+  let shift_leftWordNtoI32 = compile_shl_const
+
+  (* Makes sure that the word payload (e.g. shift/rotate amount) is in the LSB bits of the word. *)
+  let lsb_adjust = function
+    | Type.(Int32|Nat32) -> G.nop
+    | Type.(Nat8|Nat16) as ty -> compile_shrU_const (shift_of_type ty)
+    | Type.(Int8|Int16) as ty -> compile_shrS_const (shift_of_type ty)
+    | Type.Char as ty -> compile_shrU_const (shift_of_type ty)
+    | _ -> assert false
+
+  (* Makes sure that the word payload (e.g. operation result) is in the MSB bits of the word. *)
+  let msb_adjust = function
+    | Type.(Int32|Nat32) -> G.nop
+    | ty -> shift_leftWordNtoI32 (shift_of_type ty)
+  (* Makes sure that the word representation invariant is restored. *)
+  let sanitize_word_result = function
+    | Type.(Nat32|Int32) -> G.nop
+    | ty -> compile_bitand_const (mask_of_type ty)
+
+  (* Sets the number (according to the type's word invariant) of LSBs. *)
+  let compile_word_padding = function
+    | Type.(Nat32|Int32) -> G.nop
+    | ty -> compile_bitor_const (padding_of_type ty)
+
+  (* Kernel for counting leading zeros, according to the word invariant. *)
+  let clz_kernel ty =
+    compile_word_padding ty ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Clz)) ^^
+    msb_adjust ty
+
+  (* Kernel for counting trailing zeros, according to the word invariant. *)
+  let ctz_kernel ty =
+    compile_word_padding ty ^^
+    compile_rotr_const (shift_of_type ty) ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Ctz)) ^^
+    msb_adjust ty
+
+  (* Kernel for testing a bit position, according to the word invariant. *)
+  let btst_kernel env ty =
+    let (set_b, get_b) = new_local env "b"
+    in lsb_adjust ty ^^ set_b ^^ lsb_adjust ty ^^
+       compile_unboxed_one ^^ get_b ^^ clamp_shift_amount ty ^^
+       G.i (Binary (Wasm.Values.I32 I32Op.Shl)) ^^
+       G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+       msb_adjust ty
+
+  (* Code points occupy 21 bits, so can always be tagged scalars *)
+  let lsb_adjust_codepoint env = lsb_adjust Type.Char
+  let msb_adjust_codepoint = msb_adjust Type.Char
+
+  (* Checks (n < 0xD800 || 0xE000 ≤ n ≤ 0x10FFFF),
+     ensuring the codepoint range and the absence of surrogates. *)
+  let check_and_msb_adjust_codepoint env =
+    Func.share_code1 Func.Always env "Nat32->Char" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^ compile_unboxed_const 0xD800l ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^
+      get_n ^^ compile_unboxed_const 0xE000l ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+      get_n ^^ compile_unboxed_const 0x10FFFFl ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.GtU)) ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+      E.then_trap_with env "codepoint out of range" ^^
+      get_n ^^ msb_adjust_codepoint
+    )
+
+  let vanilla_lit ty v =
+    Int32.(shift_left (of_int v) (to_int (shift_of_type ty)))
+    |> Int32.logor (tag_of_type ty)
+
+  (* Wrapping implementation for multiplication and exponentiation. *)
+
+  let compile_word_mul env ty =
+    lsb_adjust ty ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Mul))
+
+  let compile_nat_power env ty =
+    (* Square- and multiply exponentiation *)
+    let name = prim_fun_name ty "wpow_nat" in
+    Func.share_code2 Func.Always env name (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let set_n = G.setter_for get_n in
+        let set_exp = G.setter_for get_exp in
+        let (set_acc, get_acc) = new_local env "acc" in
+
+        (* unshift arguments *)
+        get_exp ^^ compile_shrU_const (shift_of_type ty) ^^ set_exp ^^
+        get_n ^^ compile_shrU_const (shift_of_type ty) ^^ set_n ^^
+
+        (* The accumulator starts with and stays shifted, so no other shifts needed. *)
+        compile_unboxed_const (const_of_type ty 1l) ^^ set_acc ^^
+
+        (* handle exp == 0 *)
+        get_exp ^^ G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+        G.if1 I32Type get_acc (* done *)
+        begin
+          G.loop0 begin
+            (* Are we done? *)
+            get_exp ^^ compile_unboxed_const 1l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+            G.if0 G.nop (* done *)
+            begin
+              (* Check low bit of exp to see if we need to multiply *)
+              get_exp ^^ compile_shl_const 31l ^^ G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+              G.if0 G.nop
+              begin
+                (* Multiply! *)
+                get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^ set_acc
+              end ^^
+              (* Square n, and shift exponent *)
+              get_n ^^ get_n ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^ set_n ^^
+              get_exp ^^ compile_shrU_const 1l ^^ set_exp ^^
+              (* And loop *)
+              G.i (Br (nr 1l))
+            end
+          end ^^
+          (* Multiply a last time *)
+          get_acc ^^ get_n ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul))
+          (* Accumulator was shifted, so no further shift needed here *)
+        end
+      )
+
+  let compile_int_power env ty =
+    let name = prim_fun_name ty "wpow_int" in
+    Func.share_code2 Func.Never env name (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        get_exp ^^
+        compile_unboxed_const 0l ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        E.else_trap_with env "negative power" ^^
+        get_n ^^ get_exp ^^ compile_nat_power env (toNat ty))
+
+  (* To rotate, first rotate a copy by bits_of_type into the other direction *)
+  let rotl env ty =
+     Func.share_code2 Func.Never env (prim_fun_name ty "rotl") (("n", I32Type), ("by", I32Type)) [I32Type]
+       (fun env get_n get_by ->
+        let open Wasm.Values in
+        let beside_adjust = compile_rotr_const (Int32.of_int (bits_of_type ty)) in
+        get_n ^^ get_n ^^ beside_adjust ^^ G.i (Binary (I32 I32Op.Or)) ^^
+        get_by ^^ lsb_adjust ty ^^ clamp_shift_amount ty ^^ G.i (Binary (I32 I32Op.Rotl)) ^^
+        sanitize_word_result ty
+       )
+
+  let rotr env ty =
+     Func.share_code2 Func.Never env (prim_fun_name ty "rotr") (("n", I32Type), ("by", I32Type)) [I32Type]
+       (fun env get_n get_by ->
+        let open Wasm.Values in
+        let beside_adjust = compile_rotl_const (Int32.of_int (bits_of_type ty)) in
+        get_n ^^ get_n ^^ beside_adjust ^^ G.i (Binary (I32 I32Op.Or)) ^^
+        get_by ^^ lsb_adjust ty ^^ clamp_shift_amount ty ^^ G.i (Binary (I32 I32Op.Rotr)) ^^
+        sanitize_word_result ty
+       )
+
+  let tag env pty =
+    match pty with
+    | Type.(Nat8 | Int8 | Nat16 | Int16 | Char) ->
+      (* TODO:  could sanity check low bits clear *)
+      (* add tag *)
+      compile_bitor_const (tag_of_type pty)
+    | _ -> assert false
+
+  let untag env pty =
+    match pty with
+    | Type.(Nat8 | Int8 | Nat16 | Int16 | Char) ->
+       (* check tag *)
+       BitTagged.sanity_check_tag __LINE__ env pty ^^
+       (* clear tag *)
+       BitTagged.clear_tag env pty
+    | _ -> assert false
+
+end (* TaggedSmallWord *)
+
+
+module Float = struct
+  (* We store floats (C doubles) in immutable boxed 64bit heap objects.
+
+     The heap layout of a Float is:
+
+       ┌──────┬─────┬─────┬─────┐
+       │ obj header │    f64    │
+       └──────┴─────┴─────┴─────┘
+
+     For now the tag stored is that of a Bits64, because the payload is
+     treated opaquely by the RTS. We'll introduce a separate tag when the need of
+     debug inspection (or GC representation change) arises.
+
+     The object header includes the object tag (Bits64) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+  *)
+
+  let payload_field env = Tagged.header_size env
+
+  let compile_unboxed_const f = G.i (Const (nr (Wasm.Values.F64 f)))
+
+  let vanilla_lit env f =
+    Tagged.shared_static_obj env Tagged.Bits64 StaticBytes.[
+      I64 (Wasm.F64.to_bits f)
+    ]
+
+  let box env = Func.share_code1 Func.Never env "box_f64" ("f", F64Type) [I32Type] (fun env get_f ->
+    let (set_i, get_i) = new_local env "boxed_f64" in
+    let size = Int32.add (Tagged.header_size env)  2l in
+    Tagged.alloc env size Tagged.Bits64 ^^
+    set_i ^^
+    get_i ^^ get_f ^^ Tagged.store_field_float64 env (payload_field env) ^^
+    get_i ^^
+    Tagged.allocation_barrier env
+  )
+
+  let unbox env = Tagged.load_forwarding_pointer env ^^ Tagged.load_field_float64 env (payload_field env)
+
+end (* Float *)
+
+
+module ReadBuf = struct
+  (*
+  Combinators to safely read from a dynamic buffer.
+
+  We represent a buffer by a pointer to two words in memory (usually allocated
+  on the shadow stack): The first is a pointer to the current position of the buffer,
+  the second one a pointer to the end (to check out-of-bounds).
+
+  Code that reads from this buffer will update the former, i.e. it is mutable.
+
+  The format is compatible with C (pointer to a struct) and avoids the need for the
+  multi-value extension that we used before to return both parse result _and_
+  updated pointer.
+
+  All pointers here are unskewed!
+
+  This module is mostly for serialization, but because there are bits of
+  serialization code in the BigNumType implementations, we put it here.
+  *)
+
+  let get_ptr get_buf =
+    get_buf ^^ G.i (Load {ty = I32Type; align = 2; offset = 0l; sz = None})
+  let get_end get_buf =
+    get_buf ^^ G.i (Load {ty = I32Type; align = 2; offset = Heap.word_size; sz = None})
+  let set_ptr get_buf new_val =
+    get_buf ^^ new_val ^^ G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None})
+  let set_end get_buf new_val =
+    get_buf ^^ new_val ^^ G.i (Store {ty = I32Type; align = 2; offset = Heap.word_size; sz = None})
+  let set_size get_buf get_size =
+    set_end get_buf
+      (get_ptr get_buf ^^ get_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)))
+
+  let alloc env f = Stack.with_words env "buf" 2l f
+
+  let advance get_buf get_delta =
+    set_ptr get_buf (get_ptr get_buf ^^ get_delta ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)))
+
+  let read_leb128 env get_buf =
+    get_buf ^^ E.call_import env "rts" "leb128_decode"
+
+  let read_sleb128 env get_buf =
+    get_buf ^^ E.call_import env "rts" "sleb128_decode"
+
+  let check_space env get_buf get_delta =
+    get_delta ^^
+    get_end get_buf ^^ get_ptr get_buf ^^ G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+    G.i (Compare (Wasm.Values.I32 I64Op.LeU)) ^^
+    E.else_trap_with env "IDL error: out of bounds read"
+
+  let check_page_end env get_buf incr_delta =
+    get_ptr get_buf ^^ compile_bitand_const 0xFFFFl ^^
+    incr_delta ^^
+    compile_shrU_const 16l
+
+  let is_empty env get_buf =
+    get_end get_buf ^^ get_ptr get_buf ^^
+    G.i (Compare (Wasm.Values.I32 I64Op.Eq))
+
+  let read_byte env get_buf =
+    check_space env get_buf (compile_unboxed_const 1l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+    advance get_buf (compile_unboxed_const 1l)
+
+  let read_word16 env get_buf =
+    check_space env get_buf (compile_unboxed_const 2l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack16, ZX)}) ^^
+    advance get_buf (compile_unboxed_const 2l)
+
+  let read_word32 env get_buf =
+    check_space env get_buf (compile_unboxed_const 4l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = None}) ^^
+    advance get_buf (compile_unboxed_const 4l)
+
+  let speculative_read_word64 env get_buf =
+    check_page_end env get_buf (compile_add_const 8l) ^^
+    G.if1 I64Type
+      (compile_const_64 (-1L))
+      begin
+        get_ptr get_buf ^^
+        G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None})
+      end
+
+  let read_word64 env get_buf =
+    check_space env get_buf (compile_unboxed_const 8l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None}) ^^
+    advance get_buf (compile_unboxed_const 8l)
+
+  let read_float64 env get_buf =
+    check_space env get_buf (compile_unboxed_const 8l) ^^
+    get_ptr get_buf ^^
+    G.i (Load {ty = F64Type; align = 0; offset = 0l; sz = None}) ^^
+    advance get_buf (compile_unboxed_const 8l)
+
+  let read_blob env get_buf get_len =
+    check_space env get_buf get_len ^^
+    (* Already has destination address on the stack *)
+    get_ptr get_buf ^^
+    get_len ^^
+    Heap.memcpy env ^^
+    advance get_buf get_len
+
+end (* Buf *)
+
+
+type comparator = Lt | Le | Ge | Gt
+
+module type BigNumType =
+sig
+  (* word from SR.Vanilla, trapping, unsigned semantics *)
+  val to_word32 : E.t -> G.t
+  val to_word64 : E.t -> G.t
+  val to_word32_with : E.t -> G.t (* with error message on stack (ptr/len) *)
+
+  (* word from SR.Vanilla, lossy, raw bits *)
+  val truncate_to_word32 : E.t -> G.t
+  val truncate_to_word64 : E.t -> G.t
+
+  (* unsigned word to SR.Vanilla *)
+  val from_word32 : E.t -> G.t
+  val from_word64 : E.t -> G.t
+
+  (* signed word to SR.Vanilla *)
+  val from_signed_word_compact : E.t -> G.t
+  val from_signed_word32 : E.t -> G.t
+  val from_signed_word64 : E.t -> G.t
+
+  (* buffers *)
+  (* given a numeric object on stack (vanilla),
+     push the number (i32) of bytes necessary
+     to externalize the numeric object *)
+  val compile_data_size_signed : E.t -> G.t
+  val compile_data_size_unsigned : E.t -> G.t
+  (* given on stack
+     - numeric object (vanilla, TOS)
+     - data buffer
+    store the binary representation of the numeric object into the data buffer,
+    and push the number (i32) of bytes stored onto the stack
+   *)
+  val compile_store_to_data_buf_signed : E.t -> G.t
+  val compile_store_to_data_buf_unsigned : E.t -> G.t
+  (* given on stack
+     - numeric object (vanilla, TOS)
+     - (unskewed) stream
+    store the binary representation of the numeric object into the stream
+   *)
+  val compile_store_to_stream_signed : E.t -> G.t
+  val compile_store_to_stream_unsigned : E.t -> G.t
+  (* given a ReadBuf on stack, consume bytes from it,
+     deserializing to a numeric object
+     and leave it on the stack (vanilla).
+     The boolean argument is true if the value to be read is signed.
+   *)
+  val compile_load_from_data_buf : E.t -> G.t -> bool -> G.t
+
+  (* literals *)
+  val vanilla_lit : E.t -> Big_int.big_int -> int32
+
+  (* arithmetic *)
+  val compile_abs : E.t -> G.t
+  val compile_neg : E.t -> G.t
+  val compile_add : E.t -> G.t
+  val compile_signed_sub : E.t -> G.t
+  val compile_unsigned_sub : E.t -> G.t
+  val compile_mul : E.t -> G.t
+  val compile_signed_div : E.t -> G.t
+  val compile_signed_mod : E.t -> G.t
+  val compile_unsigned_div : E.t -> G.t
+  val compile_unsigned_rem : E.t -> G.t
+  val compile_unsigned_pow : E.t -> G.t
+  val compile_lsh : E.t -> G.t
+  val compile_rsh : E.t -> G.t
+
+  (* comparisons *)
+  val compile_eq : E.t -> G.t
+  val compile_is_negative : E.t -> G.t
+  val compile_relop : E.t -> comparator -> G.t
+
+  (* representation checks *)
+  (* given a numeric object on the stack as skewed pointer, check whether
+     it can be faithfully stored in N bits, including a leading sign bit
+     leaves boolean result on the stack
+     N must be 2..64
+   *)
+  val fits_signed_bits : E.t -> int -> G.t
+  (* given a numeric object on the stack as skewed pointer, check whether
+     it can be faithfully stored in N unsigned bits
+     leaves boolean result on the stack
+     N must be 1..64
+   *)
+  val fits_unsigned_bits : E.t -> int -> G.t
+end
+
+let i64op_from_relop = function
+  | Lt -> I64Op.LtS
+  | Le -> I64Op.LeS
+  | Ge -> I64Op.GeS
+  | Gt -> I64Op.GtS
+
+let name_from_relop = function
+  | Lt -> "B_lt"
+  | Le -> "B_le"
+  | Ge -> "B_ge"
+  | Gt -> "B_gt"
+
+(* helper, measures the dynamics of the unsigned i32, returns (32 - effective bits) *)
+let unsigned_dynamics get_x =
+  get_x ^^
+  G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+
+(* helper, measures the dynamics of the signed i32, returns (32 - effective bits) *)
+let signed_dynamics get_x =
+  get_x ^^ compile_shl_const 1l ^^
+  get_x ^^
+  G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+  G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+
+module I32Leb = struct
+  let compile_size dynamics get_x =
+    get_x ^^ G.if1 I32Type
+      begin
+        compile_unboxed_const 38l ^^
+        dynamics get_x ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+        compile_divU_const 7l
+      end
+      compile_unboxed_one
+
+  let compile_leb128_size get_x = compile_size unsigned_dynamics get_x
+  let compile_sleb128_size get_x = compile_size signed_dynamics get_x
+
+  let compile_store_to_data_buf_unsigned env get_x get_buf =
+    get_x ^^ get_buf ^^ E.call_import env "rts" "leb128_encode" ^^
+    compile_leb128_size get_x
+
+  let compile_store_to_data_buf_signed env get_x get_buf =
+    get_x ^^ get_buf ^^ E.call_import env "rts" "sleb128_encode" ^^
+    compile_sleb128_size get_x
+end
+
+module MakeCompact (Num : BigNumType) : BigNumType = struct
+
+  (* Compact BigNums are a representation of signed BitTagged.ubit-bignums (of the
+     underlying boxed representation `Num`), that fit into an i32 as per the
+     BitTagged representation.
+
+     Many arithmetic operations can be be performed on this right-zero-padded
+     representation directly. For some operations (e.g. multiplication) the
+     second argument needs to be furthermore right-shifted to avoid overflow.
+     Similarly, for division the result must be left-shifted.
+
+     Generally all operations begin with checking whether both arguments are
+     already tagged scalars. If so, the arithmetic can be performed in machine
+     registers (fast path). Otherwise one or both arguments need boxing and the
+     arithmetic needs to be carried out on the underlying boxed bignum
+     representation (slow path).
+
+     The result appears as a boxed number in the latter case, so a check is
+     performed if it can be a tagged scalar. Conversely in the former case the
+     64-bit result can either be a tagged scalar or needs to be boxed.
+
+     Manipulation of the result is unnecessary for the comparison predicates.
+
+     For the `pow` operation the check that both arguments are tagged scalars
+     is not sufficient. Here we count and multiply effective bitwidths to
+     figure out whether the operation will overflow 64 bits, and if so, we fall
+     back to the slow path.
+   *)
+
+  (* TODO: There is some unnecessary result shifting when the div result needs
+     to be boxed. Is this possible at all to happen? With (/-1) maybe! *)
+
+  (* TODO: Does the result of the rem/mod fast path ever needs boxing? *)
+
+  (* examine the skewed pointer and determine if number fits into ubits *)
+  let fits_in_vanilla env = Num.fits_signed_bits env (BitTagged.ubits_of Type.Int)
+
+  let clear_tag env = BitTagged.clear_tag env Type.Int
+
+  (* Tagged scalar to right-0-padded signed i64 *)
+  let extend64 env =
+    BitTagged.sanity_check_tag __LINE__ env Type.Int ^^
+    (* clear tag *)
+    clear_tag env ^^
+    G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32))
+
+  (* A variant of BitTagged.can_tag that works on right-0-tagged 64 bit numbers *)
+  let if_can_tag_padded env retty is1 is2 =
+    let ubitsL = Int64.of_int(BitTagged.ubits_of Type.Int) in
+    compile_shrS64_const (Int64.sub 32L ubitsL) ^^ BitTagged.if_can_tag_i64 env Type.Int retty is1 is2
+
+  (* right-0-padded signed i64 to tagged scalar *)
+  let tag_padded env =
+    G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+    compile_bitor_const (TaggingScheme.tag_of_typ Type.Int)
+
+
+  (* creates a boxed bignum from a right-0-padded signed i64 *)
+  let box64 env =
+    let ubitsL = Int64.of_int(BitTagged.ubits_of Type.Int) in
+    compile_shrS64_const (Int64.sub 32L ubitsL) ^^ Num.from_signed_word64 env
+
+  (* creates a boxed bignum from an right-0-padded signed i32 *)
+  let extend_and_box64 env = extend64 env ^^ box64 env
+
+  (* check if both arguments are tagged scalars,
+     if so, promote to right-0-padded, signed i64 and perform the fast path.
+     Otherwise make sure that both arguments are in heap representation,
+     and run the slow path on them.
+     In both cases bring the results into normal form.
+   *)
+  let try_unbox2 name fast slow env =
+    Func.share_code2 Func.Always env name (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        let set_res, get_res = new_local env "res" in
+        let set_res64, get_res64 = new_local64 env "res64" in
+        get_a ^^ get_b ^^
+        BitTagged.if_both_tagged_scalar env [I32Type]
+          begin
+            get_a ^^ extend64 env ^^
+            get_b ^^ extend64 env ^^
+            fast env ^^ set_res64 ^^
+            get_res64 ^^
+            if_can_tag_padded env [I32Type]
+              (get_res64 ^^ tag_padded env)
+              (get_res64 ^^ box64 env)
+          end
+          begin
+            get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_a ^^ extend_and_box64 env)
+              get_a ^^
+            get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_b ^^ extend_and_box64 env)
+              get_b ^^
+            slow env ^^ set_res ^^ get_res ^^
+            fits_in_vanilla env ^^
+            G.if1 I32Type
+              (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32 env Type.Int)
+              get_res
+          end
+      )
+
+  let compile_add = try_unbox2 "B_add" Word64.compile_add Num.compile_add
+
+  let adjust_arg2 code env =
+    compile_shrS64_const (Int64.of_int (32 - BitTagged.ubits_of Type.Int)) ^^
+    code env (* TBR *)
+  let adjust_result code env =
+    code env ^^
+    compile_shl64_const (Int64.of_int (32 - BitTagged.ubits_of Type.Int))
+
+  let compile_mul = try_unbox2 "B_mul" (adjust_arg2 Word64.compile_mul) Num.compile_mul
+  let compile_signed_sub = try_unbox2 "B+sub" Word64.compile_signed_sub Num.compile_signed_sub
+  let compile_signed_div = try_unbox2 "B+div" (adjust_result Word64.compile_signed_div) Num.compile_signed_div
+  let compile_signed_mod = try_unbox2 "B_mod" Word64.compile_signed_mod Num.compile_signed_mod
+  let compile_unsigned_div = try_unbox2 "B_div" (adjust_result Word64.compile_unsigned_div) Num.compile_unsigned_div
+  let compile_unsigned_rem = try_unbox2 "B_rem" Word64.compile_unsigned_rem Num.compile_unsigned_rem
+  let compile_unsigned_sub = try_unbox2 "B_sub" Word64.compile_unsigned_sub Num.compile_unsigned_sub
+
+  let compile_unsigned_pow env =
+    Func.share_code2 Func.Always env "B_pow" (("a", I32Type), ("b", I32Type)) [I32Type]
+    (fun env get_a get_b ->
+    let set_res, get_res = new_local env "res" in
+    let set_res64, get_res64 = new_local64 env "res64" in
+    get_a ^^ get_b ^^
+    BitTagged.if_both_tagged_scalar env [I32Type]
+      begin
+        let set_a64, get_a64 = new_local64 env "a64" in
+        let set_b64, get_b64 = new_local64 env "b64" in
+        (* Convert to plain Word64 *)
+        get_a ^^ extend64 env ^^ compile_shrS64_const (Int64.of_int (32 - BitTagged.ubits_of Type.Int)) ^^ set_a64 ^^
+        get_b ^^ extend64 env ^^ compile_shrS64_const (Int64.of_int (32 - BitTagged.ubits_of Type.Int)) ^^ set_b64 ^^
+
+        (* estimate bitcount of result: `bits(a) * b <= 64` guarantees
+           the absence of overflow in 64-bit arithmetic *)
+        compile_const_64 64L ^^
+        get_a64 ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^ G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+        get_b64 ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^
+        compile_const_64 64L ^^ G.i (Compare (Wasm.Values.I64 I64Op.LeU)) ^^
+        G.if1 I32Type
+          begin
+            get_a64 ^^ get_b64 ^^ Word64.compile_unsigned_pow env ^^ set_res64 ^^
+            get_res64 ^^ BitTagged.if_can_tag_i64 env Type.Int [I32Type]
+              (get_res64 ^^ BitTagged.tag env Type.Int)
+              (get_res64 ^^ Num.from_word64 env)
+          end
+          begin
+            get_a64 ^^ Num.from_signed_word64 env ^^
+            get_b64 ^^ Num.from_signed_word64 env ^^
+            Num.compile_unsigned_pow env ^^ set_res ^^
+            get_res ^^ fits_in_vanilla env ^^
+            G.if1 I32Type
+              (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32 env Type.Int)
+              get_res
+          end
+      end
+      begin
+        get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+          (get_a ^^ extend_and_box64 env)
+          get_a ^^
+        get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+          (get_b ^^ extend_and_box64 env)
+          get_b ^^
+        Num.compile_unsigned_pow env ^^ set_res ^^
+        get_res ^^ fits_in_vanilla env ^^
+        G.if1 I32Type
+          (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32 env Type.Int)
+          get_res
+      end)
+
+  (*
+    Note [left shifting compact Nat]
+    For compact Nats (i.e. non-heap allocated ones) we first try to perform the shift in the i64 domain.
+    for this we extend (signed, but that doesn't really matter) to 64 bits and then perform the left shift.
+    Then we check whether the result will fit back into the compact representation by either
+     - comparing: truncate to i32, then sign-extend back to i64, with the shift result
+     - count leading zeros >= 33 (currently we don't use this idea).
+    If the test works out, we have to ensure that the shift amount was smaller than 64, due to Wasm semantics.
+    If this is the case then the truncated i32 is the result (lowest bit is guaranteed to be clear),
+    otherwise we have to fall back to bignum arithmetic. We have two choices:
+     - reuse the 64-bit shift result going to heap (not currently, amount must be less than 33 for this to work)
+     - convert the original base to bigum and do the shift there.
+
+    N.B. we currently choose the shift cutoff as 42, just because (it must be <64).
+   *)
+
+  let compile_lsh env =
+    Func.share_code2 Func.Always env "B_lsh" (("n", I32Type), ("amount", I32Type)) [I32Type]
+    (fun env get_n get_amount ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I32Type]
+        ( (* see Note [left shifting compact Nat] *)
+          get_n ^^ clear_tag env ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+          get_amount ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+          let set_remember, get_remember = new_local64 env "remember" in
+          set_remember ^^ get_remember ^^
+          G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+          let set_res, get_res = new_local env "res" in
+          set_res ^^ get_res ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^ (* exclude sign flip *)
+          get_remember ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.Eq)) ^^
+          get_amount ^^ compile_rel_const I32Op.LeU 42l ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+          G.if1 I32Type
+            (get_res ^^ compile_bitor_const (TaggingScheme.tag_of_typ Type.Int))
+            (get_n ^^ compile_shrS_const (Int32.of_int (32 - BitTagged.ubits_of Type.Int)) ^^
+             Num.from_signed_word_compact env ^^ get_amount ^^ Num.compile_lsh env)
+        )
+        (get_n ^^ get_amount ^^ Num.compile_lsh env))
+
+  let compile_rsh env =
+    Func.share_code2 Func.Always env "B_rsh" (("n", I32Type), ("amount", I32Type)) [I32Type]
+    (fun env get_n get_amount ->
+      get_n ^^
+      BitTagged.if_tagged_scalar env [I32Type]
+        begin
+          get_n ^^ clear_tag env ^^
+          get_amount ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.ShrU)) ^^
+          compile_bitand_const Int32.(shift_left minus_one (32 - BitTagged.ubits_of Type.Int)) ^^
+          get_amount ^^ compile_rel_const I32Op.LeU (Int32.of_int (BitTagged.ubits_of Type.Int))^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Mul)) (* branch-free `if` *) ^^
+          (* tag *)
+          compile_bitor_const (TaggingScheme.tag_of_typ Type.Int)
+        end
+        begin
+          get_n ^^ get_amount ^^ Num.compile_rsh env ^^
+          let set_res, get_res = new_local env "res" in
+          set_res ^^ get_res ^^
+          fits_in_vanilla env ^^
+          G.if1 I32Type
+            (get_res ^^ Num.truncate_to_word32 env ^^ BitTagged.tag_i32 env Type.Int)
+            get_res
+        end)
+
+  let compile_is_negative env =
+    let set_n, get_n = new_local env "n" in
+    set_n ^^ get_n ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_n ^^ clear_tag env ^^ compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtS)))
+      (get_n ^^ Num.compile_is_negative env)
+
+  let vanilla_lit env = function
+    | n when Big_int.is_int_big_int n && BitTagged.can_tag_const Type.Int (Big_int.int64_of_big_int n) ->
+      BitTagged.tag_const Type.Int (Big_int.int64_of_big_int n)
+    | n -> Num.vanilla_lit env n
+
+  let compile_neg env =
+    let sminl = Int32.shift_left 1l (BitTagged.sbits_of Type.Int) in
+    let sminl_shifted = Int32.shift_left sminl (32 - BitTagged.ubits_of Type.Int) in
+    Func.share_code1 Func.Always env "B_neg" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^ BitTagged.if_tagged_scalar env [I32Type]
+        begin
+          get_n ^^ clear_tag env ^^ compile_eq_const sminl_shifted ^^ (* -2^sbits, shifted ubits *)
+          G.if1 I32Type
+            (compile_unboxed_const sminl ^^ Num.from_word32 env)
+            begin
+              compile_unboxed_const 0l ^^
+              get_n ^^ clear_tag env ^^
+              G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+              (* tag the result *)
+              clear_tag env ^^
+              compile_bitor_const (TaggingScheme.tag_of_typ Type.Int)
+            end
+        end
+        (get_n ^^ Num.compile_neg env)
+    )
+
+  let try_comp_unbox2 name fast slow env =
+    Func.share_code2 Func.Always env name (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        get_a ^^ get_b ^^
+        BitTagged.if_both_tagged_scalar env [I32Type]
+          begin
+            get_a ^^ extend64 env ^^
+            get_b ^^ extend64 env ^^
+            fast env
+          end
+          begin
+            get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_a ^^ extend_and_box64 env)
+              get_a ^^
+            get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+              (get_b ^^ extend_and_box64 env)
+              get_b ^^
+            slow env
+          end)
+
+  let compile_eq env =
+    Func.share_code2 Func.Always env "B_eq" (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        get_a ^^ get_b ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+        G.if1 I32Type
+          (Bool.lit true)
+          (get_a ^^ get_b ^^
+           BitTagged.if_both_tagged_scalar env [I32Type]
+             (Bool.lit false)
+             begin
+               get_a ^^ BitTagged.if_tagged_scalar env [I32Type]
+                 (get_a ^^ extend_and_box64 env)
+                 get_a ^^
+               get_b ^^ BitTagged.if_tagged_scalar env [I32Type]
+                 (get_b ^^ extend_and_box64 env)
+                 get_b ^^
+               Num.compile_eq env
+             end))
+
+  let compile_relop env bigintop =
+    try_comp_unbox2 (name_from_relop bigintop)
+      (fun env' -> Word64.compile_relop env' (i64op_from_relop bigintop))
+      (fun env' -> Num.compile_relop env' bigintop)
+      env
+
+  let try_unbox iN fast slow env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [iN]
+      (get_a ^^ fast env)
+      (get_a ^^ slow env)
+
+  let fits_unsigned_bits env n =
+    try_unbox I32Type (fun _ -> match n with
+        | 32 | 64 -> G.i Drop ^^ Bool.lit true
+        | 8 | 16 ->
+          (* use shifting to test that the payload including the tag fits the desired bit width. 
+              E.g. this is now n + 2 for Type.Int. *)
+          compile_bitand_const Int32.(shift_left minus_one (n + (32 - BitTagged.ubits_of Type.Int))) ^^
+          G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+        | _ -> assert false
+      )
+      (fun env -> Num.fits_unsigned_bits env n)
+      env
+
+  let sanity_check_fits_signed_bits env n get_a =
+     if TaggingScheme.debug || !Flags.sanity then
+     get_a ^^
+     Func.share_code2 Func.Always env ("check_fits_signed_bits_"^Int.to_string n) (("res", I32Type), ("a", I32Type)) [I32Type]
+      (fun env get_res get_a ->
+         let lower_bound = Int32.(neg (shift_left 1l (n-1))) in
+         let upper_bound = Int32.shift_left 1l (n-1) in
+         let set_a = G.setter_for get_a in
+         get_a ^^
+         compile_shrS_const (Int32.of_int (32 - BitTagged.ubits_of Type.Int)) ^^
+         set_a ^^
+         compile_unboxed_const lower_bound ^^
+         get_a ^^
+         G.i (Compare (Wasm.Values.I32 I32Op.LeS)) ^^
+         get_a ^^ compile_unboxed_const upper_bound ^^
+         G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+         G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+         get_res ^^
+         G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+         E.else_trap_with env ("fit_signed_bits failure_"^Int.to_string n) ^^
+         get_res)
+     else G.nop
+
+  let fits_signed_bits env n =
+    let set_a, get_a = new_local env "a" in
+    try_unbox I32Type (fun _ -> match n with
+        | 32 | 64 -> G.i Drop ^^ Bool.lit true
+        | 8 | 16 ->
+           (* check all bits beyond signed payload are all 0 or all 1 *)
+           set_a ^^
+           get_a ^^ get_a ^^ compile_shrS_const 1l ^^
+           G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+           compile_bitand_const
+             Int32.(shift_left minus_one ((n-1) + (32 - BitTagged.ubits_of Type.Int))) ^^
+           G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+           sanity_check_fits_signed_bits env n get_a
+        | _ -> assert false
+      )
+      (fun env -> Num.fits_signed_bits env n)
+      env
+
+  let compile_abs env =
+    let sminl = Int32.shift_left 1l (BitTagged.sbits_of Type.Int) in
+    let sminl_shifted = Int32.shift_left sminl (32 - BitTagged.ubits_of Type.Int) in
+    try_unbox I32Type
+      begin
+        fun _ ->
+        let set_a, get_a = new_local env "a" in
+        clear_tag env ^^
+        set_a ^^
+        get_a ^^ compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+        G.if1 I32Type
+          begin
+            get_a ^^
+            (* -2^sbits is small enough for compact representation, but 2^sbits isn't *)
+            compile_eq_const sminl_shifted ^^ (* i.e. -2^sbits shifted *)
+            G.if1 I32Type
+              (compile_unboxed_const sminl ^^ Num.from_word32 env)
+              begin
+                (* absolute value works directly on shifted representation *)
+                compile_unboxed_const 0l ^^
+                get_a ^^
+                G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+                compile_bitor_const (TaggingScheme.tag_of_typ Type.Int)
+              end
+          end
+          begin
+            get_a ^^
+            compile_bitor_const (TaggingScheme.tag_of_typ Type.Int)
+          end
+      end
+      Num.compile_abs
+      env
+
+  let compile_load_from_word64 env get_data_buf = function
+    | false -> get_data_buf ^^ E.call_import env "rts" "bigint_leb128_decode_word64"
+    | true -> get_data_buf ^^ E.call_import env "rts" "bigint_sleb128_decode_word64"
+
+  let compile_load_from_data_buf env get_data_buf signed =
+    (* see Note [speculating for short (S)LEB encoded bignums] *)
+    ReadBuf.speculative_read_word64 env get_data_buf ^^
+    let set_a, get_a = new_local64 env "a" in
+    set_a ^^ get_a ^^
+    compile_xor64_const (-1L) ^^
+    compile_bitand64_const 0b1000000010000000100000001000000010000000L ^^
+    let set_eom, get_eom = new_local64 env "eom" in
+    set_eom ^^ get_eom ^^
+    G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+    G.if1 I32Type
+      begin
+        Num.compile_load_from_data_buf env get_data_buf signed
+      end
+      begin
+        get_a ^^
+        get_eom ^^ G.i (Unary (Wasm.Values.I64 I64Op.Ctz)) ^^
+        compile_load_from_word64 env get_data_buf signed
+      end
+
+  let compile_store_to_data_buf_unsigned env =
+    let set_x, get_x = new_local env "x" in
+    let set_buf, get_buf = new_local env "buf" in
+    set_x ^^ set_buf ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 __LINE__ env Type.Int ^^ set_x ^^
+        I32Leb.compile_store_to_data_buf_unsigned env get_x get_buf
+      )
+      (fun env ->
+        G.i Drop ^^
+        get_buf ^^ get_x ^^ Num.compile_store_to_data_buf_unsigned env)
+      env
+
+  let compile_store_to_data_buf_signed env =
+    let set_x, get_x = new_local env "x" in
+    let set_buf, get_buf = new_local env "buf" in
+    set_x ^^ set_buf ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 __LINE__ env Type.Int ^^ set_x ^^
+        I32Leb.compile_store_to_data_buf_signed env get_x get_buf
+      )
+      (fun env ->
+        G.i Drop ^^
+        get_buf ^^ get_x ^^ Num.compile_store_to_data_buf_signed env)
+      env
+
+  let compile_store_to_stream_unsigned env =
+    let set_x, get_x = new_local env "x" in
+    let set_stream, get_stream = new_local env "stream" in
+    set_x ^^ set_stream ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 __LINE__ env Type.Int ^^ set_x ^^
+        (* get size & reserve & encode *)
+        let dest =
+          get_stream ^^
+          I32Leb.compile_leb128_size get_x ^^
+          E.call_import env "rts" "stream_reserve" in
+        I32Leb.compile_store_to_data_buf_unsigned env get_x dest)
+      (fun env ->
+        G.i Drop ^^
+        get_stream ^^ get_x ^^ Num.compile_store_to_stream_unsigned env ^^
+        compile_unboxed_zero)
+      env ^^
+      G.i Drop
+
+  let compile_store_to_stream_signed env =
+    let set_x, get_x = new_local env "x" in
+    let set_stream, get_stream = new_local env "stream" in
+    set_x ^^ set_stream ^^
+    get_x ^^
+    try_unbox I32Type
+      (fun env ->
+        BitTagged.untag_i32 __LINE__ env Type.Int ^^ set_x ^^
+        (* get size & reserve & encode *)
+        let dest =
+          get_stream ^^
+          I32Leb.compile_sleb128_size get_x ^^
+          E.call_import env "rts" "stream_reserve" in
+        I32Leb.compile_store_to_data_buf_signed env get_x dest)
+      (fun env ->
+        G.i Drop ^^
+        get_stream ^^ get_x ^^ Num.compile_store_to_stream_signed env ^^
+        compile_unboxed_zero)
+      env ^^
+      G.i Drop
+
+  let compile_data_size_unsigned env =
+    try_unbox I32Type
+      (fun _ ->
+        let set_x, get_x = new_local env "x" in
+        BitTagged.untag_i32 __LINE__ env Type.Int ^^ set_x ^^
+        I32Leb.compile_leb128_size get_x
+      )
+      (fun env -> Num.compile_data_size_unsigned env)
+      env
+
+  let compile_data_size_signed env =
+    try_unbox I32Type
+      (fun _ ->
+        let set_x, get_x = new_local env "x" in
+        BitTagged.untag_i32 __LINE__ env Type.Int ^^ set_x ^^
+        I32Leb.compile_sleb128_size get_x
+      )
+      (fun env -> Num.compile_data_size_signed env)
+      env
+
+  let from_signed_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_i32 env Type.Int [I32Type]
+      (get_a ^^ BitTagged.tag_i32 env Type.Int)
+      (get_a ^^ Num.from_signed_word32 env)
+
+  let from_signed_word64 env =
+    let set_a, get_a = new_local64 env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_i64 env Type.Int [I32Type]
+      (get_a ^^ BitTagged.tag env Type.Int)
+      (get_a ^^ Num.from_signed_word64 env)
+
+  let from_signed_word_compact env =
+    begin
+      if TaggingScheme.debug || !(Flags.sanity)
+     then
+      let set_a, get_a = new_local env "a" in
+      set_a ^^
+      get_a ^^ BitTagged.if_can_tag_i32 env Type.Int [I32Type]
+        get_a
+        (E.trap_with env "from_signed_word_compact")
+      else G.nop
+    end ^^
+    BitTagged.tag_i32 env Type.Int
+
+  let from_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_u32 env Type.Int [I32Type]
+      (get_a ^^ BitTagged.tag_i32 env Type.Int)
+      (get_a ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^ Num.from_word64 env)
+
+  let from_word64 env =
+    let set_a, get_a = new_local64 env "a" in
+    set_a ^^
+    get_a ^^ BitTagged.if_can_tag_u64 env Type.Int [I32Type]
+      (get_a ^^ BitTagged.tag env Type.Int)
+      (get_a ^^ Num.from_word64 env)
+
+  let truncate_to_word64 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I64Type]
+      (get_a ^^ BitTagged.untag __LINE__ env Type.Int)
+      (get_a ^^ Num.truncate_to_word64 env)
+
+  let truncate_to_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_a ^^ BitTagged.untag_i32 __LINE__ env Type.Int)
+      (get_a ^^ Num.truncate_to_word32 env)
+
+  let to_word64 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I64Type]
+      (get_a ^^ BitTagged.untag __LINE__ env Type.Int)
+      (get_a ^^ Num.to_word64 env)
+
+  let to_word32 env =
+    let set_a, get_a = new_local env "a" in
+    set_a ^^ get_a ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_a ^^ BitTagged.untag_i32 __LINE__ env Type.Int) (*TBR*)
+      (get_a ^^ Num.to_word32 env)
+
+  let to_word32_with env =
+    let set_a, get_a = new_local env "a" in
+    let set_err_msg, get_err_msg = new_local env "err_msg" in
+    set_err_msg ^^ set_a ^^
+    get_a ^^
+    BitTagged.if_tagged_scalar env [I32Type]
+      (get_a ^^ BitTagged.untag_i32 __LINE__ env Type.Int) (* TBR *)
+      (get_a ^^ get_err_msg ^^ Num.to_word32_with env)
+end
+
+module BigNumLibtommath : BigNumType = struct
+
+  let to_word32 env = E.call_import env "rts" "bigint_to_word32_trap"
+  let to_word64 env = E.call_import env "rts" "bigint_to_word64_trap"
+  let to_word32_with env = E.call_import env "rts" "bigint_to_word32_trap_with"
+
+  let truncate_to_word32 env = E.call_import env "rts" "bigint_to_word32_wrap"
+  let truncate_to_word64 env = E.call_import env "rts" "bigint_to_word64_wrap"
+
+  let from_signed_word_compact env = E.call_import env "rts" "bigint_of_int32"
+  let from_word32 env = E.call_import env "rts" "bigint_of_word32"
+  let from_word64 env = E.call_import env "rts" "bigint_of_word64"
+  let from_signed_word32 env = E.call_import env "rts" "bigint_of_int32"
+  let from_signed_word64 env = E.call_import env "rts" "bigint_of_int64"
+
+  let compile_data_size_unsigned env = E.call_import env "rts" "bigint_leb128_size"
+  let compile_data_size_signed env = E.call_import env "rts" "bigint_sleb128_size"
+
+  let compile_store_to_data_buf_unsigned env =
+    let (set_buf, get_buf) = new_local env "buf" in
+    let (set_n, get_n) = new_local env "n" in
+    set_n ^^ set_buf ^^
+    get_n ^^ get_buf ^^ E.call_import env "rts" "bigint_leb128_encode" ^^
+    get_n ^^ E.call_import env "rts" "bigint_leb128_size"
+
+  let compile_store_to_stream_unsigned env =
+    E.call_import env "rts" "bigint_leb128_stream_encode"
+
+  let compile_store_to_data_buf_signed env =
+    let (set_buf, get_buf) = new_local env "buf" in
+    let (set_n, get_n) = new_local env "n" in
+    set_n ^^ set_buf ^^
+    get_n ^^ get_buf ^^ E.call_import env "rts" "bigint_sleb128_encode" ^^
+    get_n ^^ E.call_import env "rts" "bigint_sleb128_size"
+
+  let compile_store_to_stream_signed env =
+    E.call_import env "rts" "bigint_sleb128_stream_encode"
+
+  let compile_load_from_data_buf env get_data_buf = function
+    | false -> get_data_buf ^^ E.call_import env "rts" "bigint_leb128_decode"
+    | true -> get_data_buf ^^ E.call_import env "rts" "bigint_sleb128_decode"
+
+  let vanilla_lit env n =
+    (* See enum mp_sign *)
+    let sign = if Big_int.sign_big_int n >= 0 then 0l else 1l in
+
+    let n = Big_int.abs_big_int n in
+
+    let limbs =
+      (* see MP_DIGIT_BIT *)
+      let twoto28 = Big_int.power_int_positive_int 2 28 in
+      let rec go n =
+        if Big_int.sign_big_int n = 0
+        then []
+        else
+          let (a, b) = Big_int.quomod_big_int n twoto28 in
+          [ Big_int.int32_of_big_int b ] @ go a
+      in go n
+    in
+    (* how many 32 bit digits *)
+    let size = Int32.of_int (List.length limbs) in
+
+    (* cf. mp_int in tommath.h *)
+    let ptr = Tagged.shared_static_obj env Tagged.BigInt StaticBytes.[
+      I32 size; (* used *)
+      I32 size; (* size; relying on Heap.word_size == size_of(mp_digit) *)
+      I32 sign;
+      I32 0l; (* dp; this will be patched in BigInt::mp_int_ptr in the RTS when used *)
+      i32s limbs
+
+    ] in
+    ptr
+
+  let assert_nonneg env =
+    Func.share_code1 Func.Never env "assert_nonneg" ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^
+      E.call_import env "rts" "bigint_isneg" ^^
+      E.then_trap_with env "Natural subtraction underflow" ^^
+      get_n
+    )
+
+  let compile_abs env = E.call_import env "rts" "bigint_abs"
+  let compile_neg env = E.call_import env "rts" "bigint_neg"
+  let compile_add env = E.call_import env "rts" "bigint_add"
+  let compile_mul env = E.call_import env "rts" "bigint_mul"
+  let compile_signed_sub env = E.call_import env "rts" "bigint_sub"
+  let compile_signed_div env = E.call_import env "rts" "bigint_div"
+  let compile_signed_mod env = E.call_import env "rts" "bigint_rem"
+  let compile_unsigned_sub env = E.call_import env "rts" "bigint_sub" ^^ assert_nonneg env
+  let compile_unsigned_rem env = E.call_import env "rts" "bigint_rem"
+  let compile_unsigned_div env = E.call_import env "rts" "bigint_div"
+  let compile_unsigned_pow env = E.call_import env "rts" "bigint_pow"
+  let compile_lsh env = E.call_import env "rts" "bigint_lsh"
+  let compile_rsh env = E.call_import env "rts" "bigint_rsh"
+
+  let compile_eq env = E.call_import env "rts" "bigint_eq"
+  let compile_is_negative env = E.call_import env "rts" "bigint_isneg"
+  let compile_relop env = function
+      | Lt -> E.call_import env "rts" "bigint_lt"
+      | Le -> E.call_import env "rts" "bigint_le"
+      | Ge -> E.call_import env "rts" "bigint_ge"
+      | Gt -> E.call_import env "rts" "bigint_gt"
+
+  let fits_signed_bits env bits =
+    E.call_import env "rts" "bigint_2complement_bits" ^^
+    compile_unboxed_const (Int32.of_int bits) ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+  let fits_unsigned_bits env bits =
+    E.call_import env "rts" "bigint_count_bits" ^^
+    compile_unboxed_const (Int32.of_int bits) ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+
+end (* BigNumLibtommath *)
+
+module BigNum = MakeCompact(BigNumLibtommath)
+
+(* Primitive functions *)
+module Prim = struct
+  (* The {Nat,Int}{8,16} bits sit in the MSBs of the i32, in this manner
+     we can perform almost all operations, with the exception of
+     - Mul (needs shr of one operand)
+     - Shr (needs masking of result)
+     - Rot (needs duplication into LSBs, masking of amount and masking of result)
+     - ctz (needs shr of operand or sub from result)
+
+     Both {Nat,Int}{8,16} fit into the vanilla stackrep, so no boxing is necessary.
+     This MSB-stored schema is also essentially what the interpreter is using.
+  *)
+  let prim_word32toNat = BigNum.from_word32
+  let prim_shiftWordNtoUnsigned env b =
+    compile_shrU_const b ^^
+    prim_word32toNat env
+  let prim_word32toInt = BigNum.from_signed_word32
+  let prim_shiftWordNtoSigned env b =
+    compile_shrS_const b ^^
+    prim_word32toInt env
+  let prim_intToWord32 = BigNum.truncate_to_word32
+  let prim_intToWordNShifted env b =
+    prim_intToWord32 env ^^
+    TaggedSmallWord.shift_leftWordNtoI32 b
+end (* Prim *)
+
+module Object = struct
+ (* An object with a mutable field1 and immutable field 2 has the following
+    heap layout:
+
+    ┌──────┬─────┬──────────┬──────────┬─────────┬─────────────┬───┐
+    │ obj header │ n_fields │ hash_ptr │ ind_ptr │ field2_data │ … │
+    └──────┴─────┴──────────┴┬─────────┴┬────────┴─────────────┴───┘
+         ┌───────────────────┘          │
+         │   ┌──────────────────────────┘
+         │   ↓
+         │  ╶─┬────────┬─────────────┐
+         │    │ ObjInd │ field1_data │
+         ↓    └────────┴─────────────┘
+        ╶─┬─────────────┬─────────────┬───┐
+          │ field1_hash │ field2_hash │ … │
+          └─────────────┴─────────────┴───┘
+
+    The object header includes the object tag (Object) and the forwarding pointer.
+    The forwarding pointer is only reserved if compiled for the incremental GC.
+
+    The field hash array lives in static memory (so no size header needed).
+    The hash_ptr is skewed.
+
+    The field2_data for immutable fields is a vanilla word.
+
+    The field1_data for mutable fields are pointers to either an ObjInd, or a
+    MutBox (they have the same layout). This indirection is a consequence of
+    how we compile object literals with `await` instructions, as these mutable
+    fields need to be able to alias local mutable variables.
+
+    We could alternatively switch to an allocate-first approach in the
+    await-translation of objects, and get rid of this indirection -- if it were
+    not for the implementing of sharing of mutable stable values.
+  *)
+
+  let header_size env = Int32.add (Tagged.header_size env) 2l
+
+  (* Number of object fields *)
+  let size_field env = Int32.add (Tagged.header_size env) 0l
+  let hash_ptr_field env = Int32.add (Tagged.header_size env) 1l
+
+  module FieldEnv = Env.Make(String)
+
+  (* This is for static objects *)
+  let vanilla_lit env (fs : (string * int32) list) : int32 =
+    let (hashes, ptrs) = fs
+      |> List.map (fun (n, ptr) -> (Mo_types.Hash.hash n,ptr))
+      |> List.sort compare
+      |> List.split
+    in
+
+    let hash_ptr = E.add_static env StaticBytes.[ i32s hashes ] in
+
+    Tagged.shared_static_obj env Tagged.Object StaticBytes.[
+      I32 (Int32.of_int (List.length fs));
+      I32 hash_ptr;
+      i32s ptrs;
+    ]
+
+  (* This is for non-recursive objects, i.e. ObjNewE *)
+  (* The instructions in the field already create the indirection if needed *)
+  let lit_raw env (fs : (string * (unit -> G.t)) list ) =
+    let name_pos_map =
+      fs |>
+      (* We could store only public fields in the object, but
+         then we need to allocate separate boxes for the non-public ones:
+         List.filter (fun (_, vis, f) -> vis.it = Public) |>
+      *)
+      List.map (fun (n,_) -> (E.hash env n, n)) |>
+      List.sort compare |>
+      List.mapi (fun i (_h,n) -> (n,Int32.of_int i)) |>
+      List.fold_left (fun m (n,i) -> FieldEnv.add n i m) FieldEnv.empty in
+
+    let sz = Int32.of_int (FieldEnv.cardinal name_pos_map) in
+
+    (* Create hash array *)
+    let hashes = fs |>
+      List.map (fun (n,_) -> E.hash env n) |>
+      List.sort compare in
+    let hash_ptr = E.add_static env StaticBytes.[ i32s hashes ] in
+
+    (* Allocate memory *)
+    let (set_ri, get_ri, ri) = new_local_ env I32Type "obj" in
+    Tagged.alloc env (Int32.add (header_size env) sz) Tagged.Object ^^
+    set_ri ^^
+
+    (* Set size *)
+    get_ri ^^
+    compile_unboxed_const sz ^^
+    Tagged.store_field env (size_field env) ^^
+
+    (* Set hash_ptr *)
+    get_ri ^^
+    compile_unboxed_const hash_ptr ^^
+    Tagged.store_field env (hash_ptr_field env) ^^
+
+    (* Write all the fields *)
+    let init_field (name, mk_is) : G.t =
+      (* Write the pointer to the indirection *)
+      get_ri ^^
+      mk_is () ^^
+      let i = FieldEnv.find name name_pos_map in
+      let offset = Int32.add (header_size env) i in
+      Tagged.store_field env offset
+    in
+    G.concat_map init_field fs ^^
+
+    (* Return the pointer to the object *)
+    get_ri ^^
+    Tagged.allocation_barrier env
+
+  (* Returns a pointer to the object field (without following the field indirection) *)
+  let idx_hash_raw env low_bound =
+    let name = Printf.sprintf "obj_idx<%d>" low_bound  in
+    Func.share_code2 Func.Always env name (("x", I32Type), ("hash", I32Type)) [I32Type] (fun env get_x get_hash ->
+      let set_x = G.setter_for get_x in
+      let set_h_ptr, get_h_ptr = new_local env "h_ptr" in
+
+      get_x ^^ Tagged.load_forwarding_pointer env ^^ set_x ^^
+
+      get_x ^^ Tagged.load_field env (hash_ptr_field env) ^^
+
+      (* Linearly scan through the fields (binary search can come later) *)
+      (* unskew h_ptr and advance both to low bound *)
+      compile_add_const Int32.(add ptr_unskew (mul Heap.word_size (of_int low_bound))) ^^
+      set_h_ptr ^^
+      get_x ^^
+      compile_add_const Int32.(mul Heap.word_size (add (header_size env) (of_int low_bound))) ^^
+      set_x ^^
+      G.loop0 (
+          get_h_ptr ^^ load_unskewed_ptr ^^
+          get_hash ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if0
+            (get_x ^^ G.i Return)
+            (get_h_ptr ^^ compile_add_const Heap.word_size ^^ set_h_ptr ^^
+             get_x ^^ compile_add_const Heap.word_size ^^ set_x ^^
+             G.i (Br (nr 1l)))
+        ) ^^
+      G.i Unreachable
+    )
+
+  (* Returns a pointer to the object field (possibly following the indirection) *)
+  let idx_hash env low_bound indirect =
+    if indirect
+    then
+      let name = Printf.sprintf "obj_idx_ind<%d>" low_bound in
+      Func.share_code2 Func.Never env name (("x", I32Type), ("hash", I32Type)) [I32Type] (fun env get_x get_hash ->
+      get_x ^^ get_hash ^^
+      idx_hash_raw env low_bound ^^
+      load_ptr ^^ Tagged.load_forwarding_pointer env ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size)
+    )
+    else idx_hash_raw env low_bound
+
+  let field_type env obj_type s =
+    let _, fields = Type.as_obj_sub [s] obj_type in
+    Type.lookup_val_field s fields
+
+  (* Determines whether the field is mutable (and thus needs an indirection) *)
+  let is_mut_field env obj_type s =
+    let _, fields = Type.as_obj_sub [s] obj_type in
+    Type.is_mut (Type.lookup_val_field s fields)
+
+  (* Computes a lower bound for the positional index of a field in an object *)
+  let field_lower_bound env obj_type s =
+    let open Type in
+    let _, fields = as_obj_sub [s] obj_type in
+    List.iter (function {typ = Typ _; _} -> assert false | _ -> ()) fields;
+    let sorted_by_hash =
+      List.sort
+        (fun (h1, _) (h2, _) -> Lib.Uint32.compare h1 h2)
+        (List.map (fun f -> Lib.Uint32.of_int32 (E.hash env f.lab), f) fields) in
+    match Lib.List.index_of s (List.map (fun (_, {lab; _}) -> lab) sorted_by_hash) with
+    | Some i -> i
+    | _ -> assert false
+
+  (* Returns a pointer to the object field (without following the indirection) *)
+  let idx_raw env f =
+    compile_unboxed_const (E.hash env f) ^^
+    idx_hash_raw env 0
+
+  (* Returns a pointer to the object field (possibly following the indirection) *)
+  let idx env obj_type f =
+    compile_unboxed_const (E.hash env f) ^^
+    idx_hash env (field_lower_bound env obj_type f) (is_mut_field env obj_type f)
+
+  (* load the value (or the mutbox) *)
+  let load_idx_raw env f =
+    idx_raw env f ^^
+    load_ptr
+
+  (* load the actual value (dereferencing the mutbox) *)
+  let load_idx env obj_type f =
+    idx env obj_type f ^^
+    load_ptr
+
+end (* Object *)
+
+module Blob = struct
+  (* The layout of a blob object is
+
+     ┌──────┬─────┬─────────┬──────────────────┐
+     │ obj header │ n_bytes │ bytes (padded) … │
+     └──────┴─────┴─────────┴──────────────────┘
+
+    The object header includes the object tag (Blob) and the forwarding pointer.
+    The forwarding pointer is only reserved if compiled for the incremental GC.
+
+    This heap object is used for various kinds of binary, non-pointer data.
+
+    When used for Text values, the bytes are UTF-8 encoded code points from
+    Unicode.
+  *)
+
+  let header_size env = Int32.add (Tagged.header_size env) 1l
+  let len_field env = Int32.add (Tagged.header_size env) 0l
+
+  let len env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (len_field env)
+
+  let len_nat env =
+    Func.share_code1 Func.Never env "blob_len" ("text", I32Type) [I32Type] (fun env get ->
+      get ^^
+      len env ^^
+      BigNum.from_word32 env
+    )
+
+  let vanilla_lit env s =
+    Tagged.shared_static_obj env Tagged.Blob StaticBytes.[
+      I32 (Int32.of_int (String.length s));
+      Bytes s;
+    ]
+
+  let lit env s = compile_unboxed_const (vanilla_lit env s)
+
+  let lit_ptr_len env s =
+    compile_unboxed_const (Int32.add ptr_unskew (E.add_static env StaticBytes.[Bytes s])) ^^
+    compile_unboxed_const (Int32.of_int (String.length s))
+
+  let alloc env =
+    E.call_import env "rts" "alloc_blob" ^^
+    (* uninitialized blob payload is allowed by the barrier *)
+    Tagged.allocation_barrier env
+
+  let unskewed_payload_offset env = Int32.(add ptr_unskew (mul Heap.word_size (header_size env)))
+
+  let payload_ptr_unskewed env =
+    Tagged.load_forwarding_pointer env ^^
+    compile_add_const (unskewed_payload_offset env)
+
+  let as_ptr_len env = Func.share_code1 Func.Never env "as_ptr_size" ("x", I32Type) [I32Type; I32Type] (
+    fun env get_x ->
+      get_x ^^ payload_ptr_unskewed env ^^
+      get_x ^^ len env
+    )
+
+  let of_ptr_size env = Func.share_code2 Func.Always env "blob_of_ptr_size" (("ptr", I32Type), ("size" , I32Type)) [I32Type] (
+    fun env get_ptr get_size ->
+      let (set_x, get_x) = new_local env "x" in
+      get_size ^^ alloc env ^^ set_x ^^
+      get_x ^^ payload_ptr_unskewed env ^^
+      get_ptr ^^
+      get_size ^^
+      Heap.memcpy env ^^
+      get_x
+    )
+
+  let of_size_copy env get_size_fun copy_fun offset_fun =
+    let (set_len, get_len) = new_local env "len" in
+    let (set_blob, get_blob) = new_local env "blob" in
+    get_size_fun env ^^ set_len ^^
+
+    get_len ^^ alloc env ^^ set_blob ^^
+    get_blob ^^ payload_ptr_unskewed env ^^
+    offset_fun env ^^
+    get_len ^^
+    copy_fun env ^^
+
+    get_blob
+
+  (* Lexicographic blob comparison. Expects two blobs on the stack.
+     Either specialized to a specific comparison operator, and returns a boolean,
+     or implements the generic comparison, returning -1, 0 or 1 as Int8.
+  *)
+  let rec compare env op =
+    (* return convention for the generic comparison function *)
+    let is_lt = compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Int8 (-1)) in
+    let is_gt = compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Int8 1) in
+    let is_eq = compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Int8 0) in
+    let open Operator in
+    let name = match op with
+        | Some LtOp -> "Blob.compare_lt"
+        | Some LeOp -> "Blob.compare_le"
+        | Some GeOp -> "Blob.compare_ge"
+        | Some GtOp -> "Blob.compare_gt"
+        | Some EqOp -> "Blob.compare_eq"
+        | Some NeqOp -> "Blob.compare_neq"
+        | None -> "Blob.compare" in
+    Func.share_code2 Func.Always env name (("x", I32Type), ("y", I32Type)) [I32Type] (fun env get_x get_y ->
+      match op with
+        (* Some operators can be reduced to the negation of other operators *)
+        | Some LtOp -> get_x ^^ get_y ^^ compare env (Some GeOp) ^^ Bool.neg
+        | Some GtOp -> get_x ^^ get_y ^^ compare env (Some LeOp) ^^ Bool.neg
+        | Some NeqOp -> get_x ^^ get_y ^^ compare env (Some EqOp) ^^ Bool.neg
+        | _ ->
+      begin
+        let set_x = G.setter_for get_x in
+        let set_y = G.setter_for get_y in
+        get_x ^^ Tagged.load_forwarding_pointer env ^^ set_x ^^
+        get_y ^^ Tagged.load_forwarding_pointer env ^^ set_y ^^
+
+        let (set_len1, get_len1) = new_local env "len1" in
+        let (set_len2, get_len2) = new_local env "len2" in
+        let (set_len, get_len) = new_local env "len" in
+        let (set_a, get_a) = new_local env "a" in
+        let (set_b, get_b) = new_local env "b" in
+
+        get_x ^^ len env ^^ set_len1 ^^
+        get_y ^^ len env ^^ set_len2 ^^
+
+        (* Find minimum length *)
+        begin if op = Some EqOp then
+          (* Early exit for equality *)
+          get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if0 G.nop (Bool.lit false ^^ G.i Return) ^^
+
+          get_len1 ^^ set_len
+        else
+          get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+          G.if0
+            (get_len1 ^^ set_len)
+            (get_len2 ^^ set_len)
+        end ^^
+
+        (* We could do word-wise comparisons if we know that the trailing bytes
+           are zeroed *)
+        get_len ^^
+        from_0_to_n env (fun get_i ->
+          get_x ^^
+          payload_ptr_unskewed env ^^
+          get_i ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+          G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+          set_a ^^
+
+          get_y ^^
+          payload_ptr_unskewed env ^^
+          get_i ^^
+          G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+          G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+          set_b ^^
+
+          get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if0 G.nop (
+            (* first non-equal elements *)
+            begin match op with
+            | Some LeOp -> get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+            | Some GeOp -> get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeU))
+            | Some EqOp -> Bool.lit false
+            | None -> get_a ^^ get_b ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+                      G.if1 I32Type is_lt is_gt
+            | _ -> assert false
+            end ^^
+            G.i Return
+          )
+        ) ^^
+        (* Common prefix is same *)
+        match op with
+        | Some LeOp -> get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU))
+        | Some GeOp -> get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeU))
+        | Some EqOp -> Bool.lit true (* NB: Different length handled above *)
+        | None ->
+            get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+            G.if1 I32Type is_lt (
+              get_len1 ^^ get_len2 ^^ G.i (Compare (Wasm.Values.I32 I32Op.GtU)) ^^
+              G.if1 I32Type is_gt is_eq
+            )
+        | _ -> assert false
+      end
+  )
+
+  let iter env =
+    E.call_import env "rts" "blob_iter"
+  let iter_done env =
+    E.call_import env "rts" "blob_iter_done"
+  let iter_next env =
+    E.call_import env "rts" "blob_iter_next" ^^
+    TaggedSmallWord.msb_adjust Type.Nat8
+
+  let dyn_alloc_scratch env = alloc env ^^ payload_ptr_unskewed env
+
+  (* TODO: rewrite using MemoryFill *)
+  let clear env =
+    Func.share_code1 Func.Always env "blob_clear" ("x", I32Type) [] (fun env get_x ->
+      let (set_ptr, get_ptr) = new_local env "ptr" in
+      let (set_len, get_len) = new_local env "len" in
+      get_x ^^
+      as_ptr_len env ^^
+      set_len ^^
+      set_ptr ^^
+
+      (* round to word size *)
+      get_len ^^
+      compile_add_const (Int32.sub Heap.word_size 1l) ^^
+      compile_divU_const Heap.word_size ^^
+
+      (* clear all words *)
+      from_0_to_n env (fun get_i ->
+        get_ptr ^^
+        compile_unboxed_const 0l ^^
+        store_unskewed_ptr ^^
+        get_ptr ^^
+        compile_add_const Heap.word_size ^^
+        set_ptr))
+
+end (* Blob *)
+
+module Region = struct
+  (*
+    See rts/motoko-rts/src/region.rs
+   *)
+
+  (* Object layout:
+
+     ┌─────┬──────────┬──────────────────┬─────────────────┐
+     │ tag │ id_field │ page_count_field │ vec_pages_field │
+     └─────┴──────────┴──────────────────┴─────────────────┘
+            (unboxed, low 16 bits, rest 0-initialized padding)
+                        unboxed u32
+                                          Blob
+  *)
+
+  let alloc_region env =
+    E.call_import env "rts" "alloc_region"
+
+  let init_region env =
+    E.call_import env "rts" "init_region"
+
+  (* field accessors *)
+  (* NB: all these opns must resolve forwarding pointers here or in RTS *)
+  let id env =
+    E.call_import env "rts" "region_id"
+
+  let page_count env =
+    E.call_import env "rts" "region_page_count"
+
+  let vec_pages env =
+    E.call_import env "rts" "region_vec_pages"
+
+  let new_ env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_new"
+
+  let size env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_size"
+
+  let grow env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_grow"
+
+  let load_blob env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_load_blob"
+  let store_blob env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_store_blob"
+
+  let load_word8 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_load_word8"
+  let store_word8 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_store_word8"
+
+  let load_word16 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_load_word16"
+  let store_word16 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_store_word16"
+
+  let load_word32 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_load_word32"
+  let store_word32 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_store_word32"
+
+  let load_word64 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_load_word64"
+  let store_word64 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_store_word64"
+
+  let load_float64 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_load_float64"
+  let store_float64 env =
+    E.require_stable_memory env;
+    E.call_import env "rts" "region_store_float64"
+
+end
+
+module Text = struct
+  (*
+  Most of the heavy lifting around text values is in rts/motoko-rts/src/text.rs
+  *)
+
+  (* The layout of a concatenation node is
+
+     ┌──────┬─────┬─────────┬───────┬───────┐
+     │ obj header │ n_bytes │ text1 │ text2 │
+     └──────┴─────┴─────────┴───────┴───────┘
+
+    The object header includes the object tag (TAG_CONCAT defined in rts/types.rs) and the forwarding pointer
+    The forwarding pointer is only reserved if compiled for the incremental GC.
+
+    This is internal to rts/text.c, with the exception of GC-related code.
+  *)
+
+  let of_ptr_size env =
+    E.call_import env "rts" "text_of_ptr_size"
+  let concat env =
+    E.call_import env "rts" "text_concat"
+  let size env =
+    E.call_import env "rts" "text_size"
+  let to_buf env =
+    E.call_import env "rts" "text_to_buf"
+  let len_nat env =
+    Func.share_code1 Func.Never env "text_len" ("text", I32Type) [I32Type] (fun env get ->
+      get ^^
+      E.call_import env "rts" "text_len" ^^
+      BigNum.from_word32 env
+    )
+  let prim_showChar env =
+    TaggedSmallWord.lsb_adjust_codepoint env ^^
+    E.call_import env "rts" "text_singleton"
+  let to_blob env = E.call_import env "rts" "blob_of_text"
+
+  let lowercase env = E.call_import env "rts" "text_lowercase"
+  let uppercase env = E.call_import env "rts" "text_uppercase"
+
+  let of_blob env =
+    let (set_blob, get_blob) = new_local env "blob" in
+    set_blob ^^
+    get_blob ^^ Blob.as_ptr_len env ^^
+    E.call_import env "rts" "utf8_valid" ^^
+    G.if1 I32Type (Opt.inject_simple env get_blob) (Opt.null_lit env)
+
+  let iter env =
+    E.call_import env "rts" "text_iter"
+  let iter_done env =
+    E.call_import env "rts" "text_iter_done"
+  let iter_next env =
+    E.call_import env "rts" "text_iter_next" ^^
+    TaggedSmallWord.msb_adjust_codepoint
+
+  let compare env op =
+    let open Operator in
+    let name = match op with
+        | LtOp -> "Text.compare_lt"
+        | LeOp -> "Text.compare_le"
+        | GeOp -> "Text.compare_ge"
+        | GtOp -> "Text.compare_gt"
+        | EqOp -> "Text.compare_eq"
+        | NeqOp -> assert false in
+    Func.share_code2 Func.Never env name (("x", I32Type), ("y", I32Type)) [I32Type] (fun env get_x get_y ->
+      get_x ^^ Tagged.load_forwarding_pointer env ^^
+      get_y ^^ Tagged.load_forwarding_pointer env ^^
+      E.call_import env "rts" "text_compare" ^^
+      compile_unboxed_const 0l ^^
+      match op with
+        | LtOp -> G.i (Compare (Wasm.Values.I32 I32Op.LtS))
+        | LeOp -> G.i (Compare (Wasm.Values.I32 I32Op.LeS))
+        | GtOp -> G.i (Compare (Wasm.Values.I32 I32Op.GtS))
+        | GeOp -> G.i (Compare (Wasm.Values.I32 I32Op.GeS))
+        | EqOp -> G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+        | NeqOp -> assert false
+    )
+
+
+end (* Text *)
+
+module Arr = struct
+  (* Object layout:
+
+     ┌──────┬─────┬──────────┬────────┬───┐
+     │ obj header │ n_fields │ field1 │ … │
+     └──────┴─────┴──────────┴────────┴───┘
+
+     The object  header includes the object tag (Array) and the forwarding pointer.
+     The forwarding pointer is only reserved if compiled for the incremental GC.
+
+     No difference between mutable and immutable arrays.
+  *)
+
+  (* NB max_array_size must agree with limit 2^29 imposed by RTS constants.MAX_ARRAY_SIZE *)
+  let max_array_size env = Int32.shift_left 1l 29 (* inclusive *)
+
+  let header_size env = Int32.add (Tagged.header_size env) 1l
+  let element_size = 4l
+  let len_field env = Int32.add (Tagged.header_size env) 0l
+
+  let len env =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (len_field env)
+
+  (* Static array access. No checking *)
+  let load_field env n =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env Int32.(add n (header_size env))
+
+  (* Dynamic array access. Returns the address (not the value) of the field.
+     Does no bounds checking *)
+  let unsafe_idx env =
+    Func.share_code2 Func.Never env "Array.unsafe_idx" (("array", I32Type), ("idx", I32Type)) [I32Type] (fun env get_array get_idx ->
+      get_idx ^^
+      compile_add_const (header_size env) ^^
+      compile_mul_const element_size ^^
+      get_array ^^
+      Tagged.load_forwarding_pointer env ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Add))
+    )
+
+  (* Dynamic array access. Returns the address (not the value) of the field.
+     Does bounds checking *)
+  let idx env =
+    Func.share_code2 Func.Never env "Array.idx" (("array", I32Type), ("idx", I32Type)) [I32Type] (fun env get_array get_idx ->
+      (* No need to check the lower bound, we interpret idx as unsigned *)
+      (* Check the upper bound *)
+      get_idx ^^
+      get_array ^^ len env ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+      E.else_trap_with env "Array index out of bounds" ^^
+
+      get_idx ^^
+      compile_add_const (header_size env) ^^
+      compile_mul_const element_size ^^
+      get_array ^^
+      Tagged.load_forwarding_pointer env ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Add))
+    )
+
+  (* As above, but taking a bigint (Nat), and reporting overflow as out of bounds *)
+  let idx_bigint env =
+    Func.share_code2 Func.Never env "Array.idx_bigint" (("array", I32Type), ("idx", I32Type)) [I32Type] (fun env get_array get_idx ->
+      get_array ^^
+      get_idx ^^
+      Blob.lit env "Array index out of bounds" ^^
+      BigNum.to_word32_with env ^^
+      idx env
+  )
+
+  let element_type env typ = match Type.promote typ with
+     | Type.Array element_type -> element_type
+     | _ -> assert false
+
+  let vanilla_lit env ptrs =
+    Tagged.shared_static_obj env Tagged.Array StaticBytes.[
+      I32 (Int32.of_int (List.length ptrs));
+      i32s ptrs;
+    ]
+
+  (* Compile an array literal. *)
+  let lit env element_instructions =
+    Tagged.obj env Tagged.Array
+     ([ compile_unboxed_const (Wasm.I32.of_int_u (List.length element_instructions))
+      ] @ element_instructions)
+
+  (* Does not initialize the fields! *)
+  (* Note: Post allocation barrier must be applied after initialization *)
+  let alloc env =
+    E.call_import env "rts" "alloc_array"
+
+  let iterate env get_array body =
+    let (set_boundary, get_boundary) = new_local env "boundary" in
+    let (set_pointer, get_pointer) = new_local env "pointer" in
+    let set_array = G.setter_for get_array in
+
+    get_array ^^ Tagged.load_forwarding_pointer env ^^ set_array ^^
+
+    (* Initial element pointer, skewed *)
+    compile_unboxed_const (header_size env) ^^
+    compile_mul_const element_size ^^
+    get_array ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_pointer ^^
+
+    (* Upper pointer boundary, skewed *)
+    get_array ^^
+    Tagged.load_field env (len_field env) ^^
+    compile_mul_const element_size ^^
+    get_pointer ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    set_boundary ^^
+
+    (* Loop through all elements *)
+    compile_while env
+    ( get_pointer ^^
+      get_boundary ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU))
+    ) (
+      body get_pointer ^^
+
+      (* Next element pointer, skewed *)
+      get_pointer ^^
+      compile_add_const element_size ^^
+      set_pointer
+    )
+
+  (* The primitive operations *)
+  (* No need to wrap them in RTS functions: They occur only once, in the prelude. *)
+  let init env =
+    let (set_x, get_x) = new_local env "x" in
+    let (set_r, get_r) = new_local env "r" in
+    set_x ^^
+
+    (* Allocate *)
+    BigNum.to_word32 env ^^
+    alloc env ^^
+    set_r ^^
+
+    (* Write elements *)
+    iterate env get_r (fun get_pointer ->
+      get_pointer ^^
+      get_x ^^
+      store_ptr
+    ) ^^
+
+    get_r ^^
+    Tagged.allocation_barrier env
+
+  let tabulate env =
+    let (set_f, get_f) = new_local env "f" in
+    let (set_r, get_r) = new_local env "r" in
+    let (set_i, get_i) = new_local env "i" in
+    set_f ^^
+
+    (* Allocate *)
+    BigNum.to_word32 env ^^
+    alloc env ^^
+    set_r ^^
+
+    (* Initial index *)
+    compile_unboxed_const 0l ^^
+    set_i ^^
+
+    (* Write elements *)
+    iterate env get_r (fun get_pointer ->
+      get_pointer ^^
+      (* The closure *)
+      get_f ^^
+      Closure.prepare_closure_call env ^^
+      (* The arg *)
+      get_i ^^
+      BigNum.from_word32 env ^^
+      (* The closure again *)
+      get_f ^^
+      (* Call *)
+      Closure.call_closure env 1 1 ^^
+      store_ptr ^^
+
+      (* Increment index *)
+      get_i ^^
+      compile_add_const 1l ^^
+      set_i
+    ) ^^
+    get_r ^^
+    Tagged.allocation_barrier env
+
+  let ofBlob env =
+    Func.share_code1 Func.Always env "Arr.ofBlob" ("blob", I32Type) [I32Type] (fun env get_blob ->
+      let (set_len, get_len) = new_local env "len" in
+      let (set_r, get_r) = new_local env "r" in
+
+      get_blob ^^ Blob.len env ^^ set_len ^^
+
+      get_len ^^ alloc env ^^ set_r ^^
+
+      get_len ^^ from_0_to_n env (fun get_i ->
+        get_r ^^ get_i ^^ unsafe_idx env ^^
+        get_blob ^^ Blob.payload_ptr_unskewed env ^^
+        get_i ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+        G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}) ^^
+        TaggedSmallWord.msb_adjust Type.Nat8 ^^
+        TaggedSmallWord.tag env Type.Nat8 ^^
+        store_ptr
+      ) ^^
+      get_r ^^
+      Tagged.allocation_barrier env
+    )
+
+  let toBlob env =
+    Func.share_code1 Func.Always env "Arr.toBlob" ("array", I32Type) [I32Type] (fun env get_a ->
+      let (set_len, get_len) = new_local env "len" in
+      let (set_r, get_r) = new_local env "r" in
+
+      get_a ^^ len env ^^ set_len ^^
+
+      get_len ^^ Blob.alloc env ^^ set_r ^^
+
+      get_len ^^ from_0_to_n env (fun get_i ->
+        get_r ^^ Blob.payload_ptr_unskewed env ^^
+        get_i ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+        get_a ^^ get_i ^^ unsafe_idx env ^^
+        load_ptr ^^
+        TaggedSmallWord.lsb_adjust Type.Nat8 ^^
+        G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.Pack8})
+      ) ^^
+
+      get_r
+    )
+
+end (* Array *)
+
+module Tuple = struct
+  (* Tuples use the same object representation (and same tag) as arrays.
+     Even though we know the size statically, we still need the size
+     information for the GC.
+
+     One could introduce tags for small tuples, to save one word.
+  *)
+
+  (* We represent the boxed empty tuple as the unboxed scalar 0, i.e. simply as
+     number (but really anything is fine, we never look at this) *)
+  let unit_vanilla_lit env = TaggingScheme.unit_tag ()  (* all tag, trivial payload *)
+  let compile_unit env = compile_unboxed_const (unit_vanilla_lit ())
+
+  (* Expects on the stack the pointer to the array. *)
+  let load_n env n =
+    Tagged.load_forwarding_pointer env ^^
+    Tagged.load_field env (Int32.add (Arr.header_size env) n)
+
+  (* Takes n elements of the stack and produces an argument tuple *)
+  let from_stack env n =
+    if n = 0 then compile_unit env
+    else
+      let name = Printf.sprintf "to_%i_tuple" n in
+      let args = Lib.List.table n (fun i -> Printf.sprintf "arg%i" i, I32Type) in
+      Func.share_code Func.Never env name args [I32Type] (fun env getters ->
+        Arr.lit env (Lib.List.table n (fun i -> List.nth getters i))
+      )
+
+  (* Takes an argument tuple and puts the elements on the stack: *)
+  let to_stack env n =
+    if n = 0 then G.i Drop else
+    begin
+      let name = Printf.sprintf "from_%i_tuple" n in
+      let retty = Lib.List.make n I32Type in
+      Func.share_code1 Func.Never env name ("tup", I32Type) retty (fun env get_tup ->
+        G.table n (fun i -> get_tup ^^ load_n env (Int32.of_int i))
+      )
+    end
+
+end (* Tuple *)
+
+module Lifecycle = struct
+  (*
+  This module models the life cycle of a canister as a very simple state machine,
+  keeps track of the current state of the canister, and traps noisily if an
+  unexpected transition happens. Such a transition would either be a bug in the
+  underlying system, or in our RTS.
+  *)
+
+  type state =
+    | PreInit
+  (* We do not use the (start) function when compiling canisters, so skip
+     these two:
+    | InStart
+    | Started (* (start) has run *)
+  *)
+    | InInit (* canister_init *)
+    | Idle (* basic steady state *)
+    | InUpdate
+    | InQuery
+    | PostQuery (* an invalid state *)
+    | InPreUpgrade
+    | PostPreUpgrade (* an invalid state *)
+    | InPostUpgrade
+    | InComposite
+
+  let string_of_state state = match state with
+    | PreInit -> "PreInit"
+    | InInit -> "InInit"
+    | Idle -> "Idle"
+    | InUpdate -> "InUpdate"
+    | InQuery -> "InQuery"
+    | PostQuery -> "PostQuery"
+    | InPreUpgrade -> "InPreUpgrade"
+    | PostPreUpgrade -> "PostPreUpgrade"
+    | InPostUpgrade -> "InPostUpgrade"
+    | InComposite -> "InComposite"
+
+  let int_of_state = function
+    | PreInit -> 0l (* Automatically null *)
+    (*
+    | InStart -> 1l
+    | Started -> 2l
+    *)
+    | InInit -> 3l
+    | Idle -> 4l
+    | InUpdate -> 5l
+    | InQuery -> 6l
+    | PostQuery -> 7l
+    | InPreUpgrade -> 8l
+    | PostPreUpgrade -> 9l
+    | InPostUpgrade -> 10l
+    | InComposite -> 11l
+
+  let ptr () = Stack.end_ ()
+  let end_ () = Int32.add (Stack.end_ ()) Heap.word_size
+
+  (* Which states may come before this *)
+  let pre_states = function
+    | PreInit -> []
+    (*
+    | InStart -> [PreInit]
+    | Started -> [InStart]
+    *)
+    | InInit -> [PreInit]
+    | Idle -> [InInit; InUpdate; InPostUpgrade; InComposite]
+    | InUpdate -> [Idle]
+    | InQuery -> [Idle]
+    | PostQuery -> [InQuery]
+    | InPreUpgrade -> [Idle]
+    | PostPreUpgrade -> [InPreUpgrade]
+    | InPostUpgrade -> [InInit]
+    | InComposite -> [Idle; InComposite]
+
+  let get env =
+    compile_unboxed_const (ptr ()) ^^
+    load_unskewed_ptr
+
+  let set env new_state =
+    compile_unboxed_const (ptr ()) ^^
+    compile_unboxed_const (int_of_state new_state) ^^
+    store_unskewed_ptr
+
+  let trans env new_state =
+    let name = "trans_state" ^ Int32.to_string (int_of_state new_state) in
+    Func.share_code0 Func.Always env name [] (fun env ->
+      G.block0 (
+        let rec go = function
+        | [] -> E.trap_with env
+          ("internal error: unexpected state entering " ^ string_of_state new_state)
+        | (s::ss) ->
+          get env ^^ compile_eq_const (int_of_state s) ^^
+          G.if0 (G.i (Br (nr 1l))) G.nop ^^
+          go ss
+        in go (pre_states new_state)
+        ) ^^
+      set env new_state
+    )
+
+  let is_in env state =
+    get env ^^
+    compile_eq_const (int_of_state state)
+
+end (* Lifecycle *)
+
+
+module IC = struct
+
+  (* IC-specific stuff: System imports, databufs etc. *)
+
+  let register_globals env =
+    (* result of last ic0.call_perform  *)
+    E.add_global32 env "__call_perform_status" Mutable 0l;
+    E.add_global32 env "__call_perform_message" Mutable 0l
+    (* NB: __call_perform_message is not a root so text contents *must* be static *)
+
+  let get_call_perform_status env =
+    G.i (GlobalGet (nr (E.get_global env "__call_perform_status")))
+  let set_call_perform_status env =
+    G.i (GlobalSet (nr (E.get_global env "__call_perform_status")))
+  let get_call_perform_message env =
+    G.i (GlobalGet (nr (E.get_global env "__call_perform_message")))
+  let set_call_perform_message env =
+    G.i (GlobalSet (nr (E.get_global env "__call_perform_message")))
+
+  let init_globals env =
+    Blob.lit env "" ^^
+    set_call_perform_message env
+
+  let i32s n = Lib.List.make n I32Type
+  let i64s n = Lib.List.make n I64Type
+
+  let import_ic0 env =
+      E.add_func_import env "ic0" "accept_message" [] [];
+      E.add_func_import env "ic0" "call_data_append" (i32s 2) [];
+      E.add_func_import env "ic0" "call_cycles_add128" (i64s 2) [];
+      E.add_func_import env "ic0" "call_new" (i32s 8) [];
+      E.add_func_import env "ic0" "call_perform" [] [I32Type];
+      E.add_func_import env "ic0" "call_on_cleanup" (i32s 2) [];
+      E.add_func_import env "ic0" "canister_cycle_balance128" [I32Type] [];
+      E.add_func_import env "ic0" "canister_self_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "canister_self_size" [] [I32Type];
+      E.add_func_import env "ic0" "canister_status" [] [I32Type];
+      E.add_func_import env "ic0" "canister_version" [] [I64Type];
+      E.add_func_import env "ic0" "is_controller" (i32s 2) [I32Type];
+      E.add_func_import env "ic0" "debug_print" (i32s 2) [];
+      E.add_func_import env "ic0" "msg_arg_data_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_arg_data_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_caller_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_caller_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_cycles_available128" [I32Type] [];
+      E.add_func_import env "ic0" "msg_cycles_refunded128" [I32Type] [];
+      E.add_func_import env "ic0" "msg_cycles_accept128" [I64Type; I64Type; I32Type] [];
+      E.add_func_import env "ic0" "certified_data_set" (i32s 2) [];
+      E.add_func_import env "ic0" "data_certificate_present" [] [I32Type];
+      E.add_func_import env "ic0" "data_certificate_size" [] [I32Type];
+      E.add_func_import env "ic0" "data_certificate_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_method_name_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_method_name_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_reject_code" [] [I32Type];
+      E.add_func_import env "ic0" "msg_reject_msg_size" [] [I32Type];
+      E.add_func_import env "ic0" "msg_reject_msg_copy" (i32s 3) [];
+      E.add_func_import env "ic0" "msg_reject" (i32s 2) [];
+      E.add_func_import env "ic0" "msg_reply_data_append" (i32s 2) [];
+      E.add_func_import env "ic0" "msg_reply" [] [];
+      E.add_func_import env "ic0" "performance_counter" [I32Type] [I64Type];
+      E.add_func_import env "ic0" "trap" (i32s 2) [];
+      E.add_func_import env "ic0" "stable64_write" (i64s 3) [];
+      E.add_func_import env "ic0" "stable64_read" (i64s 3) [];
+      E.add_func_import env "ic0" "stable64_size" [] [I64Type];
+      E.add_func_import env "ic0" "stable64_grow" [I64Type] [I64Type];
+      E.add_func_import env "ic0" "time" [] [I64Type];
+      if !Flags.global_timer then
+        E.add_func_import env "ic0" "global_timer_set" [I64Type] [I64Type];
+      ()
+
+  let system_imports env =
+    match E.mode env with
+    | Flags.ICMode ->
+      import_ic0 env
+    | Flags.RefMode  ->
+      import_ic0 env
+    | Flags.WASIMode ->
+      E.add_func_import env "wasi_snapshot_preview1" "fd_write" [I32Type; I32Type; I32Type; I32Type] [I32Type];
+    | Flags.WasmMode -> ()
+
+  let system_call env funcname = E.call_import env "ic0" funcname
+
+  let register env =
+
+      Func.define_built_in env "print_ptr" [("ptr", I32Type); ("len", I32Type)] [] (fun env ->
+        match E.mode env with
+        | Flags.WasmMode -> G.i Nop
+        | Flags.ICMode | Flags.RefMode ->
+            G.i (LocalGet (nr 0l)) ^^
+            G.i (LocalGet (nr 1l)) ^^
+            system_call env "debug_print"
+        | Flags.WASIMode -> begin
+          let get_ptr = G.i (LocalGet (nr 0l)) in
+          let get_len = G.i (LocalGet (nr 1l)) in
+
+          Stack.with_words env "io_vec" 6l (fun get_iovec_ptr ->
+            (* We use the iovec functionality to append a newline *)
+            get_iovec_ptr ^^
+            get_ptr ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 0l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            get_len ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 4l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            get_iovec_ptr ^^ compile_add_const 16l ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 8l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            compile_unboxed_const 1l ^^
+            G.i (Store {ty = I32Type; align = 2; offset = 12l; sz = None}) ^^
+
+            get_iovec_ptr ^^
+            compile_unboxed_const (Int32.of_int (Char.code '\n')) ^^
+            G.i (Store {ty = I32Type; align = 0; offset = 16l; sz = Some Wasm.Types.Pack8}) ^^
+
+            (* Call fd_write twice to work around
+               https://github.com/bytecodealliance/wasmtime/issues/629
+            *)
+
+            compile_unboxed_const 1l (* stdout *) ^^
+            get_iovec_ptr ^^
+            compile_unboxed_const 1l (* one string segment (2 doesn't work) *) ^^
+            get_iovec_ptr ^^ compile_add_const 20l ^^ (* out for bytes written, we ignore that *)
+            E.call_import env "wasi_snapshot_preview1" "fd_write" ^^
+            G.i Drop ^^
+
+            compile_unboxed_const 1l (* stdout *) ^^
+            get_iovec_ptr ^^ compile_add_const 8l ^^
+            compile_unboxed_const 1l (* one string segment *) ^^
+            get_iovec_ptr ^^ compile_add_const 20l ^^ (* out for bytes written, we ignore that *)
+            E.call_import env "wasi_snapshot_preview1" "fd_write" ^^
+            G.i Drop)
+          end);
+
+      E.add_export env (nr {
+        name = Lib.Utf8.decode "print_ptr";
+        edesc = nr (FuncExport (nr (E.built_in env "print_ptr")))
+      })
+
+
+  let ic_system_call call env =
+    match E.mode env with
+    | Flags.(ICMode | RefMode) ->
+      system_call env call
+    | _ ->
+      E.trap_with env Printf.(sprintf "cannot get %s when running locally" call)
+
+  let performance_counter = ic_system_call "performance_counter"
+  let is_controller = ic_system_call "is_controller"
+  let canister_version = ic_system_call "canister_version"
+
+  let print_ptr_len env = G.i (Call (nr (E.built_in env "print_ptr")))
+
+  let print_text env =
+    Func.share_code1 Func.Never env "print_text" ("str", I32Type) [] (fun env get_str ->
+      let (set_blob, get_blob) = new_local env "blob" in
+      get_str ^^ Text.to_blob env ^^ set_blob ^^
+      get_blob ^^ Blob.payload_ptr_unskewed env ^^
+      get_blob ^^ Blob.len env ^^
+      print_ptr_len env
+    )
+
+  (* For debugging *)
+  let _compile_static_print env s =
+    Blob.lit_ptr_len env s ^^ print_ptr_len env
+
+  let ic_trap env = system_call env "trap"
+
+  let trap_ptr_len env =
+    match E.mode env with
+    | Flags.WasmMode -> G.i Unreachable
+    | Flags.WASIMode -> print_ptr_len env ^^ G.i Unreachable
+    | Flags.ICMode | Flags.RefMode -> ic_trap env ^^ G.i Unreachable
+
+  let trap_with env s =
+    Blob.lit_ptr_len env s ^^ trap_ptr_len env
+
+  let trap_text env  =
+    Text.to_blob env ^^ Blob.as_ptr_len env ^^ trap_ptr_len env
+
+  let default_exports env =
+    (* these exports seem to be wanted by the hypervisor/v8 *)
+    E.add_export env (nr {
+      name = Lib.Utf8.decode (
+        match E.mode env with
+        | Flags.WASIMode -> "memory"
+        | _  -> "mem"
+      );
+      edesc = nr (MemoryExport (nr 0l))
+    });
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "table";
+      edesc = nr (TableExport (nr 0l))
+    })
+
+  let export_init env =
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let empty_f = Func.of_body env [] [] (fun env ->
+      Lifecycle.trans env Lifecycle.InInit ^^
+      G.i (Call (nr (E.built_in env "init"))) ^^
+      GC.collect_garbage env ^^
+      Lifecycle.trans env Lifecycle.Idle
+
+    ) in
+    let fi = E.add_fun env "canister_init" empty_f in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_init";
+      edesc = nr (FuncExport (nr fi))
+      })
+
+  let export_heartbeat env =
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let fi = E.add_fun env "canister_heartbeat"
+      (Func.of_body env [] [] (fun env ->
+        G.i (Call (nr (E.built_in env "heartbeat_exp"))) ^^
+        GC.collect_garbage env))
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_heartbeat";
+      edesc = nr (FuncExport (nr fi))
+    })
+
+  let export_timer env =
+    assert !Flags.global_timer;
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let fi = E.add_fun env "canister_global_timer"
+      (Func.of_body env [] [] (fun env ->
+        G.i (Call (nr (E.built_in env "timer_exp"))) ^^
+        GC.collect_garbage env))
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_global_timer";
+      edesc = nr (FuncExport (nr fi))
+    })
+
+  let export_inspect env =
+    assert (E.mode env = Flags.ICMode || E.mode env = Flags.RefMode);
+    let fi = E.add_fun env "canister_inspect_message"
+      (Func.of_body env [] [] (fun env ->
+        G.i (Call (nr (E.built_in env "inspect_exp"))) ^^
+        system_call env "accept_message" (* assumes inspect_exp traps to reject *)
+        (* no need to GC !*)))
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_inspect_message";
+      edesc = nr (FuncExport (nr fi))
+    })
+
+  let export_wasi_start env =
+    assert (E.mode env = Flags.WASIMode);
+    let fi = E.add_fun env "_start" (Func.of_body env [] [] (fun env1 ->
+      Lifecycle.trans env Lifecycle.InInit ^^
+      G.i (Call (nr (E.built_in env "init"))) ^^
+      Lifecycle.trans env Lifecycle.Idle
+    )) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "_start";
+      edesc = nr (FuncExport (nr fi))
+      })
+
+  let export_upgrade_methods env =
+    if E.mode env = Flags.ICMode || E.mode env = Flags.RefMode then
+    let status_stopped = 3l in
+    let pre_upgrade_fi = E.add_fun env "pre_upgrade" (Func.of_body env [] [] (fun env ->
+      Lifecycle.trans env Lifecycle.InPreUpgrade ^^
+      (* check status is stopped or trap on outstanding callbacks *)
+      system_call env "canister_status" ^^ compile_eq_const status_stopped ^^
+      G.if0
+       (G.nop)
+       (ContinuationTable.count env ^^
+          E.then_trap_with env "canister_pre_upgrade attempted with outstanding message callbacks (try stopping the canister before upgrade)") ^^
+      (* call pre_upgrade expression & any system method *)
+      (G.i (Call (nr (E.built_in env "pre_exp")))) ^^
+      Lifecycle.trans env Lifecycle.PostPreUpgrade
+    )) in
+
+    let post_upgrade_fi = E.add_fun env "post_upgrade" (Func.of_body env [] [] (fun env ->
+      Lifecycle.trans env Lifecycle.InInit ^^
+      G.i (Call (nr (E.built_in env "init"))) ^^
+      Lifecycle.trans env Lifecycle.InPostUpgrade ^^
+      G.i (Call (nr (E.built_in env "post_exp"))) ^^
+      Lifecycle.trans env Lifecycle.Idle ^^
+      GC.collect_garbage env
+    )) in
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_pre_upgrade";
+      edesc = nr (FuncExport (nr pre_upgrade_fi))
+    });
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "canister_post_upgrade";
+      edesc = nr (FuncExport (nr post_upgrade_fi))
+    })
+
+
+  let get_self_reference env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.share_code0 Func.Never env "canister_self" [I32Type] (fun env ->
+        Blob.of_size_copy env
+          (fun env -> system_call env "canister_self_size")
+          (fun env -> system_call env "canister_self_copy")
+          (fun env -> compile_unboxed_const 0l)
+      )
+    | _ ->
+      E.trap_with env "cannot get self-actor-reference when running locally"
+
+  let get_system_time env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      system_call env "time"
+    | _ ->
+      E.trap_with env "cannot get system time when running locally"
+
+  let caller env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_caller_size")
+        (fun env -> system_call env "msg_caller_copy")
+        (fun env -> compile_unboxed_const 0l)
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot get caller when running locally")
+
+  let method_name env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_method_name_size")
+        (fun env -> system_call env "msg_method_name_copy")
+        (fun env -> compile_unboxed_const 0l)
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot get method_name when running locally")
+
+  let arg_data env =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_arg_data_size")
+        (fun env -> system_call env "msg_arg_data_copy")
+        (fun env -> compile_unboxed_const 0l)
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot get arg_data when running locally")
+
+  let reject env arg_instrs =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      arg_instrs ^^
+      Text.to_blob env ^^
+      Blob.as_ptr_len env ^^
+      system_call env "msg_reject"
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot reject when running locally")
+
+  let error_code env =
+     Func.share_code0 Func.Always env "error_code" [I32Type] (fun env ->
+      let (set_code, get_code) = new_local env "code" in
+      system_call env "msg_reject_code" ^^ set_code ^^
+      List.fold_right (fun (tag, const) code ->
+        get_code ^^ compile_unboxed_const const ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+        G.if1 I32Type
+          (Variant.inject env tag (Tuple.compile_unit env))
+          code)
+        ["system_fatal", 1l;
+         "system_transient", 2l;
+         "destination_invalid", 3l;
+         "canister_reject", 4l;
+         "canister_error", 5l]
+        (Variant.inject env "future" (get_code ^^ BoxedSmallWord.box env Type.Nat32)))
+
+  let error_message env =
+    Func.share_code0 Func.Never env "error_message" [I32Type] (fun env ->
+      Blob.of_size_copy env
+        (fun env -> system_call env "msg_reject_msg_size")
+        (fun env -> system_call env "msg_reject_msg_copy")
+        (fun env -> compile_unboxed_const 0l)
+    )
+
+  let error_value env =
+    Func.share_code0 Func.Never env "error_value" [I32Type] (fun env ->
+      error_code env ^^
+      error_message env ^^
+      Tuple.from_stack env 2
+    )
+
+  let reply_with_data env =
+    Func.share_code2 Func.Never env "reply_with_data" (("start", I32Type), ("size", I32Type)) [] (
+      fun env get_data_start get_data_size ->
+        get_data_start ^^
+        get_data_size ^^
+        system_call env "msg_reply_data_append" ^^
+        system_call env "msg_reply"
+   )
+
+  (* Actor reference on the stack *)
+  let actor_public_field env name =
+    (* simply tuple canister name and function name *)
+    Blob.lit env name ^^
+    Tuple.from_stack env 2
+
+  let fail_assert env at =
+    let open Source in
+    let at = {
+        left = {at.left with file = Filename.basename at.left.file};
+        right = {at.right with file = Filename.basename at.right.file}
+      }
+    in
+    E.trap_with env (Printf.sprintf "assertion failed at %s" (string_of_region at))
+
+  let async_method_name = Type.(motoko_async_helper_fld.lab)
+  let gc_trigger_method_name = Type.(motoko_gc_trigger_fld.lab)
+
+  let is_self_call env =
+    let (set_len_self, get_len_self) = new_local env "len_self" in
+    let (set_len_caller, get_len_caller) = new_local env "len_caller" in
+    system_call env "canister_self_size" ^^ set_len_self ^^
+    system_call env "msg_caller_size" ^^ set_len_caller ^^
+    get_len_self ^^ get_len_caller ^^ G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    G.if1 I32Type
+      begin
+        get_len_self ^^ Stack.dynamic_with_bytes env "str_self" (fun get_str_self ->
+          get_len_caller ^^ Stack.dynamic_with_bytes env "str_caller" (fun get_str_caller ->
+            get_str_caller ^^ compile_unboxed_const 0l ^^ get_len_caller ^^
+            system_call env "msg_caller_copy" ^^
+            get_str_self ^^ compile_unboxed_const 0l ^^ get_len_self ^^
+            system_call env "canister_self_copy" ^^
+            get_str_self ^^ get_str_caller ^^ get_len_self ^^ Heap.memcmp env ^^
+            compile_eq_const 0l))
+      end
+      begin
+        compile_unboxed_const 0l
+      end
+
+  let assert_caller_self env =
+    is_self_call env ^^
+    E.else_trap_with env "not a self-call"
+
+  let is_controller_call env =
+    let (set_len_caller, get_len_caller) = new_local env "len_caller" in
+    system_call env "msg_caller_size" ^^ set_len_caller ^^
+    get_len_caller ^^ Stack.dynamic_with_bytes env "str_caller" (fun get_str_caller ->
+      get_str_caller ^^ compile_unboxed_const 0l ^^ get_len_caller ^^
+      system_call env "msg_caller_copy" ^^
+      get_str_caller ^^ get_len_caller ^^ is_controller env)
+
+  let assert_caller_self_or_controller env =
+    is_self_call env ^^
+    is_controller_call env ^^
+    G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+    E.else_trap_with env "not a self-call or call from controller"
+
+  (* Cycles *)
+
+  let cycle_balance env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "canister_cycle_balance128"
+    | _ ->
+      E.trap_with env "cannot read balance when running locally"
+
+  let cycles_add env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "call_cycles_add128"
+    | _ ->
+      E.trap_with env "cannot accept cycles when running locally"
+
+  let cycles_accept env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "msg_cycles_accept128"
+    | _ ->
+      E.trap_with env "cannot accept cycles when running locally"
+
+  let cycles_available env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "msg_cycles_available128"
+    | _ ->
+      E.trap_with env "cannot get cycles available when running locally"
+
+  let cycles_refunded env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "msg_cycles_refunded128"
+    | _ ->
+      E.trap_with env "cannot get cycles refunded when running locally"
+
+  let set_certified_data env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      Blob.as_ptr_len env ^^
+      system_call env "certified_data_set"
+    | _ ->
+      E.trap_with env "cannot set certified data when running locally"
+
+  let get_certificate env =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      system_call env "data_certificate_present" ^^
+      G.if1 I32Type
+      begin
+        Opt.inject_simple env (
+          Blob.of_size_copy env
+            (fun env -> system_call env "data_certificate_size")
+            (fun env -> system_call env "data_certificate_copy")
+            (fun env -> compile_unboxed_const 0l)
+        )
+      end (Opt.null_lit env)
+    | _ ->
+      E.trap_with env "cannot get certificate when running locally"
+
+end (* IC *)
+
+module Cycles = struct
+
+  let from_word128_ptr env = Func.share_code1 Func.Never env "from_word128_ptr" ("ptr", I32Type) [I32Type]
+    (fun env get_ptr ->
+     let set_lower, get_lower = new_local env "lower" in
+     get_ptr ^^
+     G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None }) ^^
+     BigNum.from_word64 env ^^
+     set_lower ^^
+     get_ptr ^^
+     G.i (Load {ty = I64Type; align = 0; offset = 8l; sz = None }) ^^
+     G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+     G.if1 I32Type
+       get_lower
+       begin
+         get_lower ^^
+         get_ptr ^^
+         G.i (Load {ty = I64Type; align = 0; offset = 8l; sz = None }) ^^
+         BigNum.from_word64 env ^^
+         (* shift left 64 bits *)
+         compile_unboxed_const 64l ^^
+         BigNum.compile_lsh env ^^
+         BigNum.compile_add env
+       end)
+
+  (* takes a bignum from the stack, traps if ≥2^128, and leaves two 64bit words on the stack *)
+  (* only used twice, so ok to not use share_code1; that would require I64Type support in FakeMultiVal *)
+  let to_two_word64 env =
+    let (set_val, get_val) = new_local env "cycles" in
+    set_val ^^
+    get_val ^^
+    compile_unboxed_const (BigNum.vanilla_lit env (Big_int.power_int_positive_int 2 128)) ^^
+    BigNum.compile_relop env Lt ^^
+    E.else_trap_with env "cycles out of bounds" ^^
+
+    get_val ^^
+    (* shift right 64 bits *)
+    compile_unboxed_const 64l ^^
+    BigNum.compile_rsh env ^^
+    BigNum.truncate_to_word64 env ^^
+
+    get_val ^^
+    BigNum.truncate_to_word64 env
+
+  let balance env =
+    Func.share_code0 Func.Always env "cycle_balance" [I32Type] (fun env ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_dst ^^
+        IC.cycle_balance env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+  let add env =
+    Func.share_code1 Func.Always env "cycle_add" ("cycles", I32Type) [] (fun env get_x ->
+      get_x ^^
+      to_two_word64 env ^^
+      IC.cycles_add env
+    )
+
+  let accept env =
+    Func.share_code1 Func.Always env "cycle_accept" ("cycles", I32Type) [I32Type] (fun env get_x ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_x ^^
+        to_two_word64 env ^^
+        get_dst ^^
+        IC.cycles_accept env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+  let available env =
+    Func.share_code0 Func.Always env "cycle_available" [I32Type] (fun env ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_dst ^^
+        IC.cycles_available env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+  let refunded env =
+    Func.share_code0 Func.Always env "cycle_refunded" [I32Type] (fun env ->
+      Stack.with_words env "dst" 4l (fun get_dst ->
+        get_dst ^^
+        IC.cycles_refunded env ^^
+        get_dst ^^
+        from_word128_ptr env
+      )
+    )
+
+end (* Cycles *)
+
+(* Low-level, almost raw access to IC stable memory.
+   Essentially a virtual page allocator
+   * enforcing limit --max-stable-pages not exceeded
+   * tracking virtual page count, ignoring physical pages added for stable variable serialization (global`__stable_mem_size`)
+   * recording current format of contents (global `__stable_version`)
+   Used to implement stable variable serialization, (experimental) stable memory library and Region type (see region.rs)
+*)
+module StableMem = struct
+
+
+  let conv_u32 env get_u64 =
+    get_u64 ^^
+    compile_shrU64_const 32L ^^
+    G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+    E.then_trap_with env "stable64 overflow" ^^
+    get_u64  ^^
+    G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+
+  (* Raw stable memory API,
+     using ic0.stable64_xxx or
+     emulating via (for now) 32-bit memory 1
+  *)
+  let stable64_grow env =
+    E.require_stable_memory env;
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+       IC.system_call env "stable64_grow"
+    | _ ->
+       Func.share_code1 Func.Always env "stable64_grow" ("pages", I64Type) [I64Type]
+         (fun env get_pages ->
+          let set_old_pages, get_old_pages = new_local env "old_pages" in
+          conv_u32 env get_pages ^^
+          G.i StableGrow ^^
+          set_old_pages ^^
+          get_old_pages ^^
+          compile_unboxed_const (-1l) ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          G.if1 I64Type
+            begin
+             compile_const_64 (-1L)
+            end
+            begin
+              get_old_pages ^^
+              G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+            end)
+
+  let stable64_size env =
+    E.require_stable_memory env;
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+       IC.system_call env "stable64_size"
+    | _ ->
+       Func.share_code0 Func.Always env "stable64_size" [I64Type]
+         (fun env ->
+          G.i StableSize ^^
+          G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)))
+
+  let stable64_read env =
+    E.require_stable_memory env;
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+       IC.system_call env "stable64_read"
+    | _ ->
+       Func.share_code3 Func.Always env "stable64_read"
+         (("dst", I64Type), ("offset", I64Type), ("size", I64Type)) []
+         (fun env get_dst get_offset get_size ->
+          conv_u32 env get_dst ^^
+          conv_u32 env get_offset ^^
+          conv_u32 env get_size ^^
+          G.i StableRead)
+
+  let stable64_write env =
+    E.require_stable_memory env;
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+       IC.system_call env "stable64_write"
+    | _ ->
+       Func.share_code3 Func.Always env "stable64_write"
+         (("offset", I64Type), ("src", I64Type), ("size", I64Type)) []
+         (fun env get_offset get_src get_size ->
+          conv_u32 env get_offset ^^
+          conv_u32 env get_src ^^
+          conv_u32 env get_size ^^
+          G.i StableWrite)
+
+
+  (* Versioning (c.f. Region.rs) *)
+  (* NB: these constants must agree with VERSION_NO_STABLE_MEMORY etc. in Region.rs *)
+  let version_no_stable_memory = Int32.of_int 0 (* never manifest in serialized form *)
+  let version_some_stable_memory = Int32.of_int 1
+  let version_regions = Int32.of_int 2
+  let version_max = version_regions
+
+  let register_globals env =
+    (* size (in pages) *)
+    E.add_global64 env "__stablemem_size" Mutable 0L;
+    E.add_global32 env "__stablemem_version" Mutable version_no_stable_memory
+
+  let get_mem_size env =
+    G.i (GlobalGet (nr (E.get_global env "__stablemem_size")))
+
+  let set_mem_size env =
+    G.i (GlobalSet (nr (E.get_global env "__stablemem_size")))
+
+  let get_version env =
+    G.i (GlobalGet (nr (E.get_global env "__stablemem_version")))
+
+  let set_version env =
+    G.i (GlobalSet (nr (E.get_global env "__stablemem_version")))
+
+  (* stable memory bounds check *)
+  let guard env =
+       get_mem_size env ^^
+       compile_const_64 (Int64.of_int page_size_bits) ^^
+       G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+       G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+       E.then_trap_with env "StableMemory offset out of bounds"
+
+  (* check both offset and [offset,.., offset + size) within bounds *)
+  (* c.f. region.rs check_relative_range *)
+  (* TODO: specialize on size *)
+  let guard_range env =
+      Func.share_code2 Func.Always env "__stablemem_guard_range"
+        (("offset", I64Type), ("size", I32Type)) []
+        (fun env get_offset get_size ->
+          get_size ^^
+          compile_unboxed_one ^^
+          G.i (Compare (Wasm.Values.I32 I64Op.LeU)) ^^
+          G.if0 begin
+            get_offset ^^
+            guard env
+          end
+          begin
+            compile_const_64 (Int64.minus_one) ^^
+            get_size ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+            get_offset ^^
+            G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+            E.then_trap_with env "StableMemory range overflow" ^^
+            get_offset ^^
+            get_size ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+            get_mem_size env ^^
+            compile_const_64 (Int64.of_int page_size_bits) ^^
+            G.i (Binary (Wasm.Values.I64 I64Op.Shl)) ^^
+            G.i (Compare (Wasm.Values.I64 I64Op.GtU)) ^^
+            E.then_trap_with env "StableMemory range out of bounds"
+          end)
+
+  let add_guard env guarded get_offset bytes =
+    if guarded then
+     (get_offset ^^
+      if bytes = 1l then
+        guard env
+      else
+        compile_unboxed_const bytes ^^
+        guard_range env)
+    else G.nop
+
+  (* TODO: crusso in read/write could avoid stack allocation by reserving and re-using scratch memory instead *)
+  let read env guarded name typ bytes load =
+      Func.share_code1 Func.Never env (Printf.sprintf "__stablemem_%sread_%s" (if guarded then "guarded_" else "") name)
+        ("offset", I64Type) [typ]
+        (fun env get_offset ->
+          let words = Int32.div (Int32.add bytes 3l) 4l in
+          add_guard env guarded get_offset bytes ^^
+          Stack.with_words env "temp_ptr" words (fun get_temp_ptr ->
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            get_offset ^^
+            compile_const_64 (Int64.of_int32 bytes) ^^
+            stable64_read env ^^
+            get_temp_ptr ^^ load))
+
+  let write env guarded name typ bytes store =
+      Func.share_code2 Func.Never env (Printf.sprintf "__stablemem_%swrite_%s" (if guarded then "guarded_" else "") name)
+        (("offset", I64Type), ("value", typ)) []
+        (fun env get_offset get_value ->
+          let words = Int32.div (Int32.add bytes 3l) 4l in
+          add_guard env guarded get_offset bytes ^^
+          Stack.with_words env "temp_ptr" words (fun get_temp_ptr ->
+            get_temp_ptr ^^ get_value ^^ store ^^
+            get_offset ^^
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            compile_const_64 (Int64.of_int32 bytes) ^^
+            stable64_write env))
+
+  let _read_word32 env =
+    read env false "word32" I32Type 4l load_unskewed_ptr
+  let write_word32 env =
+    write env false "word32" I32Type 4l store_unskewed_ptr
+
+
+  (* read and clear word32 from stable mem offset on stack *)
+  let read_and_clear_word32 env =
+      Func.share_code1 Func.Always env "__stablemem_read_and_clear_word32"
+        ("offset", I64Type) [I32Type]
+        (fun env get_offset ->
+          Stack.with_words env "temp_ptr" 1l (fun get_temp_ptr ->
+            let (set_word, get_word) = new_local env "word" in
+            (* read word *)
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            get_offset ^^
+            compile_const_64 4L ^^
+            stable64_read env ^^
+            get_temp_ptr ^^ load_unskewed_ptr ^^
+            set_word ^^
+            (* write 0 *)
+            get_temp_ptr ^^ compile_unboxed_const 0l ^^ store_unskewed_ptr ^^
+            get_offset ^^
+            get_temp_ptr ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+            compile_const_64 4L ^^
+            stable64_write env ^^
+            (* return word *)
+            get_word
+        ))
+
+  (* ensure_pages : ensure at least num pages allocated,
+     growing (real) stable memory if needed *)
+  let ensure_pages env =
+      Func.share_code1 Func.Always env "__stablemem_ensure_pages"
+        ("pages", I64Type) [I64Type]
+        (fun env get_pages ->
+          let (set_size, get_size) = new_local64 env "size" in
+          let (set_pages_needed, get_pages_needed) = new_local64 env "pages_needed" in
+
+          stable64_size env ^^
+          set_size ^^
+
+          get_pages ^^
+          get_size ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+          set_pages_needed ^^
+
+          get_pages_needed ^^
+          compile_const_64 0L ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.GtS)) ^^
+          G.if1 I64Type
+            (get_pages_needed ^^
+             stable64_grow env)
+            get_size)
+
+  (* ensure stable memory includes [offset..offset+size), assumes size > 0 *)
+  let ensure env =
+      Func.share_code2 Func.Always env "__stablemem_ensure"
+        (("offset", I64Type), ("size", I64Type)) []
+        (fun env get_offset get_size ->
+          let (set_sum, get_sum) = new_local64 env "sum" in
+          get_offset ^^
+          get_size ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+          set_sum ^^
+          (* check for overflow *)
+          get_sum ^^
+          get_offset ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LtU)) ^^
+          E.then_trap_with env "Range overflow" ^^
+          (* ensure page *)
+          get_sum ^^
+          compile_const_64 (Int64.of_int page_size_bits) ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.ShrU)) ^^
+          compile_add64_const 1L ^^
+          ensure_pages env ^^
+          (* Check result *)
+          compile_const_64 0L ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.LtS)) ^^
+          E.then_trap_with env "Out of stable memory.")
+
+  (* low-level grow, respecting --max-stable-pages *)
+  let grow env =
+      Func.share_code1 Func.Always env "__stablemem_grow"
+        ("pages", I64Type) [I64Type] (fun env get_pages ->
+          let (set_size, get_size) = new_local64 env "size" in
+          get_mem_size env ^^
+          set_size ^^
+
+          (* check within --max-stable-pages *)
+          get_size ^^
+          get_pages ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+          compile_const_64 (Int64.of_int (!Flags.max_stable_pages)) ^^
+          G.i (Compare (Wasm.Values.I64 I64Op.GtU)) ^^
+          G.if1 I64Type
+            begin
+             compile_const_64 (-1L) ^^
+             G.i Return
+            end
+            begin
+              let (set_new_size, get_new_size) = new_local64 env "new_size" in
+              get_size ^^
+              get_pages ^^
+              G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+              set_new_size ^^
+
+              (* physical grow if necessary *)
+              let (set_ensured, get_ensured) = new_local64 env "ensured" in
+              get_new_size ^^
+              ensure_pages env ^^
+              set_ensured ^^
+
+              (* Check result *)
+              get_ensured ^^
+              compile_const_64 0L ^^
+              G.i (Compare (Wasm.Values.I64 I64Op.LtS)) ^^
+              G.if1 I64Type
+                ((* propagate failure -1; preserve logical size *)
+                 get_ensured)
+                ((* update logical size *)
+                 get_new_size ^^
+                 set_mem_size env ^^
+                 (* return old logical size *)
+                 get_size)
+            end)
+
+  let load_word32 env =
+    read env true "word32" I32Type 4l load_unskewed_ptr
+  let store_word32 env =
+    write env true "word32" I32Type 4l store_unskewed_ptr
+
+  let load_word8 env =
+    read env true "word8" I32Type 1l
+      (G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack8, ZX)}))
+  let store_word8 env =
+    write env true "word8" I32Type 1l store_unskewed_ptr
+
+  let load_word16 env =
+    read env true "word16" I32Type 2l
+      (G.i (Load {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.(Pack16, ZX)}))
+  let store_word16 env =
+    write env true "word16" I32Type 2l store_unskewed_ptr
+
+  let load_word64 env =
+    read env true "word64" I64Type 8l
+      (G.i (Load {ty = I64Type; align = 0; offset = 0l; sz = None }))
+  let store_word64 env =
+    write env true "word64" I64Type 8l
+      (G.i (Store {ty = I64Type; align = 0; offset = 0l; sz = None}))
+
+  let load_float64 env =
+    read env true "float64" F64Type 8l
+      (G.i (Load {ty = F64Type; align = 0; offset = 0l; sz = None }))
+  let store_float64 env =
+    write env true "float64" F64Type 8l
+      (G.i (Store {ty = F64Type; align = 0; offset = 0l; sz = None}))
+
+  let load_blob env =
+      Func.share_code2 Func.Always env "__stablemem_load_blob"
+        (("offset", I64Type), ("len", I32Type)) [I32Type]
+        (fun env get_offset get_len ->
+          let (set_blob, get_blob) = new_local env "blob" in
+          get_offset ^^
+          get_len ^^
+          guard_range env ^^
+          get_len ^^ Blob.alloc env ^^ set_blob ^^
+          get_blob ^^ Blob.payload_ptr_unskewed env ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          get_offset ^^
+          get_len ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          stable64_read env ^^
+          get_blob)
+
+  let store_blob env =
+      Func.share_code2 Func.Always env "__stablemem_store_blob"
+        (("offset", I64Type), ("blob", I32Type)) []
+        (fun env get_offset get_blob ->
+         let (set_len, get_len) = new_local env "len" in
+          get_blob ^^ Blob.len env ^^ set_len ^^
+          get_offset ^^
+          get_len ^^
+          guard_range env ^^
+          get_offset ^^
+          get_blob ^^ Blob.payload_ptr_unskewed env ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          get_len ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+          stable64_write env)
+
+end (* StableMem *)
+
+
+(* StableMemoryInterface *)
+(* Core, legacy interface to IC stable memory, used to implement prims `stableMemoryXXX` of
+   library `ExperimentalStableMemory.mo`.
+   Each operation dispatches on the state of `StableMem.get_version()`.
+   * StableMem.version_no_stable_memory/StableMem.version_some_stable_memory:
+     * use StableMem directly
+     * switch to version_some_stable_memory on non-trivial grow.
+   * StableMem.version_regions: use Region.mo
+*)
+module StableMemoryInterface = struct
+
+  (* Helpers *)
+  let get_region0 env = E.call_import env "rts" "region0_get"
+
+  let if_regions env args tys is1 is2 =
+    StableMem.get_version env ^^
+    compile_unboxed_const StableMem.version_regions ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    E.if_ env tys
+      (get_region0 env ^^ args ^^ is1 env)
+      (args ^^ is2 env)
+
+  (* Prims *)
+  let size env =
+    E.require_stable_memory env;
+    Func.share_code0 Func.Always env "__stablememory_size" [I64Type]
+      (fun env ->
+        if_regions env
+          G.nop
+          [I64Type]
+          Region.size
+          StableMem.get_mem_size)
+
+  let grow env =
+    E.require_stable_memory env;
+    Func.share_code1 Func.Always env "__stablememory_grow" ("pages", I64Type) [I64Type]
+      (fun env get_pages ->
+        if_regions env
+          get_pages
+          [I64Type]
+          Region.grow
+          (fun env ->
+            (* do StableMem.grow, but detect and record change in version as well *)
+            let (set_res, get_res) = new_local64 env "size" in
+            (* logical grow *)
+            StableMem.grow env ^^
+            set_res ^^
+            (* if version = version_no_stable_memory and new mem_size > 0
+               then version := version_some_stable_memory *)
+            StableMem.get_version env ^^
+            compile_eq_const StableMem.version_no_stable_memory ^^
+            StableMem.get_mem_size env ^^
+            compile_const_64 0L ^^
+            G.i (Compare (Wasm.Values.I64 I32Op.GtU)) ^^
+            G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+            (G.if0
+               begin
+                 compile_unboxed_const StableMem.version_some_stable_memory ^^
+                 StableMem.set_version env
+               end
+               G.nop) ^^
+            (* return res *)
+            get_res))
+
+  let load_blob env =
+    E.require_stable_memory env;
+    Func.share_code2 Func.Never env "__stablememory_load_blob"
+      (("offset", I64Type), ("len", I32Type)) [I32Type]
+      (fun env offset len ->
+        if_regions env
+          (offset ^^ len)
+          [I32Type]
+          Region.load_blob
+          StableMem.load_blob)
+  let store_blob env =
+    E.require_stable_memory env;
+    Func.share_code2 Func.Never env "__stablememory_store_blob"
+      (("offset", I64Type), ("blob", I32Type)) []
+      (fun env offset blob ->
+        if_regions env
+          (offset ^^ blob)
+          []
+          Region.store_blob
+          StableMem.store_blob)
+
+  let load_word8 env =
+    E.require_stable_memory env;
+    Func.share_code1 Func.Never env "__stablememory_load_word8"
+      ("offset", I64Type) [I32Type]
+      (fun env offset ->
+        if_regions env
+          offset
+          [I32Type]
+          Region.load_word8
+          StableMem.load_word8)
+  let store_word8 env =
+    E.require_stable_memory env;
+    Func.share_code2 Func.Never env "__stablememory_store_word8"
+      (("offset", I64Type), ("value", I32Type)) []
+      (fun env offset value ->
+        if_regions env
+          (offset ^^ value)
+          []
+          Region.store_word8
+          StableMem.store_word8)
+
+  let load_word16 env =
+    E.require_stable_memory env;
+    Func.share_code1 Func.Never env "__stablememory_load_word16"
+      ("offset", I64Type) [I32Type]
+      (fun env offset->
+        if_regions env
+          offset
+          [I32Type]
+          Region.load_word16
+          StableMem.load_word16)
+  let store_word16 env =
+    E.require_stable_memory env;
+    Func.share_code2 Func.Never env "__stablememory_store_word16"
+      (("offset", I64Type), ("value", I32Type)) []
+      (fun env offset value ->
+        if_regions env
+          (offset ^^ value)
+          []
+          Region.store_word16
+          StableMem.store_word16)
+
+  let load_word32 env =
+    E.require_stable_memory env;
+    Func.share_code1 Func.Never env "__stablememory_load_word32"
+      ("offset", I64Type) [I32Type]
+      (fun env offset ->
+        if_regions env
+          offset
+          [I32Type]
+          Region.load_word32
+          StableMem.load_word32)
+  let store_word32 env =
+    E.require_stable_memory env;
+    Func.share_code2 Func.Never env "__stablememory_store_word32"
+      (("offset", I64Type), ("value", I32Type)) []
+      (fun env offset value ->
+        if_regions env
+          (offset ^^ value)
+          []
+          Region.store_word32
+          StableMem.store_word32)
+
+  let load_word64 env =
+    E.require_stable_memory env;
+    Func.share_code1 Func.Never env "__stablememory_load_word64" ("offset", I64Type) [I64Type]
+      (fun env offset ->
+        if_regions env
+          offset
+          [I64Type]
+          Region.load_word64
+          StableMem.load_word64)
+  let store_word64 env =
+    E.require_stable_memory env;
+    Func.share_code2 Func.Never env "__stablememory_store_word64"
+      (("offset", I64Type), ("value", I64Type)) []
+      (fun env offset value ->
+        if_regions env
+          (offset ^^ value)
+          []
+          Region.store_word64
+          StableMem.store_word64)
+
+  let load_float64 env =
+    E.require_stable_memory env;
+    Func.share_code1 Func.Never env "__stablememory_load_float64"
+      ("offset", I64Type) [F64Type]
+      (fun env offset ->
+        if_regions env
+          offset
+          [F64Type]
+          Region.load_float64
+          StableMem.load_float64)
+  let store_float64 env =
+    Func.share_code2 Func.Never env "__stablememory_store_float64"
+      (("offset", I64Type), ("value", F64Type)) []
+      (fun env offset value ->
+        if_regions env
+          (offset ^^ value)
+          []
+          Region.store_float64
+          StableMem.store_float64)
+
+end
+
+module RTS_Exports = struct
+  (* Must be called late, after main codegen, to ensure correct generation of
+     of functioning or unused-but-trapping stable memory exports (as required)
+   *)
+  let system_exports env =
+
+    (* Value constructors *)
+
+    let int_from_i32_fi = E.add_fun env "int_from_i32" (
+      Func.of_body env ["v", I32Type] [I32Type] (fun env ->
+        let get_v = G.i (LocalGet (nr 0l)) in
+        get_v ^^ BigNum.from_signed_word32 env
+      )
+    ) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "int_from_i32";
+      edesc = nr (FuncExport (nr int_from_i32_fi))
+    });
+
+    (* Traps *)
+
+    let bigint_trap_fi = E.add_fun env "bigint_trap" (
+      Func.of_body env [] [] (fun env ->
+        E.trap_with env "bigint function error"
+      )
+    ) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "bigint_trap";
+      edesc = nr (FuncExport (nr bigint_trap_fi))
+    });
+
+    let rts_trap_fi = E.add_fun env "rts_trap" (
+      Func.of_body env ["str", I32Type; "len", I32Type] [] (fun env ->
+        let get_str = G.i (LocalGet (nr 0l)) in
+        let get_len = G.i (LocalGet (nr 1l)) in
+        get_str ^^ get_len ^^ IC.trap_ptr_len env
+      )
+    ) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "rts_trap";
+      edesc = nr (FuncExport (nr rts_trap_fi))
+    });
+
+    (* Keep a memory reserve when in update or init state.
+       This reserve can be used by queries, composite queries, and upgrades. *)
+    let keep_memory_reserve_fi = E.add_fun env "keep_memory_reserve" (
+      Func.of_body env [] [I32Type] (fun env ->
+        Lifecycle.get env ^^
+        compile_eq_const Lifecycle.(int_of_state InUpdate) ^^
+        Lifecycle.get env ^^
+        compile_eq_const Lifecycle.(int_of_state InInit) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or))
+      )
+    ) in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "keep_memory_reserve";
+      edesc = nr (FuncExport (nr keep_memory_reserve_fi))
+    });
+
+    if !Flags.gc_strategy <> Flags.Incremental then
+    begin
+      let set_hp_fi =
+        E.add_fun env "__set_hp" (
+        Func.of_body env ["new_hp", I32Type] [] (fun env ->
+          G.i (LocalGet (nr 0l)) ^^
+          GC.set_heap_pointer env
+        )
+      ) in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode "setHP";
+        edesc = nr (FuncExport (nr set_hp_fi))
+      });
+
+      let get_hp_fi = E.add_fun env "__get_hp" (
+        Func.of_body env [] [I32Type] (fun env ->
+          GC.get_heap_pointer env
+        )
+      ) in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode "getHP";
+        edesc = nr (FuncExport (nr get_hp_fi))
+      })
+    end;
+
+
+    (* Stable Memory related exports *)
+
+    let when_stable_memory_required_else_trap env code =
+      if E.requires_stable_memory env then
+        code() else
+        E.trap_with env "unreachable" in
+
+    let ic0_stable64_write_fi =
+      match E.mode env with
+      | Flags.ICMode | Flags.RefMode ->
+        E.reuse_import env "ic0" "stable64_write"
+      | Flags.WASIMode | Flags.WasmMode ->
+        E.add_fun env "ic0_stable64_write" (
+          Func.of_body env ["offset", I64Type; "src", I64Type; "size", I64Type] []
+            (fun env ->
+              when_stable_memory_required_else_trap env (fun () ->
+               let get_offset = G.i (LocalGet (nr 0l)) in
+               let get_src = G.i (LocalGet (nr 1l)) in
+               let get_size = G.i (LocalGet (nr 2l)) in
+               get_offset ^^
+               get_src ^^
+               get_size ^^
+               StableMem.stable64_write env))
+          )
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "ic0_stable64_write";
+      edesc = nr (FuncExport (nr ic0_stable64_write_fi))
+    });
+
+    let ic0_stable64_read_fi =
+      match E.mode env with
+      | Flags.ICMode | Flags.RefMode ->
+        E.reuse_import env "ic0" "stable64_read"
+      | Flags.WASIMode | Flags.WasmMode ->
+        E.add_fun env "ic0_stable64_read" (
+          Func.of_body env ["dst", I64Type; "offset", I64Type; "size", I64Type] []
+            (fun env ->
+              when_stable_memory_required_else_trap env (fun () ->
+              let get_dst = G.i (LocalGet (nr 0l)) in
+              let get_offset = G.i (LocalGet (nr 1l)) in
+              let get_size = G.i (LocalGet (nr 2l)) in
+              get_dst ^^
+              get_offset ^^
+              get_size ^^
+              StableMem.stable64_read env))
+          )
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "ic0_stable64_read";
+      edesc = nr (FuncExport (nr ic0_stable64_read_fi))
+    });
+
+    let moc_stable_mem_grow_fi =
+      E.add_fun env "moc_stable_mem_grow" (
+        Func.of_body env ["newPages", I64Type] [I64Type]
+          (fun env ->
+            when_stable_memory_required_else_trap env (fun () ->
+            G.i (LocalGet (nr 0l)) ^^
+            StableMem.grow env))
+        )
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "moc_stable_mem_grow";
+      edesc = nr (FuncExport (nr moc_stable_mem_grow_fi))
+    });
+
+    let moc_stable_mem_size_fi =
+      E.add_fun env "moc_stable_mem_size" (
+        Func.of_body env [] [I64Type]
+          (fun env ->
+             when_stable_memory_required_else_trap env (fun () ->
+             StableMem.get_mem_size env))
+        )
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "moc_stable_mem_size";
+      edesc = nr (FuncExport (nr moc_stable_mem_size_fi))
+    });
+
+    let moc_stable_mem_get_version_fi =
+      E.add_fun env "moc_stable_mem_get_version" (
+        Func.of_body env [] [I32Type]
+          (fun env ->
+             StableMem.get_version env)
+        )
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "moc_stable_mem_get_version";
+      edesc = nr (FuncExport (nr moc_stable_mem_get_version_fi))
+    });
+
+    let moc_stable_mem_set_version_fi =
+      E.add_fun env "moc_stable_mem_set_version" (
+        Func.of_body env ["version", I32Type] []
+          (fun env ->
+             G.i (LocalGet (nr 0l)) ^^
+             StableMem.set_version env
+          )
+        )
+    in
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "moc_stable_mem_set_version";
+      edesc = nr (FuncExport (nr moc_stable_mem_set_version_fi))
+    })
+
+end (* RTS_Exports *)
+
+
+(* Below signature is needed by the serialiser to supply the
+   methods various formats and auxiliary routines. A stream
+   token refers to the stream itself. Depending on the stream's
+   methodology, the token can be a (bump) pointer or a handle
+   (like a `Blob`). The former needs to be updated at certain
+   points because the token will normally reside in locals that
+   nested functions won't have access to. *)
+module type Stream = sig
+  (* Bottleneck routines for streaming in different formats.
+     The `code` must be used linearly. `token` is a fragment
+     of Wasm that puts the stream token onto the stack.
+     Arguments:    env    token  code *)
+  val write_byte : E.t -> G.t -> G.t -> G.t
+  val write_word_leb : E.t -> G.t -> G.t -> G.t
+  val write_word_32 : E.t -> G.t -> G.t -> G.t
+  val write_blob : E.t -> G.t -> G.t -> G.t
+  val write_text : E.t -> G.t -> G.t -> G.t
+  val write_bignum_leb : E.t -> G.t -> G.t -> G.t
+  val write_bignum_sleb : E.t -> G.t -> G.t -> G.t
+
+  (* Creates a fresh stream with header, storing stream token.
+     Arguments:env    size   setter getter header *)
+  val create : E.t -> G.t -> G.t -> G.t -> string -> G.t
+
+  (* Checks the stream's filling, traps if unexpected
+     Arguments:      env    token  size *)
+  val check_filled : E.t -> G.t -> G.t -> G.t
+
+  (* Pushes the stream's current absolute byte offset on stack.
+     The requirement is that the difference between two uses
+     of this method must give a correct _relative_ offset.
+     Arguments:         env    token *)
+  val absolute_offset : E.t -> G.t -> G.t
+
+  (* Finishes the stream, performing consistency checks.
+     Leaves two words on stack, whose interpretation depends
+     on the Stream.
+     Arguments:   env    token  size   header_size *)
+  val terminate : E.t -> G.t -> G.t -> int32 -> G.t
+
+  (* Executes code to eliminate the residual buffer
+     that `terminate` returns (if at all) *)
+  val finalize_buffer : G.t -> G.t
+
+  (* Builds a unique name for a name seed and a type *)
+  val name_for : string -> Type.typ list -> string
+
+  (* Opportunity to flush or update the token. Stream token is on stack. *)
+  val checkpoint : E.t -> G.t -> G.t
+
+  (* Reserve a small fixed number of bytes in the stream and return an
+     address to it. The address is invalidated by a GC, and as such must
+     be written to in the next few instructions. *)
+  val reserve : E.t -> G.t -> int32 -> G.t
+end
+
+
+module BumpStream : Stream = struct
+  let create env get_data_size set_data_buf get_data_buf header =
+    let header_size = Int32.of_int (String.length header) in
+    get_data_size ^^ compile_add_const header_size ^^
+    Blob.dyn_alloc_scratch env ^^ set_data_buf ^^
+    get_data_buf ^^
+    Blob.lit env header ^^ Blob.payload_ptr_unskewed env ^^
+    compile_unboxed_const header_size ^^
+    Heap.memcpy env ^^
+    get_data_buf ^^ compile_add_const header_size ^^ set_data_buf
+
+  let check_filled env get_data_buf get_data_size =
+    get_data_buf ^^ get_data_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+    E.else_trap_with env "data buffer not filled"
+
+  let terminate env get_data_buf get_data_size header_size =
+    get_data_buf ^^ compile_sub_const header_size ^^
+    get_data_size ^^ compile_add_const header_size
+
+  let finalize_buffer code = code
+
+  let name_for fn_name ts = "@" ^ fn_name ^ "<" ^ Typ_hash.typ_seq_hash ts ^ ">"
+
+  let advance_data_buf get_data_buf =
+    get_data_buf ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^ G.setter_for get_data_buf
+
+  let absolute_offset _env get_data_buf = get_data_buf
+
+  let checkpoint _env get_data_buf = G.setter_for get_data_buf
+
+  let reserve _env get_data_buf bytes =
+    get_data_buf ^^ get_data_buf ^^ compile_add_const bytes ^^ G.setter_for get_data_buf
+
+  let write_word_leb env get_data_buf code =
+    let set_word, get_word = new_local env "word" in
+    code ^^ set_word ^^
+    I32Leb.compile_store_to_data_buf_unsigned env get_word get_data_buf ^^
+    advance_data_buf get_data_buf
+
+  let write_word_32 env get_data_buf code =
+    get_data_buf ^^ code ^^
+    G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = None}) ^^
+    compile_unboxed_const Heap.word_size ^^ advance_data_buf get_data_buf
+
+  let write_byte _env get_data_buf code =
+    get_data_buf ^^ code ^^
+    G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.Pack8}) ^^
+    compile_unboxed_const 1l ^^ advance_data_buf get_data_buf
+
+  let write_blob env get_data_buf get_x =
+    let set_len, get_len = new_local env "len" in
+    get_x ^^ Blob.len env ^^ set_len ^^
+    write_word_leb env get_data_buf get_len ^^
+    get_data_buf ^^
+    get_x ^^ Blob.payload_ptr_unskewed env ^^
+    get_len ^^
+    Heap.memcpy env ^^
+    get_len ^^ advance_data_buf get_data_buf
+
+  let write_text env get_data_buf get_x =
+    let set_len, get_len = new_local env "len" in
+    get_x ^^ Text.size env ^^ set_len ^^
+    write_word_leb env get_data_buf get_len ^^
+    get_x ^^ get_data_buf ^^ Text.to_buf env ^^
+    get_len ^^ advance_data_buf get_data_buf
+
+  let write_bignum_leb env get_data_buf get_x =
+    get_data_buf ^^
+    get_x ^^
+    BigNum.compile_store_to_data_buf_unsigned env ^^
+    advance_data_buf get_data_buf
+
+  let write_bignum_sleb env get_data_buf get_x =
+    get_data_buf ^^
+    get_x ^^
+    BigNum.compile_store_to_data_buf_signed env ^^
+    advance_data_buf get_data_buf
+
+end
+
+module MakeSerialization (Strm : Stream) = struct
+  (*
+    The general serialization strategy is as follows:
+    * We statically generate the IDL type description header.
+    * We traverse the data to calculate the size needed for the data buffer and the
+      reference buffer.
+    * We allocate memory for the data buffer and the reference buffer
+      (this memory area is not referenced, so will be dead with the next GC)
+    * We copy the IDL type header to the data buffer.
+    * We traverse the data and serialize it into the data buffer.
+      This is type driven, and we use the `share_code` machinery and names that
+      properly encode the type to resolve loops in a convenient way.
+    * We externalize all that new data space into a databuf
+    * We externalize the reference space into a elembuf
+    * We pass both databuf and elembuf to shared functions
+      (this mimicks the future system API)
+
+    The deserialization is analogous:
+    * We allocate some scratch space, and internalize the databuf and elembuf into it.
+    * We parse the data, in a type-driven way, using normal construction and
+      allocation, while keeping tabs on the type description header for subtyping.
+    * At the end, the scratch space is a hole in the heap, and will be reclaimed
+      by the next GC.
+  *)
+
+  module Strm = Strm
+
+  (* Globals recording known Candid types
+     See Note [Candid subtype checks]
+   *)
+
+  let register_delayed_globals env =
+    (E.add_global32_delayed env "__typtbl" Immutable,
+     E.add_global32_delayed env "__typtbl_end" Immutable,
+     E.add_global32_delayed env "__typtbl_size" Immutable,
+     E.add_global32_delayed env "__typtbl_idltyps" Immutable)
+
+  let get_typtbl env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl")))
+  let get_typtbl_size env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl_size")))
+  let get_typtbl_end env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl_end")))
+  let get_typtbl_idltyps env =
+    G.i (GlobalGet (nr (E.get_global env "__typtbl_idltyps")))
+
+  module Registers = struct
+    let register_globals env =
+      E.add_global32 env "@@rel_buf_opt" Mutable 0l;
+      E.add_global32 env "@@data_buf" Mutable 0l;
+      E.add_global32 env "@@ref_buf" Mutable 0l;
+      E.add_global32 env "@@typtbl" Mutable 0l;
+      E.add_global32 env "@@typtbl_end" Mutable 0l;
+      E.add_global32 env "@@typtbl_size" Mutable 0l
+
+    let get_rel_buf_opt env =
+      G.i (GlobalGet (nr (E.get_global env "@@rel_buf_opt")))
+    let set_rel_buf_opt env =
+      G.i (GlobalSet (nr (E.get_global env "@@rel_buf_opt")))
+
+    let get_data_buf env =
+      G.i (GlobalGet (nr (E.get_global env "@@data_buf")))
+    let set_data_buf env =
+      G.i (GlobalSet (nr (E.get_global env "@@data_buf")))
+
+    let get_ref_buf env =
+      G.i (GlobalGet (nr (E.get_global env "@@ref_buf")))
+    let set_ref_buf env =
+      G.i (GlobalSet (nr (E.get_global env "@@ref_buf")))
+
+    let get_typtbl env =
+      G.i (GlobalGet (nr (E.get_global env "@@typtbl")))
+    let set_typtbl env =
+      G.i (GlobalSet (nr (E.get_global env "@@typtbl")))
+
+    let get_typtbl_end env =
+      G.i (GlobalGet (nr (E.get_global env "@@typtbl_end")))
+    let set_typtbl_end env =
+      G.i (GlobalSet (nr (E.get_global env "@@typtbl_end")))
+
+    let get_typtbl_size env =
+      G.i (GlobalGet (nr (E.get_global env "@@typtbl_size")))
+    let set_typtbl_size env =
+      G.i (GlobalSet (nr (E.get_global env "@@typtbl_size")))
+  end
+
+  open Typ_hash
+
+  let sort_by_hash fs =
+    List.sort
+      (fun (h1,_) (h2,_) -> Lib.Uint32.compare h1 h2)
+      (List.map (fun f -> (Idllib.Escape.unescape_hash f.Type.lab, f)) fs)
+
+  (* The IDL serialization prefaces the data with a type description.
+     We can statically create the type description in Ocaml code,
+     store it in the program, and just copy it to the beginning of the message.
+
+     At some point this can be factored into a function from Motoko type to IDL,
+     type and a function like this for IDL types. But due to recursion handling
+     it is easier to start like this.
+  *)
+
+  module TM = Map.Make (Type.Ord)
+  let to_idl_prim = let open Type in function
+    | Prim Null | Tup [] -> Some 1l
+    | Prim Bool -> Some 2l
+    | Prim Nat -> Some 3l
+    | Prim Int -> Some 4l
+    | Prim Nat8 -> Some 5l
+    | Prim Nat16 -> Some 6l
+    | Prim (Nat32|Char) -> Some 7l
+    | Prim Nat64 -> Some 8l
+    | Prim Int8 -> Some 9l
+    | Prim Int16 -> Some 10l
+    | Prim Int32 -> Some 11l
+    | Prim Int64 -> Some 12l
+    | Prim Float -> Some 14l
+    | Prim Text -> Some 15l
+    (* NB: Prim Blob does not map to a primitive IDL type *)
+    | Any -> Some 16l
+    | Non -> Some 17l
+    | Prim Principal -> Some 24l
+    | Prim Region -> Some 128l
+    | _ -> None
+
+  (* some constants, also see rts/idl.c *)
+  let idl_opt       = -18l
+  let idl_vec       = -19l
+  let idl_record    = -20l
+  let idl_variant   = -21l
+  let idl_func      = -22l
+  let idl_service   = -23l
+  let idl_alias     = 1l (* see Note [mutable stable values] *)
+
+  (* TODO: use record *)
+  let type_desc env ts :
+     string * int list * int32 list  (* type_desc, (relative offsets), indices of ts *)
+    =
+    let open Type in
+
+    (* Type traversal *)
+    (* We do a first traversal to find out the indices of non-primitive types *)
+    let (typs, idx) =
+      let typs = ref [] in
+      let idx = ref TM.empty in
+      let rec go t =
+        let t = Type.normalize t in
+        if to_idl_prim t <> None then () else
+        if TM.mem t !idx then () else begin
+          idx := TM.add t (Lib.List32.length !typs) !idx;
+          typs := !typs @ [ t ];
+          match t with
+          | Tup ts -> List.iter go ts
+          | Obj (_, fs) ->
+            List.iter (fun f -> go f.typ) fs
+          | Array (Mut t) -> go (Array t)
+          | Array t -> go t
+          | Opt t -> go t
+          | Variant vs -> List.iter (fun f -> go f.typ) vs
+          | Func (s, c, tbs, ts1, ts2) ->
+            List.iter go ts1; List.iter go ts2
+          | Prim Blob -> ()
+          | Mut t -> go t
+          | _ ->
+            Printf.eprintf "type_desc: unexpected type %s\n" (string_of_typ t);
+            assert false
+        end
+      in
+      List.iter go ts;
+      (!typs, !idx)
+    in
+
+    (* buffer utilities *)
+    let buf = Buffer.create 16 in
+
+    let add_u8 i =
+      Buffer.add_char buf (Char.chr (i land 0xff)) in
+
+    let rec add_leb128_32 (i : Lib.Uint32.t) =
+      let open Lib.Uint32 in
+      let b = logand i (of_int32 0x7fl) in
+      if of_int32 0l <= i && i < of_int32 128l
+      then add_u8 (to_int b)
+      else begin
+        add_u8 (to_int (logor b (of_int32 0x80l)));
+        add_leb128_32 (shift_right_logical i 7)
+      end in
+
+    let add_leb128 i =
+      assert (i >= 0);
+      add_leb128_32 (Lib.Uint32.of_int i) in
+
+    let rec add_sleb128 (i : int32) =
+      let open Int32 in
+      let b = logand i 0x7fl in
+      if -64l <= i && i < 64l
+      then add_u8 (to_int b)
+      else begin
+        add_u8 (to_int (logor b 0x80l));
+        add_sleb128 (shift_right i 7)
+      end in
+
+    (* Actual binary data *)
+
+    let add_idx t =
+      let t = Type.normalize t in
+      match to_idl_prim t with
+      | Some i -> add_sleb128 (Int32.neg i)
+      | None -> add_sleb128 (TM.find (normalize t) idx) in
+
+    let idx t =
+      let t = Type.normalize t in
+      match to_idl_prim t with
+      | Some i -> Int32.neg i
+      | None -> TM.find (normalize t) idx in
+
+    let rec add_typ t =
+      match t with
+      | Non -> assert false
+      | Prim Blob ->
+        add_typ Type.(Array (Prim Nat8))
+      | Prim Region ->
+        add_sleb128 idl_alias; add_idx t
+      | Prim _ -> assert false
+      | Tup ts ->
+        add_sleb128 idl_record;
+        add_leb128 (List.length ts);
+        List.iteri (fun i t ->
+          add_leb128 i;
+          add_idx t;
+        ) ts
+      | Obj ((Object | Memory), fs) ->
+        add_sleb128 idl_record;
+        add_leb128 (List.length fs);
+        List.iter (fun (h, f) ->
+          add_leb128_32 h;
+          add_idx f.typ
+        ) (sort_by_hash fs)
+      | Array (Mut t) ->
+        add_sleb128 idl_alias; add_idx (Array t)
+      | Array t ->
+        add_sleb128 idl_vec; add_idx t
+      | Opt t ->
+        add_sleb128 idl_opt; add_idx t
+      | Variant vs ->
+        add_sleb128 idl_variant;
+        add_leb128 (List.length vs);
+        List.iter (fun (h, f) ->
+          add_leb128_32 h;
+          add_idx f.typ
+        ) (sort_by_hash vs)
+      | Func (s, c, tbs, ts1, ts2) ->
+        assert (Type.is_shared_sort s);
+        add_sleb128 idl_func;
+        add_leb128 (List.length ts1);
+        List.iter add_idx ts1;
+        add_leb128 (List.length ts2);
+        List.iter add_idx ts2;
+        begin match s, c with
+          | _, Returns ->
+            add_leb128 1; add_u8 2; (* oneway *)
+          | Shared Write, _ ->
+            add_leb128 0; (* no annotation *)
+          | Shared Query, _ ->
+            add_leb128 1; add_u8 1; (* query *)
+          | Shared Composite, _ ->
+            add_leb128 1; add_u8 3; (* composite *)
+          | _ -> assert false
+        end
+      | Obj (Actor, fs) ->
+        add_sleb128 idl_service;
+        add_leb128 (List.length fs);
+        List.iter (fun f ->
+          add_leb128 (String.length f.lab);
+          Buffer.add_string buf f.lab;
+          add_idx f.typ
+        ) fs
+      | Mut t ->
+        add_sleb128 idl_alias; add_idx t
+      | _ -> assert false in
+
+    Buffer.add_string buf "DIDL";
+    add_leb128 (List.length typs);
+    let offsets = List.map (fun typ ->
+      let offset = Buffer.length buf in
+      add_typ typ;
+      offset)
+      typs
+    in
+    add_leb128 (List.length ts);
+    List.iter add_idx ts;
+    (Buffer.contents buf,
+     offsets,
+     List.map idx ts)
+
+  (* See Note [Candid subtype checks] *)
+  let set_delayed_globals (env : E.t) (set_typtbl, set_typtbl_end, set_typtbl_size, set_typtbl_idltyps) =
+    let typdesc, offsets, idltyps = type_desc env (E.get_typtbl_typs env) in
+    let static_typedesc = E.add_static_unskewed env [StaticBytes.Bytes typdesc] in
+    let static_typtbl =
+      let bytes = StaticBytes.i32s
+        (List.map (fun offset ->
+          Int32.(add static_typedesc (of_int(offset))))
+        offsets)
+      in
+      E.add_static_unskewed env [bytes]
+    in
+    let static_idltyps = E.add_static_unskewed env [StaticBytes.i32s idltyps] in
+    set_typtbl static_typtbl;
+    set_typtbl_end Int32.(add static_typedesc (of_int (String.length typdesc)));
+    set_typtbl_size (Int32.of_int (List.length offsets));
+    set_typtbl_idltyps static_idltyps
+
+  (* Returns data (in bytes) and reference buffer size (in entries) needed *)
+  let rec buffer_size env t =
+    let open Type in
+    let t = Type.normalize t in
+    let name = "@buffer_size<" ^ typ_hash t ^ ">" in
+    Func.share_code1 Func.Always env name ("x", I32Type) [I32Type; I32Type]
+    (fun env get_x ->
+
+      (* Some combinators for writing values *)
+      let (set_data_size, get_data_size) = new_local64 env "data_size" in
+      let (set_ref_size, get_ref_size) = new_local env "ref_size" in
+      compile_const_64 0L ^^ set_data_size ^^
+      compile_unboxed_const 0l ^^ set_ref_size ^^
+
+      let inc_data_size code =
+        get_data_size ^^
+        code ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+        G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+        set_data_size
+      in
+
+      let size_word env code =
+        let (set_word, get_word) = new_local env "word" in
+        code ^^ set_word ^^
+        inc_data_size (I32Leb.compile_leb128_size get_word)
+      in
+
+      let size env t =
+        let (set_inc, get_inc) = new_local env "inc" in
+        buffer_size env t ^^
+        get_ref_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^ set_ref_size ^^
+        set_inc ^^ inc_data_size get_inc
+      in
+
+      (* the incremental GC leaves array slice information in tag,
+         the slice information can be removed and the tag reset to array
+         as the GC can resume marking from the array beginning *)
+      let clear_array_slicing =
+        let (set_temp, get_temp) = new_local env "temp" in
+        set_temp ^^
+        get_temp ^^ compile_unboxed_const Tagged.(int_of_tag StableSeen) ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Ne)) ^^
+        get_temp ^^ compile_unboxed_const Tagged.(int_of_tag CoercionFailure) ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.Ne)) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+        get_temp ^^ compile_unboxed_const Tagged.(int_of_tag ArraySliceMinimum) ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+        G.if1 I32Type begin
+          (compile_unboxed_const Tagged.(int_of_tag Array))
+        end begin
+          get_temp
+        end
+      in
+
+      let size_alias size_thing =
+        (* see Note [mutable stable values] *)
+        let (set_tag, get_tag) = new_local env "tag" in
+        get_x ^^ Tagged.load_tag env ^^ clear_array_slicing ^^ set_tag ^^
+        (* Sanity check *)
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag StableSeen) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag MutBox) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag ObjInd) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag Array) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag Region) ^^
+        G.i (Binary (Wasm.Values.I32 I32Op.Or)) ^^
+        E.else_trap_with env "object_size/Mut: Unexpected tag." ^^
+        (* Check if we have seen this before *)
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag StableSeen) ^^
+        G.if0 begin
+          (* Seen before *)
+          (* One byte marker, one word offset *)
+          inc_data_size (compile_unboxed_const 5l)
+        end begin
+          (* Not yet seen *)
+          (* One byte marker, two words scratch space *)
+          inc_data_size (compile_unboxed_const 9l) ^^
+          (* Mark it as seen *)
+          get_x ^^ Tagged.(store_tag env StableSeen) ^^
+          (* and descend *)
+          size_thing ()
+        end
+      in
+
+      (* Now the actual type-dependent code *)
+      begin match t with
+      | Prim Nat -> inc_data_size (get_x ^^ BigNum.compile_data_size_unsigned env)
+      | Prim Int -> inc_data_size (get_x ^^ BigNum.compile_data_size_signed env)
+      | Prim (Int8|Nat8) -> inc_data_size (compile_unboxed_const 1l)
+      | Prim (Int16|Nat16) -> inc_data_size (compile_unboxed_const 2l)
+      | Prim (Int32|Nat32|Char) -> inc_data_size (compile_unboxed_const 4l)
+      | Prim (Int64|Nat64|Float) -> inc_data_size (compile_unboxed_const 8l)
+      | Prim Bool -> inc_data_size (compile_unboxed_const 1l)
+      | Prim Null -> G.nop
+      | Any -> G.nop
+      | Tup [] -> G.nop (* e(()) = null *)
+      | Tup ts ->
+        G.concat_mapi (fun i t ->
+          get_x ^^ Tuple.load_n env (Int32.of_int i) ^^
+          size env t
+          ) ts
+      | Obj ((Object | Memory), fs) ->
+        G.concat_map (fun (_h, f) ->
+          get_x ^^ Object.load_idx_raw env f.Type.lab ^^
+          size env f.typ
+          ) (sort_by_hash fs)
+      | Array (Mut t) ->
+        size_alias (fun () -> get_x ^^ size env (Array t))
+      | Array t ->
+        size_word env (get_x ^^ Arr.len env) ^^
+        get_x ^^ Arr.len env ^^
+        from_0_to_n env (fun get_i ->
+          get_x ^^ get_i ^^ Arr.unsafe_idx env ^^ load_ptr ^^
+          size env t
+        )
+      | Prim Blob ->
+        let (set_len, get_len) = new_local env "len" in
+        get_x ^^ Blob.len env ^^ set_len ^^
+        size_word env get_len ^^
+        inc_data_size get_len
+      | Prim Text ->
+        let (set_len, get_len) = new_local env "len" in
+        get_x ^^ Text.size env ^^ set_len ^^
+        size_word env get_len ^^
+        inc_data_size get_len
+      | Opt t ->
+        inc_data_size (compile_unboxed_const 1l) ^^ (* one byte tag *)
+        get_x ^^ Opt.is_some env ^^
+        G.if0 (get_x ^^ Opt.project env ^^ size env t) G.nop
+      | Variant vs ->
+        List.fold_right (fun (i, {lab = l; typ = t; _}) continue ->
+            get_x ^^
+            Variant.test_is env l ^^
+            G.if0
+              ( size_word env (compile_unboxed_const (Int32.of_int i)) ^^
+                get_x ^^ Variant.project env ^^ size env t
+              ) continue
+          )
+          ( List.mapi (fun i (_h, f) -> (i,f)) (sort_by_hash vs) )
+          ( E.trap_with env "buffer_size: unexpected variant" )
+      | Func _ ->
+        inc_data_size (compile_unboxed_const 1l) ^^ (* one byte tag *)
+        get_x ^^ Arr.load_field env 0l ^^ size env (Obj (Actor, [])) ^^
+        get_x ^^ Arr.load_field env 1l ^^ size env (Prim Text)
+      | Obj (Actor, _) | Prim Principal ->
+        inc_data_size (compile_unboxed_const 1l) ^^ (* one byte tag *)
+        get_x ^^ size env (Prim Blob)
+      | Non ->
+        E.trap_with env "buffer_size called on value of type None"
+      | Prim Region ->
+         size_alias (fun () ->
+          inc_data_size (compile_unboxed_const 12l) ^^ (* |id| + |page_count| = 8 + 4 *)
+          get_x ^^ Region.vec_pages env ^^ size env (Prim Blob))
+      | Mut t ->
+        size_alias (fun () -> get_x ^^ MutBox.load_field env ^^ size env t)
+      | _ -> todo "buffer_size" (Arrange_ir.typ t) G.nop
+      end ^^
+      (* Check 32-bit overflow of buffer_size *)
+      get_data_size ^^
+      compile_shrU64_const 32L ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      E.else_trap_with env "buffer_size overflow" ^^
+      (* Convert to 32-bit *)
+      get_data_size ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+      get_ref_size
+    )
+
+  (* Copies x to the data_buffer, storing references after ref_count entries in ref_base *)
+  let rec serialize_go env t =
+    let open Type in
+    let t = Type.normalize t in
+    let name = Strm.name_for "serialize_go" [t] in
+    Func.share_code3 Func.Always env name (("x", I32Type), ("data_buffer", I32Type), ("ref_buffer", I32Type)) [I32Type; I32Type]
+    (fun env get_x get_data_buf get_ref_buf ->
+      let set_ref_buf = G.setter_for get_ref_buf in
+
+      (* Some combinators for writing values *)
+      let open Strm in
+
+      let write env t =
+        get_data_buf ^^
+        get_ref_buf ^^
+        serialize_go env t ^^
+        set_ref_buf ^^
+        checkpoint env get_data_buf
+      in
+
+      let write_alias write_thing =
+        (* see Note [mutable stable values] *)
+        (* Check heap tag *)
+        let (set_tag, get_tag) = new_local env "tag" in
+        get_x ^^ Tagged.load_tag env ^^ set_tag ^^
+        get_tag ^^ compile_eq_const Tagged.(int_of_tag StableSeen) ^^
+        G.if0
+        begin
+          (* This is the real data *)
+          write_byte env get_data_buf (compile_unboxed_const 0l) ^^
+          (* Remember the current offset in the tag word *)
+          get_x ^^ Tagged.load_forwarding_pointer env ^^ Strm.absolute_offset env get_data_buf ^^
+          Tagged.store_field env Tagged.tag_field ^^
+          (* Leave space in the output buffer for the decoder's bookkeeping *)
+          write_word_32 env get_data_buf (compile_unboxed_const 0l) ^^
+          write_word_32 env get_data_buf (compile_unboxed_const 0l) ^^
+          (* Now the data, following the object field mutbox indirection *)
+          write_thing ()
+        end
+        begin
+          (* This is a reference *)
+          write_byte env get_data_buf (compile_unboxed_const 1l) ^^
+          (* Sanity Checks *)
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag MutBox) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (MutBox)" ^^
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag ObjInd) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (ObjInd)" ^^
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag Array) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (Array)" ^^
+          get_tag ^^ compile_eq_const Tagged.(int_of_tag Region) ^^
+          E.then_trap_with env "unvisited mutable data in serialize_go (Region)" ^^
+          (* Second time we see this *)
+          (* Calculate relative offset *)
+          let set_offset, get_offset = new_local env "offset" in
+          get_tag ^^ Strm.absolute_offset env get_data_buf ^^ G.i (Binary (Wasm.Values.I32 I32Op.Sub)) ^^
+          set_offset ^^
+          (* A sanity check *)
+          get_offset ^^ compile_unboxed_const 0l ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+          E.else_trap_with env "Odd offset" ^^
+          (* Write the offset to the output buffer *)
+          write_word_32 env get_data_buf get_offset
+        end
+      in
+
+      (* Now the actual serialization *)
+
+      begin match t with
+      | Prim Nat ->
+        write_bignum_leb env get_data_buf get_x
+      | Prim Int ->
+        write_bignum_sleb env get_data_buf get_x
+      | Prim Float ->
+        reserve env get_data_buf 8l ^^
+        get_x ^^ Float.unbox env ^^
+        G.i (Store {ty = F64Type; align = 0; offset = 0l; sz = None})
+      | Prim ((Int64|Nat64) as pty) ->
+        reserve env get_data_buf 8l ^^
+        get_x ^^ BoxedWord64.unbox env pty ^^
+        G.i (Store {ty = I64Type; align = 0; offset = 0l; sz = None})
+      | Prim ((Int32|Nat32) as ty) ->
+        write_word_32 env get_data_buf (get_x ^^ BoxedSmallWord.unbox env ty)
+      | Prim Char ->
+        write_word_32 env get_data_buf (get_x ^^ TaggedSmallWord.lsb_adjust_codepoint env)
+      | Prim ((Int16|Nat16) as ty) ->
+        reserve env get_data_buf 2l ^^
+        get_x ^^ TaggedSmallWord.lsb_adjust ty ^^
+        G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = Some Wasm.Types.Pack16})
+      | Prim ((Int8|Nat8) as ty) ->
+        write_byte env get_data_buf (get_x ^^ TaggedSmallWord.lsb_adjust ty)
+      | Prim Bool ->
+        write_byte env get_data_buf get_x
+      | Tup [] -> (* e(()) = null *)
+        G.nop
+      | Tup ts ->
+        G.concat_mapi (fun i t ->
+          get_x ^^ Tuple.load_n env (Int32.of_int i) ^^
+          write env t
+        ) ts
+      | Obj ((Object | Memory), fs) ->
+        G.concat_map (fun (_h, f) ->
+          get_x ^^ Object.load_idx_raw env f.Type.lab ^^
+          write env f.typ
+        ) (sort_by_hash fs)
+      | Array (Mut t) ->
+        write_alias (fun () -> get_x ^^ write env (Array t))
+      | Prim Region ->
+        write_alias (fun () ->
+          reserve env get_data_buf 8l ^^
+          get_x ^^ Region.id env ^^
+          G.i (Store {ty = I64Type; align = 0; offset = 0l; sz = None}) ^^
+          write_word_32 env get_data_buf (get_x ^^ Region.page_count env) ^^
+          write_blob env get_data_buf (get_x ^^ Region.vec_pages env)
+        )
+      | Array t ->
+        write_word_leb env get_data_buf (get_x ^^ Arr.len env) ^^
+        get_x ^^ Arr.len env ^^
+        from_0_to_n env (fun get_i ->
+          get_x ^^ get_i ^^ Arr.unsafe_idx env ^^ load_ptr ^^
+          write env t
+        )
+      | Prim Null -> G.nop
+      | Any -> G.nop
+      | Opt t ->
+        get_x ^^
+        Opt.is_some env ^^
+        G.if0
+          (write_byte env get_data_buf (compile_unboxed_const 1l) ^^ get_x ^^ Opt.project env ^^ write env t)
+          (write_byte env get_data_buf (compile_unboxed_const 0l))
+      | Variant vs ->
+        List.fold_right (fun (i, {lab = l; typ = t; _}) continue ->
+            get_x ^^
+            Variant.test_is env l ^^
+            G.if0
+              ( write_word_leb env get_data_buf (compile_unboxed_const (Int32.of_int i)) ^^
+                get_x ^^ Variant.project env ^^ write env t)
+              continue
+          )
+          ( List.mapi (fun i (_h, f) -> (i,f)) (sort_by_hash vs) )
+          ( E.trap_with env "serialize_go: unexpected variant" )
+      | Prim Blob ->
+        write_blob env get_data_buf get_x
+      | Prim Text ->
+        write_text env get_data_buf get_x
+      | Func _ ->
+        write_byte env get_data_buf (compile_unboxed_const 1l) ^^
+        get_x ^^ Arr.load_field env 0l ^^ write env (Obj (Actor, [])) ^^
+        get_x ^^ Arr.load_field env 1l ^^ write env (Prim Text)
+      | Obj (Actor, _) | Prim Principal ->
+        write_byte env get_data_buf (compile_unboxed_const 1l) ^^
+        get_x ^^ write env (Prim Blob)
+      | Non ->
+        E.trap_with env "serializing value of type None"
+      | Mut t ->
+        write_alias (fun () ->
+          get_x ^^ MutBox.load_field env ^^ write env t
+        )
+      | _ -> todo "serialize" (Arrange_ir.typ t) G.nop
+      end ^^
+      get_data_buf ^^
+      get_ref_buf
+    )
+
+  (* This value is returned by deserialize_go if deserialization fails in a way
+     that should be recoverable by opt parsing.
+     By virtue of being a deduped static value, it can be detected by pointer
+     comparison.
+  *)
+  let coercion_error_value env : int32 =
+    Tagged.shared_static_obj env Tagged.CoercionFailure []
+
+  (* See Note [Candid subtype checks] *)
+  let with_rel_buf_opt env extended get_typtbl_size1 f =
+    if extended then
+      f (compile_unboxed_const 0l)
+    else
+      get_typtbl_size1 ^^ get_typtbl_size env ^^
+      E.call_import env "rts" "idl_sub_buf_words" ^^
+      Stack.dynamic_with_words env "rel_buf" (fun get_ptr ->
+        get_ptr ^^ get_typtbl_size1 ^^ get_typtbl_size env ^^
+        E.call_import env "rts" "idl_sub_buf_init" ^^
+        f get_ptr)
+
+  (* See Note [Candid subtype checks] *)
+  let idl_sub env t2 =
+    let idx = E.add_typtbl_typ env t2 in
+    get_typtbl_idltyps env ^^
+    G.i (Load {ty = I32Type; align = 0; offset = Int32.mul idx 4l (*!*); sz = None}) ^^
+    Func.share_code6 Func.Always env ("idl_sub")
+      (("rel_buf", I32Type),
+       ("typtbl1", I32Type),
+       ("typtbl_end1", I32Type),
+       ("typtbl_size1", I32Type),
+       ("idltyp1", I32Type),
+       ("idltyp2", I32Type)
+      )
+      [I32Type]
+      (fun env get_rel_buf get_typtbl1 get_typtbl_end1 get_typtbl_size1 get_idltyp1 get_idltyp2 ->
+        get_rel_buf ^^
+        E.else_trap_with env "null rel_buf" ^^
+        get_rel_buf ^^
+        get_typtbl1 ^^
+        get_typtbl env ^^
+        get_typtbl_end1 ^^
+        get_typtbl_end env ^^
+        get_typtbl_size1 ^^
+        get_typtbl_size env ^^
+        get_idltyp1 ^^
+        get_idltyp2 ^^
+        E.call_import env "rts" "idl_sub")
+
+  (* The main deserialization function, generated once per type hash.
+
+     We use a combination of RTS stack locals and registers (Wasm globals) for
+     recursive parameter passing to avoid exhausting the Wasm stack, which is instead
+     used solely for return values and (implicit) return addresses.
+
+     Its RTS stack parameters are (c.f. module Stack):
+
+       * idltyp:      The idl type (prim type or table index) to decode now
+       * depth:       Recursion counter; reset when we make progres on the value
+       * can_recover: Whether coercion errors are recoverable, see coercion_failed below
+
+     Its register parameters are (c.f. Registers):
+       * rel_buf_opt: The optional subtype check memoization table
+          (non-null for untrusted Candid but null for trusted de-stablization (see `with_rel_buf_opt`).)
+       * data_buffer: The current position of the input data buffer
+       * ref_buffer:  The current position of the input references buffer
+       * typtbl:      The type table, as returned by parse_idl_header
+       * typtbl_size: The size of the type table, used to limit recursion
+
+     It returns the value of type t (vanilla representation) or coercion_error_value,
+     It advances the data_buffer past the decoded value (even if it returns coercion_error_value!)
+
+  *)
+
+  (* symbolic names for arguments passed on RTS stack *)
+  module StackArgs = struct
+    let idltyp = 0l
+    let depth = 1l
+    let can_recover = 2l
+  end
+
+  let rec deserialize_go env t =
+    let open Type in
+    let t = Type.normalize t in
+    let name = "@deserialize_go<" ^ typ_hash t ^ ">" in
+    Func.share_code0 Func.Always env name
+      [I32Type]
+      (fun env  ->
+      let get_idltyp = Stack.get_local env StackArgs.idltyp in
+      let get_depth = Stack.get_local env StackArgs.depth in
+      let get_can_recover = Stack.get_local env StackArgs.can_recover in
+      let get_rel_buf_opt = Registers.get_rel_buf_opt env in
+      let get_data_buf = Registers.get_data_buf env in
+      let _get_ref_buf = Registers.get_ref_buf env in
+      let get_typtbl = Registers.get_typtbl env in
+      let get_typtbl_end = Registers.get_typtbl_end env in
+      let get_typtbl_size = Registers.get_typtbl_size env in
+
+      (* Check recursion depth (protects against empty record etc.) *)
+      (* Factor 2 because at each step, the expected type could go through one
+         level of opt that is not present in the value type
+      *)
+      get_depth ^^
+      get_typtbl_size ^^ compile_add_const 1l ^^ compile_mul_const 2l ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+      E.else_trap_with env ("IDL error: circular record read") ^^
+
+      (* Remember data buffer position, to detect progress *)
+      let (set_old_pos, get_old_pos) = new_local env "old_pos" in
+      ReadBuf.get_ptr get_data_buf ^^ set_old_pos ^^
+
+      let go' can_recover env t =
+        (* assumes idltyp on stack *)
+        Stack.with_frame env "frame_ptr" 3l (fun () ->
+          Stack.set_local env StackArgs.idltyp ^^
+          (* set up frame arguments *)
+          ( (* Reset depth counter if we made progress *)
+            ReadBuf.get_ptr get_data_buf ^^ get_old_pos ^^
+            G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+            G.if1 I32Type
+              (Stack.get_prev_local env 1l ^^ compile_add_const 1l)
+              (compile_unboxed_const 0l)
+            ) ^^
+          Stack.set_local env StackArgs.depth ^^
+          (if can_recover
+             then compile_unboxed_const 1l
+             else Stack.get_prev_local env 2l) ^^
+          Stack.set_local env StackArgs.can_recover ^^
+          deserialize_go env t)
+      in
+
+      let go = go' false in
+      let go_can_recover = go' true in
+
+      let skip get_typ =
+        get_data_buf ^^ get_typtbl ^^ get_typ ^^ compile_unboxed_const 0l ^^
+        E.call_import env "rts" "skip_any"
+      in
+
+      (* This flag is set to return a coercion error at the very end
+         We cannot use (G.i Return) for early exit, or we’d leak stack space,
+         as Stack.with_words is used to allocate scratch space.
+      *)
+      let (set_failed, get_failed) = new_local env "failed" in
+      let set_failure = compile_unboxed_const 1l ^^ set_failed in
+      let when_failed f = get_failed ^^ G.if0 f G.nop in
+
+      (* This looks at a value and if it is coercion_error_value, sets the failure flag.
+         This propagates the error out of arrays, records, etc.
+       *)
+      let remember_failure get_val =
+          get_val ^^ compile_eq_const (coercion_error_value env) ^^
+          G.if0 set_failure G.nop
+      in
+
+      (* This sets the failure flag and puts coercion_error_value on the stack *)
+      let coercion_failed msg =
+        (* If we know that there is no backtracking `opt t` around, then just trap.
+           This gives a better error message
+        *)
+        get_can_recover ^^ E.else_trap_with env msg ^^
+        set_failure ^^ compile_unboxed_const (coercion_error_value env) in
+
+      (* returns true if we are looking at primitive type with this id *)
+      let check_prim_typ t =
+        get_idltyp ^^
+        compile_eq_const (Int32.neg (Option.get (to_idl_prim t)))
+      in
+
+      let with_prim_typ t f =
+        check_prim_typ t ^^
+        G.if1 I32Type f
+          ( skip get_idltyp ^^
+            coercion_failed ("IDL error: unexpected IDL type when parsing " ^ string_of_typ t)
+          )
+      in
+
+      let read_byte_tagged = function
+        | [code0; code1] ->
+          ReadBuf.read_byte env get_data_buf ^^
+          let (set_b, get_b) = new_local env "b" in
+          set_b ^^
+          get_b ^^
+          compile_eq_const 0l ^^
+          G.if1 I32Type
+          begin code0
+          end begin
+            get_b ^^ compile_eq_const 1l ^^
+            E.else_trap_with env "IDL error: byte tag not 0 or 1" ^^
+            code1
+          end
+        | _ -> assert false; (* can be generalized later as needed *)
+      in
+
+      let read_blob () =
+        let (set_len, get_len) = new_local env "len" in
+        let (set_x, get_x) = new_local env "x" in
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+
+        get_len ^^ Blob.alloc env ^^ set_x ^^
+        get_x ^^ Blob.payload_ptr_unskewed env ^^
+        ReadBuf.read_blob env get_data_buf get_len ^^
+        get_x
+      in
+
+      let read_principal () =
+        let (set_len, get_len) = new_local env "len" in
+        let (set_x, get_x) = new_local env "x" in
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+
+        (* at most 29 bytes, according to
+           https://sdk.dfinity.org/docs/interface-spec/index.html#principal
+        *)
+        get_len ^^ compile_unboxed_const 29l ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+        E.else_trap_with env "IDL error: principal too long" ^^
+
+        get_len ^^ Blob.alloc env ^^ set_x ^^
+        get_x ^^ Blob.payload_ptr_unskewed env ^^
+        ReadBuf.read_blob env get_data_buf get_len ^^
+        get_x
+      in
+
+      let read_text () =
+        let (set_len, get_len) = new_local env "len" in
+        ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+        let (set_ptr, get_ptr) = new_local env "x" in
+        ReadBuf.get_ptr get_data_buf ^^ set_ptr ^^
+        ReadBuf.advance get_data_buf get_len ^^
+        (* validate *)
+        get_ptr ^^ get_len ^^ E.call_import env "rts" "utf8_validate" ^^
+        (* copy *)
+        get_ptr ^^ get_len ^^ Text.of_ptr_size env
+      in
+
+      let read_actor_data () =
+        read_byte_tagged
+          [ E.trap_with env "IDL error: unexpected actor reference"
+          ; read_principal ()
+          ]
+      in
+
+      (* returns true if get_arg_typ is a composite type of this id *)
+      let check_composite_typ get_arg_typ idl_tycon_id =
+        get_arg_typ ^^
+        compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        G.if1 I32Type
+        begin
+          ReadBuf.alloc env (fun get_typ_buf ->
+            (* Update typ_buf *)
+            ReadBuf.set_ptr get_typ_buf (
+              get_typtbl ^^
+              get_arg_typ ^^ compile_mul_const Heap.word_size ^^
+              G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+              load_unskewed_ptr
+            ) ^^
+            ReadBuf.set_end get_typ_buf (ReadBuf.get_end get_data_buf) ^^
+            (* read sleb128 *)
+            ReadBuf.read_sleb128 env get_typ_buf ^^
+            (* Check it is the expected value *)
+            compile_eq_const idl_tycon_id
+          )
+        end
+        (compile_unboxed_const 0l)
+      in
+
+
+      (* checks that arg_typ is positive, looks it up in the table,
+         creates a fresh typ_buf pointing into the type description,
+         reads the type constructor index and traps or fails if it is the wrong one.
+         and passes the typ_buf to a subcomputation to read the type arguments *)
+      let with_composite_arg_typ get_arg_typ idl_tycon_id f =
+        (* make sure index is not negative *)
+        get_arg_typ ^^
+        compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        G.if1 I32Type
+        begin
+          ReadBuf.alloc env (fun get_typ_buf ->
+            (* Update typ_buf *)
+            ReadBuf.set_ptr get_typ_buf (
+              get_typtbl ^^
+              get_arg_typ ^^ compile_mul_const Heap.word_size ^^
+              G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+              load_unskewed_ptr
+            ) ^^
+            ReadBuf.set_end get_typ_buf (ReadBuf.get_end get_data_buf) ^^
+            (* read sleb128 *)
+            ReadBuf.read_sleb128 env get_typ_buf ^^
+            (* Check it is the expected type constructor *)
+            compile_eq_const idl_tycon_id ^^
+            G.if1 I32Type
+            begin
+              f get_typ_buf
+            end
+            begin
+              skip get_arg_typ ^^
+              coercion_failed ("IDL error: unexpected IDL type when parsing " ^ string_of_typ t)
+            end
+          )
+        end
+        begin
+          skip get_arg_typ ^^
+          coercion_failed ("IDL error: unexpected IDL type when parsing " ^ string_of_typ t)
+        end
+      in
+
+      let with_alias_typ get_arg_typ =
+        get_arg_typ ^^
+        compile_unboxed_const 0l ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+        G.if1 I32Type
+        begin
+            with_composite_arg_typ get_arg_typ idl_alias (ReadBuf.read_sleb128 env)
+        end
+        begin
+          (* sanity check *)
+          get_arg_typ ^^
+          compile_eq_const (Int32.neg (Option.get (to_idl_prim (Prim Region)))) ^^
+          E.else_trap_with env "IDL error: unexpecting primitive alias type" ^^
+          get_arg_typ
+        end
+      in
+
+      let with_composite_typ idl_tycon_id f =
+        with_composite_arg_typ get_idltyp idl_tycon_id f
+      in
+
+      let with_record_typ f = with_composite_typ idl_record (fun get_typ_buf ->
+        Stack.with_words env "get_n_ptr" 1l (fun get_n_ptr ->
+          get_n_ptr ^^
+          ReadBuf.read_leb128 env get_typ_buf ^^
+          store_unskewed_ptr ^^
+          f get_typ_buf get_n_ptr
+        )
+      ) in
+
+      let with_blob_typ env f =
+        with_composite_typ idl_vec (fun get_typ_buf ->
+          ReadBuf.read_sleb128 env get_typ_buf ^^
+          compile_eq_const (-5l) (* Nat8 *) ^^
+          G.if1 I32Type
+            f
+            begin
+              skip get_idltyp ^^
+              coercion_failed "IDL error: blob not a vector of nat8"
+            end
+        )
+      in
+
+      let read_alias env t read_thing =
+        (* see Note [mutable stable values] *)
+        let (set_is_ref, get_is_ref) = new_local env "is_ref" in
+        let (set_result, get_result) = new_local env "result" in
+        let (set_cur, get_cur) = new_local env "cur" in
+        let (set_memo, get_memo) = new_local env "memo" in
+
+        let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+
+        with_alias_typ get_idltyp ^^ set_arg_typ ^^
+
+        (* Find out if it is a reference or not *)
+        ReadBuf.read_byte env get_data_buf ^^ set_is_ref ^^
+
+        (* If it is a reference, temporarily set the read buffer to that place *)
+        get_is_ref ^^
+        G.if0 begin
+          let (set_offset, get_offset) = new_local env "offset" in
+          ReadBuf.read_word32 env get_data_buf ^^ set_offset ^^
+          (* A sanity check *)
+          get_offset ^^ compile_unboxed_const 0l ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+          E.else_trap_with env "Odd offset" ^^
+
+          ReadBuf.get_ptr get_data_buf ^^ set_cur ^^
+          ReadBuf.advance get_data_buf (get_offset ^^ compile_add_const (-4l))
+        end G.nop ^^
+
+        (* Remember location of ptr *)
+        ReadBuf.get_ptr get_data_buf ^^ set_memo ^^
+        (* Did we decode this already? *)
+        ReadBuf.read_word32 env get_data_buf ^^ set_result ^^
+        get_result ^^ compile_eq_const 0l ^^
+        G.if0 begin
+          (* No, not yet decoded *)
+          (* Skip over type hash field *)
+          ReadBuf.read_word32 env get_data_buf ^^ compile_eq_const 0l ^^
+          E.else_trap_with env "Odd: Type hash scratch space not empty" ^^
+
+          (* Read the content *)
+          read_thing get_arg_typ (fun get_thing ->
+            (* This is called after allocation, but before descending
+               We update the memo location here so that loops work
+            *)
+            get_thing ^^ set_result ^^
+            get_memo ^^ get_result ^^ store_unskewed_ptr ^^
+            get_memo ^^ compile_add_const 4l ^^ Blob.lit env (typ_hash t) ^^ store_unskewed_ptr
+          )
+          end begin
+          (* Decoded before. Check type hash *)
+          ReadBuf.read_word32 env get_data_buf ^^ Blob.lit env (typ_hash t) ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+          E.else_trap_with env ("Stable memory error: Aliased at wrong type, expected: " ^ typ_hash t)
+        end ^^
+
+        (* If this was a reference, reset read buffer *)
+        get_is_ref ^^
+        G.if0 (ReadBuf.set_ptr get_data_buf get_cur) G.nop ^^
+
+        get_result
+      in
+
+
+      (* Now the actual deserialization *)
+      begin match t with
+      (* Primitive types *)
+      | Prim Nat ->
+        with_prim_typ t
+        begin
+          BigNum.compile_load_from_data_buf env get_data_buf false
+        end
+      | Prim Int ->
+        (* Subtyping with nat *)
+        check_prim_typ (Prim Nat) ^^
+        G.if1 I32Type
+          begin
+            BigNum.compile_load_from_data_buf env get_data_buf false
+          end
+          begin
+            with_prim_typ t
+            begin
+              BigNum.compile_load_from_data_buf env get_data_buf true
+            end
+          end
+      | Prim Float ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_float64 env get_data_buf ^^
+          Float.box env
+        end
+      | Prim ((Int64|Nat64) as pty) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word64 env get_data_buf ^^
+          BoxedWord64.box env pty
+        end
+      | Prim ((Int32|Nat32) as pty) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word32 env get_data_buf ^^
+          BoxedSmallWord.box env pty
+        end
+      | Prim Char ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word32 env get_data_buf ^^
+          TaggedSmallWord.check_and_msb_adjust_codepoint env ^^
+          TaggedSmallWord.tag env Char
+        end
+      | Prim ((Int16|Nat16) as ty) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_word16 env get_data_buf ^^
+          TaggedSmallWord.msb_adjust ty ^^
+          TaggedSmallWord.tag env ty
+        end
+      | Prim ((Int8|Nat8) as ty) ->
+        with_prim_typ t
+        begin
+          ReadBuf.read_byte env get_data_buf ^^
+          TaggedSmallWord.msb_adjust ty ^^
+          TaggedSmallWord.tag env ty
+        end
+      | Prim Bool ->
+        with_prim_typ t
+        begin
+          read_byte_tagged
+            [ Bool.lit false
+            ; Bool.lit true
+            ]
+        end
+      | Prim Null ->
+        with_prim_typ t (Opt.null_lit env)
+      | Any ->
+        skip get_idltyp ^^
+        (* Any vanilla value works here *)
+        Opt.null_lit env
+      | Prim Blob ->
+        with_blob_typ env (read_blob ())
+      | Prim Principal ->
+        with_prim_typ t
+        begin
+          read_byte_tagged
+            [ E.trap_with env "IDL error: unexpected principal reference"
+            ; read_principal ()
+            ]
+        end
+      | Prim Text ->
+        with_prim_typ t (read_text ())
+      | Tup [] -> (* e(()) = null *)
+        with_prim_typ t (Tuple.from_stack env 0)
+      (* Composite types *)
+      | Tup ts ->
+        with_record_typ (fun get_typ_buf get_n_ptr ->
+          let (set_val, get_val) = new_local env "val" in
+
+          G.concat_mapi (fun i t ->
+            (* skip all possible intermediate extra fields *)
+            get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ compile_unboxed_const (Int32.of_int i) ^^ get_n_ptr ^^
+            E.call_import env "rts" "find_field" ^^
+            G.if1 I32Type
+              begin
+                ReadBuf.read_sleb128 env get_typ_buf ^^
+                go env t ^^ set_val ^^
+                remember_failure get_val ^^
+                get_val
+              end
+              begin
+                match normalize t with
+                | Opt _ | Any -> Opt.null_lit env
+                | _ -> coercion_failed "IDL error: did not find tuple field in record"
+              end
+          ) ts ^^
+
+          (* skip all possible trailing extra fields *)
+          get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ get_n_ptr ^^
+          E.call_import env "rts" "skip_fields" ^^
+
+          Tuple.from_stack env (List.length ts)
+        )
+      | Obj ((Object | Memory), fs) ->
+        with_record_typ (fun get_typ_buf get_n_ptr ->
+          let (set_val, get_val) = new_local env "val" in
+
+          Object.lit_raw env (List.map (fun (h,f) ->
+            f.Type.lab, fun () ->
+              (* skip all possible intermediate extra fields *)
+              get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ compile_unboxed_const (Lib.Uint32.to_int32 h) ^^ get_n_ptr ^^
+              E.call_import env "rts" "find_field" ^^
+              G.if1 I32Type
+                begin
+                  ReadBuf.read_sleb128 env get_typ_buf ^^
+                  go env f.typ ^^ set_val ^^
+                  remember_failure get_val ^^
+                  get_val
+                  end
+                begin
+                  match normalize f.typ with
+                  | Opt _ | Any -> Opt.null_lit env
+                  | _ -> coercion_failed (Printf.sprintf "IDL error: did not find field %s in record" f.lab)
+                end
+          ) (sort_by_hash fs)) ^^
+
+          (* skip all possible trailing extra fields *)
+          get_typ_buf ^^ get_data_buf ^^ get_typtbl ^^ get_n_ptr ^^
+          E.call_import env "rts" "skip_fields"
+          )
+      | Array (Mut t) ->
+        read_alias env (Array (Mut t)) (fun get_array_typ on_alloc ->
+          let (set_len, get_len) = new_local env "len" in
+          let (set_x, get_x) = new_local env "x" in
+          let (set_val, get_val) = new_local env "val" in
+          let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+          (* TODO: if possible refactor to match new Array t code,
+             (perhaps too risky and unnecessary for extended candid due to lack of fancy opt subtyping, see #4243)
+          *)
+          with_composite_arg_typ get_array_typ idl_vec (ReadBuf.read_sleb128 env) ^^ set_arg_typ ^^
+          ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+          get_len ^^ Arr.alloc env ^^ set_x ^^
+          on_alloc get_x ^^
+          get_len ^^ from_0_to_n env (fun get_i ->
+            get_x ^^ get_i ^^ Arr.unsafe_idx env ^^
+            get_arg_typ ^^ go env t ^^ set_val ^^
+            remember_failure get_val ^^
+            get_val ^^ store_ptr
+          ) ^^
+          get_x ^^
+          Tagged.allocation_barrier env ^^
+          G.i Drop
+        )
+      | Prim Region ->
+         read_alias env (Prim Region) (fun get_region_typ on_alloc ->
+          let (set_region, get_region) = new_local env "region" in
+          (* sanity check *)
+          get_region_typ ^^
+          compile_eq_const (Int32.neg (Option.get (to_idl_prim (Prim Region)))) ^^
+          E.else_trap_with env "deserialize_go (Region): unexpected idl_typ" ^^
+          (* pre-allocate a region object, with dummy fields *)
+          compile_const_64 0L ^^ (* id *)
+          compile_unboxed_const 0l ^^ (* pagecount *)
+          Blob.lit env "" ^^ (* vec_pages *)
+          Region.alloc_region env ^^
+          set_region ^^
+          on_alloc get_region ^^
+          (* read and initialize the region's fields *)
+          get_region ^^
+          ReadBuf.read_word64 env get_data_buf ^^ (* id *)
+          ReadBuf.read_word32 env get_data_buf ^^ (* pagecount *)
+          read_blob () ^^ (* vec_pages *)
+          Region.init_region env
+        )
+      | Array t ->
+        let (set_len, get_len) = new_local env "len" in
+        let (set_x, get_x) = new_local env "x" in
+        let (set_val, get_val) = new_local env "val" in
+        let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+        with_composite_typ idl_vec (fun get_typ_buf ->
+          ReadBuf.read_sleb128 env get_typ_buf ^^
+          set_arg_typ ^^
+          ReadBuf.read_leb128 env get_data_buf ^^ set_len ^^
+          get_len ^^ Arr.alloc env ^^ set_x ^^
+          get_len ^^ from_0_to_n env (fun get_i ->
+          get_x ^^ get_i ^^ Arr.unsafe_idx env ^^
+          get_arg_typ ^^ go env t ^^ set_val ^^
+          remember_failure get_val ^^
+          get_val ^^ store_ptr
+        ) ^^
+        get_x ^^
+        Tagged.allocation_barrier env)
+      | Opt t ->
+        check_prim_typ (Prim Null) ^^
+        G.if1 I32Type (Opt.null_lit env)
+        begin
+          check_prim_typ Any ^^ (* reserved *)
+          G.if1 I32Type (Opt.null_lit env)
+          begin
+            check_composite_typ get_idltyp idl_opt ^^
+            G.if1 I32Type
+            begin
+              let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+              with_composite_typ idl_opt (ReadBuf.read_sleb128 env) ^^ set_arg_typ ^^
+              read_byte_tagged
+                [ Opt.null_lit env
+                ; let (set_val, get_val) = new_local env "val" in
+                  get_arg_typ ^^ go_can_recover env t ^^ set_val ^^
+                  get_val ^^ compile_eq_const (coercion_error_value env) ^^
+                  G.if1 I32Type
+                    (* decoding failed, but this is opt, so: return null *)
+                    (Opt.null_lit env)
+                    (* decoding succeeded, return opt value *)
+                    (Opt.inject env get_val)
+                ]
+            end
+            begin
+              (* this check corresponds to `not (null <: <t>)` in the spec *)
+              match normalize t with
+              | Prim Null | Opt _ | Any ->
+                (* Ignore and return null *)
+                skip get_idltyp ^^
+                Opt.null_lit env
+              | _ ->
+                (* Try constituent type *)
+                let (set_val, get_val) = new_local env "val" in
+                get_idltyp ^^ go_can_recover env t ^^ set_val ^^
+                get_val ^^ compile_eq_const (coercion_error_value env) ^^
+                G.if1 I32Type
+                  (* decoding failed, but this is opt, so: return null *)
+                  (Opt.null_lit env)
+                  (* decoding succeeded, return opt value *)
+                  (Opt.inject env get_val)
+            end
+          end
+        end
+      | Variant vs ->
+        let (set_val, get_val) = new_local env "val" in
+        with_composite_typ idl_variant (fun get_typ_buf ->
+          (* Find the tag *)
+          let (set_n, get_n) = new_local env "len" in
+          ReadBuf.read_leb128 env get_typ_buf ^^ set_n ^^
+
+          let (set_tagidx, get_tagidx) = new_local env "tagidx" in
+          ReadBuf.read_leb128 env get_data_buf ^^ set_tagidx ^^
+
+          get_tagidx ^^ get_n ^^
+          G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+          E.else_trap_with env "IDL error: variant index out of bounds" ^^
+
+          (* Zoom past the previous entries *)
+          get_tagidx ^^ from_0_to_n env (fun _ ->
+            get_typ_buf ^^ E.call_import env "rts" "skip_leb128" ^^
+            get_typ_buf ^^ E.call_import env "rts" "skip_leb128"
+          ) ^^
+
+          (* Now read the tag *)
+          let (set_tag, get_tag) = new_local env "tag" in
+          ReadBuf.read_leb128 env get_typ_buf ^^ set_tag ^^
+          let (set_arg_typ, get_arg_typ) = new_local env "arg_typ" in
+          ReadBuf.read_sleb128 env get_typ_buf ^^ set_arg_typ ^^
+
+          List.fold_right (fun (h, {lab = l; typ = t; _}) continue ->
+              get_tag ^^ compile_eq_const (Lib.Uint32.to_int32 h) ^^
+              G.if1 I32Type
+                ( Variant.inject env l (
+                  get_arg_typ ^^ go env t ^^ set_val ^^
+                  remember_failure get_val ^^
+                  get_val
+                ))
+                continue
+            )
+            ( sort_by_hash vs )
+            ( skip get_arg_typ ^^
+              coercion_failed "IDL error: unexpected variant tag" )
+        )
+      | Func _ ->
+        (* See Note [Candid subtype checks] *)
+        get_rel_buf_opt ^^
+        G.if1 I32Type
+          begin
+            get_rel_buf_opt ^^
+            get_typtbl ^^
+            get_typtbl_end ^^
+            get_typtbl_size ^^
+            get_idltyp ^^
+            idl_sub env t
+          end
+          (Bool.lit true) ^^ (* if we don't have a subtype memo table, assume the types are ok *)
+        G.if1 I32Type
+          (with_composite_typ idl_func (fun _get_typ_buf ->
+            read_byte_tagged
+              [ E.trap_with env "IDL error: unexpected function reference"
+              ; read_actor_data () ^^
+                read_text () ^^
+                Tuple.from_stack env 2
+              ]))
+          (skip get_idltyp ^^
+           coercion_failed "IDL error: incompatible function type")
+      | Obj (Actor, _) ->
+        (* See Note [Candid subtype checks] *)
+        get_rel_buf_opt ^^
+        G.if1 I32Type
+          begin
+            get_rel_buf_opt ^^
+            get_typtbl ^^
+            get_typtbl_end ^^
+            get_typtbl_size ^^
+            get_idltyp ^^
+            idl_sub env t
+          end
+          (Bool.lit true) ^^
+        G.if1 I32Type
+          (with_composite_typ idl_service
+             (fun _get_typ_buf -> read_actor_data ()))
+          (skip get_idltyp ^^
+           coercion_failed "IDL error: incompatible actor type")
+      | Mut t ->
+        read_alias env (Mut t) (fun get_arg_typ on_alloc ->
+          let (set_result, get_result) = new_local env "result" in
+          Tagged.obj env Tagged.ObjInd [ compile_unboxed_const 0l ] ^^ set_result ^^
+          on_alloc get_result ^^
+          get_result ^^
+          get_arg_typ ^^ go env t ^^
+          MutBox.store_field env
+        )
+      | Non ->
+        skip get_idltyp ^^
+        coercion_failed "IDL error: deserializing value of type None"
+      | _ -> todo_trap env "deserialize" (Arrange_ir.typ t)
+      end ^^
+      (* Parsed value on the stack, return that, unless the failure flag is set *)
+      when_failed (compile_unboxed_const (coercion_error_value env) ^^ G.i Return)
+    )
+
+  let serialize env ts : G.t =
+    let name = Strm.name_for "serialize" ts in
+    (* returns data/length pointers (will be GC’ed next time!) *)
+    Func.share_code1 Func.Always env name ("x", I32Type) [I32Type; I32Type] (fun env get_x ->
+      let (set_data_size, get_data_size) = new_local env "data_size" in
+      let (set_refs_size, get_refs_size) = new_local env "refs_size" in
+
+      let (tydesc, _offsets, _idltyps) = type_desc env ts in
+      let tydesc_len = Int32.of_int (String.length tydesc) in
+
+      (* Get object sizes *)
+      get_x ^^
+      buffer_size env (Type.seq ts) ^^
+      set_refs_size ^^
+      set_data_size ^^
+      (* check for overflow *)
+      get_data_size ^^
+      compile_add_const tydesc_len ^^
+      compile_unboxed_const tydesc_len ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.LtU)) ^^
+      E.then_trap_with env "serialization overflow" ^^
+
+      let (set_data_start, get_data_start) = new_local env "data_start" in
+      let (set_refs_start, get_refs_start) = new_local env "refs_start" in
+
+      (* Create a stream with suitable capacity and given header *)
+      Strm.create env get_data_size set_data_start get_data_start tydesc ^^
+      get_refs_size ^^ compile_mul_const Heap.word_size ^^ Blob.dyn_alloc_scratch env ^^ set_refs_start ^^
+
+      (* Serialize x into the buffer *)
+      get_x ^^
+      get_data_start ^^
+      get_refs_start ^^
+      serialize_go env (Type.seq ts) ^^
+
+      (* Sanity check: Did we fill exactly the buffer *)
+      get_refs_start ^^ get_refs_size ^^ compile_mul_const Heap.word_size ^^ G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+      G.i (Compare (Wasm.Values.I32 I32Op.Eq)) ^^
+      E.else_trap_with env "reference buffer not filled" ^^
+
+      (* Verify that the stream is correctly filled *)
+      Strm.check_filled env get_data_start get_data_size ^^
+      get_refs_size ^^
+      compile_eq_const 0l ^^
+      E.else_trap_with env "cannot send references on IC System API" ^^
+
+      (* Extract the payload if possible *)
+      Strm.terminate env get_data_start get_data_size tydesc_len
+    )
+
+
+  let deserialize_from_blob extended env ts =
+    let ts_name = typ_seq_hash ts in
+    let name =
+      (* TODO(#3185): this specialization on `extended` seems redundant,
+         removing it might simplify things *and* share more code in binaries.
+         The only tricky bit might be the conditional Stack.dynamic_with_words bit... *)
+      if extended
+      then "@deserialize_extended<" ^ ts_name ^ ">"
+      else "@deserialize<" ^ ts_name ^ ">" in
+    Func.share_code2 Func.Always env name (("blob", I32Type), ("can_recover", I32Type)) (List.map (fun _ -> I32Type) ts) (fun env get_blob get_can_recover ->
+      let (set_data_size, get_data_size) = new_local env "data_size" in
+      let (set_refs_size, get_refs_size) = new_local env "refs_size" in
+      let (set_data_start, get_data_start) = new_local env "data_start" in
+      let (set_refs_start, get_refs_start) = new_local env "refs_start" in
+      let (set_arg_count, get_arg_count) = new_local env "arg_count" in
+      let (set_val, get_val) = new_local env "val" in
+
+      get_blob ^^ Blob.len env ^^ set_data_size ^^
+      get_blob ^^ Blob.payload_ptr_unskewed env ^^ set_data_start ^^
+
+      (* Allocate space for the reference buffer and copy it *)
+      compile_unboxed_const 0l ^^ set_refs_size (* none yet *) ^^
+
+      (* Allocate space for out parameters of parse_idl_header *)
+      Stack.with_words env "get_typtbl_size_ptr" 1l (fun get_typtbl_size_ptr ->
+      Stack.with_words env "get_typtbl_ptr" 1l (fun get_typtbl_ptr ->
+      Stack.with_words env "get_maintyps_ptr" 1l (fun get_maintyps_ptr ->
+
+      (* Set up read buffers *)
+      ReadBuf.alloc env (fun get_data_buf -> ReadBuf.alloc env (fun get_ref_buf ->
+
+      ReadBuf.set_ptr get_data_buf get_data_start ^^
+      ReadBuf.set_size get_data_buf get_data_size ^^
+      ReadBuf.set_ptr get_ref_buf get_refs_start ^^
+      ReadBuf.set_size get_ref_buf (get_refs_size ^^ compile_mul_const Heap.word_size) ^^
+
+      (* Go! *)
+      Bool.lit extended ^^ get_data_buf ^^ get_typtbl_ptr ^^ get_typtbl_size_ptr ^^ get_maintyps_ptr ^^
+      E.call_import env "rts" "parse_idl_header" ^^
+
+      (* Allocate memo table, if necessary *)
+      with_rel_buf_opt env extended (get_typtbl_size_ptr ^^ load_unskewed_ptr) (fun get_rel_buf_opt ->
+
+      (* set up a dedicated read buffer for the list of main types *)
+      ReadBuf.alloc env (fun get_main_typs_buf ->
+        ReadBuf.set_ptr get_main_typs_buf (get_maintyps_ptr ^^ load_unskewed_ptr) ^^
+        ReadBuf.set_end get_main_typs_buf (ReadBuf.get_end get_data_buf) ^^
+        ReadBuf.read_leb128 env get_main_typs_buf ^^ set_arg_count ^^
+
+        G.concat_map (fun t ->
+          let can_recover, default_or_trap = Type.(
+            match normalize t with
+            | Opt _ | Any ->
+              (Bool.lit true, fun msg -> Opt.null_lit env)
+            | _ ->
+              (get_can_recover, fun msg ->
+                get_can_recover ^^
+                G.if1 I32Type
+                   (compile_unboxed_const (coercion_error_value env))
+                   (E.trap_with env msg)))
+          in
+          get_arg_count ^^
+          compile_eq_const 0l ^^
+          G.if1 I32Type
+           (default_or_trap ("IDL error: too few arguments " ^ ts_name))
+           (begin
+              begin
+                (* set up invariant register arguments *)
+                get_rel_buf_opt ^^ Registers.set_rel_buf_opt env ^^
+                get_data_buf ^^ Registers.set_data_buf env ^^
+                get_ref_buf ^^ Registers.set_ref_buf env ^^
+                get_typtbl_ptr ^^ load_unskewed_ptr ^^ Registers.set_typtbl env ^^
+                get_maintyps_ptr ^^ load_unskewed_ptr ^^ Registers.set_typtbl_end env ^^
+                get_typtbl_size_ptr ^^ load_unskewed_ptr ^^ Registers.set_typtbl_size env
+              end ^^
+              (* set up variable frame arguments *)
+              Stack.with_frame env "frame_ptr" 3l (fun () ->
+                (* idltyp *)
+                ReadBuf.read_sleb128 env get_main_typs_buf ^^
+                Stack.set_local env StackArgs.idltyp ^^
+                (* depth *)
+                compile_unboxed_const 0l ^^
+                Stack.set_local env StackArgs.depth ^^
+                (* recovery mode *)
+                can_recover ^^
+                Stack.set_local env StackArgs.can_recover ^^
+                deserialize_go env t
+             )
+             ^^ set_val ^^
+             get_arg_count ^^ compile_sub_const 1l ^^ set_arg_count ^^
+             get_val ^^ compile_eq_const (coercion_error_value env) ^^
+             (G.if1 I32Type
+               (default_or_trap "IDL error: coercion failure encountered")
+               get_val)
+            end)
+        ) ts ^^
+
+        (* Skip any extra arguments *)
+        compile_while env
+         (get_arg_count ^^ compile_rel_const I32Op.GtU 0l)
+         begin
+           get_data_buf ^^
+           get_typtbl_ptr ^^ load_unskewed_ptr ^^
+           ReadBuf.read_sleb128 env get_main_typs_buf ^^
+           compile_unboxed_const 0l ^^
+           E.call_import env "rts" "skip_any" ^^
+           get_arg_count ^^ compile_sub_const 1l ^^ set_arg_count
+         end ^^
+
+        ReadBuf.is_empty env get_data_buf ^^
+        E.else_trap_with env ("IDL error: left-over bytes " ^ ts_name) ^^
+        ReadBuf.is_empty env get_ref_buf ^^
+        E.else_trap_with env ("IDL error: left-over references " ^ ts_name)
+      ))))))
+
+    ))
+
+  let deserialize env ts =
+    IC.arg_data env ^^
+    Bool.lit false ^^ (* can't recover *)
+    deserialize_from_blob false env ts
+
+(*
+Note [speculating for short (S)LEB encoded bignums]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+#3098 highlighted that a lot of heap garbage can be generated while reading in
+(S)LEB-encoded bignums. To make heap consumption optimal for every compactly
+representable `Int`, we resort to speculatively reading a 64-byte chunk from
+the `ReadBuf`. We call it speculative, because it may read past the end of the
+buffer (and thus end up containing junk bytes) or even fail because reading
+across Wasm page boundaries could cause trapping. (Consider the buffer ending
+3 bytes before the last-memory-page boundary and issuing a speculative 64-bit read for the
+address 2 bytes less than buffer end.) In case of failure to read data, `-1`
+(a sentinel) is returned. (The sentinel could be use-case specific when later
+the need arises.)
+
+In most cases the speculative read will come back with valid bytes. How many
+of those are relevant, can be judged by consulting the buffer-end pointer or
+analysing the 64-bit word directly. In the case of (S)LEB, the continuation and
+termination bits can be filtered and thus the encoding's last byte detected when
+present in the 64-bit word.
+
+If such a LEB boundary is detected, avenues open up for a much faster (than
+bytewise-sequential) parsing.
+
+After the data is interpreted, it's the client's responsibility to adjust the
+current buffer position.
+
+ *)
+
+(*
+Note [mutable stable values]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We currently use a Candid derivative to serialize stable values. In addition to
+storing sharable data, we can also store mutable data (records with mutable
+fields and mutable arrays), and we need to preserve aliasing.
+
+To that end we extend Candid with a type constructor `alias t`.
+
+In the type table, alias t is represented by type code 1. All Candid type constructors
+are represented by negative numbers, so this cannot clash with anything and,
+conveniently, makes such values illegal Candid.
+
+The values of `alias t` are either
+
+ * i8(0) 0x00000000 0x00000000 M(v)
+   for one (typically the first) occurrence of v
+   The first 0x00000000 is the “memo field”, the second is the “type hash field”.
+   Both are scratch spaces for the benefit of the decoder.
+
+or
+
+ * i8(1) i32(offset) M(v)
+   for all other occurrences of v, where offset is the relative position of the
+   above occurrences from this reference.
+
+We map Motoko types to this as follows:
+
+  e([var t]) = alias e([t]) = alias vec e(t)
+  e({var field : t}) = record { field : alias e(t) }
+
+Why different? Because we need to alias arrays as a whole (we can’t even alias
+their fields, as they are manifestly part of the array heap structure), but
+aliasing records does not work, as aliased record values may appear at
+different types (due to subtyping), and Candid serialization is type-driven.
+Luckily records put all mutable fields behind an indirection (ObjInd), so this
+works.
+
+The type-driven code in this module treats `Type.Mut` to always refer to an
+`ObjInd`; for arrays the mutable case is handled directly.
+
+To detect and preserve aliasing, these steps are taken:
+
+ * In `buffer_size`, when we see a mutable thing (`Array` or `ObjInd`), the
+   first time, we mark it by setting the heap tag to `StableSeen`.
+   This way, when we see it a second time, we can skip the value in the size
+   calculation.
+ * In `serialize`, when we see it a first time (tag still `StableSeen`),
+   we serialize it (first form above), and remember the absolute position
+   in the output buffer, abusing the heap tag here.
+   (Invariant: This absolute position is never `StableSeen`)
+   Upon a second visit (tag not `StableSeen`), we can thus fetch that absolute
+   position and calculate the offset.
+ * In `deserialize`, when we come across a `alias t`, we follow the offset (if
+   needed) to find the content.
+
+   If the memo field is still `0x00000000`, this is the first time we read
+   this, so we deserialize to the Motoko heap, and remember the heap position
+   (vanilla pointer) by overwriting the memo field.
+   We also store the type hash of the type we are serializing at in the type
+   hash field.
+
+   If it is not `0x00000000` then we can simply read the pointer from there,
+   after checking the type hash field to make sure we are aliasing at the same
+   type.
+
+ *)
+
+(*
+Note [Candid subtype checks]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Deserializing Candid values requires a Candid subtype check when
+deserializing values of reference types (actors and functions).
+
+The subtype test is performed directly on the expected and actual
+candid type tables using RTS functions `idl_sub_buf_words`,
+`idl_sub_buf_init` and `idl_sub`.  One type table and vector of types
+is generated statically from the list of statically known types
+encountered during code generation, the other is determined
+dynamically by, e.g. message payload. The latter will vary with
+each payload to decode.
+
+The known Motoko types are accumulated in a global list as required
+and then, in a final compilation step, encoded to global type table
+and sequence of type indices. The encoding is stored as static
+data referenced by dedicated wasm globals so that we can generate
+code that references the globals before their final definitions are
+known.
+
+Deserializing a proper (not extended) Candid value stack allocates a
+mutable word buffer, of size determined by `idl_sub_buf_words`.
+The word buffer is used to initialize and provide storage for a
+Rust memo table (see bitrel.rs) memoizing the result of sub and
+super type tests performed during deserialization of a given Candid
+value sequence.  The memo table is initialized once, using `idl_sub_buf_init`,
+then shared between recursive calls to deserialize, by threading the (possibly
+null) wasm address of the word buffer as an optional argument.  The
+word buffer is stack allocated in generated code, not Rust, because
+it's size is dynamic and Rust doesn't seem to support dynamically-sized
+stack allocation.
+
+Currently, we only perform Candid subtype checks when decoding proper
+(not extended) Candid values. Extended values are required for
+stable variables only: we can omit the check, because compatibility
+should already be enforced by the static signature compatibility
+check.  We use the `null`-ness of the word buffer pointer to
+dynamically determine whether to omit or perform Candid subtype checks.
+
+NB: Extending `idl_sub` to support extended, "stable" types (with mutable,
+invariant type constructors) would require extending the polarity argument
+from a Boolean to a three-valued argument to efficiently check equality for
+invariant type constructors in a single pass.
+*)
+
+end (* MakeSerialization *)
+
+module Serialization = MakeSerialization(BumpStream)
+
+module BlobStream : Stream = struct
+  let create env get_data_size set_token get_token header =
+    let header_size = Int32.of_int (String.length header) in
+    get_data_size ^^ compile_add_const header_size ^^
+    E.call_import env "rts" "alloc_stream" ^^ set_token ^^ (* allocation barrier called in alloc_stream *)
+    get_token ^^
+    Blob.lit env header ^^
+    E.call_import env "rts" "stream_write_text"
+
+  let check_filled env get_token get_data_size =
+    G.i Drop
+
+  let terminate env get_token _get_data_size _header_size =
+    get_token ^^ E.call_import env "rts" "stream_split" ^^
+    let set_blob, get_blob = new_local env "blob" in
+    set_blob ^^
+    get_blob ^^ Blob.payload_ptr_unskewed env ^^
+    get_blob ^^ Blob.len env
+
+  let finalize_buffer code = code
+
+  let name_for fn_name ts = "@Bl_" ^ fn_name ^ "<" ^ Typ_hash.typ_seq_hash ts ^ ">"
+
+  let absolute_offset env get_token =
+    let offset = 8l in (* see invariant in `stream.rs` *)
+    let filled_field = Int32.add (Blob.len_field env) offset in
+    get_token ^^ Tagged.load_field_unskewed env filled_field
+
+  let checkpoint _env _get_token = G.i Drop
+
+  let reserve env get_token bytes =
+    get_token ^^ compile_unboxed_const bytes ^^ E.call_import env "rts" "stream_reserve"
+
+  let write_word_leb env get_token code =
+    let set_word, get_word = new_local env "word" in
+    code ^^ set_word ^^
+    I32Leb.compile_store_to_data_buf_unsigned env get_word
+      (get_token ^^ I32Leb.compile_leb128_size get_word ^^ E.call_import env "rts" "stream_reserve") ^^
+    G.i Drop
+
+  let write_word_32 env get_token code =
+    reserve env get_token Heap.word_size ^^
+    code ^^
+    G.i (Store {ty = I32Type; align = 0; offset = 0l; sz = None})
+
+  let write_byte env get_token code =
+    get_token ^^ code ^^
+    E.call_import env "rts" "stream_write_byte"
+
+  let write_blob env get_token get_x =
+    let set_len, get_len = new_local env "len" in
+    get_x ^^ Blob.len env ^^ set_len ^^
+    write_word_leb env get_token get_len ^^
+    get_token ^^
+    get_x ^^ Blob.payload_ptr_unskewed env ^^
+    get_len ^^
+    E.call_import env "rts" "stream_write"
+
+  let write_text env get_token get_x =
+    write_word_leb env get_token (get_x ^^ Text.size env) ^^
+    get_token ^^ get_x ^^
+    E.call_import env "rts" "stream_write_text"
+
+  let write_bignum_leb env get_token get_x =
+    get_token ^^ get_x ^^
+    BigNum.compile_store_to_stream_unsigned env
+
+  let write_bignum_sleb env get_token get_x =
+    get_token ^^ get_x ^^
+    BigNum.compile_store_to_stream_signed env
+
+end
+
+
+(* Stabilization (serialization to/from stable memory) of both:
+   * stable variables; and
+   * virtual stable memory.
+   c.f.
+   * ../../design/Stable.md
+   * ../../design/StableMemory.md
+*)
+
+module Stabilization = struct
+
+  let extend64 code = code ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+
+  (* The below stream implementation is geared towards the
+     tail section of stable memory, where the serialised
+     stable variables go. As such a few intimate details of
+     the stable memory layout are burnt in, such as the
+     variable `N` from the design document. *)
+  module StableMemoryStream : Stream = struct
+    include BlobStream
+
+    let name_for fn_name ts = "@Sm_" ^ fn_name ^ "<" ^ Typ_hash.typ_seq_hash ts ^ ">"
+
+    let create env get_data_size set_token get_token header =
+      create env (compile_unboxed_const 0x8000l) set_token get_token header ^^
+        (* TODO: push header directly? *)
+
+      let (set_len, get_len) = new_local env "len" in
+      get_data_size ^^
+      compile_add_const (Int32.of_int (String.length header)) ^^
+      set_len ^^
+
+      let (set_dst, get_dst) = new_local64 env "dst" in
+      StableMem.get_mem_size env ^^
+      compile_shl64_const (Int64.of_int page_size_bits) ^^
+      compile_add64_const 4L ^^ (* `N` is now on the stack *)
+      set_dst ^^
+
+      get_dst ^^
+      extend64 get_len ^^
+      StableMem.ensure env ^^
+
+      get_token ^^
+      get_dst ^^
+      get_dst ^^ extend64 get_len ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+      E.call_import env "rts" "stream_stable_dest"
+
+    let ptr64_field env =
+      let offset = 1l in (* see invariant in `stream.rs` *)
+      Int32.add (Blob.len_field env) offset (* see invariant in `stream.rs`, padding for 64-bit after Stream header *)
+
+    let terminate env get_token get_data_size header_size =
+      get_token ^^
+      E.call_import env "rts" "stream_shutdown" ^^
+      compile_unboxed_zero ^^ (* no need to write *)
+      get_token ^^
+      Tagged.load_field64_unskewed env (ptr64_field env) ^^
+      StableMem.get_mem_size env ^^
+      compile_shl64_const (Int64.of_int page_size_bits) ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+      compile_sub64_const 4L ^^  (* `N` is now subtracted *)
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+
+    let finalize_buffer _ = G.nop (* everything is outputted already *)
+
+    (* Returns a 32-bit unsigned int that is the number of bytes that would
+       have been written to stable memory if flushed. The difference
+       of two such numbers will always be an exact byte distance. *)
+    let absolute_offset env get_token =
+      let start64_field = Int32.add (ptr64_field env) 2l in (* see invariant in `stream.rs` *)
+      absolute_offset env get_token ^^
+      get_token ^^
+      Tagged.load_field64_unskewed env (ptr64_field env) ^^
+      get_token ^^
+      Tagged.load_field64_unskewed env start64_field ^^
+      G.i (Binary (Wasm.Values.I64 I64Op.Sub)) ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Add))
+  end
+
+  module Externalization = MakeSerialization(StableMemoryStream)
+
+  let stabilize env t =
+    let (set_dst, get_dst) = new_local env "dst" in
+    let (set_len, get_len) = new_local env "len" in
+
+    (if !Flags.gc_strategy = Flags.Incremental then
+      E.call_import env "rts" "stop_gc_on_upgrade"
+    else
+      G.nop) ^^
+
+
+    Externalization.serialize env [t] ^^
+    set_len ^^
+    set_dst ^^
+
+    StableMem.get_mem_size env ^^
+    G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+    G.if0
+      begin
+        (* assert StableMem.get_version() == StableMem.version_no_stable_memory *)
+        StableMem.get_version env ^^
+        compile_eq_const StableMem.version_no_stable_memory ^^
+        E.else_trap_with env "StableMem.get_version() != version_no_stable_memory" ^^
+
+        (* Case-true: Stable variables only --
+           no use of either regions or experimental API. *)
+        (* ensure [0,..,3,...len+4) *)
+        compile_const_64 0L ^^
+        extend64 get_len ^^
+        compile_add64_const 4L ^^  (* reserve one word for size *)
+        StableMem.ensure env ^^
+
+        (* write len to initial word of stable memory*)
+        compile_const_64 0L ^^
+        get_len ^^
+        StableMem.write_word32 env ^^
+
+        (* copy data to following stable memory *)
+        Externalization.Strm.finalize_buffer
+          begin
+            compile_const_64 4L ^^
+            extend64 get_dst ^^
+            extend64 get_len ^^
+            StableMem.stable64_write env
+          end
+      end
+      begin
+        (* Case-false: Either regions or experimental API. *)
+        let (set_N, get_N) = new_local64 env "N" in
+
+        (* let N = !size * page_size *)
+        StableMem.get_mem_size env ^^
+        compile_shl64_const (Int64.of_int page_size_bits) ^^
+        set_N ^^
+
+        (* grow mem to page including address
+           N + 4 + len + 4 + 4 + 4 = N + len + 16
+        *)
+        get_N ^^
+        extend64 get_len ^^
+        compile_add64_const 16L ^^
+        StableMem.ensure env ^^
+
+        get_N ^^
+        get_len ^^
+        StableMem.write_word32 env ^^
+
+        (* copy data to following stable memory *)
+        Externalization.Strm.finalize_buffer
+          begin
+            get_N ^^
+            compile_add64_const 4L ^^
+            extend64 get_dst ^^
+            extend64 get_len ^^
+            StableMem.stable64_write env
+          end ^^
+
+        (* let M = pagesize * ic0.stable64_size() - 1 *)
+        (* M is beginning of last page *)
+        let (set_M, get_M) = new_local64 env "M" in
+        StableMem.stable64_size env ^^
+        compile_sub64_const 1L ^^
+        compile_shl64_const (Int64.of_int page_size_bits) ^^
+        set_M ^^
+
+        (* store mem_size at M + (pagesize - 12) *)
+        get_M ^^
+        compile_add64_const (Int64.sub page_size64 12L) ^^
+        StableMem.get_mem_size env ^^
+        G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+        (* TODO: write word64 *)
+        StableMem.write_word32 env ^^
+
+        (* save first word at M + (pagesize - 8);
+           mark first word as 0 *)
+        get_M ^^
+        compile_add64_const (Int64.sub page_size64 8L) ^^
+        compile_const_64 0L ^^
+        StableMem.read_and_clear_word32 env ^^
+        StableMem.write_word32 env ^^
+
+        (* save version at M + (pagesize - 4) *)
+        get_M ^^
+        compile_add64_const (Int64.sub page_size64 4L) ^^
+
+        (* assert StableMem.get_version() > StableMem.version_no_stable_memory *)
+        StableMem.get_version env ^^
+        compile_rel_const I32Op.GtU StableMem.version_no_stable_memory ^^
+        E.else_trap_with env "StableMem.get_version() == version_no_stable_memory" ^^
+
+        (* assert StableMem.get_version() <= StableMem.version_max *)
+        StableMem.get_version env ^^
+        compile_rel_const I32Op.LeU StableMem.version_max ^^
+        E.else_trap_with env "StableMem.get_version() > version_max" ^^
+
+        (* record the version *)
+        StableMem.get_version env ^^
+        StableMem.write_word32 env
+
+      end
+
+  let destabilize env ty save_version =
+    match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      let (set_pages, get_pages) = new_local64 env "pages" in
+      StableMem.stable64_size env ^^
+      set_pages ^^
+
+      get_pages ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      G.if1 I32Type
+        begin
+          (* Case: Size zero ==> Nothing in stable memory,
+             so result becomes the nil-valued record. *)
+          let (_, fs) = Type.as_obj ty in
+          let fs' = List.map
+           (fun f -> (f.Type.lab, fun () -> Opt.null_lit env))
+           fs
+          in
+          StableMem.get_mem_size env ^^
+          G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+          E.else_trap_with env "StableMem.mem_size non-zero" ^^
+          compile_unboxed_const 0l ^^
+          StableMem.set_version env ^^
+          Object.lit_raw env fs'
+        end
+        begin
+          (* Case: Non-zero size. *)
+          let (set_marker, get_marker) = new_local env "marker" in
+          let (set_len, get_len) = new_local env "len" in
+          let (set_offset, get_offset) = new_local64 env "offset" in
+          compile_const_64 0L ^^
+          StableMem.read_and_clear_word32 env ^^
+          set_marker ^^
+
+          get_marker ^^
+          G.i (Test (Wasm.Values.I32 I32Op.Eqz)) ^^
+          G.if0
+            begin
+              (* Sub-Case: version 1 or 2:
+                 Regions/Experimental API and stable vars. *)
+              let (set_M, get_M) = new_local64 env "M" in
+              let (set_version, get_version) = new_local env "version" in
+              let (set_N, get_N) = new_local64 env "N" in
+
+              StableMem.stable64_size env ^^
+              compile_sub64_const 1L ^^
+              compile_shl64_const (Int64.of_int page_size_bits) ^^
+              set_M ^^
+
+              (* read version *)
+              get_M ^^
+              compile_add64_const (Int64.sub page_size64 4L) ^^
+              StableMem.read_and_clear_word32 env ^^
+              set_version ^^
+              get_version ^^
+              save_version ^^
+
+              (* check version *)
+              get_version ^^
+              compile_unboxed_const (StableMem.version_max) ^^
+              G.i (Compare (Wasm.Values.I32 I32Op.GtU)) ^^
+              E.then_trap_with env (Printf.sprintf
+                "higher stable memory version (expected 1..%s)"
+                (Int32.to_string StableMem.version_max)) ^^
+
+              (* restore StableMem bytes [0..4) *)
+              compile_const_64 0L ^^
+              get_M ^^
+              compile_add64_const (Int64.sub page_size64 8L) ^^
+              StableMem.read_and_clear_word32 env ^^
+              StableMem.write_word32 env ^^
+
+              (* restore mem_size *)
+              get_M ^^
+              compile_add64_const (Int64.sub page_size64 12L) ^^
+              extend64 (StableMem.read_and_clear_word32 env) ^^ (*TODO: use 64 bits *)
+              StableMem.set_mem_size env ^^
+
+              StableMem.get_mem_size env ^^
+              compile_shl64_const (Int64.of_int page_size_bits) ^^
+              set_N ^^
+
+              (* set len *)
+              get_N ^^
+              StableMem.read_and_clear_word32 env ^^
+              set_len ^^
+
+              (* set offset *)
+              get_N ^^
+              compile_add64_const 4L ^^
+              set_offset
+            end
+            begin
+              (* Sub-Case: Version 0.
+                 Stable vars with NO Regions/Experimental API. *)
+              (* assert mem_size == 0 *)
+              StableMem.get_mem_size env ^^
+              G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+              E.else_trap_with env "unexpected, non-zero stable memory size" ^^
+
+              (* set len *)
+              get_marker ^^
+              set_len ^^
+
+              (* set offset *)
+              compile_const_64 4L ^^
+              set_offset ^^
+
+              compile_unboxed_const (Int32.of_int 0) ^^
+              save_version
+            end ^^ (* if_ *)
+
+          let (set_blob, get_blob) = new_local env "blob" in
+          (* read blob from stable memory *)
+          get_len ^^ Blob.alloc env ^^ set_blob ^^
+          extend64 (get_blob ^^ Blob.payload_ptr_unskewed env) ^^
+          get_offset ^^
+          extend64 get_len ^^
+          StableMem.stable64_read env ^^
+
+          let (set_val, get_val) = new_local env "val" in
+          (* deserialize blob to val *)
+          get_blob ^^
+          Bool.lit false ^^ (* can't recover *)
+          Serialization.deserialize_from_blob true env [ty] ^^
+          set_val ^^
+
+          (* clear blob contents *)
+          get_blob ^^
+          Blob.clear env ^^
+
+          (* copy zeros from blob to stable memory *)
+          get_offset ^^
+          extend64 (get_blob ^^ Blob.payload_ptr_unskewed env) ^^
+          extend64 (get_blob ^^ Blob.len env) ^^
+          StableMem.stable64_write env ^^
+
+          (* return val *)
+          get_val
+        end
+    | _ -> assert false
+end
+
+module GCRoots = struct
+  let register env static_roots =
+
+    let get_static_roots = E.add_fun env "get_static_roots" (Func.of_body env [] [I32Type] (fun env ->
+      compile_unboxed_const static_roots
+    )) in
+
+    E.add_export env (nr {
+      name = Lib.Utf8.decode "get_static_roots";
+      edesc = nr (FuncExport (nr get_static_roots))
+    })
+
+  let store_static_roots env =
+    Arr.vanilla_lit env (E.get_static_roots env)
+
+end (* GCRoots *)
+
+module StackRep = struct
+  open SR
+
+  (*
+     Most expressions have a “preferred”, most optimal, form. Hence,
+     compile_exp put them on the stack in that form, and also returns
+     the form it chose.
+
+     But the users of compile_exp usually want a specific form as well.
+     So they use compile_exp_as, indicating the form they expect.
+     compile_exp_as then does the necessary coercions.
+   *)
+
+  let of_arity n =
+    if n = 1 then Vanilla else UnboxedTuple n
+
+  (* The stack rel of a primitive type, i.e. what the binary operators expect *)
+  let of_type t =
+    let open Type in
+    match normalize t with
+    | Prim Bool -> SR.bool
+    | Prim (Nat | Int) -> Vanilla
+    | Prim ((Nat64 | Int64) as pty) -> UnboxedWord64 pty
+    | Prim ((Nat32 | Int32) as pty) -> UnboxedWord32 pty
+    | Prim ((Nat8 | Nat16 | Int8 | Int16 | Char) as pty) -> UnboxedWord32 pty
+    | Prim (Text | Blob | Principal) -> Vanilla
+    | Prim Float -> UnboxedFloat64
+    | Obj (Actor, _) -> Vanilla
+    | Func (Shared _, _, _, _, _) -> Vanilla
+    | p -> todo "StackRep.of_type" (Arrange_ir.typ p) Vanilla
+
+  (* The env looks unused, but will be needed once we can use multi-value, to register
+     the complex types in the environment.
+     For now, multi-value block returns are handled via FakeMultiVal. *)
+  let to_block_type env = function
+    | Vanilla -> [I32Type]
+    | UnboxedWord64 _ -> [I64Type]
+    | UnboxedWord32 _ -> [I32Type]
+    | UnboxedFloat64 -> [F64Type]
+    | UnboxedTuple n -> Lib.List.make n I32Type
+    | Const _ -> []
+    | Unreachable -> []
+
+  let to_string = function
+    | Vanilla -> "Vanilla"
+    | UnboxedWord64 pty -> prim_fun_name pty "UnboxedWord64"
+    | UnboxedWord32 pty -> prim_fun_name pty "UnboxedWord32"
+    | UnboxedFloat64 -> "UnboxedFloat64"
+    | UnboxedTuple n -> Printf.sprintf "UnboxedTuple %d" n
+    | Unreachable -> "Unreachable"
+    | Const _ -> "Const"
+
+  let join (sr1 : t) (sr2 : t) = match sr1, sr2 with
+    | _, _ when SR.eq sr1 sr2 -> sr1
+    | Unreachable, sr2 -> sr2
+    | sr1, Unreachable -> sr1
+
+    | Const _, Const _ -> Vanilla
+    | Const _, sr2_ -> sr2
+    | sr1, Const _ -> sr1
+
+    | _, Vanilla -> Vanilla
+    | Vanilla, _ -> Vanilla
+
+    | UnboxedTuple n, UnboxedTuple m when n = m -> sr1
+
+    | _, _ ->
+      Printf.eprintf "Invalid stack rep join (%s, %s)\n"
+        (to_string sr1) (to_string sr2); sr1
+
+  let joins = List.fold_left join Unreachable
+
+  let drop env (sr_in : t) =
+    match sr_in with
+    | Vanilla | UnboxedWord64 _ | UnboxedWord32 _ | UnboxedFloat64 -> G.i Drop
+    | UnboxedTuple n -> G.table n (fun _ -> G.i Drop)
+    | Const _ | Unreachable -> G.nop
+
+  (* Materializes a Const.lit: If necessary, puts
+     bytes into static memory, and returns a vanilla value.
+  *)
+  let materialize_lit env (lit : Const.lit) : int32 =
+    match lit with
+    | Const.Vanilla n  -> n
+    | Const.Bool n     -> Bool.vanilla_lit n
+    | Const.BigInt n   -> BigNum.vanilla_lit env n
+    | Const.Word32 (pty, n) -> BoxedSmallWord.vanilla_lit env pty n
+    | Const.Word64 (pty, n) -> BoxedWord64.vanilla_lit env pty n
+    | Const.Float64 f  -> Float.vanilla_lit env f
+    | Const.Blob t     -> Blob.vanilla_lit env t
+    | Const.Null       -> Opt.null_vanilla_lit env
+
+  let rec materialize_const_t env (p, cv) : int32 =
+    Lib.Promise.lazy_value p (fun () -> materialize_const_v env cv)
+
+  and materialize_const_v env = function
+    | Const.Fun (get_fi, _) -> Closure.static_closure env (get_fi ())
+    | Const.Message fi -> assert false
+    | Const.Obj fs ->
+      let fs' = List.map (fun (n, c) -> (n, materialize_const_t env c)) fs in
+      Object.vanilla_lit env fs'
+    | Const.Unit -> Tuple.unit_vanilla_lit env
+    | Const.Array cs ->
+      let ptrs = List.map (materialize_const_t env) cs in
+      Arr.vanilla_lit env ptrs
+    | Const.Tag (i, c) ->
+      let ptr = materialize_const_t env c in
+      Variant.vanilla_lit env i ptr
+    | Const.Lit l -> materialize_lit env l
+    | Const.Opt c ->
+      let rec kernel = Const.(function
+        | (_, Lit Null) -> None
+        | (_, Opt c) -> kernel c
+        | (_, other) -> Some (materialize_const_v env other)) in
+      match kernel c with
+      | Some ptr -> ptr
+      | None -> Opt.vanilla_lit env (materialize_const_t env c)
+
+  let adjust env (sr_in : t) sr_out =
+    if eq sr_in sr_out
+    then G.nop
+    else match sr_in, sr_out with
+    | Unreachable, Unreachable -> G.nop
+    | Unreachable, _ -> G.i Unreachable
+
+    | UnboxedTuple n, Vanilla -> Tuple.from_stack env n
+    | Vanilla, UnboxedTuple n -> Tuple.to_stack env n
+
+    (* BoxedWord64 types *)
+    | UnboxedWord64 pty, Vanilla ->
+       assert Type.(pty = Nat64 || pty = Int64);
+       BoxedWord64.box env pty
+    | Vanilla, UnboxedWord64 pty ->
+       assert Type.(pty = Nat64 || pty = Int64);
+       BoxedWord64.unbox env pty
+
+    (* TaggedSmallWord types *)
+    | UnboxedWord32 (Type.(Int8 | Nat8 | Int16 | Nat16 | Char) as pty), Vanilla ->
+       TaggedSmallWord.tag env pty
+    | Vanilla, UnboxedWord32 (Type.(Nat8 | Int8 | Nat16 | Int16 | Char) as pty) ->
+       TaggedSmallWord.untag env pty
+
+    (* BoxedSmallWord types *)
+    | UnboxedWord32 pty, Vanilla ->
+       assert Type.(pty = Nat32 || pty = Int32);
+       BoxedSmallWord.box env pty
+    | Vanilla, UnboxedWord32 ((Type.Nat32 | Type.Int32) as pty) ->
+       assert Type.(pty = Nat32 || pty = Int32);
+       BoxedSmallWord.unbox env pty
+
+    | UnboxedFloat64, Vanilla -> Float.box env
+    | Vanilla, UnboxedFloat64 -> Float.unbox env
+
+    | Const (_, Const.Lit (Const.Bool b)), Vanilla -> Bool.lit b
+    | Const c, Vanilla -> compile_unboxed_const (materialize_const_t env c)
+    | Const (_, Const.Lit (Const.Vanilla n)), UnboxedWord32 ty ->
+       compile_unboxed_const n ^^
+       TaggedSmallWord.untag env ty
+    | Const (_, Const.Lit (Const.Word32 (ty1, n))), UnboxedWord32 ty2 when ty1 = ty2 ->
+       compile_unboxed_const n
+    | Const (_, Const.Lit (Const.Word64 (ty1, n))), UnboxedWord64 ty2 when ty1 = ty2 ->
+       compile_const_64 n
+    | Const (_, Const.Lit (Const.Float64 f)), UnboxedFloat64 -> Float.compile_unboxed_const f
+    | Const c, UnboxedTuple 0 -> G.nop
+    | Const (_, Const.Array cs), UnboxedTuple n ->
+      assert (n = List.length cs);
+      G.concat_map (fun c -> compile_unboxed_const (materialize_const_t env c)) cs
+    | _, _ ->
+      Printf.eprintf "Unknown stack_rep conversion %s -> %s\n"
+        (to_string sr_in) (to_string sr_out);
+      assert false
+
+end (* StackRep *)
+
+module VarEnv = struct
+
+  (* A type to record where Motoko names are stored. *)
+  type varloc =
+    (* A Wasm Local of the current function, directly containing the value,
+       in the given stackrep (Vanilla, UnboxedWord32, …) so far
+       Used for immutable and mutable, non-captured data *)
+    | Local of SR.t * int32
+    (* A Wasm Local of the current function, that points to memory location,
+       which is a MutBox.  Used for mutable captured data *)
+    | HeapInd of int32
+    (* A static mutable memory location (static address of a MutBox object) *)
+    (* TODO: Do we need static immutable? *)
+    | HeapStatic of int32
+    (* Not materialized (yet), statically known constant, static location on demand *)
+    | Const of Const.t
+    (* public method *)
+    | PublicMethod of int32 * string
+
+  let is_non_local : varloc -> bool = function
+    | Local _
+    | HeapInd _ -> false
+    | HeapStatic _
+    | PublicMethod _
+    | Const _ -> true
+
+  type lvl = TopLvl | NotTopLvl
+
+  (*
+  The source variable environment:
+   - Whether we are on the top level
+   - In-scope variables
+   - scope jump labels
+  *)
+
+
+  module NameEnv = Env.Make(String)
+  type t = {
+    lvl : lvl;
+    vars : (varloc * Type.typ) NameEnv.t; (* variables ↦ their location and type *)
+    labels : G.depth NameEnv.t; (* jump label ↦ their depth *)
+  }
+
+  let empty_ae = {
+    lvl = TopLvl;
+    vars = NameEnv.empty;
+    labels = NameEnv.empty;
+  }
+
+  (* Creating a local environment, resetting the local fields,
+     and removing bindings for local variables (unless they are at global locations)
+  *)
+
+  let mk_fun_ae ae = { ae with
+    lvl = NotTopLvl;
+    vars = NameEnv.filter (fun v (l, _) ->
+      let non_local = is_non_local l in
+      (* For debugging, enable this:
+      (if not non_local then Printf.eprintf "VarEnv.mk_fun_ae: Removing %s\n" v);
+      *)
+      non_local
+    ) ae.vars;
+  }
+  let lookup ae var =
+    match NameEnv.find_opt var ae.vars with
+      | Some e -> Some e
+      | None   -> Printf.eprintf "Could not find %s\n" var; None
+
+  let lookup_var ae var =
+    match lookup ae var with
+      | Some (l, _) -> Some l
+      | None -> None
+
+  let needs_capture ae var = match lookup_var ae var with
+    | Some l -> not (is_non_local l)
+    | None -> assert false
+
+  let add_local_with_heap_ind env (ae : t) name typ =
+      let i = E.add_anon_local env I32Type in
+      E.add_local_name env i name;
+      ({ ae with vars = NameEnv.add name ((HeapInd i), typ) ae.vars }, i)
+
+  let add_local_heap_static (ae : t) name ptr typ =
+      { ae with vars = NameEnv.add name ((HeapStatic ptr), typ) ae.vars }
+
+  let add_local_public_method (ae : t) name (fi, exported_name) typ =
+      { ae with vars = NameEnv.add name ((PublicMethod (fi, exported_name) : varloc), typ) ae.vars }
+
+  let add_local_const (ae : t) name cv typ =
+      { ae with vars = NameEnv.add name ((Const cv : varloc), typ) ae.vars }
+
+  let add_local_local env (ae : t) name sr i typ =
+      { ae with vars = NameEnv.add name ((Local (sr, i)), typ) ae.vars }
+
+  let add_direct_local env (ae : t) name sr typ =
+      let i = E.add_anon_local env (SR.to_var_type sr) in
+      E.add_local_name env i name;
+      (add_local_local env ae name sr i typ, i)
+
+  (* Adds the names to the environment and returns a list of setters *)
+  let rec add_arguments env (ae : t) as_local = function
+    | [] -> ae
+    | ((name, typ) :: remainder) ->
+      if as_local name then
+        let i = E.add_anon_local env I32Type in
+        E.add_local_name env i name;
+        let ae' = { ae with vars = NameEnv.add name ((Local (SR.Vanilla, i)), typ) ae.vars } in
+        add_arguments env ae' as_local remainder
+      else (* needs to go to static memory *)
+        let ptr = MutBox.static env in
+        let ae' = add_local_heap_static ae name ptr typ in
+        add_arguments env ae' as_local remainder
+
+  let add_argument_locals env (ae : t) =
+    add_arguments env ae (fun _ -> true)
+
+  let add_label (ae : t) name (d : G.depth) =
+      { ae with labels = NameEnv.add name d ae.labels }
+
+  let get_label_depth (ae : t) name : G.depth  =
+    match NameEnv.find_opt name ae.labels with
+      | Some d -> d
+      | None   -> raise (CodegenError (Printf.sprintf "Could not find %s\n" name))
+
+end (* VarEnv *)
+
+(* type for wrapping code with context, context is establishment
+   of (pattern) binding, argument is the code using the binding,
+   result is e.g. the code for `case p e`. *)
+type scope_wrap = G.t -> G.t
+
+let unmodified : scope_wrap = fun code -> code
+
+let rec can_be_pointer typ nested_optional =
+  Type.(match normalize typ with
+  | Mut t -> (can_be_pointer t nested_optional)
+  | Opt t -> (if nested_optional then true else (can_be_pointer t true))
+  | Prim (Null| Bool | Char | Nat8 | Nat16 | Int8 | Int16) | Non | Tup [] -> false
+  | _ -> true)
+
+let potential_pointer typ : bool =
+  (* must not eliminate nested optional types as they refer to a heap object for ??null, ???null etc. *)
+  can_be_pointer typ false
+
+module Var = struct
+  (* This module is all about looking up Motoko variables in the environment,
+     and dealing with mutable variables *)
+
+  open VarEnv
+
+  (* Returns desired stack representation, preparation code and code to consume
+     the value onto the stack *)
+  let set_val env ae var : G.t * SR.t * G.t = match (VarEnv.lookup ae var, !Flags.gc_strategy) with
+    | (Some ((Local (sr, i)), _), _) ->
+      G.nop,
+      sr,
+      G.i (LocalSet (nr i))
+    | (Some ((HeapInd i), typ), Flags.Generational) when potential_pointer typ ->
+      G.i (LocalGet (nr i)),
+      SR.Vanilla,
+      MutBox.store_field env ^^
+      G.i (LocalGet (nr i)) ^^
+      Tagged.load_forwarding_pointer env ^^ (* not needed for this GC, but only for forward pointer sanity checks *)
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size) ^^
+      E.call_import env "rts" "post_write_barrier"
+    | (Some ((HeapInd i), typ), Flags.Incremental) when potential_pointer typ ->
+      G.i (LocalGet (nr i)) ^^
+      Tagged.load_forwarding_pointer env ^^
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size),
+      SR.Vanilla,
+      Tagged.write_with_barrier env
+    | (Some ((HeapInd i), typ), _) ->
+      G.i (LocalGet (nr i)),
+      SR.Vanilla,
+      MutBox.store_field env
+    | (Some ((HeapStatic ptr), typ), Flags.Generational) when potential_pointer typ ->
+      compile_unboxed_const ptr,
+      SR.Vanilla,
+      MutBox.store_field env ^^
+      compile_unboxed_const ptr ^^
+      Tagged.load_forwarding_pointer env ^^ (* not needed for this GC, but only for forward pointer sanity checks *)
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size) ^^
+      E.call_import env "rts" "post_write_barrier"
+    | (Some ((HeapStatic ptr), typ), Flags.Incremental) when potential_pointer typ ->
+      compile_unboxed_const ptr ^^
+      Tagged.load_forwarding_pointer env ^^
+      compile_add_const ptr_unskew ^^
+      compile_add_const (Int32.mul (MutBox.field env) Heap.word_size),
+      SR.Vanilla,
+      Tagged.write_with_barrier env
+    | (Some ((HeapStatic ptr), typ), _) ->
+      compile_unboxed_const ptr,
+      SR.Vanilla,
+      MutBox.store_field env
+    | (Some ((Const _), _), _) -> fatal "set_val: %s is const" var
+    | (Some ((PublicMethod _), _), _) -> fatal "set_val: %s is PublicMethod" var
+    | (None, _)   -> fatal "set_val: %s missing" var
+
+  (* Stores the payload. Returns stack preparation code, and code that consumes the values from the stack *)
+  let set_val_vanilla env ae var : G.t * G.t =
+    let pre_code, sr, code = set_val env ae var in
+    pre_code, StackRep.adjust env SR.Vanilla sr ^^ code
+
+  (* Stores the payload (which is found on the stack, in Vanilla stackrep) *)
+  let set_val_vanilla_from_stack env ae var : G.t =
+    let pre_code, code = set_val_vanilla env ae var in
+    if G.is_nop pre_code
+    then code
+    else
+      (* Need to shuffle the stack entries *)
+      let (set_x, get_x) = new_local env "var_scrut" in
+      set_x ^^
+      pre_code ^^
+      get_x ^^
+      code
+
+  (* Returns the payload (optimized representation) *)
+  let get_val (env : E.t) (ae : VarEnv.t) var = match VarEnv.lookup_var ae var with
+    | Some (Local (sr, i)) ->
+      sr, G.i (LocalGet (nr i))
+    | Some (HeapInd i) ->
+      SR.Vanilla, G.i (LocalGet (nr i)) ^^ MutBox.load_field env
+    | Some (HeapStatic i) ->
+      SR.Vanilla, compile_unboxed_const i ^^ MutBox.load_field env
+    | Some (Const c) ->
+      SR.Const c, G.nop
+    | Some (PublicMethod (_, name)) ->
+      SR.Vanilla,
+      IC.get_self_reference env ^^
+      IC.actor_public_field env name
+    | None -> assert false
+
+  (* Returns the payload (vanilla representation) *)
+  let get_val_vanilla (env : E.t) (ae : VarEnv.t) var =
+    let sr, code = get_val env ae var in
+    code ^^ StackRep.adjust env sr SR.Vanilla
+
+  (* Returns the value to put in the closure,
+     and code to restore it, including adding to the environment
+  *)
+  let capture old_env ae0 var : G.t * (E.t -> VarEnv.t -> VarEnv.t * scope_wrap) =
+    match VarEnv.lookup ae0 var with
+    | Some ((Local (sr, i)), typ) ->
+      ( G.i (LocalGet (nr i)) ^^ StackRep.adjust old_env sr SR.Vanilla
+      , fun new_env ae1 ->
+        (* we use SR.Vanilla in the restored environment. We could use sr;
+           like for parameters hard to predict what’s better *)
+        let ae2, j = VarEnv.add_direct_local new_env ae1 var SR.Vanilla typ in
+        let restore_code = G.i (LocalSet (nr j))
+        in ae2, fun body -> restore_code ^^ body
+      )
+    | Some ((HeapInd i), typ) ->
+      ( G.i (LocalGet (nr i))
+      , fun new_env ae1 ->
+        let ae2, j = VarEnv.add_local_with_heap_ind new_env ae1 var typ in
+        let restore_code = G.i (LocalSet (nr j))
+        in ae2, fun body -> restore_code ^^ body
+      )
+    | _ -> assert false
+
+  (* This is used when putting a mutable field into an object.
+     In the IR, mutable fields of objects are pre-allocated as MutBox objects,
+     to allow the async/await.
+     So we expect the variable to be in a HeapInd (pointer to MutBox on the heap),
+     or HeapStatic (statically known MutBox in the static memory) and we use
+     the pointer.
+  *)
+  let get_aliased_box env ae var = match VarEnv.lookup_var ae var with
+    | Some (HeapInd i) -> G.i (LocalGet (nr i))
+    | Some (HeapStatic i) -> compile_unboxed_const i
+    | _ -> assert false
+
+  let capture_aliased_box env ae var = match VarEnv.lookup_var ae var with
+    | Some (HeapInd i) ->
+      G.i (LocalSet (nr i))
+    | _ -> assert false
+
+end (* Var *)
+
+(* Calling well-known prelude functions *)
+(* FIXME: calling into the prelude will not work if we ever need to compile a program
+   that requires top-level cps conversion;
+   use new prims instead *)
+module Internals = struct
+  let call_prelude_function env ae var =
+    match VarEnv.lookup_var ae var with
+    | Some (VarEnv.Const (_, Const.Fun (mk_fi, _))) ->
+       compile_unboxed_zero ^^ (* A dummy closure *)
+       G.i (Call (nr (mk_fi ())))
+    | _ -> assert false
+
+  let add_cycles env ae = call_prelude_function env ae "@add_cycles"
+  let reset_cycles env ae = call_prelude_function env ae "@reset_cycles"
+  let reset_refund env ae = call_prelude_function env ae "@reset_refund"
+end
+
+(* This comes late because it also deals with messages *)
+module FuncDec = struct
+  let bind_args env ae0 first_arg args =
+    let rec go i ae = function
+    | [] -> ae
+    | a::args ->
+      (* Function arguments are always vanilla, due to subtyping and uniform representation.
+         We keep them as such here for now. We _could_ always unpack those that can be unpacked
+         (Nat32 etc.). It is generally hard to predict which strategy is better. *)
+      let ae' = VarEnv.add_local_local env ae a.it SR.Vanilla (Int32.of_int i) a.note in
+      go (i+1) ae' args in
+    go first_arg ae0 args
+
+  (* Create a WebAssembly func from a pattern (for the argument) and the body.
+   Parameter `captured` should contain the, well, captured local variables that
+   the function will find in the closure. *)
+  let compile_local_function outer_env outer_ae restore_env args mk_body ret_tys at =
+    let arg_names = List.map (fun a -> a.it, I32Type) args in
+    let return_arity = List.length ret_tys in
+    let retty = Lib.List.make return_arity I32Type in
+    let ae0 = VarEnv.mk_fun_ae outer_ae in
+    Func.of_body outer_env (["clos", I32Type] @ arg_names) retty (fun env -> G.with_region at (
+      let get_closure = G.i (LocalGet (nr 0l)) ^^ Tagged.load_forwarding_pointer env in
+
+      let ae1, closure_codeW = restore_env env ae0 get_closure in
+
+      (* Add arguments to the environment (shifted by 1) *)
+      let ae2 = bind_args env ae1 1 args in
+
+      closure_codeW (mk_body env ae2)
+    ))
+
+  let message_start env sort = match sort with
+      | Type.Shared Type.Write ->
+        Lifecycle.trans env Lifecycle.InUpdate
+      | Type.Shared Type.Query ->
+        Lifecycle.trans env Lifecycle.InQuery
+      | Type.Shared Type.Composite ->
+        Lifecycle.trans env Lifecycle.InComposite
+      | _ -> assert false
+
+  let message_cleanup env sort = match sort with
+      | Type.Shared Type.Write ->
+        GC.collect_garbage env ^^
+        Lifecycle.trans env Lifecycle.Idle
+      | Type.Shared Type.Query ->
+        Lifecycle.trans env Lifecycle.PostQuery
+      | Type.Shared Type.Composite ->
+        (* Stay in composite query state such that callbacks of 
+        composite queries can also use the memory reserve. 
+        The state is isolated since memory changes of queries 
+        are rolled back by the IC runtime system. *)
+        Lifecycle.trans env Lifecycle.InComposite
+      | _ -> assert false
+
+  let callback_start env =
+    Lifecycle.is_in env Lifecycle.InComposite ^^
+    G.if0
+      (G.nop)
+      (message_start env (Type.Shared Type.Write))
+
+  let callback_cleanup env =
+    Lifecycle.is_in env Lifecycle.InComposite ^^
+    G.if0
+      (G.nop)
+      (message_cleanup env (Type.Shared Type.Write))
+  
+  let compile_const_message outer_env outer_ae sort control args mk_body ret_tys at : E.func_with_names =
+    let ae0 = VarEnv.mk_fun_ae outer_ae in
+    Func.of_body outer_env [] [] (fun env -> G.with_region at (
+      message_start env sort ^^
+      (* cycles *)
+      Internals.reset_cycles env outer_ae ^^
+      Internals.reset_refund env outer_ae ^^
+      (* reply early for a oneway *)
+      (if control = Type.Returns
+       then
+         Tuple.compile_unit env ^^
+         Serialization.serialize env [] ^^
+         IC.reply_with_data env
+       else G.nop) ^^
+      (* Deserialize argument and add params to the environment *)
+      let arg_list = List.map (fun a -> (a.it, a.note)) args in
+      let arg_names = List.map (fun a -> a.it) args in
+      let arg_tys = List.map (fun a -> a.note) args in
+      let ae1 = VarEnv.add_argument_locals env ae0 arg_list in
+      Serialization.deserialize env arg_tys ^^
+      G.concat_map (Var.set_val_vanilla_from_stack env ae1) (List.rev arg_names) ^^
+      mk_body env ae1 ^^
+      message_cleanup env sort
+    ))
+
+  (* Compile a closed function declaration (captures no local variables) *)
+  let closed pre_env sort control name args mk_body fun_rhs ret_tys at =
+    if Type.is_shared_sort sort
+    then begin
+      let (fi, fill) = E.reserve_fun pre_env name in
+      ( Const.t_of_v (Const.Message fi), fun env ae ->
+        fill (compile_const_message env ae sort control args mk_body ret_tys at)
+      )
+    end else begin
+      assert (control = Type.Returns);
+      let lf = E.make_lazy_function pre_env name in
+      ( Const.t_of_v (Const.Fun ((fun () -> Lib.AllocOnUse.use lf), fun_rhs)), fun env ae ->
+        let restore_no_env _env ae _ = ae, unmodified in
+        Lib.AllocOnUse.def lf (lazy (compile_local_function env ae restore_no_env args mk_body ret_tys at))
+      )
+    end
+
+  (* Compile a closure declaration (captures local variables) *)
+  let closure env ae sort control name captured args mk_body ret_tys at =
+      let is_local = sort = Type.Local in
+
+      let set_clos, get_clos = new_local env (name ^ "_clos") in
+
+      let len = Wasm.I32.of_int_u (List.length captured) in
+      let store_env, restore_env =
+        let rec go i = function
+          | [] -> (G.nop, fun _env ae1 _ -> ae1, unmodified)
+          | (v::vs) ->
+              let store_rest, restore_rest = go (i + 1) vs in
+              let store_this, restore_this = Var.capture env ae v in
+              let store_env =
+                get_clos ^^
+                store_this ^^
+                Closure.store_data env (Wasm.I32.of_int_u i) ^^
+                store_rest in
+              let restore_env env ae1 get_env =
+                let ae2, codeW = restore_this env ae1 in
+                let ae3, code_restW = restore_rest env ae2 get_env in
+                (ae3,
+                 fun body ->
+                 get_env ^^
+                 Closure.load_data env (Wasm.I32.of_int_u i) ^^
+                 codeW (code_restW body)
+                )
+              in store_env, restore_env in
+        go 0 captured in
+
+      let f =
+        if is_local
+        then compile_local_function env ae restore_env args mk_body ret_tys at
+        else assert false (* no first class shared functions yet *) in
+
+      let fi = E.add_fun env name f in
+
+      let code =
+        (* Allocate a heap object for the closure *)
+        Tagged.alloc env (Int32.add (Closure.header_size env) len) Tagged.Closure ^^
+        set_clos ^^
+
+        (* Store the function pointer number: *)
+        get_clos ^^
+        compile_unboxed_const (E.add_fun_ptr env fi) ^^
+        Tagged.store_field env (Closure.funptr_field env) ^^
+
+        (* Store the length *)
+        get_clos ^^
+        compile_unboxed_const len ^^
+        Tagged.store_field env (Closure.len_field env) ^^
+
+        (* Store all captured values *)
+        store_env ^^
+
+        get_clos ^^
+        Tagged.allocation_barrier env ^^
+        G.i Drop
+      in
+
+      if is_local
+      then
+        SR.Vanilla,
+        code ^^
+        get_clos
+      else assert false (* no first class shared functions *)
+
+  let lit env ae name sort control free_vars args mk_body ret_tys at =
+    let captured = List.filter (VarEnv.needs_capture ae) free_vars in
+
+    if ae.VarEnv.lvl = VarEnv.TopLvl then assert (captured = []);
+
+    if captured = []
+    then
+      let (ct, fill) = closed env sort control name args mk_body Const.Complicated ret_tys at in
+      fill env ae;
+      (SR.Const ct, G.nop)
+    else closure env ae sort control name captured args mk_body ret_tys at
+
+  (* Returns a closure corresponding to a future (async block) *)
+  let async_body env ae ts free_vars mk_body at =
+    (* We compile this as a local, returning function, so set return type to [] *)
+    let sr, code = lit env ae "anon_async" Type.Local Type.Returns free_vars [] mk_body [] at in
+    code ^^
+    StackRep.adjust env sr SR.Vanilla
+
+  (* Takes the reply and reject callbacks, tuples them up (with administrative extras),
+     adds them to the continuation table, and returns the two callbacks expected by
+     ic.call_new.
+
+     The tupling is necessary because we want to free _both_/_all_ closures
+     when the call is answered.
+
+     The reply callback function exists once per type (as it has to do
+     deserialization); the reject callback function is unique.
+  *)
+
+  let closures_to_reply_reject_callbacks_aux env ts_opt =
+    let arity, reply_name, from_arg_data =
+      match ts_opt with
+      | Some ts ->
+        (List.length ts,
+         "@callback<" ^ Typ_hash.typ_hash (Type.Tup ts) ^ ">",
+         fun env -> Serialization.deserialize env ts)
+      | None ->
+        (1,
+         "@callback",
+         (fun env ->
+           Blob.of_size_copy env
+           (fun env -> IC.system_call env "msg_arg_data_size")
+           (fun env -> IC.system_call env "msg_arg_data_copy")
+           (fun env -> compile_unboxed_const 0l)))
+    in
+    Func.define_built_in env reply_name ["env", I32Type] [] (fun env ->
+        callback_start env ^^
+        (* Look up continuation *)
+        let (set_closure, get_closure) = new_local env "closure" in
+        G.i (LocalGet (nr 0l)) ^^
+        ContinuationTable.recall env ^^
+        Arr.load_field env 0l ^^ (* get the reply closure *)
+        set_closure ^^
+        get_closure ^^
+        Closure.prepare_closure_call env ^^
+
+        (* Deserialize/Blobify reply arguments  *)
+        from_arg_data env ^^
+
+        get_closure ^^
+        Closure.call_closure env arity 0 ^^
+
+        callback_cleanup env
+      );
+
+    let reject_name = "@reject_callback" in
+    Func.define_built_in env reject_name ["env", I32Type] [] (fun env ->
+        callback_start env ^^
+        (* Look up continuation *)
+        let (set_closure, get_closure) = new_local env "closure" in
+        G.i (LocalGet (nr 0l)) ^^
+        ContinuationTable.recall env ^^
+        Arr.load_field env 1l ^^ (* get the reject closure *)
+        set_closure ^^
+        get_closure ^^
+        Closure.prepare_closure_call env ^^
+        (* Synthesize value of type `Text`, the error message
+           (The error code is fetched via a prim)
+        *)
+        IC.error_value env ^^
+
+        get_closure ^^
+        Closure.call_closure env 1 0 ^^
+
+        callback_cleanup env
+      );
+
+    (* result is a function that accepts a list of closure getters, from which
+       the first and second must be the reply and reject continuations. *)
+    fun closure_getters ->
+      let (set_cb_index, get_cb_index) = new_local env "cb_index" in
+      Arr.lit env closure_getters ^^
+      ContinuationTable.remember env ^^
+      set_cb_index ^^
+
+      (* return arguments for the ic.call *)
+      compile_unboxed_const (E.add_fun_ptr env (E.built_in env reply_name)) ^^
+      get_cb_index ^^
+      compile_unboxed_const (E.add_fun_ptr env (E.built_in env reject_name)) ^^
+      get_cb_index
+
+  let closures_to_reply_reject_callbacks env ts =
+    closures_to_reply_reject_callbacks_aux env (Some ts)
+  let closures_to_raw_reply_reject_callbacks env  =
+    closures_to_reply_reject_callbacks_aux env None
+
+  let ignoring_callback env =
+    (* for one-way calls, we use an invalid table entry as the callback. this
+       way, the callback, when it comes back, will (safely) trap, even if the
+       module has completely changed in between. This way, one-way calls do not
+       get in the way of safe instantaneous upgrades *)
+    compile_unboxed_const (-1l)
+
+  let cleanup_callback env =
+    let name = "@cleanup_callback" in
+    Func.define_built_in env name ["env", I32Type] [] (fun env ->
+        G.i (LocalGet (nr 0l)) ^^
+        ContinuationTable.recall env ^^
+        G.i Drop);
+    compile_unboxed_const (E.add_fun_ptr env (E.built_in env name))
+
+  let ic_call_threaded env purpose get_meth_pair push_continuations
+    add_data add_cycles =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      let message = Printf.sprintf "could not perform %s" purpose in
+      let (set_cb_index, get_cb_index) = new_local env "cb_index" in
+      (* The callee *)
+      get_meth_pair ^^ Arr.load_field env 0l ^^ Blob.as_ptr_len env ^^
+      (* The method name *)
+      get_meth_pair ^^ Arr.load_field env 1l ^^ Blob.as_ptr_len env ^^
+      (* The reply and reject callback *)
+      push_continuations ^^
+      set_cb_index ^^ get_cb_index ^^
+      (* initiate call *)
+      IC.system_call env "call_new" ^^
+      cleanup_callback env ^^ get_cb_index ^^
+      IC.system_call env "call_on_cleanup" ^^
+      (* the data *)
+      add_data get_cb_index ^^
+      IC.system_call env "call_data_append" ^^
+      (* the cycles *)
+      add_cycles ^^
+      (* done! *)
+      IC.system_call env "call_perform" ^^
+      IC.set_call_perform_status env ^^
+      Blob.lit env message ^^
+      IC.set_call_perform_message env ^^
+      IC.get_call_perform_status env ^^
+      (* save error code, cleanup on error *)
+      G.if0
+      begin (* send failed *)
+        if !Flags.trap_on_call_error then
+          E.trap_with env message
+        else
+        (* Recall (don't leak) continuations *)
+        get_cb_index ^^
+        ContinuationTable.recall env ^^
+        G.i Drop
+      end
+      begin (* send succeeded *)
+        G.nop
+      end
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot perform %s when running locally" purpose)
+
+  let ic_call env ts1 ts2 get_meth_pair get_arg get_k get_r =
+    ic_call_threaded
+      env
+      "remote call"
+      get_meth_pair
+      (closures_to_reply_reject_callbacks env ts2 [get_k; get_r])
+      (fun _ -> get_arg ^^ Serialization.serialize env ts1)
+
+  let ic_call_raw env get_meth_pair get_arg get_k get_r =
+    ic_call_threaded
+      env
+      "raw call"
+      get_meth_pair
+      (closures_to_raw_reply_reject_callbacks env [get_k; get_r])
+      (fun _ -> get_arg ^^ Blob.as_ptr_len env)
+
+  let ic_self_call env ts get_meth_pair get_future get_k get_r =
+    ic_call_threaded
+      env
+      "self call"
+      get_meth_pair
+      (* Storing the tuple away, future_array_index = 2, keep in sync with rts/continuation_table.rs *)
+      (closures_to_reply_reject_callbacks env ts [get_k; get_r; get_future])
+      (fun get_cb_index ->
+        get_cb_index ^^
+        BoxedSmallWord.box env Type.Nat32 ^^
+        Serialization.serialize env Type.[Prim Nat32])
+
+  let ic_call_one_shot env ts get_meth_pair get_arg add_cycles =
+    match E.mode env with
+    | Flags.ICMode
+    | Flags.RefMode ->
+      (* The callee *)
+      get_meth_pair ^^ Arr.load_field env 0l ^^ Blob.as_ptr_len env ^^
+      (* The method name *)
+      get_meth_pair ^^ Arr.load_field env 1l ^^ Blob.as_ptr_len env ^^
+      (* The reply callback *)
+      ignoring_callback env ^^
+      compile_unboxed_zero ^^
+      (* The reject callback *)
+      ignoring_callback env ^^
+      compile_unboxed_zero ^^
+      IC.system_call env "call_new" ^^
+      (* the data *)
+      get_arg ^^ Serialization.serialize env ts ^^
+      IC.system_call env "call_data_append" ^^
+      (* the cycles *)
+      add_cycles ^^
+      IC.system_call env "call_perform" ^^
+      (* This is a one-shot function: just remember error code *)
+      (if !Flags.trap_on_call_error then
+         (* legacy: discard status, proceed as if all well *)
+         G.i Drop ^^
+         compile_unboxed_zero ^^
+         IC.set_call_perform_status env ^^
+         Blob.lit env "" ^^
+         IC.set_call_perform_message env
+       else
+         IC.set_call_perform_status env ^^
+         Blob.lit env "could not perform oneway" ^^
+         IC.set_call_perform_message env)
+
+    | _ -> assert false
+
+  let equate_msgref env =
+    let (set_meth_pair1, get_meth_pair1) = new_local env "meth_pair1" in
+    let (set_meth_pair2, get_meth_pair2) = new_local env "meth_pair2" in
+    set_meth_pair2 ^^ set_meth_pair1 ^^
+    get_meth_pair1 ^^ Arr.load_field env 0l ^^
+    get_meth_pair2 ^^ Arr.load_field env 0l ^^
+    Blob.compare env (Some Operator.EqOp) ^^
+    G.if1 I32Type
+    begin
+      get_meth_pair1 ^^ Arr.load_field env 1l ^^
+      get_meth_pair2 ^^ Arr.load_field env 1l ^^
+      Blob.compare env (Some Operator.EqOp)
+    end
+    begin
+      Bool.lit false
+    end
+
+  let export_async_method env =
+    let name = IC.async_method_name in
+    begin match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.define_built_in env name [] [] (fun env ->
+        let (set_closure, get_closure) = new_local env "closure" in
+
+        message_start env (Type.Shared Type.Write) ^^
+
+        (* Check that we are calling this *)
+        IC.assert_caller_self env ^^
+
+        (* Deserialize and look up continuation argument *)
+        Serialization.deserialize env Type.[Prim Nat32] ^^
+        BoxedSmallWord.unbox env Type.Nat32 ^^
+        ContinuationTable.peek_future env ^^
+        set_closure ^^
+        get_closure ^^
+        Closure.prepare_closure_call env ^^
+        get_closure ^^
+        Closure.call_closure env 0 0 ^^
+        message_cleanup env (Type.Shared Type.Write)
+      );
+
+      let fi = E.built_in env name in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode ("canister_update " ^ name);
+        edesc = nr (FuncExport (nr fi))
+      })
+    | _ -> ()
+    end
+
+  let export_gc_trigger_method env =
+    let name = IC.gc_trigger_method_name in
+    begin match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      Func.define_built_in env name [] [] (fun env ->
+        message_start env (Type.Shared Type.Write) ^^
+        (* Check that we are called from this or a controller, w/o allocation *)
+        IC.assert_caller_self_or_controller env ^^
+        (* To avoid more failing allocation, don't deserialize args nor serialize reply,
+           i.e. don't even try to do this:
+        Serialization.deserialize env [] ^^
+        Tuple.compile_unit env ^^
+        Serialization.serialize env [] ^^
+        *)
+        (* Instead, just ignore the argument and
+           send a *statically* allocated, nullary reply *)
+        Blob.lit_ptr_len env "DIDL\x00\x00" ^^
+        IC.reply_with_data env ^^
+        (* Finally, act like
+        message_cleanup env (Type.Shared Type.Write)
+           but *force* collection *)
+        GC.record_mutator_instructions env ^^
+        E.collect_garbage env true ^^
+        GC.record_collector_instructions env ^^
+        Lifecycle.trans env Lifecycle.Idle
+      );
+
+      let fi = E.built_in env name in
+      E.add_export env (nr {
+        name = Lib.Utf8.decode ("canister_update " ^ name);
+        edesc = nr (FuncExport (nr fi))
+      })
+    | _ -> ()
+    end
+
+end (* FuncDec *)
+
+
+module PatCode = struct
+  (* Pattern failure code on demand.
+
+  Patterns in general can fail, so we want a block around them with a
+  jump-label for the fail case. But many patterns cannot fail, in particular
+  function arguments that are simple variables. In these cases, we do not want
+  to create the block and the (unused) jump label. So we first generate the
+  code, either as plain code (CannotFail) or as code with hole for code to run
+  in case of failure (CanFail).
+  *)
+
+  type patternCode =
+    | CannotFail of G.t
+    | CanFail of (G.t -> G.t)
+
+  let definiteFail = CanFail (fun fail -> fail)
+
+  let (^^^) : patternCode -> patternCode -> patternCode = function
+    | CannotFail is1 ->
+      begin function
+      | CannotFail is2 -> CannotFail (is1 ^^ is2)
+      | CanFail is2 -> CanFail (fun k -> is1 ^^ is2 k)
+      end
+    | CanFail is1 ->
+      begin function
+      | CannotFail is2 -> CanFail (fun k ->  is1 k ^^ is2)
+      | CanFail is2 -> CanFail (fun k -> is1 k ^^ is2 k)
+      end
+
+  let with_fail (fail_code : G.t) : patternCode -> G.t = function
+    | CannotFail is -> is
+    | CanFail is -> is fail_code
+
+  let orElse : patternCode -> patternCode -> patternCode = function
+    | CannotFail is1 -> fun _ -> CannotFail is1
+    | CanFail is1 -> function
+      | CanFail is2 -> CanFail (fun fail_code ->
+          let inner_fail = G.new_depth_label () in
+          let inner_fail_code = Bool.lit false ^^ G.branch_to_ inner_fail in
+          G.labeled_block1 I32Type inner_fail (is1 inner_fail_code ^^ Bool.lit true) ^^
+          G.if0 G.nop (is2 fail_code)
+        )
+      | CannotFail is2 -> CannotFail (
+          let inner_fail = G.new_depth_label () in
+          let inner_fail_code = Bool.lit false ^^ G.branch_to_ inner_fail in
+          G.labeled_block1 I32Type inner_fail (is1 inner_fail_code ^^ Bool.lit true) ^^
+          G.if0 G.nop is2
+        )
+
+  let orElses : patternCode list -> patternCode -> patternCode =
+    List.fold_right orElse
+
+  let patternFailTrap env = E.trap_with env "pattern failed"
+
+  let orPatternFailure env pcode =
+    with_fail (patternFailTrap env) pcode
+
+  let orsPatternFailure env pcodes =
+    orPatternFailure env (orElses pcodes definiteFail)
+
+  let with_region at = function
+    | CannotFail is -> CannotFail (G.with_region at is)
+    | CanFail is -> CanFail (fun k -> G.with_region at (is k))
+
+end (* PatCode *)
+open PatCode
+
+(* All the code above is independent of the IR *)
+open Ir
+
+module AllocHow = struct
+  (*
+  When compiling a (recursive) block, we need to do a dependency analysis, to
+  find out how the things are allocated. The options are:
+  - const:  completely known, constant, not stored anywhere (think static function)
+            (no need to mention in a closure)
+  - local:  only needed locally, stored in a Wasm local, immutable
+            (can be copied into a closure by value)
+  - local mutable: only needed locally, stored in a Wasm local, mutable
+            (cannot be copied into a closure)
+  - heap allocated: stored on the dynamic heap, address in Wasm local
+            (can be copied into a closure by reference)
+  - static heap: stored on the static heap, address known statically
+            (no need to mention in a closure)
+
+  The goal is to avoid dynamic allocation where possible (and use locals), and
+  to avoid turning function references into closures.
+
+  The rules are:
+  - functions are const, unless they capture something that is not a const
+    function or a static heap allocation.
+    in particular, top-level functions are always const
+  - everything that is captured on the top-level needs to be statically
+    heap-allocated
+  - everything that is captured before it is defined, or is captured and mutable
+    needs to be dynamically heap-allocated
+  - the rest can be local
+  *)
+
+  module M = Freevars.M
+  module S = Freevars.S
+
+  (*
+  We represent this as a lattice as follows:
+  *)
+  type how = Const | LocalImmut of SR.t | LocalMut of SR.t | StoreHeap | StoreStatic
+  type allocHow = how M.t
+
+  let disjoint_union : allocHow -> allocHow -> allocHow =
+    M.union (fun v _ _ -> fatal "AllocHow.disjoint_union: %s" v)
+
+  let join : allocHow -> allocHow -> allocHow =
+    M.union (fun _ x y -> Some (match x, y with
+      | StoreStatic, StoreHeap | StoreHeap, StoreStatic
+      ->  fatal "AllocHow.join: cannot join StoreStatic and StoreHeap"
+
+      | _, StoreHeap     | StoreHeap,      _ -> StoreHeap
+      | _, StoreStatic   | StoreStatic,    _ -> StoreStatic
+      | _, LocalMut sr   | LocalMut sr,    _ -> LocalMut sr
+      | _, LocalImmut sr | LocalImmut sr,  _ -> LocalImmut sr
+
+      | Const, Const -> Const
+    ))
+  let joins = List.fold_left join M.empty
+
+  let map_of_set = Freevars.map_of_set
+  let set_of_map = Freevars.set_of_map
+
+  (* Various filters used in the set operations below *)
+  let is_local_mut _ = function
+    | LocalMut _ -> true
+    | _ -> false
+
+  let is_local _ = function
+    | LocalImmut _ | LocalMut _ -> true
+    | _ -> false
+
+  let how_captured lvl how seen captured =
+    (* What to do so that we can capture something?
+       * For local blocks, put on the dynamic heap:
+         - mutable things
+         - not yet defined things
+       * For top-level blocks, put on the static heap:
+         - everything that is non-static (i.e. still in locals)
+    *)
+    match lvl with
+    | VarEnv.NotTopLvl ->
+      map_of_set StoreHeap (S.union
+        (S.inter (set_of_map (M.filter is_local_mut how)) captured)
+        (S.inter (set_of_map (M.filter is_local how)) (S.diff captured seen))
+      )
+    | VarEnv.TopLvl ->
+      map_of_set StoreStatic
+        (S.inter (set_of_map (M.filter is_local how)) captured)
+
+  (* A bit like StackRep.of_type, but only for those types and stackreps that
+     we support in local variables *)
+  let stackrep_of_type t =
+    let open Type in
+    match normalize t with
+    | Prim ((Nat32 | Int32 | Nat16 | Int16 | Nat8 | Int8 | Char) as pty) ->
+       SR.UnboxedWord32 pty
+    | Prim ((Nat64 | Int64) as pty) -> SR.UnboxedWord64 pty
+    | Prim Float -> SR.UnboxedFloat64
+    | _ -> SR.Vanilla
+
+  let dec lvl how_outer (seen, how0) dec =
+    let how_all = disjoint_union how_outer how0 in
+
+    let (f,d) = Freevars.dec dec in
+    let captured = S.inter (set_of_map how0) (Freevars.captured_vars f) in
+
+    (* Which allocation is required for the things defined here? *)
+    let how1 = match dec.it with
+      (* Mutable variables are, well, mutable *)
+      | VarD _ ->
+        M.map (fun t -> LocalMut (stackrep_of_type t)) d
+
+      (* Constant expressions (trusting static_vals.ml) *)
+      | LetD (_, e) when e.note.Note.const ->
+        M.map (fun _ -> (Const : how)) d
+
+      (* References to mutboxes *)
+      | RefD _ ->
+        M.map (fun _ -> StoreHeap) d
+
+      (* Everything else needs at least a local *)
+      | _ ->
+        M.map (fun t -> LocalImmut (stackrep_of_type t)) d in
+
+    (* Which allocation does this require for its captured things? *)
+    let how2 = how_captured lvl how_all seen captured in
+
+    let how = joins [how0; how1; how2] in
+    let seen' = S.union seen (set_of_map d)
+    in (seen', how)
+
+  (* find the allocHow for the variables currently in scope *)
+  (* we assume things are mutable, as we do not know better here *)
+  let how_of_ae ae : allocHow =
+    M.map (fun (l, _) -> match l with
+    | VarEnv.Const _        -> (Const : how)
+    | VarEnv.HeapStatic _   -> StoreStatic
+    | VarEnv.HeapInd _      -> StoreHeap
+    | VarEnv.Local (sr, _)  -> LocalMut sr (* conservatively assume mutable *)
+    | VarEnv.PublicMethod _ -> LocalMut SR.Vanilla
+    ) ae.VarEnv.vars
+
+  let decs (ae : VarEnv.t) decs captured_in_body : allocHow =
+    let lvl = ae.VarEnv.lvl in
+    let how_outer = how_of_ae ae in
+    let defined_here = snd (Freevars.decs decs) in (* TODO: implement gather_decs more directly *)
+    let how_outer = Freevars.diff how_outer defined_here in (* shadowing *)
+    let how0 = M.map (fun _t -> (Const : how)) defined_here in
+    let captured = S.inter (set_of_map defined_here) captured_in_body in
+    let rec go how =
+      let seen, how1 = List.fold_left (dec lvl how_outer) (S.empty, how) decs in
+      assert (S.equal seen (set_of_map defined_here));
+      let how2 = how_captured lvl how1 seen captured in
+      let how' = join how1 how2 in
+      if M.equal (=) how how' then how' else go how' in
+    go how0
+
+  (* Functions to extend the environment (and possibly allocate memory)
+     based on how we want to store them. *)
+  let add_local env ae how name typ : VarEnv.t * G.t =
+    match M.find name how with
+    | (Const : how) -> (ae, G.nop)
+    | LocalImmut sr | LocalMut sr ->
+      let ae1, _ = VarEnv.add_direct_local env ae name sr typ in
+      (ae1, G.nop)
+    | StoreHeap ->
+      let ae1, i = VarEnv.add_local_with_heap_ind env ae name typ in
+      let alloc_code = MutBox.alloc env ^^ G.i (LocalSet (nr i)) in
+      (ae1, alloc_code)
+    | StoreStatic ->
+      let ptr = MutBox.static env in
+      let ae1 = VarEnv.add_local_heap_static ae name ptr typ in
+      (ae1, G.nop)
+
+  let add_local_for_alias env ae how name typ : VarEnv.t * G.t =
+    match M.find name how with
+    | StoreHeap ->
+      let ae1, _ = VarEnv.add_local_with_heap_ind env ae name typ in
+      ae1, G.nop
+    | _ -> assert false
+
+end (* AllocHow *)
+
+(* The actual compiler code that looks at the AST *)
+
+(* wraps a bigint in range [0…2^32-1] into range [-2^31…2^31-1] *)
+let nat32_to_int32 n =
+  let open Big_int in
+  if ge_big_int n (power_int_positive_int 2 31)
+  then sub_big_int n (power_int_positive_int 2 32)
+  else n
+
+(* wraps a bigint in range [0…2^64-1] into range [-2^63…2^63-1] *)
+let nat64_to_int64 n =
+  let open Big_int in
+  if ge_big_int n (power_int_positive_int 2 63)
+  then sub_big_int n (power_int_positive_int 2 64)
+  else n
+
+let const_lit_of_lit : Ir.lit -> Const.lit = function
+  | BoolLit b     -> Const.Bool b
+  | IntLit n
+  | NatLit n      -> Const.BigInt (Numerics.Nat.to_big_int n)
+  | Int8Lit n     -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Int8 (Numerics.Int_8.to_int n))
+  | Nat8Lit n     -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Nat8 (Numerics.Nat8.to_int n))
+  | Int16Lit n    -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Int16 (Numerics.Int_16.to_int n))
+  | Nat16Lit n    -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Nat16 (Numerics.Nat16.to_int n))
+  | Int32Lit n    -> Const.Word32 (Type.Int32, (Big_int.int32_of_big_int (Numerics.Int_32.to_big_int n)))
+  | Nat32Lit n    -> Const.Word32 (Type.Nat32, (Big_int.int32_of_big_int (nat32_to_int32 (Numerics.Nat32.to_big_int n))))
+  | Int64Lit n    -> Const.Word64 (Type.Int64, (Big_int.int64_of_big_int (Numerics.Int_64.to_big_int n)))
+  | Nat64Lit n    -> Const.Word64 (Type.Nat64, (Big_int.int64_of_big_int (nat64_to_int64 (Numerics.Nat64.to_big_int n))))
+  | CharLit c     -> Const.Vanilla (TaggedSmallWord.vanilla_lit Type.Char c)
+
+  | NullLit       -> Const.Null
+  | TextLit t
+  | BlobLit t     -> Const.Blob t
+  | FloatLit f    -> Const.Float64 f
+
+let const_of_lit lit =
+  Const.t_of_v (Const.Lit (const_lit_of_lit lit))
+
+let compile_lit lit =
+  SR.Const (const_of_lit lit), G.nop
+
+let compile_lit_as env sr_out lit =
+  let sr_in, code = compile_lit lit in
+  code ^^ StackRep.adjust env sr_in sr_out
+
+(* helper, traps with message *)
+let then_arithmetic_overflow env =
+  E.then_trap_with env "arithmetic overflow"
+
+(* The first returned StackRep is for the arguments (expected), the second for the results (produced) *)
+let compile_unop env t op =
+  let open Operator in
+  match op, t with
+  | _, Type.Non ->
+    SR.Vanilla, SR.Unreachable, G.i Unreachable
+  | NegOp, Type.(Prim Int) ->
+    SR.Vanilla, SR.Vanilla,
+    BigNum.compile_neg env
+  | NegOp, Type.(Prim Int64) ->
+      SR.UnboxedWord64 Type.Int64, SR.UnboxedWord64 Type.Int64,
+      Func.share_code1 Func.Never env "neg_trap" ("n", I64Type) [I64Type] (fun env get_n ->
+        get_n ^^
+        compile_eq64_const 0x8000000000000000L ^^
+        then_arithmetic_overflow env ^^
+        compile_const_64 0L ^^
+        get_n ^^
+        G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+      )
+  | NegOp, Type.(Prim ((Int8 | Int16 | Int32) as p)) ->
+    StackRep.of_type t, StackRep.of_type t,
+    Func.share_code1 Func.Never env (prim_fun_name p "neg32_trap") ("n", I32Type) [I32Type] (fun env get_n ->
+      get_n ^^
+      compile_eq_const 0x80000000l ^^
+      then_arithmetic_overflow env ^^
+      compile_unboxed_zero ^^
+      get_n ^^
+      G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+    )
+  | NegOp, Type.(Prim Float) ->
+    SR.UnboxedFloat64, SR.UnboxedFloat64,
+    G.i (Unary (Wasm.Values.F64 F64Op.Neg))
+  | NotOp, Type.(Prim (Nat64|Int64 as p)) ->
+     SR.UnboxedWord64 p, SR.UnboxedWord64 p,
+     compile_xor64_const (-1L)
+  | NotOp, Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32 as ty)) ->
+     StackRep.of_type t, StackRep.of_type t,
+     compile_unboxed_const (TaggedSmallWord.mask_of_type ty) ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.Xor))
+  | _ ->
+    todo "compile_unop"
+      (Wasm.Sexpr.Node ("BinOp", [ Arrange_ops.unop op ]))
+      (SR.Vanilla, SR.Unreachable, E.trap_with env "TODO: compile_unop")
+
+(* Logarithmic helpers for deciding whether we can carry out operations in constant bitwidth *)
+
+(* helper, traps with message *)
+let else_arithmetic_overflow env =
+  E.else_trap_with env "arithmetic overflow"
+
+(* helpers to decide if Int64 arithmetic can be carried out on the fast path *)
+let additiveInt64_shortcut fast env get_a get_b slow =
+  get_a ^^ get_a ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ compile_shrU64_const 63L ^^
+  get_b ^^ get_b ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ compile_shrU64_const 63L ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Or)) ^^
+  G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let mulInt64_shortcut fast env get_a get_b slow =
+  get_a ^^ get_a ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  get_b ^^ get_b ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+  compile_const_64 65L ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let powInt64_shortcut fast env get_a get_b slow =
+  get_b ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (compile_const_64 1L) (* ^0 *)
+    begin (* ^(1+n) *)
+      get_a ^^ compile_const_64 (-1L) ^^ G.i (Compare (Wasm.Values.I64 I64Op.Eq)) ^^
+      G.if1 I64Type
+        begin (* -1 ** (1+exp) == if even (1+exp) then 1 else -1 *)
+          get_b ^^ compile_const_64 1L ^^
+          G.i (Binary (Wasm.Values.I64 I64Op.And)) ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+          G.if1 I64Type
+            (compile_const_64 1L)
+            get_a
+        end
+        begin
+          get_a ^^ compile_shrS64_const 1L ^^
+          G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+          G.if1 I64Type
+            get_a (* {0,1}^(1+n) *)
+            begin
+              get_b ^^ compile_const_64 64L ^^
+              G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^ then_arithmetic_overflow env ^^
+              get_a ^^ get_a ^^ compile_shl64_const 1L ^^ G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^
+              G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^ compile_sub64_const 63L ^^
+              get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^
+              compile_const_64 (-63L) ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeS)) ^^
+              G.if1 I64Type
+                (get_a ^^ get_b ^^ fast)
+                slow
+            end
+        end
+    end
+
+
+(* kernel for Int64 arithmetic, invokes estimator for fast path *)
+let compile_Int64_kernel env name op shortcut =
+  Func.share_code2 Func.Always env (prim_fun_name Type.Int64 name)
+    (("a", I64Type), ("b", I64Type)) [I64Type]
+    BigNum.(fun env get_a get_b ->
+    shortcut
+      env
+      get_a
+      get_b
+      begin
+        let (set_res, get_res) = new_local env "res" in
+        get_a ^^ from_signed_word64 env ^^
+        get_b ^^ from_signed_word64 env ^^
+        op env ^^
+        set_res ^^ get_res ^^
+        fits_signed_bits env 64 ^^
+        else_arithmetic_overflow env ^^
+        get_res ^^ truncate_to_word64 env
+      end)
+
+
+(* helpers to decide if Nat64 arithmetic can be carried out on the fast path *)
+let additiveNat64_shortcut fast env get_a get_b slow =
+  get_a ^^ compile_shrU64_const 62L ^^
+  get_b ^^ compile_shrU64_const 62L ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Or)) ^^
+  G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let mulNat64_shortcut fast env get_a get_b slow =
+  get_a ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  get_b ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Add)) ^^
+  compile_const_64 64L ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+  G.if1 I64Type
+    (get_a ^^ get_b ^^ fast)
+    slow
+
+let powNat64_shortcut fast env get_a get_b slow =
+  get_b ^^ G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  G.if1 I64Type
+    (compile_const_64 1L) (* ^0 *)
+    begin (* ^(1+n) *)
+      get_a ^^ compile_shrU64_const 1L ^^
+      G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+      G.if1 I64Type
+        get_a (* {0,1}^(1+n) *)
+        begin
+          get_b ^^ compile_const_64 64L ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^ then_arithmetic_overflow env ^^
+          get_a ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz)) ^^ compile_sub64_const 64L ^^
+          get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Mul)) ^^ compile_const_64 (-64L) ^^ G.i (Compare (Wasm.Values.I64 I64Op.GeS)) ^^
+          G.if1 I64Type
+            (get_a ^^ get_b ^^ fast)
+            slow
+        end
+    end
+
+
+(* kernel for Nat64 arithmetic, invokes estimator for fast path *)
+let compile_Nat64_kernel env name op shortcut =
+  Func.share_code2 Func.Always env (prim_fun_name Type.Nat64 name)
+    (("a", I64Type), ("b", I64Type)) [I64Type]
+    BigNum.(fun env get_a get_b ->
+    shortcut
+      env
+      get_a
+      get_b
+      begin
+        let (set_res, get_res) = new_local env "res" in
+        get_a ^^ from_word64 env ^^
+        get_b ^^ from_word64 env ^^
+        op env ^^
+        set_res ^^ get_res ^^
+        fits_unsigned_bits env 64 ^^
+        else_arithmetic_overflow env ^^
+        get_res ^^ truncate_to_word64 env
+      end)
+
+
+(* Compiling Int/Nat32 ops by conversion to/from i64. *)
+
+(* helper, expects i64 on stack *)
+let enforce_32_unsigned_bits env =
+  compile_bitand64_const 0xFFFFFFFF00000000L ^^
+  G.i (Test (Wasm.Values.I64 I64Op.Eqz)) ^^
+  else_arithmetic_overflow env
+
+(* helper, expects two identical i64s on stack *)
+let enforce_32_signed_bits env =
+  compile_shl64_const 1L ^^
+  G.i (Binary (Wasm.Values.I64 I64Op.Xor)) ^^
+  enforce_32_unsigned_bits env
+
+let compile_Int32_kernel env name op =
+     Func.share_code2 Func.Always env (prim_fun_name Type.Int32 name)
+       (("a", I32Type), ("b", I32Type)) [I32Type]
+       (fun env get_a get_b ->
+         let (set_res, get_res) = new_local64 env "res" in
+         get_a ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+         get_b ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+         G.i (Binary (Wasm.Values.I64 op)) ^^
+         set_res ^^ get_res ^^ get_res ^^
+         enforce_32_signed_bits env ^^
+         get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)))
+
+let compile_Nat32_kernel env name op =
+     Func.share_code2 Func.Always env (prim_fun_name Type.Nat32 name)
+       (("a", I32Type), ("b", I32Type)) [I32Type]
+       (fun env get_a get_b ->
+         let (set_res, get_res) = new_local64 env "res" in
+         get_a ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+         get_b ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+         G.i (Binary (Wasm.Values.I64 op)) ^^
+         set_res ^^ get_res ^^
+         enforce_32_unsigned_bits env ^^
+         get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)))
+
+(* Customisable kernels for 8/16bit arithmetic via 32 bits. *)
+
+(* helper, expects i32 on stack *)
+let enforce_unsigned_bits env n =
+  compile_bitand_const Int32.(shift_left minus_one n) ^^
+  then_arithmetic_overflow env
+
+let enforce_16_unsigned_bits env = enforce_unsigned_bits env 16
+
+(* helper, expects two identical i32s on stack *)
+let enforce_signed_bits env n =
+  compile_shl_const 1l ^^ G.i (Binary (Wasm.Values.I32 I32Op.Xor)) ^^
+  enforce_unsigned_bits env n
+
+let enforce_16_signed_bits env = enforce_signed_bits env 16
+
+let compile_smallInt_kernel' env ty name op =
+  Func.share_code2 Func.Always env (prim_fun_name ty name)
+    (("a", I32Type), ("b", I32Type)) [I32Type]
+    (fun env get_a get_b ->
+      let (set_res, get_res) = new_local env "res" in
+      get_a ^^ compile_shrS_const 16l ^^
+      get_b ^^ compile_shrS_const 16l ^^
+      op ^^
+      set_res ^^ get_res ^^ get_res ^^
+      enforce_16_signed_bits env ^^
+      get_res ^^ compile_shl_const 16l)
+
+let compile_smallInt_kernel env ty name op =
+  compile_smallInt_kernel' env ty name (G.i (Binary (Wasm.Values.I32 op)))
+
+let compile_smallNat_kernel' env ty name op =
+  Func.share_code2 Func.Always env (prim_fun_name ty name)
+    (("a", I32Type), ("b", I32Type)) [I32Type]
+    (fun env get_a get_b ->
+      let (set_res, get_res) = new_local env "res" in
+      get_a ^^ compile_shrU_const 16l ^^
+      get_b ^^ compile_shrU_const 16l ^^
+      op ^^
+      set_res ^^ get_res ^^
+      enforce_16_unsigned_bits env ^^
+      get_res ^^ compile_shl_const 16l)
+
+let compile_smallNat_kernel env ty name op =
+  compile_smallNat_kernel' env ty name (G.i (Binary (Wasm.Values.I32 op)))
+
+(* The first returned StackRep is for the arguments (expected), the second for the results (produced) *)
+let compile_binop env t op : SR.t * SR.t * G.t =
+  if t = Type.Non then SR.Vanilla, SR.Unreachable, G.i Unreachable else
+  StackRep.of_type t,
+  StackRep.of_type t,
+  Operator.(match t, op with
+  | Type.(Prim (Nat | Int)),                  AddOp -> BigNum.compile_add env
+  | Type.(Prim (Nat64|Int64)),                WAddOp -> G.i (Binary (Wasm.Values.I64 I64Op.Add))
+  | Type.(Prim Int64),                        AddOp ->
+    compile_Int64_kernel env "add" BigNum.compile_add
+      (additiveInt64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Add))))
+  | Type.(Prim Nat64),                        AddOp ->
+    compile_Nat64_kernel env "add" BigNum.compile_add
+      (additiveNat64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Add))))
+  | Type.(Prim Nat),                          SubOp -> BigNum.compile_unsigned_sub env
+  | Type.(Prim Int),                          SubOp -> BigNum.compile_signed_sub env
+  | Type.(Prim (Nat | Int)),                  MulOp -> BigNum.compile_mul env
+  | Type.(Prim (Nat64|Int64)),                WMulOp -> G.i (Binary (Wasm.Values.I64 I64Op.Mul))
+  | Type.(Prim Int64),                        MulOp ->
+    compile_Int64_kernel env "mul" BigNum.compile_mul
+      (mulInt64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Mul))))
+  | Type.(Prim Nat64),                        MulOp ->
+    compile_Nat64_kernel env "mul" BigNum.compile_mul
+      (mulNat64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Mul))))
+  | Type.(Prim Nat64),                        DivOp -> G.i (Binary (Wasm.Values.I64 I64Op.DivU))
+  | Type.(Prim Nat64) ,                       ModOp -> G.i (Binary (Wasm.Values.I64 I64Op.RemU))
+  | Type.(Prim Int64),                        DivOp -> G.i (Binary (Wasm.Values.I64 I64Op.DivS))
+  | Type.(Prim Int64) ,                       ModOp -> G.i (Binary (Wasm.Values.I64 I64Op.RemS))
+  | Type.(Prim Nat),                          DivOp -> BigNum.compile_unsigned_div env
+  | Type.(Prim Nat),                          ModOp -> BigNum.compile_unsigned_rem env
+  | Type.(Prim (Nat64|Int64)),                WSubOp -> G.i (Binary (Wasm.Values.I64 I64Op.Sub))
+  | Type.(Prim Int64),                        SubOp ->
+    compile_Int64_kernel env "sub" BigNum.compile_signed_sub
+      (additiveInt64_shortcut (G.i (Binary (Wasm.Values.I64 I64Op.Sub))))
+  | Type.(Prim Nat64),                        SubOp ->
+    compile_Nat64_kernel env "sub" BigNum.compile_unsigned_sub
+      (fun env get_a get_b ->
+        additiveNat64_shortcut
+          (G.i (Compare (Wasm.Values.I64 I64Op.GeU)) ^^
+           else_arithmetic_overflow env ^^
+           get_a ^^ get_b ^^ G.i (Binary (Wasm.Values.I64 I64Op.Sub)))
+          env get_a get_b)
+  | Type.(Prim Int),                          DivOp -> BigNum.compile_signed_div env
+  | Type.(Prim Int),                          ModOp -> BigNum.compile_signed_mod env
+
+  | Type.Prim Type.(Nat8|Nat16|Nat32|Int8|Int16|Int32),
+                                              WAddOp -> G.i (Binary (Wasm.Values.I32 I32Op.Add))
+  | Type.(Prim Int32),                        AddOp -> compile_Int32_kernel env "add" I64Op.Add
+  | Type.Prim Type.(Int8 | Int16 as ty),      AddOp -> compile_smallInt_kernel env ty "add" I32Op.Add
+  | Type.(Prim Nat32),                        AddOp -> compile_Nat32_kernel env "add" I64Op.Add
+  | Type.Prim Type.(Nat8 | Nat16 as ty),      AddOp -> compile_smallNat_kernel env ty "add" I32Op.Add
+  | Type.(Prim Float),                        AddOp -> G.i (Binary (Wasm.Values.F64 F64Op.Add))
+  | Type.Prim Type.(Nat8|Nat16|Nat32|Int8|Int16|Int32),
+                                              WSubOp -> G.i (Binary (Wasm.Values.I32 I32Op.Sub))
+  | Type.(Prim Int32),                        SubOp -> compile_Int32_kernel env "sub" I64Op.Sub
+  | Type.(Prim (Int8|Int16 as ty)),           SubOp -> compile_smallInt_kernel env ty "sub" I32Op.Sub
+  | Type.(Prim Nat32),                        SubOp -> compile_Nat32_kernel env "sub" I64Op.Sub
+  | Type.(Prim (Nat8|Nat16 as ty)),           SubOp -> compile_smallNat_kernel env ty "sub" I32Op.Sub
+  | Type.(Prim Float),                        SubOp -> G.i (Binary (Wasm.Values.F64 F64Op.Sub))
+  | Type.Prim Type.(Nat8|Nat16|Nat32|Int8|Int16|Int32 as ty),
+                                              WMulOp -> TaggedSmallWord.compile_word_mul env ty
+  | Type.(Prim Int32),                        MulOp -> compile_Int32_kernel env "mul" I64Op.Mul
+  | Type.(Prim Int16),                        MulOp -> compile_smallInt_kernel env Type.Int16 "mul" I32Op.Mul
+  | Type.(Prim Int8),                         MulOp -> compile_smallInt_kernel' env Type.Int8 "mul"
+                                                         (compile_shrS_const 8l ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)))
+  | Type.(Prim Nat32),                        MulOp -> compile_Nat32_kernel env "mul" I64Op.Mul
+  | Type.(Prim Nat16),                        MulOp -> compile_smallNat_kernel env Type.Nat16 "mul" I32Op.Mul
+  | Type.(Prim Nat8),                         MulOp -> compile_smallNat_kernel' env Type.Nat8 "mul"
+                                                         (compile_shrU_const 8l ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)))
+  | Type.(Prim Float),                        MulOp -> G.i (Binary (Wasm.Values.F64 F64Op.Mul))
+  | Type.(Prim (Nat8|Nat16|Nat32 as ty)),     DivOp -> G.i (Binary (Wasm.Values.I32 I32Op.DivU)) ^^
+                                                       TaggedSmallWord.msb_adjust ty
+  | Type.(Prim (Nat8|Nat16|Nat32)),           ModOp -> G.i (Binary (Wasm.Values.I32 I32Op.RemU))
+  | Type.(Prim Int32),                        DivOp -> G.i (Binary (Wasm.Values.I32 I32Op.DivS))
+  | Type.(Prim (Int8|Int16 as ty)),           DivOp ->
+    Func.share_code2 Func.Always env (prim_fun_name ty "div")
+      (("a", I32Type), ("b", I32Type)) [I32Type]
+      (fun env get_a get_b ->
+        let (set_res, get_res) = new_local env "res" in
+        get_a ^^ get_b ^^ G.i (Binary (Wasm.Values.I32 I32Op.DivS)) ^^
+        TaggedSmallWord.msb_adjust ty ^^ set_res ^^
+        get_a ^^ compile_eq_const 0x80000000l ^^
+        E.if_ env (StackRep.to_block_type env (SR.UnboxedWord32 Type.Int32))
+          begin
+            get_b ^^ TaggedSmallWord.lsb_adjust ty ^^ compile_eq_const (-1l) ^^
+            E.if_ env (StackRep.to_block_type env (SR.UnboxedWord32 ty))
+              (G.i Unreachable)
+              get_res
+          end
+          get_res)
+  | Type.(Prim Float),                        DivOp -> G.i (Binary (Wasm.Values.F64 F64Op.Div))
+  | Type.(Prim Float),                        ModOp -> E.call_import env "rts" "fmod" (* musl *)
+  | Type.(Prim (Int8|Int16|Int32)),           ModOp -> G.i (Binary (Wasm.Values.I32 I32Op.RemS))
+  | Type.(Prim (Nat8|Nat16|Nat32 as ty)),     WPowOp -> TaggedSmallWord.compile_nat_power env ty
+  | Type.(Prim (Int8|Int16|Int32 as ty)),     WPowOp -> TaggedSmallWord.compile_int_power env ty
+  | Type.(Prim ((Nat8|Nat16) as ty)),         PowOp ->
+    Func.share_code2 Func.Always env (prim_fun_name ty "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local env "res" in
+        let bits = TaggedSmallWord.bits_of_type ty in
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_shrU_const Int32.(sub 33l (of_int bits)) ^^
+            G.if1 I32Type
+              begin
+                unsigned_dynamics get_n ^^ compile_sub_const (Int32.of_int bits) ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-30l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ TaggedSmallWord.lsb_adjust ty ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^
+                TaggedSmallWord.compile_nat_power env Type.Nat32 ^^ set_res ^^
+                get_res ^^ enforce_unsigned_bits env bits ^^
+                get_res ^^ TaggedSmallWord.msb_adjust ty
+              end
+              get_n (* n@{0,1} ** (1+exp) == n *)
+          end
+          (compile_unboxed_const
+             Int32.(shift_left one (to_int (TaggedSmallWord.shift_of_type ty))))) (* x ** 0 == 1 *)
+  | Type.(Prim Nat32),                        PowOp ->
+    Func.share_code2 Func.Always env (prim_fun_name Type.Nat32 "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local64 env "res" in
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_shrU_const 1l ^^
+            G.if1 I32Type
+              begin
+                get_exp ^^ compile_unboxed_const 32l ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^ then_arithmetic_overflow env ^^
+                unsigned_dynamics get_n ^^ compile_sub_const 32l ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust Type.Nat32 ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-62l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+                get_exp ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32)) ^^
+                Word64.compile_unsigned_pow env ^^
+                set_res ^^ get_res ^^ enforce_32_unsigned_bits env ^^
+                get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+              end
+              get_n (* n@{0,1} ** (1+exp) == n *)
+          end
+          compile_unboxed_one) (* x ** 0 == 1 *)
+  | Type.(Prim ((Int8|Int16) as ty)),         PowOp ->
+    Func.share_code2 Func.Always env (prim_fun_name ty "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local env "res" in
+        let bits = TaggedSmallWord.bits_of_type ty in
+        get_exp ^^ compile_unboxed_zero ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ E.then_trap_with env "negative power" ^^
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_shrS_const Int32.(sub 33l (of_int bits)) ^^
+            G.if1 I32Type
+              begin
+                signed_dynamics get_n ^^ compile_sub_const (Int32.of_int (bits - 1)) ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-30l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ TaggedSmallWord.lsb_adjust ty ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust ty ^^
+                TaggedSmallWord.compile_nat_power env Type.Nat32 ^^
+                set_res ^^ get_res ^^ get_res ^^ enforce_signed_bits env bits ^^
+                get_res ^^ TaggedSmallWord.msb_adjust ty
+              end
+              get_n (* n@{0,1} ** (1+exp) == n *)
+          end
+          (compile_unboxed_one ^^ TaggedSmallWord.msb_adjust ty)) (* x ** 0 == 1 *)
+  | Type.(Prim Int32),                        PowOp ->
+    Func.share_code2 Func.Always env (prim_fun_name Type.Int32 "pow")
+      (("n", I32Type), ("exp", I32Type)) [I32Type]
+      (fun env get_n get_exp ->
+        let (set_res, get_res) = new_local64 env "res" in
+        get_exp ^^ compile_unboxed_zero ^^
+        G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ E.then_trap_with env "negative power" ^^
+        get_exp ^^
+        G.if1 I32Type
+          begin
+            get_n ^^ compile_unboxed_one ^^ G.i (Compare (Wasm.Values.I32 I32Op.LeS)) ^^
+            get_n ^^ compile_unboxed_const (-1l) ^^ G.i (Compare (Wasm.Values.I32 I32Op.GeS)) ^^
+            G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+            G.if1 I32Type
+              begin
+                get_n ^^ compile_unboxed_zero ^^ G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^
+                G.if1 I32Type
+                  begin
+                    (* -1 ** (1+exp) == if even (1+exp) then 1 else -1 *)
+                    get_exp ^^ compile_unboxed_one ^^ G.i (Binary (Wasm.Values.I32 I32Op.And)) ^^
+                    G.if1 I32Type
+                      get_n
+                      compile_unboxed_one
+                  end
+                  get_n (* n@{0,1} ** (1+exp) == n *)
+              end
+              begin
+                get_exp ^^ compile_unboxed_const 32l ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.GeU)) ^^ then_arithmetic_overflow env ^^
+                signed_dynamics get_n ^^ compile_sub_const 31l ^^
+                get_exp ^^ TaggedSmallWord.lsb_adjust Type.Int32 ^^ G.i (Binary (Wasm.Values.I32 I32Op.Mul)) ^^
+                compile_unboxed_const (-62l) ^^
+                G.i (Compare (Wasm.Values.I32 I32Op.LtS)) ^^ then_arithmetic_overflow env ^^
+                get_n ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+                get_exp ^^ G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+                Word64.compile_unsigned_pow env ^^
+                set_res ^^ get_res ^^ get_res ^^ enforce_32_signed_bits env ^^
+                get_res ^^ G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+              end
+          end
+          compile_unboxed_one) (* x ** 0 == 1 *)
+  | Type.(Prim Int),                          PowOp ->
+    let pow = BigNum.compile_unsigned_pow env in
+    let (set_n, get_n) = new_local env "n" in
+    let (set_exp, get_exp) = new_local env "exp" in
+    set_exp ^^ set_n ^^
+    get_exp ^^ BigNum.compile_is_negative env ^^
+    E.then_trap_with env "negative power" ^^
+    get_n ^^ get_exp ^^ pow
+  | Type.(Prim Nat64),                        WPowOp -> Word64.compile_unsigned_pow env
+  | Type.(Prim Int64),                        WPowOp -> Word64.compile_signed_wpow env
+  | Type.(Prim Nat64),                        PowOp ->
+    compile_Nat64_kernel env "pow"
+      BigNum.compile_unsigned_pow
+      (powNat64_shortcut (Word64.compile_unsigned_pow env))
+  | Type.(Prim Int64),                        PowOp ->
+    let (set_exp, get_exp) = new_local64 env "exp" in
+    set_exp ^^ get_exp ^^
+    compile_const_64 0L ^^
+    G.i (Compare (Wasm.Values.I64 I64Op.LtS)) ^^
+    E.then_trap_with env "negative power" ^^
+    get_exp ^^
+    compile_Int64_kernel
+      env "pow" BigNum.compile_unsigned_pow
+      (powInt64_shortcut (Word64.compile_unsigned_pow env))
+  | Type.(Prim Nat),                          PowOp -> BigNum.compile_unsigned_pow env
+  | Type.(Prim Float),                        PowOp -> E.call_import env "rts" "pow" (* musl *)
+  | Type.(Prim (Nat64|Int64)),                AndOp -> G.i (Binary (Wasm.Values.I64 I64Op.And))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32)),
+                                              AndOp -> G.i (Binary (Wasm.Values.I32 I32Op.And))
+  | Type.(Prim (Nat64|Int64)),                OrOp  -> G.i (Binary (Wasm.Values.I64 I64Op.Or))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32)),
+                                              OrOp  -> G.i (Binary (Wasm.Values.I32 I32Op.Or))
+  | Type.(Prim (Nat64|Int64)),                XorOp -> G.i (Binary (Wasm.Values.I64 I64Op.Xor))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32)),
+                                              XorOp -> G.i (Binary (Wasm.Values.I32 I32Op.Xor))
+  | Type.(Prim (Nat64|Int64)),                ShLOp -> G.i (Binary (Wasm.Values.I64 I64Op.Shl))
+  | Type.(Prim (Nat8|Nat16|Nat32|Int8|Int16|Int32 as ty)),
+                                              ShLOp -> TaggedSmallWord.(
+     lsb_adjust ty ^^ clamp_shift_amount ty ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.Shl)))
+  | Type.(Prim Nat64),                        ShROp -> G.i (Binary (Wasm.Values.I64 I64Op.ShrU))
+  | Type.(Prim (Nat8|Nat16|Nat32 as ty)),     ShROp -> TaggedSmallWord.(
+     lsb_adjust ty ^^ clamp_shift_amount ty ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.ShrU)) ^^
+     sanitize_word_result ty)
+  | Type.(Prim Int64),                        ShROp -> G.i (Binary (Wasm.Values.I64 I64Op.ShrS))
+  | Type.(Prim (Int8|Int16|Int32 as ty)),     ShROp -> TaggedSmallWord.(
+     lsb_adjust ty ^^ clamp_shift_amount ty ^^
+     G.i (Binary (Wasm.Values.I32 I32Op.ShrS)) ^^
+     sanitize_word_result ty)
+  | Type.(Prim (Nat64|Int64)),                RotLOp -> G.i (Binary (Wasm.Values.I64 I64Op.Rotl))
+  | Type.(Prim (Nat32|Int32)),                RotLOp -> G.i (Binary (Wasm.Values.I32 I32Op.Rotl))
+  | Type.(Prim (Nat8|Nat16|Int8|Int16 as ty)),
+                                              RotLOp -> TaggedSmallWord.rotl env ty
+  | Type.(Prim (Nat64|Int64)),                RotROp -> G.i (Binary (Wasm.Values.I64 I64Op.Rotr))
+  | Type.(Prim (Nat32|Int32)),                RotROp -> G.i (Binary (Wasm.Values.I32 I32Op.Rotr))
+  | Type.(Prim (Nat8|Nat16|Int8|Int16 as ty)),
+                                              RotROp -> TaggedSmallWord.rotr env ty
+  | Type.(Prim Text), CatOp -> Text.concat env
+  | Type.Non, _ -> G.i Unreachable
+  | _ -> todo_trap env "compile_binop" (Wasm.Sexpr.Node ("BinOp", [ Arrange_ops.binop op; Arrange_type.typ t]))
+  )
+
+let compile_eq env =
+  let open Type in
+  function
+  | Prim Text -> Text.compare env Operator.EqOp
+  | Prim (Blob|Principal) | Obj (Actor, _) -> Blob.compare env (Some Operator.EqOp)
+  | Func (Shared _, _, _, _, _) -> FuncDec.equate_msgref env
+  | Prim (Nat | Int) -> BigNum.compile_eq env
+  | Prim (Int64 | Nat64) -> G.i (Compare (Wasm.Values.I64 I64Op.Eq))
+  | Prim (Bool | Int8 | Nat8 | Int16 | Nat16 | Int32 | Nat32 | Char) ->
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+  | Non -> G.i Unreachable
+  | Prim Float -> G.i (Compare (Wasm.Values.F64 F64Op.Eq))
+  | t -> todo_trap env "compile_eq" (Arrange_type.typ t)
+
+let get_relops = Operator.(function
+  | GeOp -> Ge, I64Op.GeU, I64Op.GeS, I32Op.GeU, I32Op.GeS
+  | GtOp -> Gt, I64Op.GtU, I64Op.GtS, I32Op.GtU, I32Op.GtS
+  | LeOp -> Le, I64Op.LeU, I64Op.LeS, I32Op.LeU, I32Op.LeS
+  | LtOp -> Lt, I64Op.LtU, I64Op.LtS, I32Op.LtU, I32Op.LtS
+  | NeqOp -> assert false
+  | _ -> failwith "uncovered relop")
+
+let compile_comparison env t op =
+  let bigintop, u64op, s64op, u32op, s32op = get_relops op in
+  let open Type in
+  match t with
+    | Nat | Int -> BigNum.compile_relop env bigintop
+    | Nat64 -> G.i (Compare (Wasm.Values.I64 u64op))
+    | Nat8 | Nat16 | Nat32 | Char -> G.i (Compare (Wasm.Values.I32 u32op))
+    | Int64 -> G.i (Compare (Wasm.Values.I64 s64op))
+    | Int8 | Int16 | Int32 -> G.i (Compare (Wasm.Values.I32 s32op))
+    | _ -> todo_trap env "compile_comparison" (Arrange_type.prim t)
+
+let compile_relop env t op =
+  if t = Type.Non then SR.Vanilla, G.i Unreachable else
+  StackRep.of_type t,
+  let open Operator in
+  match t, op with
+  | Type.(Prim Text), _ -> Text.compare env op
+  | Type.(Prim (Blob|Principal)), _ -> Blob.compare env (Some op)
+  | _, EqOp -> compile_eq env t
+  | Type.(Prim (Nat | Nat8 | Nat16 | Nat32 | Nat64 | Int | Int8 | Int16 | Int32 | Int64 | Char as t1)), op1 ->
+    compile_comparison env t1 op1
+  | Type.(Prim Float), GtOp -> G.i (Compare (Wasm.Values.F64 F64Op.Gt))
+  | Type.(Prim Float), GeOp -> G.i (Compare (Wasm.Values.F64 F64Op.Ge))
+  | Type.(Prim Float), LeOp -> G.i (Compare (Wasm.Values.F64 F64Op.Le))
+  | Type.(Prim Float), LtOp -> G.i (Compare (Wasm.Values.F64 F64Op.Lt))
+  | _ -> todo_trap env "compile_relop" (Arrange_ops.relop op)
+
+let compile_load_field env typ name =
+  Object.load_idx env typ name
+
+
+(* compile_lexp is used for expressions on the left of an assignment operator.
+   Produces
+   * preparation code, to run first
+   * an expected stack rep
+   * code that expects the value to be written in that stackrep, and consumes it
+*)
+let rec compile_lexp (env : E.t) ae lexp : G.t * SR.t * G.t =
+  (fun (code, sr, fill_code) -> G.(with_region lexp.at code, sr, with_region lexp.at fill_code)) @@
+  match lexp.it, !Flags.gc_strategy with
+  | VarLE var, _ -> Var.set_val env ae var
+  | IdxLE (e1, e2), Flags.Generational when potential_pointer (Arr.element_type env e1.note.Note.typ) ->
+    let (set_field, get_field) = new_local env "field" in
+    compile_array_index env ae e1 e2 ^^
+    set_field ^^ (* peepholes to tee *)
+    get_field,
+    SR.Vanilla,
+    store_ptr ^^
+    get_field ^^
+    compile_add_const ptr_unskew ^^
+    E.call_import env "rts" "post_write_barrier"
+  | IdxLE (e1, e2), Flags.Incremental when potential_pointer (Arr.element_type env e1.note.Note.typ) ->
+    compile_array_index env ae e1 e2 ^^
+    compile_add_const ptr_unskew,
+    SR.Vanilla,
+    Tagged.write_with_barrier env
+  | IdxLE (e1, e2), _ ->
+    compile_array_index env ae e1 e2,
+    SR.Vanilla,
+    store_ptr
+  | DotLE (e, n), Flags.Generational when potential_pointer (Object.field_type env e.note.Note.typ n) ->
+    let (set_field, get_field) = new_local env "field" in
+    compile_exp_vanilla env ae e ^^
+    Object.idx env e.note.Note.typ n ^^
+    set_field ^^ (* peepholes to tee *)
+    get_field,
+    SR.Vanilla,
+    store_ptr ^^
+    get_field ^^
+    compile_add_const ptr_unskew ^^
+    E.call_import env "rts" "post_write_barrier"
+  | DotLE (e, n), Flags.Incremental when potential_pointer (Object.field_type env e.note.Note.typ n) ->
+    compile_exp_vanilla env ae e ^^
+    (* Only real objects have mutable fields, no need to branch on the tag *)
+    Object.idx env e.note.Note.typ n ^^
+    compile_add_const ptr_unskew,
+    SR.Vanilla,
+    Tagged.write_with_barrier env
+  | DotLE (e, n), _ ->
+    compile_exp_vanilla env ae e ^^
+    (* Only real objects have mutable fields, no need to branch on the tag *)
+    Object.idx env e.note.Note.typ n,
+    SR.Vanilla,
+    store_ptr
+
+(* Common code for a[e] as lexp and as exp.
+Traps or pushes the pointer to the element on the stack
+*)
+and compile_array_index env ae e1 e2 =
+    compile_exp_vanilla env ae e1 ^^ (* offset to array *)
+    compile_exp_vanilla env ae e2 ^^ (* idx *)
+    Arr.idx_bigint env
+
+and compile_prim_invocation (env : E.t) ae p es at =
+  (* for more concise code when all arguments and result use the same sr *)
+  let const_sr sr inst = sr, G.concat_map (compile_exp_as env ae sr) es ^^ inst in
+
+  begin match p, es with
+  (* Calls *)
+  | CallPrim _, [e1; e2] ->
+    let sort, control, _, arg_tys, ret_tys = Type.as_func e1.note.Note.typ in
+    let n_args = List.length arg_tys in
+    let return_arity = match control with
+      | Type.Returns -> List.length ret_tys
+      | Type.Replies -> 0
+      | Type.Promises -> assert false in
+
+    let fun_sr, code1 = compile_exp env ae e1 in
+
+    (* we duplicate this pattern match to emulate pattern guards *)
+    let call_as_prim = match fun_sr, sort with
+      | SR.Const (_, Const.Fun (mk_fi, Const.PrimWrapper prim)), _ ->
+         begin match n_args, e2.it with
+         | 0, _ -> true
+         | 1, _ -> true
+         | n, PrimE (TupPrim, es) when List.length es = n -> true
+         | _, _ -> false
+         end
+      | _ -> false in
+
+    begin match fun_sr, sort with
+      | SR.Const (_, Const.Fun (mk_fi, Const.PrimWrapper prim)), _ when call_as_prim ->
+         assert (sort = Type.Local);
+         (* Handle argument tuples *)
+         begin match n_args, e2.it with
+         | 0, _ ->
+           let sr, code2 = compile_prim_invocation env ae prim [] at in
+           sr,
+           code1 ^^
+           compile_exp_as env ae (StackRep.of_arity 0) e2 ^^
+           code2
+         | 1, _ ->
+           compile_prim_invocation env ae prim [e2] at
+         | n, PrimE (TupPrim, es) ->
+           assert (List.length es = n);
+           compile_prim_invocation env ae prim es at
+         | _, _ ->
+           (* ugly case; let's just call this as a function for now *)
+           raise (Invalid_argument "call_as_prim was true?")
+         end
+      | SR.Const (_, Const.Fun (mk_fi, _)), _ ->
+         assert (sort = Type.Local);
+         StackRep.of_arity return_arity,
+
+         code1 ^^
+         compile_unboxed_zero ^^ (* A dummy closure *)
+         compile_exp_as env ae (StackRep.of_arity n_args) e2 ^^ (* the args *)
+         G.i (Call (nr (mk_fi ()))) ^^
+         FakeMultiVal.load env (Lib.List.make return_arity I32Type)
+      | _, Type.Local ->
+         let (set_clos, get_clos) = new_local env "clos" in
+
+         StackRep.of_arity return_arity,
+         code1 ^^ StackRep.adjust env fun_sr SR.Vanilla ^^
+         set_clos ^^
+         get_clos ^^
+         Closure.prepare_closure_call env ^^
+         compile_exp_as env ae (StackRep.of_arity n_args) e2 ^^
+         get_clos ^^
+         Closure.call_closure env n_args return_arity
+      | _, Type.Shared _ ->
+         (* Non-one-shot functions have been rewritten in async.ml *)
+         assert (control = Type.Returns);
+
+         let (set_meth_pair, get_meth_pair) = new_local env "meth_pair" in
+         let (set_arg, get_arg) = new_local env "arg" in
+         let _, _, _, ts, _ = Type.as_func e1.note.Note.typ in
+         let add_cycles = Internals.add_cycles env ae in
+
+         StackRep.of_arity return_arity,
+         code1 ^^ StackRep.adjust env fun_sr SR.Vanilla ^^
+         set_meth_pair ^^
+         compile_exp_vanilla env ae e2 ^^ set_arg ^^
+
+         FuncDec.ic_call_one_shot env ts get_meth_pair get_arg add_cycles
+    end
+
+  (* Operators *)
+  | UnPrim (_, Operator.PosOp), [e1] -> compile_exp env ae e1
+  | UnPrim (t, op), [e1] ->
+    let sr_in, sr_out, code = compile_unop env t op in
+    sr_out,
+    compile_exp_as env ae sr_in e1 ^^
+    code
+  | BinPrim (t, op), [e1;e2] ->
+    let sr_in, sr_out, code = compile_binop env t op in
+    sr_out,
+    compile_exp_as env ae sr_in e1 ^^
+    compile_exp_as env ae sr_in e2 ^^
+    code
+  (* special case: recognize negation *)
+  | RelPrim (Type.(Prim Bool), Operator.EqOp), [e1; {it = LitE (BoolLit false); _}] ->
+    SR.bool,
+    compile_exp_as_test env ae e1 ^^
+    G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+  | RelPrim (t, op), [e1;e2] ->
+    let sr, code = compile_relop env t op in
+    SR.bool,
+    compile_exp_as env ae sr e1 ^^
+    compile_exp_as env ae sr e2 ^^
+    code
+
+  (* Tuples *)
+  | TupPrim, es ->
+    SR.UnboxedTuple (List.length es),
+    G.concat_map (compile_exp_vanilla env ae) es
+  | ProjPrim n, [e1] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^ (* offset to tuple (an array) *)
+    Tuple.load_n env (Int32.of_int n)
+
+  | OptPrim, [e] ->
+    SR.Vanilla,
+    Opt.inject env (compile_exp_vanilla env ae e)
+  | TagPrim l, [e] ->
+    SR.Vanilla,
+    Variant.inject env l (compile_exp_vanilla env ae e)
+
+  | DotPrim name, [e] ->
+    let sr, code1 = compile_exp env ae e in
+    begin match sr with
+    | SR.Const (_, Const.Obj fs) ->
+      let c = List.assoc name fs in
+      SR.Const c, code1
+    | _ ->
+      SR.Vanilla,
+      code1 ^^ StackRep.adjust env sr SR.Vanilla ^^
+      Object.load_idx env e.note.Note.typ name
+    end
+  | ActorDotPrim name, [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    IC.actor_public_field env name
+
+  | ArrayPrim (m, t), es ->
+    SR.Vanilla,
+    Arr.lit env (List.map (compile_exp_vanilla env ae) es)
+  | IdxPrim, [e1; e2] ->
+    SR.Vanilla,
+    compile_array_index env ae e1 e2 ^^
+    load_ptr
+  (* NB: all these operations assume a valid array offset fits in a compact bignum *)
+  | NextArrayOffset, [e] ->
+    let one_untagged = Int32.shift_left 1l (32 - BitTagged.ubits_of Type.Int) in
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^ (* previous byte offset to array *)
+    compile_add_const one_untagged (* preserving the tag in low bits *)
+  | EqArrayOffset, [e1; e2] ->
+    SR.bool,
+    compile_exp_vanilla env ae e1 ^^
+    BitTagged.sanity_check_tag __LINE__ env Type.Int ^^
+    compile_exp_vanilla env ae e2 ^^
+    BitTagged.sanity_check_tag __LINE__ env Type.Int ^^
+    (* equate (without untagging) *)
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+  | DerefArrayOffset, [e1; e2] ->
+    SR.Vanilla,
+    (* NB: no bounds check on index *)
+    compile_exp_vanilla env ae e1 ^^ (* skewed pointer to array *)
+    Tagged.load_forwarding_pointer env ^^
+    compile_exp_vanilla env ae e2 ^^ (* byte offset *)
+    BitTagged.untag_i32 __LINE__ env Type.Int ^^
+    compile_shl_const 2l ^^ (* effectively a multiplication by word_size *)
+    (* Note: the below two lines compile to `i32.add; i32.load offset=OFFSET`
+       with OFFSET = 13 with forwarding pointers and OFFSET = 9 without forwarding pointers,
+       thus together also unskewing the pointer and skipping administrative
+       fields, effectively arriving at the desired element *)
+    G.i (Binary (Wasm.Values.I32 I32Op.Add)) ^^
+    (* Not using Tagged.load_field since it is not a proper pointer to the array start *)
+    Heap.load_field (Arr.header_size env) (* loads the element at the byte offset *)
+  | GetLastArrayOffset, [e] ->
+    assert (BitTagged.can_tag_const Type.Int (Int64.of_int32 (Int32.sub (Arr.max_array_size env) 1l)));
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^ (* array *)
+    Arr.len env ^^
+    compile_sub_const 1l ^^
+    BigNum.from_signed_word_compact env
+
+  | BreakPrim name, [e] ->
+    let d = VarEnv.get_label_depth ae name in
+    SR.Unreachable,
+    compile_exp_vanilla env ae e ^^
+    G.branch_to_ d
+  | AssertPrim, [e1] ->
+    SR.unit,
+    compile_exp_as env ae SR.bool e1 ^^
+    G.if0 G.nop (IC.fail_assert env at)
+  | RetPrim, [e] ->
+    SR.Unreachable,
+    compile_exp_as env ae (StackRep.of_arity (E.get_return_arity env)) e ^^
+    FakeMultiVal.store env (Lib.List.make (E.get_return_arity env) I32Type) ^^
+    G.i Return
+
+  (* Numeric conversions *)
+  | NumConvWrapPrim (t1, t2), [e] -> begin
+    let open Type in
+    match t1, t2 with
+    | (Nat|Int), (Nat8|Nat16|Int8|Int16) ->
+      SR.UnboxedWord32 t2, (* ! *)
+      compile_exp_vanilla env ae e ^^
+      Prim.prim_intToWordNShifted env (TaggedSmallWord.shift_of_type t2)
+    | (Nat|Int), ((Nat32|Int32 as p)) ->
+      SR.UnboxedWord32 p,
+      compile_exp_vanilla env ae e ^^
+      Prim.prim_intToWord32 env
+
+    | (Nat|Int), (Nat64|Int64 as p) ->
+      SR.UnboxedWord64 p,
+      compile_exp_vanilla env ae e ^^
+      BigNum.truncate_to_word64 env
+
+    | Nat64, Int64 | Int64, Nat64 ->
+      SR.UnboxedWord64 t2,
+      compile_exp_as env ae (SR.UnboxedWord64 t1) e
+    | Nat32, Int32 | Int32, Nat32 ->
+      SR.UnboxedWord32 t2,
+      compile_exp_as env ae (SR.UnboxedWord32 t1) e
+    | Nat16, Int16 | Int16, Nat16
+    | Nat8, Int8 | Int8, Nat8 ->
+      SR.UnboxedWord32 t2,
+      compile_exp_as env ae (SR.UnboxedWord32 t1) e
+    | Char, Nat32 ->
+      SR.UnboxedWord32 Nat32,
+      compile_exp_as env ae (SR.UnboxedWord32 t1) e ^^
+      TaggedSmallWord.lsb_adjust_codepoint env
+
+    | _ -> SR.Unreachable, todo_trap env "compile_prim_invocation" (Arrange_ir.prim p)
+    end
+
+  | NumConvTrapPrim (t1, t2), [e] -> begin
+    let open Type in
+    match t1, t2 with
+
+    | Int, Int64 ->
+      SR.UnboxedWord64 Int64,
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 Func.Never env "Int->Int64" ("n", I32Type) [I64Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_signed_bits env 64 ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word64 env)
+
+    | Int, (Int8|Int16|Int32 as pty) ->
+      StackRep.of_type (Prim pty),
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 Func.Never env (prim_fun_name pty "Int->") ("n", I32Type) [I32Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_signed_bits env (TaggedSmallWord.bits_of_type pty) ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word32 env ^^
+        TaggedSmallWord.msb_adjust pty)
+
+    | Nat, Nat64 ->
+      SR.UnboxedWord64 Nat64,
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 Func.Never env "Nat->Nat64" ("n", I32Type) [I64Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_unsigned_bits env 64 ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word64 env)
+
+    | Nat, (Nat8|Nat16|Nat32 as pty) ->
+      StackRep.of_type (Prim pty),
+      compile_exp_vanilla env ae e ^^
+      Func.share_code1 Func.Never env (prim_fun_name pty "Nat->") ("n", I32Type) [I32Type] (fun env get_n ->
+        get_n ^^
+        BigNum.fits_unsigned_bits env (TaggedSmallWord.bits_of_type pty) ^^
+        E.else_trap_with env "losing precision" ^^
+        get_n ^^
+        BigNum.truncate_to_word32 env ^^
+        TaggedSmallWord.msb_adjust pty)
+
+    | (Nat8|Nat16), Nat ->
+      SR.Vanilla,
+      compile_exp_as env ae (SR.UnboxedWord32 t1) e ^^
+      Prim.prim_shiftWordNtoUnsigned env (TaggedSmallWord.shift_of_type t1)
+
+    | (Int8|Int16), Int ->
+      SR.Vanilla,
+      compile_exp_as env ae (SR.UnboxedWord32 t1) e ^^
+      Prim.prim_shiftWordNtoSigned env (TaggedSmallWord.shift_of_type t1)
+
+    | Nat32, Nat ->
+      SR.Vanilla,
+      compile_exp_as env ae (SR.UnboxedWord32 Nat32) e ^^
+      Prim.prim_word32toNat env
+
+    | Int32, Int ->
+      SR.Vanilla,
+      compile_exp_as env ae (SR.UnboxedWord32 Int32) e ^^
+      Prim.prim_word32toInt env
+
+    | Nat64, Nat ->
+      SR.Vanilla,
+      compile_exp_as env ae (SR.UnboxedWord64 Nat64) e ^^
+      BigNum.from_word64 env
+
+    | Int64, Int ->
+      SR.Vanilla,
+      compile_exp_as env ae (SR.UnboxedWord64 Int64) e ^^
+      BigNum.from_signed_word64 env
+
+    | Nat32, Char ->
+      SR.UnboxedWord32 Type.Char, (* ! *)
+      compile_exp_as env ae (SR.UnboxedWord32 Nat32) e ^^
+      TaggedSmallWord.check_and_msb_adjust_codepoint env (* TBR *)
+
+    | Float, Int ->
+      SR.Vanilla,
+      compile_exp_as env ae SR.UnboxedFloat64 e ^^
+      E.call_import env "rts" "bigint_of_float64"
+
+    | Int, Float ->
+      SR.UnboxedFloat64,
+      compile_exp_vanilla env ae e ^^
+      let set_b, get_b = new_local env "b" in
+      set_b ^^
+      get_b ^^
+      BitTagged.if_tagged_scalar env [F64Type]
+        (get_b ^^
+         BitTagged.untag_i32 __LINE__ env Type.Int ^^
+         G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32)) ^^
+         G.i (Convert (Wasm.Values.F64 F64Op.ConvertSI64)))
+        (get_b ^^
+         E.call_import env "rts" "bigint_to_float64")
+
+    | Float, Int64 ->
+      SR.UnboxedWord64 Int64,
+      compile_exp_as env ae SR.UnboxedFloat64 e ^^
+      G.i (Convert (Wasm.Values.I64 I64Op.TruncSF64))
+
+    | Int64, Float ->
+      SR.UnboxedFloat64,
+      compile_exp_as env ae (SR.UnboxedWord64 Int64) e ^^
+      G.i (Convert (Wasm.Values.F64 F64Op.ConvertSI64))
+    | Nat8, Nat16 ->
+      SR.UnboxedWord32 Nat16,
+      compile_exp_as env ae (SR.UnboxedWord32 Nat8) e ^^
+      TaggedSmallWord.lsb_adjust Nat8 ^^
+      TaggedSmallWord.msb_adjust Nat16
+    | Nat16, Nat32 ->
+      SR.UnboxedWord32 Nat32,
+      compile_exp_as env ae (SR.UnboxedWord32 Nat16) e ^^
+      TaggedSmallWord.lsb_adjust Type.Nat16 ^^
+      TaggedSmallWord.msb_adjust Nat32 (* NB: a nop for 32-bit present, but not for 64-bit future *)
+    | Nat32, Nat64 ->
+      SR.UnboxedWord64 Nat64,
+      compile_exp_as env ae (SR.UnboxedWord32 Nat32) e ^^
+      G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+    | Nat16, (Nat8 as pty) ->
+      SR.UnboxedWord32 Nat8,
+      let num_bits = (TaggedSmallWord.bits_of_type pty) in
+      let set_val, get_val = new_local env "convertee" in
+      compile_exp_as env ae (SR.UnboxedWord32 Nat16) e ^^
+      set_val ^^
+      get_val ^^
+      compile_shrU_const (Int32.of_int (32 - num_bits)) ^^
+      E.then_trap_with env "losing precision" ^^
+      get_val ^^
+      compile_shl_const (Int32.of_int num_bits)
+    | Nat32, (Nat16 as pty) ->
+      SR.UnboxedWord32 pty, (* ! *)
+      let num_bits = Int32.of_int (TaggedSmallWord.bits_of_type pty) in
+      let set_val, get_val = new_local env "convertee" in
+      compile_exp_as env ae (SR.UnboxedWord32 Nat32) e ^^
+      set_val ^^
+      get_val ^^
+      compile_shrU_const num_bits ^^
+      E.then_trap_with env "losing precision" ^^
+      get_val ^^
+      compile_shl_const num_bits
+    | Nat64, (Nat32 as pty) ->
+      SR.UnboxedWord32 pty,
+      let num_bits = Int64.of_int (TaggedSmallWord.bits_of_type pty) in
+      let set_val, get_val = new_local64 env "convertee" in
+      compile_exp_as env ae (SR.UnboxedWord64 Nat64) e ^^
+      set_val ^^
+      get_val ^^
+      compile_shrU64_const num_bits ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64)) ^^
+      E.then_trap_with env "losing precision" ^^
+      get_val ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+    | Int8, Int16 ->
+      SR.UnboxedWord32 Int16,
+      compile_exp_as env ae (SR.UnboxedWord32 Int8) e ^^
+      (* Optimization of TaggedSmallWord.lsb_adjust Int8 ^^ TabbedSmallWord.msb_adjust Int16 *)
+      compile_shrS_const 8l
+
+    | Int16, Int32 ->
+      SR.UnboxedWord32 Int32,
+      compile_exp_as env ae (SR.UnboxedWord32 Int16) e ^^
+      (* Optimization of TaggedSmallWord.lsb_adjust Int16 ^^ TabbedSmallWord.msb_adjust Int32 *)
+      compile_shrS_const 16l
+    | Int32, Int64 ->
+      SR.UnboxedWord64 Int64,
+      compile_exp_as env ae (SR.UnboxedWord32 Int32) e ^^
+      G.i (Convert (Wasm.Values.I64 I64Op.ExtendSI32))
+    | Int16, (Int8 as pty) ->
+      SR.UnboxedWord32 Int8,
+      let num_bits = (TaggedSmallWord.bits_of_type pty) in
+      let set_val, get_val = new_local env "convertee" in
+      compile_exp_as env ae (SR.UnboxedWord32 Int16)  e ^^
+      set_val ^^
+      get_val ^^
+      compile_shl_const (Int32.of_int num_bits) ^^
+      compile_shrS_const (Int32.of_int num_bits) ^^
+      get_val ^^
+      compile_eq env Type.(Prim Int16) ^^
+      E.else_trap_with env "losing precision" ^^
+      get_val ^^
+      compile_shl_const (Int32.of_int num_bits)
+    | Int32, (Int16 as pty) ->
+      SR.UnboxedWord32 Int16, (*!*)
+      let num_bits = (TaggedSmallWord.bits_of_type pty) in
+      let set_val, get_val = new_local env "convertee" in
+      compile_exp_as env ae (SR.UnboxedWord32 Int32) e ^^
+      set_val ^^
+      get_val ^^
+      compile_shl_const (Int32.of_int num_bits) ^^
+      compile_shrS_const (Int32.of_int num_bits) ^^
+      get_val ^^
+      compile_eq env Type.(Prim Nat32) ^^
+      E.else_trap_with env "losing precision" ^^
+      get_val ^^
+      compile_shl_const (Int32.of_int num_bits)
+    | Int64, (Int32 as pty) ->
+      SR.UnboxedWord32 pty,
+      let num_bits = (TaggedSmallWord.bits_of_type pty) in
+      let set_val, get_val = new_local64 env "convertee" in
+      compile_exp_as env ae (SR.UnboxedWord64 Int64) e ^^
+      set_val ^^
+      get_val ^^
+      compile_shl64_const (Int64.of_int num_bits) ^^
+      compile_shrS64_const (Int64.of_int num_bits) ^^
+      get_val ^^
+      compile_eq env Type.(Prim Nat64) ^^
+      E.else_trap_with env "losing precision" ^^
+      get_val ^^
+      G.i (Convert (Wasm.Values.I32 I32Op.WrapI64))
+    | _ -> SR.Unreachable, todo_trap env "compile_prim_invocation" (Arrange_ir.prim p)
+    end
+
+  | SerializePrim ts, [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Serialization.serialize env ts ^^
+    Blob.of_ptr_size env
+
+  | DeserializePrim ts, [e] ->
+    StackRep.of_arity (List.length ts),
+    compile_exp_vanilla env ae e ^^
+    Bool.lit false ^^ (* can't recover *)
+    Serialization.deserialize_from_blob false env ts
+
+  | DeserializeOptPrim ts, [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Bool.lit true ^^ (* can (!) recover *)
+    Serialization.deserialize_from_blob false env ts ^^
+    begin match ts with
+    | [] ->
+      (* return some () *)
+      Opt.inject env (Tuple.compile_unit env)
+    | [t] ->
+      (* save to local, propagate error as null or return some value *)
+      let (set_val, get_val) = new_local env "val" in
+      set_val ^^
+      get_val ^^
+      compile_eq_const (Serialization.coercion_error_value env) ^^
+      G.if1 I32Type
+        (Opt.null_lit env)
+        (Opt.inject env get_val)
+    | ts ->
+      (* propagate any errors as null or return some tuples using shared code *)
+      let n = List.length ts in
+      let name = Printf.sprintf "to_opt_%i_tuple" n in
+      let args = Lib.List.table n (fun i -> (Printf.sprintf "arg%i" i, I32Type)) in
+      Func.share_code Func.Always env name args [I32Type] (fun env getters ->
+        let locals =
+          Lib.List.table n (fun i -> List.nth getters i) in
+        let rec go ls =
+          match ls with
+          | get_val::ls' ->
+            get_val ^^
+            compile_eq_const (Serialization.coercion_error_value env) ^^
+            G.if1 I32Type
+              (Opt.null_lit env)
+              (go ls')
+          | [] ->
+            Opt.inject env (Arr.lit env locals)
+        in
+        go locals)
+    end
+
+  | ICPerformGC, [] ->
+    SR.unit,
+    GC.collect_garbage env
+
+  | ICStableSize t, [e] ->
+    SR.UnboxedWord64  Type.Nat64,
+    let (tydesc, _, _) = Serialization.type_desc env [t] in
+    let tydesc_len = Int32.of_int (String.length tydesc) in
+    compile_exp_vanilla env ae e ^^
+    Serialization.buffer_size env t ^^
+    G.i Drop ^^
+    compile_add_const tydesc_len ^^
+    G.i (Convert (Wasm.Values.I64 I64Op.ExtendUI32))
+
+  (* Other prims, unary *)
+
+  | OtherPrim "array_len", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Arr.len env ^^
+    BigNum.from_word32 env
+
+  | OtherPrim "text_len", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Text.len_nat env
+  | OtherPrim "text_iter", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Text.iter env
+  | OtherPrim "text_iter_done", [e] ->
+    SR.bool, compile_exp_vanilla env ae e ^^ Text.iter_done env
+  | OtherPrim "text_iter_next", [e] ->
+    SR.UnboxedWord32 Type.Char, compile_exp_vanilla env ae e ^^ Text.iter_next env
+  | OtherPrim "text_compare", [e1; e2] ->
+    SR.UnboxedWord32 Type.Int8,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_vanilla env ae e2 ^^
+    E.call_import env "rts" "text_compare" ^^
+    TaggedSmallWord.msb_adjust Type.Int8
+  | OtherPrim "blob_compare", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_vanilla env ae e2 ^^
+    Blob.compare env None
+
+  | OtherPrim "blob_size", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Blob.len_nat env
+  | OtherPrim "blob_vals_iter", [e] ->
+    SR.Vanilla, compile_exp_vanilla env ae e ^^ Blob.iter env
+  | OtherPrim "blob_iter_done", [e] ->
+    SR.bool, compile_exp_vanilla env ae e ^^ Blob.iter_done env
+  | OtherPrim "blob_iter_next", [e] ->
+    SR.UnboxedWord32 Type.Nat8, (* ! *)
+    compile_exp_vanilla env ae e ^^ Blob.iter_next env
+
+  | OtherPrim "lsh_Nat", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e2 ^^
+    BigNum.compile_lsh env
+
+  | OtherPrim "rsh_Nat", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e1 ^^
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e2 ^^
+    BigNum.compile_rsh env
+
+  | OtherPrim "abs", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    BigNum.compile_abs env
+
+  | OtherPrim "fabs", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Abs))
+
+  | OtherPrim "fsqrt", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Sqrt))
+
+  | OtherPrim "fceil", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Ceil))
+
+  | OtherPrim "ffloor", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Floor))
+
+  | OtherPrim "ftrunc", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Trunc))
+
+  | OtherPrim "fnearest", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    G.i (Unary (Wasm.Values.F64 F64Op.Nearest))
+
+  | OtherPrim "fmin", [e; f] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    G.i (Binary (Wasm.Values.F64 F64Op.Min))
+
+  | OtherPrim "fmax", [e; f] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    G.i (Binary (Wasm.Values.F64 F64Op.Max))
+
+  | OtherPrim "fcopysign", [e; f] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    G.i (Binary (Wasm.Values.F64 F64Op.CopySign))
+
+  | OtherPrim "Float->Text", [e] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Nat8 6) ^^
+    compile_unboxed_const (TaggedSmallWord.vanilla_lit Type.Nat8 0) ^^
+    E.call_import env "rts" "float_fmt"
+
+  | OtherPrim "fmtFloat->Text", [f; prec; mode] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.UnboxedFloat64 f ^^
+    compile_exp_vanilla env ae prec ^^
+    compile_exp_vanilla env ae mode ^^
+    E.call_import env "rts" "float_fmt"
+
+  | OtherPrim "fsin", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "sin" (* musl *)
+
+  | OtherPrim "fcos", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "cos" (* musl *)
+
+  | OtherPrim "ftan", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "tan" (* musl *)
+
+  | OtherPrim "fasin", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "asin" (* musl *)
+
+  | OtherPrim "facos", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "acos" (* musl *)
+
+  | OtherPrim "fatan", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "atan" (* musl *)
+
+  | OtherPrim "fatan2", [y; x] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 y ^^
+    compile_exp_as env ae SR.UnboxedFloat64 x ^^
+    E.call_import env "rts" "atan2" (* musl *)
+
+  | OtherPrim "fexp", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "exp" (* musl *)
+
+  | OtherPrim "flog", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.UnboxedFloat64 e ^^
+    E.call_import env "rts" "log" (* musl *)
+
+  (* Other prims, nullary *)
+
+  | SystemTimePrim, [] ->
+    SR.UnboxedWord64 Type.Nat64,
+    IC.get_system_time env
+
+  | OtherPrim "call_perform_status", [] ->
+    SR.UnboxedWord32 Type.Nat32,
+    IC.get_call_perform_status env
+
+  | OtherPrim "call_perform_message", [] ->
+    SR.Vanilla,
+    IC.get_call_perform_message env
+
+  | OtherPrim "rts_version", [] ->
+    SR.Vanilla,
+    E.call_import env "rts" "version"
+
+  | OtherPrim "rts_heap_size", [] ->
+    SR.Vanilla,
+    Heap.get_heap_size env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_memory_size", [] ->
+    SR.Vanilla,
+    Heap.get_memory_size ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_total_allocation", [] ->
+    SR.Vanilla,
+    Heap.get_total_allocation env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_reclaimed", [] ->
+    SR.Vanilla,
+    Heap.get_reclaimed env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_max_live_size", [] ->
+    SR.Vanilla,
+    Heap.get_max_live_size env ^^ BigNum.from_word32 env
+
+  | OtherPrim "rts_max_stack_size", [] ->
+    SR.Vanilla,
+    Stack.get_max_stack_size env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_callback_table_count", [] ->
+    SR.Vanilla,
+    ContinuationTable.count env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_callback_table_size", [] ->
+    SR.Vanilla,
+    ContinuationTable.size env ^^ Prim.prim_word32toNat env
+
+  | OtherPrim "rts_mutator_instructions", [] ->
+    SR.Vanilla,
+    GC.get_mutator_instructions env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_collector_instructions", [] ->
+    SR.Vanilla,
+    GC.get_collector_instructions env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_stable_memory_size", [] ->
+    SR.Vanilla,
+    StableMem.stable64_size env ^^ BigNum.from_word64 env
+
+  | OtherPrim "rts_logical_stable_memory_size", [] ->
+    SR.Vanilla,
+    StableMem.get_mem_size env ^^ BigNum.from_word64 env
+
+  (* Regions *)
+
+  | OtherPrim "regionNew", [] ->
+    SR.Vanilla,
+    Region.new_ env
+
+  | OtherPrim "regionId", [e0] ->
+     SR.Vanilla,
+     compile_exp_as env ae SR.Vanilla e0 ^^
+     Region.id env ^^
+     BigNum.from_word64 env
+
+  | OtherPrim ("regionGrow"), [e0; e1] ->
+    SR.UnboxedWord64 Type.Nat64,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    Region.grow env
+
+  | OtherPrim "regionSize", [e0] ->
+    SR.UnboxedWord64 Type.Nat64,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    Region.size env
+
+  | OtherPrim ("regionLoadBlob"), [e0; e1; e2] ->
+    SR.Vanilla,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^
+    Blob.lit env "Blob size out of bounds" ^^
+    BigNum.to_word32_with env ^^
+    Region.load_blob env
+
+  | OtherPrim ("regionStoreBlob"), [e0; e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^
+    Region.store_blob env
+
+  | OtherPrim (("regionLoadNat8" | "regionLoadInt8" as p)), [e0; e1] ->
+    let ty = Type.(if p = "regionLoadNat8" then Nat8 else Int8) in
+    SR.UnboxedWord32 ty,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    Region.load_word8 env ^^
+    TaggedSmallWord.msb_adjust ty
+
+  | OtherPrim (("regionStoreNat8" | "regionStoreInt8") as p), [e0; e1; e2] ->
+    let ty = Type.(if p = "regionStoreNat8" then Nat8 else Int8) in
+    SR.unit,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae (SR.UnboxedWord32 ty) e2 ^^
+    TaggedSmallWord.lsb_adjust ty ^^
+    Region.store_word8 env
+
+  | OtherPrim (("regionLoadNat16" | "regionLoadInt16") as p), [e0; e1] ->
+    let ty = Type.(if p = "regionLoadNat16" then Nat16 else Int16) in
+    SR.UnboxedWord32 ty,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    Region.load_word16 env ^^
+    TaggedSmallWord.msb_adjust ty
+
+  | OtherPrim (("regionStoreNat16" | "regionStoreInt16") as p), [e0; e1; e2] ->
+    SR.unit,
+    let ty = Type.(if p = "regionStoreNat16" then Nat16 else Int16) in
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae (SR.UnboxedWord32 ty) e2 ^^
+    TaggedSmallWord.lsb_adjust ty ^^
+    Region.store_word16 env
+
+  | OtherPrim (("regionLoadNat32" | "regionLoadInt32") as p), [e0; e1] ->
+    SR.UnboxedWord32 Type.(if p = "regionLoadNat32" then Nat32 else Int32),
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    Region.load_word32 env
+
+  | OtherPrim (("regionStoreNat32" | "regionStoreInt32") as p), [e0; e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae
+      (SR.UnboxedWord32 Type.(if p = "regionStoreNat32" then Nat32 else Int32)) e2 ^^
+    Region.store_word32 env
+
+  | OtherPrim (("regionLoadNat64" | "regionLoadInt64") as p), [e0; e1] ->
+    (SR.UnboxedWord64 Type.(if p = "regionLoadNat64" then Nat64 else Int64)),
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    Region.load_word64 env
+
+  | OtherPrim (("regionStoreNat64" | "regionStoreInt64") as p), [e0; e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae
+      (SR.UnboxedWord64 Type.(if p = "regionStoreNat64" then Nat64 else Int64))
+      e2 ^^
+    Region.store_word64 env
+
+  | OtherPrim ("regionLoadFloat"), [e0; e1] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    Region.load_float64 env
+
+  | OtherPrim ("regionStoreFloat"), [e0; e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae SR.Vanilla e0 ^^
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae SR.UnboxedFloat64 e2 ^^
+    Region.store_float64 env
+
+  (* Other prims, unary *)
+
+  | OtherPrim "global_timer_set", [e] ->
+    SR.UnboxedWord64 Type.Nat64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    IC.system_call env "global_timer_set"
+
+  | OtherPrim "is_controller", [e] ->
+    SR.Vanilla,
+    let set_principal, get_principal = new_local env "principal" in
+    compile_exp_vanilla env ae e ^^
+    set_principal ^^ get_principal ^^
+    Blob.payload_ptr_unskewed env ^^
+    get_principal ^^
+    Blob.len env ^^
+    IC.is_controller env
+
+  | OtherPrim "canister_version", [] ->
+    SR.UnboxedWord64 Type.Nat64,
+    IC.canister_version env
+
+  | OtherPrim "crc32Hash", [e] ->
+    SR.UnboxedWord32 Type.Nat32,
+    compile_exp_vanilla env ae e ^^
+    E.call_import env "rts" "compute_crc32"
+
+  | OtherPrim "idlHash", [e] ->
+    SR.Vanilla,
+    E.trap_with env "idlHash only implemented in interpreter"
+
+
+  | OtherPrim "popcnt8", [e] ->
+    SR.UnboxedWord32 Type.Nat8,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat8) e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+    TaggedSmallWord.msb_adjust Type.Nat8
+  | OtherPrim "popcnt16", [e] ->
+    SR.UnboxedWord32 Type.Nat16,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat16) e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+    TaggedSmallWord.msb_adjust Type.Nat16
+  | OtherPrim "popcntInt8", [e] ->
+    SR.UnboxedWord32 Type.Int8,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Int8) e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+    TaggedSmallWord.msb_adjust Type.Int8
+  | OtherPrim "popcntInt16", [e] ->
+    SR.UnboxedWord32 Type.Int16,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Int16) e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt)) ^^
+    TaggedSmallWord.msb_adjust Type.Int16
+  | OtherPrim "popcnt32", [e] ->
+    SR.UnboxedWord32 Type.Nat32,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt))
+  | OtherPrim "popcntInt32", [e] ->
+    SR.UnboxedWord32 Type.Int32,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Int32) e ^^
+    G.i (Unary (Wasm.Values.I32 I32Op.Popcnt))
+  | OtherPrim "popcnt64", [e] ->
+    SR.UnboxedWord64 Type.Nat64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    G.i (Unary (Wasm.Values.I64 I64Op.Popcnt))
+  | OtherPrim "popcntInt64", [e] ->
+    SR.UnboxedWord64 Type.Int64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Int64) e ^^
+    G.i (Unary (Wasm.Values.I64 I64Op.Popcnt))
+  | OtherPrim "clz8", [e] ->
+     SR.UnboxedWord32 Type.Nat8,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Nat8) e ^^
+     TaggedSmallWord.clz_kernel Type.Nat8
+  | OtherPrim "clz16", [e] ->
+     SR.UnboxedWord32 Type.Nat16,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Nat16) e ^^
+     TaggedSmallWord.clz_kernel Type.Nat16
+  | OtherPrim "clzInt8", [e] ->
+     SR.UnboxedWord32 Type.Int8,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Int8) e ^^
+     TaggedSmallWord.clz_kernel Type.Int8
+  | OtherPrim "clzInt16", [e] ->
+     SR.UnboxedWord32 Type.Int16,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Int16) e ^^
+     TaggedSmallWord.clz_kernel Type.Int16
+  | OtherPrim "clz32", [e] ->
+     SR.UnboxedWord32 Type.Nat32,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e ^^ G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+  | OtherPrim "clzInt32", [e] ->
+     SR.UnboxedWord32 Type.Int32,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Int32) e ^^ G.i (Unary (Wasm.Values.I32 I32Op.Clz))
+  | OtherPrim "clz64", [e] ->
+     SR.UnboxedWord64 Type.Nat64,
+     compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz))
+  | OtherPrim "clzInt64", [e] ->
+     SR.UnboxedWord64 Type.Int64,
+     compile_exp_as env ae (SR.UnboxedWord64 Type.Int64) e ^^ G.i (Unary (Wasm.Values.I64 I64Op.Clz))
+  | OtherPrim "ctz8", [e] ->
+     SR.UnboxedWord32 Type.Nat8,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Nat8) e ^^
+     TaggedSmallWord.ctz_kernel Type.Nat8
+  | OtherPrim "ctz16", [e] ->
+     SR.UnboxedWord32 Type.Nat16,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Nat16) e ^^
+     TaggedSmallWord.ctz_kernel Type.Nat16
+  | OtherPrim "ctzInt8", [e] ->
+     SR.UnboxedWord32 Type.Int8,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Int8) e ^^
+     TaggedSmallWord.ctz_kernel Type.Int8
+  | OtherPrim "ctzInt16", [e] ->
+     SR.UnboxedWord32 Type.Int16,
+     compile_exp_as env ae (SR.UnboxedWord32 Type.Int16) e ^^
+     TaggedSmallWord.ctz_kernel Type.Int16
+  | OtherPrim "ctz32", [e] ->
+    SR.UnboxedWord32 Type.Nat32,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e ^^ G.i (Unary (Wasm.Values.I32 I32Op.Ctz))
+  | OtherPrim "ctzInt32", [e] ->
+    SR.UnboxedWord32 Type.Int32,
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Int32) e ^^ G.i (Unary (Wasm.Values.I32 I32Op.Ctz))
+  | OtherPrim "ctz64", [e] ->
+    SR.UnboxedWord64 Type.Nat64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^ G.i (Unary (Wasm.Values.I64 I64Op.Ctz))
+  | OtherPrim "ctzInt64", [e] ->
+    SR.UnboxedWord64 Type.Int64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Int64) e ^^ G.i (Unary (Wasm.Values.I64 I64Op.Ctz))
+
+  | OtherPrim "conv_Char_Text", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Text.prim_showChar env
+
+  | OtherPrim "char_to_upper", [e] ->
+    compile_char_to_char_rts env ae e "char_to_upper"
+
+  | OtherPrim "char_to_lower", [e] ->
+    compile_char_to_char_rts env ae e "char_to_lower"
+
+  | OtherPrim "char_is_whitespace", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_whitespace"
+
+  | OtherPrim "char_is_lowercase", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_lowercase"
+
+  | OtherPrim "char_is_uppercase", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_uppercase"
+
+  | OtherPrim "char_is_alphabetic", [e] ->
+    compile_char_to_bool_rts env ae e "char_is_alphabetic"
+
+  | OtherPrim "print", [e] ->
+    SR.unit,
+    compile_exp_vanilla env ae e ^^
+    IC.print_text env
+
+  | OtherPrim "text_lowercase", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Text.lowercase env
+
+  | OtherPrim "text_uppercase", [e] ->
+    SR.Vanilla,
+    compile_exp_vanilla env ae e ^^
+    Text.uppercase env
+
+  | OtherPrim "performanceCounter", [e] ->
+    (SR.UnboxedWord64 Type.Nat64),
+    compile_exp_as env ae (SR.UnboxedWord32 Type.Nat32) e ^^
+    IC.performance_counter env
+
+  | OtherPrim "trap", [e] ->
+    SR.Unreachable,
+    compile_exp_vanilla env ae e ^^
+    IC.trap_text env
+
+  | OtherPrim ("blobToArray" | "blobToArrayMut"), e ->
+    const_sr SR.Vanilla (Arr.ofBlob env)
+  | OtherPrim ("arrayToBlob" | "arrayMutToBlob"), e ->
+    const_sr SR.Vanilla (Arr.toBlob env)
+
+  | OtherPrim (("stableMemoryLoadNat32" | "stableMemoryLoadInt32") as p), [e] ->
+    (SR.UnboxedWord32 Type.(if p = "stableMemoryLoadNat32" then Nat32 else Int32)),
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    StableMemoryInterface.load_word32 env
+
+  | OtherPrim (("stableMemoryStoreNat32" | "stableMemoryStoreInt32") as p), [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae
+      (SR.UnboxedWord32 Type.(if p = "stableMemoryStoreNat32" then Nat32 else Int32))
+      e2 ^^
+    StableMemoryInterface.store_word32 env
+
+  | OtherPrim (("stableMemoryLoadNat8" | "stableMemoryLoadInt8") as p), [e] ->
+    let ty = Type.(if p = "stableMemoryLoadNat8" then Nat8 else Int8) in
+    SR.UnboxedWord32 ty,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    StableMemoryInterface.load_word8 env ^^
+    TaggedSmallWord.msb_adjust ty
+
+  (* Other prims, binary *)
+
+  | OtherPrim (("stableMemoryStoreNat8" | "stableMemoryStoreInt8") as p), [e1; e2] ->
+    let ty = Type.(if p = "stableMemoryStoreNat8" then Nat8 else Int8) in
+    SR.unit,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae (SR.UnboxedWord32 ty) e2 ^^
+    TaggedSmallWord.lsb_adjust ty ^^
+    StableMemoryInterface.store_word8 env
+
+  | OtherPrim (("stableMemoryLoadNat16" | "stableMemoryLoadInt16") as p), [e] ->
+    let ty = Type.(if p = "stableMemoryLoadNat16" then Nat16 else Int16) in
+    SR.UnboxedWord32 ty,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    StableMemoryInterface.load_word16 env ^^
+    TaggedSmallWord.msb_adjust ty
+
+  | OtherPrim (("stableMemoryStoreNat16" | "stableMemoryStoreInt16") as p), [e1; e2] ->
+    let ty = Type.(if p = "stableMemoryStoreNat16" then Nat16 else Int16) in
+    SR.unit,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae (SR.UnboxedWord32 ty) e2 ^^
+    TaggedSmallWord.lsb_adjust ty ^^
+    StableMemoryInterface.store_word16 env
+
+  | OtherPrim (("stableMemoryLoadNat64" | "stableMemoryLoadInt64") as p), [e] ->
+    (SR.UnboxedWord64 Type.(if p = "stableMemoryLoadNat64" then Nat64 else Int64)),
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    StableMemoryInterface.load_word64 env
+
+  | OtherPrim (("stableMemoryStoreNat64" | "stableMemoryStoreInt64") as p), [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae
+      (SR.UnboxedWord64 Type.(if p = "stableMemoryStoreNat64" then Nat64 else Int64))
+      e2 ^^
+    StableMemoryInterface.store_word64 env
+
+  | OtherPrim "stableMemoryLoadFloat", [e] ->
+    SR.UnboxedFloat64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    StableMemoryInterface.load_float64 env
+
+  | OtherPrim "stableMemoryStoreFloat", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae SR.UnboxedFloat64 e2 ^^
+    StableMemoryInterface.store_float64 env
+
+  | OtherPrim "stableMemoryLoadBlob", [e1; e2] ->
+    SR.Vanilla,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^
+    Blob.lit env "Blob size out of bounds" ^^
+    BigNum.to_word32_with env ^^
+    StableMemoryInterface.load_blob env
+
+  | OtherPrim "stableMemoryStoreBlob", [e1; e2] ->
+    SR.unit,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e1 ^^
+    compile_exp_as env ae SR.Vanilla e2 ^^
+    StableMemoryInterface.store_blob env
+
+  | OtherPrim "stableMemorySize", [] ->
+    SR.UnboxedWord64 Type.Nat64,
+    StableMemoryInterface.size env
+
+  | OtherPrim "stableMemoryGrow", [e] ->
+    SR.UnboxedWord64 Type.Nat64,
+    compile_exp_as env ae (SR.UnboxedWord64 Type.Nat64) e ^^
+    StableMemoryInterface.grow env
+
+  | OtherPrim "stableVarQuery", [] ->
+    SR.UnboxedTuple 2,
+    IC.get_self_reference env ^^
+    Blob.lit env Type.(motoko_stable_var_info_fld.lab)
+
+  (* Other prims, binary*)
+  | OtherPrim "Array.init", [_;_] ->
+    const_sr SR.Vanilla (Arr.init env)
+  | OtherPrim "Array.tabulate", [_;_] ->
+    const_sr SR.Vanilla (Arr.tabulate env)
+  | OtherPrim "btst8", [_;_] ->
+    (* TODO: btstN returns Bool, not a small value *)
+    const_sr (SR.UnboxedWord32 Type.Nat8) (TaggedSmallWord.btst_kernel env Type.Nat8)
+  | OtherPrim "btst16", [_;_] ->
+    const_sr (SR.UnboxedWord32 Type.Nat16) (TaggedSmallWord.btst_kernel env Type.Nat16)
+  | OtherPrim "btstInt8", [_;_] ->
+    const_sr (SR.UnboxedWord32 Type.Int8) (TaggedSmallWord.btst_kernel env Type.Int8)
+  | OtherPrim "btstInt16", [_;_] ->
+    const_sr (SR.UnboxedWord32 Type.Int16) (TaggedSmallWord.btst_kernel env Type.Int16)
+  | OtherPrim "btst32", [_;_] ->
+     const_sr (SR.UnboxedWord32 Type.Nat32) (TaggedSmallWord.btst_kernel env Type.Nat32)
+  | OtherPrim "btstInt32", [_;_] ->
+     const_sr (SR.UnboxedWord32 Type.Int32) (TaggedSmallWord.btst_kernel env Type.Int32) (* ! *)
+  | OtherPrim "btst64", [_;_] ->
+    const_sr (SR.UnboxedWord64 Type.Nat64) (Word64.btst_kernel env)
+  | OtherPrim "btstInt64", [_;_] ->
+    const_sr (SR.UnboxedWord64 Type.Int64) (Word64.btst_kernel env)
+
+  (* Coercions for abstract types *)
+  | CastPrim (_,_), [e] ->
+    compile_exp env ae e
+
+  | DecodeUtf8, [_] ->
+    const_sr SR.Vanilla (Text.of_blob env)
+  | EncodeUtf8, [_] ->
+    const_sr SR.Vanilla (Text.to_blob env)
+
+  (* textual to bytes *)
+  | BlobOfIcUrl, [_] ->
+    const_sr SR.Vanilla (E.call_import env "rts" "blob_of_principal")
+  (* The other direction *)
+  | IcUrlOfBlob, [_] ->
+    const_sr SR.Vanilla (E.call_import env "rts" "principal_of_blob")
+
+  (* Actor ids are blobs in the RTS *)
+  | ActorOfIdBlob _, [e] ->
+    SR.Vanilla,
+    let (set_blob, get_blob) = new_local env "blob" in
+    compile_exp_vanilla env ae e ^^
+    set_blob ^^
+    get_blob ^^
+    Blob.len env ^^
+    compile_unboxed_const 29l ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.LeU)) ^^
+    E.else_trap_with env "blob too long for actor principal" ^^
+    get_blob
+
+  | SelfRef _, [] ->
+    SR.Vanilla, IC.get_self_reference env
+
+  | ICArgDataPrim, [] ->
+    SR.Vanilla, IC.arg_data env
+
+  | ICReplyPrim ts, [e] ->
+    SR.unit, begin match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      compile_exp_vanilla env ae e ^^
+      (* TODO: We can try to avoid the boxing and pass the arguments to
+        serialize individually *)
+      Serialization.serialize env ts ^^
+      IC.reply_with_data env
+    | _ ->
+      E.trap_with env (Printf.sprintf "cannot reply when running locally")
+    end
+
+  | ICRejectPrim, [e] ->
+    SR.unit, IC.reject env (compile_exp_vanilla env ae e)
+
+  | ICCallerPrim, [] ->
+    SR.Vanilla, IC.caller env
+
+  | ICCallPrim, [f;e;k;r] ->
+    SR.unit, begin
+    (* TBR: Can we do better than using the notes? *)
+    let _, _, _, ts1, _ = Type.as_func f.note.Note.typ in
+    let _, _, _, ts2, _ = Type.as_func k.note.Note.typ in
+    let (set_meth_pair, get_meth_pair) = new_local env "meth_pair" in
+    let (set_arg, get_arg) = new_local env "arg" in
+    let (set_k, get_k) = new_local env "k" in
+    let (set_r, get_r) = new_local env "r" in
+    let add_cycles = Internals.add_cycles env ae in
+    compile_exp_vanilla env ae f ^^ set_meth_pair ^^
+    compile_exp_vanilla env ae e ^^ set_arg ^^
+    compile_exp_vanilla env ae k ^^ set_k ^^
+    compile_exp_vanilla env ae r ^^ set_r ^^
+    FuncDec.ic_call env ts1 ts2 get_meth_pair get_arg get_k get_r add_cycles
+    end
+  | ICCallRawPrim, [p;m;a;k;r] ->
+    SR.unit, begin
+    let (set_meth_pair, get_meth_pair) = new_local env "meth_pair" in
+    let (set_arg, get_arg) = new_local env "arg" in
+    let (set_k, get_k) = new_local env "k" in
+    let (set_r, get_r) = new_local env "r" in
+    let add_cycles = Internals.add_cycles env ae in
+    compile_exp_vanilla env ae p ^^
+    compile_exp_vanilla env ae m ^^ Text.to_blob env ^^
+    Tagged.load_forwarding_pointer env ^^
+    Tuple.from_stack env 2 ^^ set_meth_pair ^^
+    compile_exp_vanilla env ae a ^^ set_arg ^^
+    compile_exp_vanilla env ae k ^^ set_k ^^
+    compile_exp_vanilla env ae r ^^ set_r ^^
+    FuncDec.ic_call_raw env get_meth_pair get_arg get_k get_r add_cycles
+    end
+
+  | ICMethodNamePrim, [] ->
+    SR.Vanilla, IC.method_name env
+
+  | ICStableRead ty, [] ->
+    (*
+      * On initial install:
+        1. return record of nulls
+      * On upgrade:
+        1. deserialize stable store to v : ty,
+        2. possibly run region manager initialization logic.
+        3. return v
+    *)
+    SR.Vanilla,
+    Stabilization.destabilize env ty (StableMem.set_version env) ^^
+    compile_unboxed_const (if !Flags.use_stable_regions then 1l else 0l) ^^
+    E.call_import env "rts" "region_init"
+
+  | ICStableWrite ty, [e] ->
+    SR.unit,
+    compile_exp_vanilla env ae e ^^
+    Stabilization.stabilize env ty
+
+  (* Cycles *)
+  | SystemCyclesBalancePrim, [] ->
+    SR.Vanilla, Cycles.balance env
+  | SystemCyclesAddPrim, [e1] ->
+    SR.unit, compile_exp_vanilla env ae e1 ^^ Cycles.add env
+  | SystemCyclesAcceptPrim, [e1] ->
+    SR.Vanilla, compile_exp_vanilla env ae e1 ^^ Cycles.accept env
+  | SystemCyclesAvailablePrim, [] ->
+    SR.Vanilla, Cycles.available env
+  | SystemCyclesRefundedPrim, [] ->
+    SR.Vanilla, Cycles.refunded env
+
+  | SetCertifiedData, [e1] ->
+    SR.unit, compile_exp_vanilla env ae e1 ^^ IC.set_certified_data env
+  | GetCertificate, [] ->
+    SR.Vanilla,
+    IC.get_certificate env
+
+  (* Unknown prim *)
+  | _ -> SR.Unreachable, todo_trap env "compile_prim_invocation" (Arrange_ir.prim p)
+  end
+
+(* Compile, infer and return stack representation *)
+and compile_exp (env : E.t) ae exp =
+  compile_exp_with_hint env ae None exp
+
+(* Compile to given stack representation *)
+and compile_exp_as env ae sr_out e =
+  let sr_in, code = compile_exp_with_hint env ae (Some sr_out) e in
+  code ^^ StackRep.adjust env sr_in sr_out
+
+and single_case e (cs : Ir.case list) =
+  match cs, e.note.Note.typ with
+  | [{it={pat={it=TagP (l, _);_}; _}; _}], Type.(Variant [{lab; _}]) -> l = lab
+  | _ -> false
+
+and known_tag_pat p = TagP ("", p)
+
+and simplify_cases e (cs : Ir.case list) =
+  match cs, e.note.Note.typ with
+  (* for a 2-cased variant type, the second comparison can be omitted when the first pattern
+     (with irrefutable subpattern) didn't match, and the pattern types line up *)
+  | [{it={pat={it=TagP (l1, ip); _}; _}; _} as c1; {it={pat={it=TagP (l2, pat'); _} as pat2; exp}; _} as c2], Type.(Variant [{lab=el1; _}; {lab=el2; _}])
+       when Ir_utils.is_irrefutable ip
+            && (l1 = el1 || l1 = el2)
+            && (l2 = el1 || l2 = el2) ->
+     [c1; {c2 with it = {exp; pat = {pat2 with it = known_tag_pat pat'}}}]
+  | _ -> cs
+
+(* Compile, infer and return stack representation, taking the hint into account *)
+and compile_exp_with_hint (env : E.t) ae sr_hint exp =
+  (fun (sr,code) -> (sr, G.with_region exp.at code)) @@
+  if exp.note.Note.const
+  then let (c, fill) = compile_const_exp env ae exp in fill env ae; (SR.Const c, G.nop)
+  else match exp.it with
+  | PrimE (p, es) when List.exists (fun e -> Type.is_non e.note.Note.typ) es ->
+    (* Handle dead code separately, so that we can rely on useful type
+       annotations below *)
+    SR.Unreachable,
+    G.concat_map (compile_exp_ignore env ae) es ^^
+    G.i Unreachable
+
+  | PrimE (p, es) ->
+    compile_prim_invocation (env : E.t) ae p es exp.at
+  | VarE var ->
+    Var.get_val env ae var
+  | AssignE (e1,e2) ->
+    SR.unit,
+    let (prepare_code, sr, store_code) = compile_lexp env ae e1 in
+    prepare_code ^^
+    compile_exp_as env ae sr e2 ^^
+    store_code
+  | LitE l ->
+    compile_lit l
+  | IfE (scrut, e1, e2) ->
+    let code_scrut = compile_exp_as_test env ae scrut in
+    let sr1, code1 = compile_exp_with_hint env ae sr_hint e1 in
+    let sr2, code2 = compile_exp_with_hint env ae sr_hint e2 in
+    (* Use the expected stackrep, if given, else infer from the branches *)
+    let sr = match sr_hint with
+      | Some sr -> sr
+      | None -> StackRep.join sr1 sr2
+    in
+    sr,
+    code_scrut ^^
+    FakeMultiVal.if_ env
+      (StackRep.to_block_type env sr)
+      (code1 ^^ StackRep.adjust env sr1 sr)
+      (code2 ^^ StackRep.adjust env sr2 sr)
+  | BlockE (decs, exp) ->
+    let captured = Freevars.captured_vars (Freevars.exp exp) in
+    let ae', codeW1 = compile_decs env ae decs captured in
+    let (sr, code2) = compile_exp_with_hint env ae' sr_hint exp in
+    (sr, codeW1 code2)
+  | LabelE (name, _ty, e) ->
+    (* The value here can come from many places -- the expression,
+       or any of the nested returns. Hard to tell which is the best
+       stack representation here.
+       So let’s go with Vanilla. *)
+    SR.Vanilla,
+    E.block_ env (StackRep.to_block_type env SR.Vanilla) (
+      G.with_current_depth (fun depth ->
+        let ae1 = VarEnv.add_label ae name depth in
+        compile_exp_vanilla env ae1 e
+      )
+    )
+  | LoopE e ->
+    SR.Unreachable,
+    let ae' = VarEnv.{ ae with lvl = NotTopLvl } in
+    G.loop0 (compile_exp_unit env ae' e ^^ G.i (Br (nr 0l))
+    )
+    ^^
+   G.i Unreachable
+
+  | SwitchE (e, cs) when single_case e cs ->
+    let code1 = compile_exp_vanilla env ae e in
+    let [@warning "-8"] [{it={pat={it=TagP (_, pat');_} as pat; exp}; _}] = cs in
+    let ae1, pat_code = compile_pat_local env ae {pat with it = known_tag_pat pat'} in
+    let sr, rhs_code = compile_exp_with_hint env ae1 sr_hint exp in
+
+    (* Use the expected stackrep, if given, else infer from the branches *)
+    let final_sr = match sr_hint with
+      | Some sr -> sr
+      | None -> sr
+    in
+
+    final_sr,
+    (* Run rest in block to exit from *)
+    FakeMultiVal.block_ env (StackRep.to_block_type env final_sr) (fun branch_code ->
+       orsPatternFailure env (List.map (fun (sr, c) ->
+          c ^^^ CannotFail (StackRep.adjust env sr final_sr ^^ branch_code)
+       ) [sr, CannotFail code1 ^^^ pat_code ^^^ CannotFail rhs_code]) ^^
+       G.i Unreachable (* We should always exit using the branch_code *)
+    )
+
+  | SwitchE (e, cs) ->
+    let code1 = compile_exp_vanilla env ae e in
+    let (set_i, get_i) = new_local env "switch_in" in
+
+    (* compile subexpressions and collect the provided stack reps *)
+    let codes = List.map (fun {it={pat; exp=e}; _} ->
+      let (ae1, pat_code) = compile_pat_local env ae pat in
+      let (sr, rhs_code) = compile_exp_with_hint env ae1 sr_hint e in
+      (sr, CannotFail get_i ^^^ pat_code ^^^ CannotFail rhs_code)
+      ) (simplify_cases e cs) in
+
+    (* Use the expected stackrep, if given, else infer from the branches *)
+    let final_sr = match sr_hint with
+      | Some sr -> sr
+      | None -> StackRep.joins (List.map fst codes)
+    in
+
+    final_sr,
+    (* Run scrut *)
+    code1 ^^ set_i ^^
+    (* Run rest in block to exit from *)
+    FakeMultiVal.block_ env (StackRep.to_block_type env final_sr) (fun branch_code ->
+       orsPatternFailure env (List.map (fun (sr, c) ->
+          c ^^^ CannotFail (StackRep.adjust env sr final_sr ^^ branch_code)
+       ) codes) ^^
+       G.i Unreachable (* We should always exit using the branch_code *)
+    )
+  (* Async-wait lowering support features *)
+  | DeclareE (name, typ, e) ->
+    let ae1, i = VarEnv.add_local_with_heap_ind env ae name typ in
+    let sr, code = compile_exp env ae1 e in
+    sr,
+    MutBox.alloc env ^^ G.i (LocalSet (nr i)) ^^
+    code
+  | DefineE (name, _, e) ->
+    SR.unit,
+    let pre_code, sr, code = Var.set_val env ae name in
+    pre_code ^^
+    compile_exp_as env ae sr e ^^
+    code
+  | FuncE (x, sort, control, typ_binds, args, res_tys, e) ->
+    let captured = Freevars.captured exp in
+    let return_tys = match control with
+      | Type.Returns -> res_tys
+      | Type.Replies -> []
+      | Type.Promises -> assert false in
+    let return_arity = List.length return_tys in
+    let mk_body env1 ae1 = compile_exp_as env1 ae1 (StackRep.of_arity return_arity) e in
+    FuncDec.lit env ae x sort control captured args mk_body return_tys exp.at
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    SR.unit,
+    let (set_future, get_future) = new_local env "future" in
+    let (set_k, get_k) = new_local env "k" in
+    let (set_r, get_r) = new_local env "r" in
+    let mk_body env1 ae1 = compile_exp_as env1 ae1 SR.unit exp_f in
+    let captured = Freevars.captured exp_f in
+    let add_cycles = Internals.add_cycles env ae in
+    FuncDec.async_body env ae ts captured mk_body exp.at ^^
+    Tagged.load_forwarding_pointer env ^^
+    set_future ^^
+
+    compile_exp_vanilla env ae exp_k ^^ set_k ^^
+    compile_exp_vanilla env ae exp_r ^^ set_r ^^
+
+    FuncDec.ic_self_call env ts
+      IC.(get_self_reference env ^^
+          actor_public_field env async_method_name)
+      get_future
+      get_k
+      get_r
+      add_cycles
+  | ActorE (ds, fs, _, _) ->
+    fatal "Local actors not supported by backend"
+  | NewObjE (Type.(Object | Module | Memory) as _sort, fs, _) ->
+    (*
+    We can enable this warning once we treat everything as static that
+    mo_frontend/static.ml accepts, including _all_ literals.
+    if sort = Type.Module then Printf.eprintf "%s" "Warning: Non-static module\n";
+    *)
+    SR.Vanilla,
+    let fs' = fs |> List.map
+      (fun (f : Ir.field) -> (f.it.name, fun () ->
+        if Type.is_mut f.note
+        then Var.get_aliased_box env ae f.it.var
+        else Var.get_val_vanilla env ae f.it.var)) in
+    Object.lit_raw env fs'
+  | _ -> SR.unit, todo_trap env "compile_exp" (Arrange_ir.exp exp)
+
+and compile_exp_ignore env ae e =
+  let sr, code = compile_exp env ae e in
+  code ^^ StackRep.drop env sr
+
+and compile_exp_as_opt env ae sr_out_o e =
+  let sr_in, code = compile_exp_with_hint env ae sr_out_o e in
+  G.with_region e.at (
+    code ^^
+    match sr_out_o with
+    | None -> StackRep.drop env sr_in
+    | Some sr_out -> StackRep.adjust env sr_in sr_out
+  )
+
+and compile_exp_vanilla (env : E.t) ae exp =
+  compile_exp_as env ae SR.Vanilla exp
+
+and compile_exp_unit (env : E.t) ae exp =
+  compile_exp_as env ae SR.unit exp
+
+(* compiles to something that works with IfE or Eqz
+   (SR.UnboxedWord32 or SR.Vanilla are _both_ ok)
+*)
+and compile_exp_as_test env ae e =
+  let sr, code = compile_exp env ae e in
+  code ^^
+  (if sr != SR.bool then StackRep.adjust env sr SR.Vanilla else G.nop)
+
+(* Compile a prim of type Char -> Char to a RTS call. *)
+and compile_char_to_char_rts env ae exp rts_fn =
+  SR.UnboxedWord32 Type.Char,
+  compile_exp_as env ae (SR.UnboxedWord32 Type.Char) exp ^^
+  TaggedSmallWord.lsb_adjust_codepoint env ^^
+  E.call_import env "rts" rts_fn ^^
+  TaggedSmallWord.msb_adjust_codepoint
+
+(* Compile a prim of type Char -> Bool to a RTS call. The RTS function should
+   have type int32_t -> int32_t where the return value is 0 for 'false' and 1
+   for 'true'. *)
+and compile_char_to_bool_rts (env : E.t) (ae : VarEnv.t) exp rts_fn =
+  SR.bool,
+  compile_exp_as env ae (SR.UnboxedWord32 Type.Char) exp ^^
+  TaggedSmallWord.lsb_adjust_codepoint env ^^
+  (* The RTS function returns Motoko True/False values (which are represented as
+     1 and 0, respectively) so we don't need any marshalling *)
+  E.call_import env "rts" rts_fn
+
+(*
+The compilation of declarations (and patterns!) needs to handle mutual recursion.
+This requires conceptually three passes:
+ 1. First we need to collect all names bound in a block,
+    and find locations for then (which extends the environment).
+    The environment is extended monotonically: The type-checker ensures that
+    a Block does not bind the same name twice.
+    We would not need to pass in the environment, just out ... but because
+    it is bundled in the E.t type, threading it through is also easy.
+
+ 2. We need to allocate memory for them, and store the pointer in the
+    WebAssembly local, so that they can be captured by closures.
+
+ 3. We go through the declarations, generate the actual code and fill the
+    allocated memory.
+    This includes creating the actual closure references.
+
+We could do this in separate functions, but I chose to do it in one
+ * it means all code related to one constructor is in one place and
+ * when generating the actual code, we still “know” the id of the local that
+   has the memory location, and don’t have to look it up in the environment.
+
+The first phase works with the `pre_env` passed to `compile_dec`,
+while the third phase is a function that expects the final environment. This
+enabled mutual recursion.
+*)
+
+
+and compile_lit_pat env l =
+  match l with
+  | NullLit ->
+    compile_lit_as env SR.Vanilla l ^^
+    G.i (Compare (Wasm.Values.I32 I32Op.Eq))
+  | BoolLit true ->
+    G.nop
+  | BoolLit false ->
+    G.i (Test (Wasm.Values.I32 I32Op.Eqz))
+  | (NatLit _ | IntLit _) ->
+    compile_lit_as env SR.Vanilla l ^^
+    BigNum.compile_eq env
+  | Nat8Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Nat8)
+  | Nat16Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Nat16)
+  | Nat32Lit _ ->
+    BoxedSmallWord.unbox env Type.Nat32 ^^
+    compile_lit_as env (SR.UnboxedWord32 Type.Nat32) l ^^
+    compile_eq env Type.(Prim Nat32)
+  | Nat64Lit _ ->
+    BoxedWord64.unbox env Type.Nat64 ^^
+    compile_lit_as env (SR.UnboxedWord64 Type.Nat64) l ^^
+    compile_eq env Type.(Prim Nat64)
+  | Int8Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Int8)
+  | Int16Lit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Int16)
+  | Int32Lit _ ->
+    BoxedSmallWord.unbox env Type.Int32 ^^
+    compile_lit_as env (SR.UnboxedWord32 Type.Int32) l ^^
+    compile_eq env Type.(Prim Int32)
+  | Int64Lit _ ->
+    BoxedWord64.unbox env Type.Int64 ^^
+    compile_lit_as env (SR.UnboxedWord64 Type.Int64) l ^^
+    compile_eq env Type.(Prim Int64)
+  | CharLit _ ->
+    compile_lit_as env SR.Vanilla l ^^
+    compile_eq env Type.(Prim Char)
+  | TextLit t
+  | BlobLit t ->
+    compile_lit_as env SR.Vanilla l ^^
+    Text.compare env Operator.EqOp
+  | FloatLit _ ->
+    todo_trap env "compile_lit_pat" (Arrange_ir.lit l)
+
+and fill_pat env ae pat : patternCode =
+  PatCode.with_region pat.at @@
+  match pat.it with
+  | _ when Ir_utils.is_irrefutable_nonbinding pat -> CannotFail (G.i Drop)
+  | WildP -> assert false (* matched above *)
+  | OptP p when Ir_utils.is_irrefutable_nonbinding p ->
+      CanFail (fun fail_code ->
+        Opt.is_some env ^^
+        G.if0 G.nop fail_code)
+  | OptP p ->
+      let (set_x, get_x) = new_local env "opt_scrut" in
+      CanFail (fun fail_code ->
+        set_x ^^
+        get_x ^^
+        Opt.is_some env ^^
+        G.if0
+          ( get_x ^^
+            Opt.project env ^^
+            with_fail fail_code (fill_pat env ae p)
+          )
+          fail_code
+      )
+  | TagP ("", p) -> (* these only come from known_tag_pat *)
+    if Ir_utils.is_irrefutable_nonbinding p
+    then CannotFail (G.i Drop)
+    else CannotFail (Variant.project env) ^^^ fill_pat env ae p
+  | TagP (l, p) when Ir_utils.is_irrefutable_nonbinding p ->
+      CanFail (fun fail_code ->
+        Variant.test_is env l ^^
+        G.if0 G.nop fail_code)
+  | TagP (l, p) ->
+      let (set_x, get_x) = new_local env "tag_scrut" in
+      CanFail (fun fail_code ->
+        set_x ^^
+        get_x ^^
+        Variant.test_is env l ^^
+        G.if0
+          ( get_x ^^
+            Variant.project env ^^
+            with_fail fail_code (fill_pat env ae p)
+          )
+          fail_code
+      )
+  | LitP l ->
+      CanFail (fun fail_code ->
+        compile_lit_pat env l ^^
+        G.if0 G.nop fail_code)
+  | VarP name ->
+      CannotFail (Var.set_val_vanilla_from_stack env ae name)
+  | TupP ps ->
+      let (set_i, get_i) = new_local env "tup_scrut" in
+      let rec go i = function
+        | [] -> CannotFail G.nop
+        | p::ps ->
+          let code1 = fill_pat env ae p in
+          let code2 = go (Int32.add i 1l) ps in
+          CannotFail (get_i ^^ Tuple.load_n env i) ^^^ code1 ^^^ code2 in
+      CannotFail set_i ^^^ go 0l ps
+  | ObjP pfs ->
+      let project = compile_load_field env pat.note in
+      let (set_i, get_i) = new_local env "obj_scrut" in
+      let rec go = function
+        | [] -> CannotFail G.nop
+        | {it={name; pat}; _}::pfs' ->
+          let code1 = fill_pat env ae pat in
+          let code2 = go pfs' in
+          CannotFail (get_i ^^ project name) ^^^ code1 ^^^ code2 in
+      CannotFail set_i ^^^ go pfs
+  | AltP (p1, p2) ->
+      let code1 = fill_pat env ae p1 in
+      let code2 = fill_pat env ae p2 in
+      let (set_i, get_i) = new_local env "alt_scrut" in
+      CannotFail set_i ^^^
+      orElse (CannotFail get_i ^^^ code1)
+             (CannotFail get_i ^^^ code2)
+
+and alloc_pat_local env ae pat =
+  let d = Freevars.pat pat in
+  AllocHow.M.fold (fun v typ ae ->
+    let (ae1, _i) = VarEnv.add_direct_local env ae v SR.Vanilla typ
+    in ae1
+  ) d ae
+
+and alloc_pat env ae how pat : VarEnv.t * G.t  =
+  (fun (ae, code) -> (ae, G.with_region pat.at code)) @@
+  let d = Freevars.pat pat in
+  AllocHow.M.fold (fun v typ (ae, code0) ->
+    let ae1, code1 = AllocHow.add_local env ae how v typ
+    in (ae1, code0 ^^ code1)
+  ) d (ae, G.nop)
+
+and compile_pat_local env ae pat : VarEnv.t * patternCode =
+  (* It returns:
+     - the extended environment
+     - the patternCode to do the pattern matching.
+       This expects the  undestructed value is on top of the stack,
+       consumes it, and fills the heap.
+       If the pattern matches, execution continues (with nothing on the stack).
+       If the pattern does not match, it fails (in the sense of PatCode.CanFail)
+  *)
+  let ae1 = alloc_pat_local env ae pat in
+  let fill_code = fill_pat env ae1 pat in
+  (ae1, fill_code)
+
+(* Used for let patterns:
+   If the pattern can consume its scrutinee in a better form than vanilla (e.g.
+   unboxed tuple, unboxed 32/64), lets do that.
+*)
+and compile_unboxed_pat env ae how pat
+  : VarEnv.t * G.t * G.t * SR.t option * G.t =
+  (* It returns:
+     - the extended environment
+     - the code to allocate memory
+     - the code to prepare the stack (e.g. push destination addresses)
+       before the scrutinee is pushed
+     - the desired stack rep. None means: Do not even push the scrutinee.
+     - the code to do the pattern matching.
+       This expects the undestructed value is on top of the stack,
+       consumes it, and fills the heap
+       If the pattern does not match, it traps with pattern failure
+  *)
+  let (ae1, alloc_code) = alloc_pat env ae how pat in
+  let pre_code, sr, fill_code = match pat.it with
+    (* Nothing to match: Do not even put something on the stack *)
+    | WildP -> G.nop, None, G.nop
+    (* Tuple patterns *)
+    | TupP ps when List.length ps <> 1 ->
+      G.nop,
+      Some (SR.UnboxedTuple (List.length ps)),
+      (* We have to fill the pattern in reverse order, to take things off the
+         stack. This is only ok as long as patterns have no side effects.
+      *)
+      G.concat_mapi (fun i p -> orPatternFailure env (fill_pat env ae1 p)) (List.rev ps)
+    (* Variable patterns *)
+    | VarP name ->
+      let pre_code, sr, code = Var.set_val env ae1 name in
+      pre_code, Some sr, code
+    (* The general case: Create a single value, match that. *)
+    | _ ->
+      G.nop,
+      Some SR.Vanilla,
+      orPatternFailure env (fill_pat env ae1 pat) in
+  let pre_code = G.with_region pat.at pre_code in
+  let fill_code = G.with_region pat.at fill_code in
+  (ae1, alloc_code, pre_code, sr, fill_code)
+
+and compile_dec env pre_ae how v2en dec : VarEnv.t * G.t * (VarEnv.t -> scope_wrap) =
+  (fun (pre_ae, alloc_code, mk_code, wrap) ->
+       G.(pre_ae, with_region dec.at alloc_code, fun ae body_code ->
+          with_region dec.at (mk_code ae) ^^ wrap body_code)) @@
+
+  match dec.it with
+  (* A special case for public methods *)
+  (* This relies on the fact that in the top-level mutually recursive group, no shadowing happens. *)
+  | LetD ({it = VarP v; _}, e) when E.NameEnv.mem v v2en ->
+    let (const, fill) = compile_const_exp env pre_ae e in
+    let fi = match const with
+      | (_, Const.Message fi) -> fi
+      | _ -> assert false in
+    let pre_ae1 = VarEnv.add_local_public_method pre_ae v (fi, (E.NameEnv.find v v2en)) e.note.Note.typ in
+    G.( pre_ae1, nop, (fun ae -> fill env ae; nop), unmodified)
+
+  (* A special case for constant expressions *)
+  | LetD (p, e) when e.note.Note.const ->
+    (* constant expression matching with patterns is fully decidable *)
+    if const_exp_matches_pat env pre_ae p e then (* not refuted *)
+      let extend, fill = compile_const_dec env pre_ae dec in
+      G.(extend pre_ae, nop, (fun ae -> fill env ae; nop), unmodified)
+    else (* refuted *)
+      (pre_ae, G.nop, (fun _ -> PatCode.patternFailTrap env), unmodified)
+
+  | LetD (p, e) ->
+    let (pre_ae1, alloc_code, pre_code, sr, fill_code) = compile_unboxed_pat env pre_ae how p in
+    ( pre_ae1, alloc_code,
+      (fun ae -> pre_code ^^ compile_exp_as_opt env ae sr e ^^ fill_code),
+      unmodified
+    )
+
+  | VarD (name, content_typ, e) ->
+    assert AllocHow.(match M.find_opt name how with
+                     | Some (LocalMut _ | StoreHeap | StoreStatic) -> true
+                     | _ -> false);
+    let var_typ = Type.Mut content_typ in
+    let pre_ae1, alloc_code = AllocHow.add_local env pre_ae how name var_typ in
+    ( pre_ae1,
+      alloc_code,
+      (fun ae -> let pre_code, sr, code = Var.set_val env ae name in
+                 pre_code ^^ compile_exp_as env ae sr e ^^ code),
+      unmodified
+    )
+
+  | RefD (name, typ, { it = DotLE (e, n); _ }) ->
+    let pre_ae1, alloc_code = AllocHow.add_local_for_alias env pre_ae how name typ in
+
+    ( pre_ae1,
+      alloc_code,
+      (fun ae ->
+        compile_exp_vanilla env ae e ^^
+        Object.load_idx_raw env n ^^
+        Var.capture_aliased_box env ae name),
+      unmodified
+    )
+  | RefD _ -> assert false
+
+and compile_decs_public env pre_ae decs v2en captured_in_body : VarEnv.t * scope_wrap =
+  let how = AllocHow.decs pre_ae decs captured_in_body in
+  let rec go pre_ae = function
+    | []        -> (pre_ae, G.nop, fun _ -> unmodified)
+    | [dec]     -> compile_dec env pre_ae how v2en dec
+    | dec::decs ->
+        let (pre_ae1, alloc_code1, mk_codeW1) = compile_dec env pre_ae how v2en dec in
+        let (pre_ae2, alloc_code2, mk_codeW2) = go              pre_ae1 decs in
+        ( pre_ae2,
+          alloc_code1 ^^ alloc_code2,
+          fun ae -> let codeW1 = mk_codeW1 ae in
+                    let codeW2 = mk_codeW2 ae in
+                    fun body_code -> codeW1 (codeW2 body_code)
+        ) in
+  let (ae1, alloc_code, mk_codeW) = go pre_ae decs in
+  (ae1, fun body_code -> alloc_code ^^ mk_codeW ae1 body_code)
+
+and compile_decs env ae decs captured_in_body : VarEnv.t * scope_wrap =
+  compile_decs_public env ae decs E.NameEnv.empty captured_in_body
+
+(* This compiles expressions determined to be const as per the analysis in
+   ir_passes/const.ml. See there for more details.
+*)
+and compile_const_exp env pre_ae exp : Const.t * (E.t -> VarEnv.t -> unit) =
+  match exp.it with
+  | FuncE (name, sort, control, typ_binds, args, res_tys, e) ->
+    let fun_rhs =
+
+      (* a few prims cannot be safely inlined *)
+      let inlineable_prim = function
+      | RetPrim -> false
+      | BreakPrim _ -> false
+      | ThrowPrim -> fatal "internal error: left-over ThrowPrim"
+      | _ -> true in
+
+      match sort, control, typ_binds, e.it with
+      (* Special cases for prim-wrapping functions *)
+
+      | Type.Local, Type.Returns, [], PrimE (prim, prim_args) when
+          inlineable_prim prim &&
+          List.length args = List.length prim_args &&
+          List.for_all2 (fun p a -> a.it = VarE p.it) args prim_args ->
+        Const.PrimWrapper prim
+      | _, _, _, _ -> Const.Complicated
+    in
+    let return_tys = match control with
+      | Type.Returns -> res_tys
+      | Type.Replies -> []
+      | Type.Promises -> assert false in
+    let mk_body env ae =
+      List.iter (fun v ->
+        if not (VarEnv.NameEnv.mem v ae.VarEnv.vars)
+        then fatal "internal error: const \"%s\": captures \"%s\", not found in static environment\n" name v
+      ) (Freevars.M.keys (Freevars.exp e));
+      compile_exp_as env ae (StackRep.of_arity (List.length return_tys)) e in
+    FuncDec.closed env sort control name args mk_body fun_rhs return_tys exp.at
+  | BlockE (decs, e) ->
+    let (extend, fill1) = compile_const_decs env pre_ae decs in
+    let ae' = extend pre_ae in
+    let (c, fill2) = compile_const_exp env ae' e in
+    (c, fun env ae ->
+      let ae' = extend ae in
+      fill1 env ae';
+      fill2 env ae')
+  | VarE v ->
+    let c =
+      match VarEnv.lookup_var pre_ae v with
+      | Some (VarEnv.Const c) -> c
+      | _ -> fatal "compile_const_exp/VarE: \"%s\" not found" v
+    in
+    (c, fun _ _ -> ())
+  | NewObjE (Type.(Object | Module | Memory), fs, _) ->
+    let static_fs = List.map (fun f ->
+          let st =
+            match VarEnv.lookup_var pre_ae f.it.var with
+            | Some (VarEnv.Const c) -> c
+            | _ -> fatal "compile_const_exp/ObjE: \"%s\" not found" f.it.var
+          in f.it.name, st) fs
+    in
+    (Const.t_of_v (Const.Obj static_fs), fun _ _ -> ())
+  | PrimE (DotPrim name, [e]) ->
+    let (object_ct, fill) = compile_const_exp env pre_ae e in
+    let fs = match object_ct with
+      | _, Const.Obj fs -> fs
+      | _ -> fatal "compile_const_exp/DotE: not a static object" in
+    let member_ct = List.assoc name fs in
+    (member_ct, fill)
+  | PrimE (ProjPrim i, [e]) ->
+    let (object_ct, fill) = compile_const_exp env pre_ae e in
+    let cs = match object_ct with
+      | _, Const.Array cs -> cs
+      | _ -> fatal "compile_const_exp/ProjE: not a static tuple" in
+    (List.nth cs i, fill)
+  | LitE l -> Const.(t_of_v (Lit (const_lit_of_lit l))), (fun _ _ -> ())
+  | PrimE (TupPrim, []) -> Const.t_of_v Const.Unit, (fun _ _ -> ())
+  | PrimE (ArrayPrim (Const, _), es)
+  | PrimE (TupPrim, es) ->
+    let (cs, fills) = List.split (List.map (compile_const_exp env pre_ae) es) in
+    Const.(t_of_v (Array cs)),
+    (fun env ae -> List.iter (fun fill -> fill env ae) fills)
+  | PrimE (TagPrim i, [e]) ->
+    let (arg_ct, fill) = compile_const_exp env pre_ae e in
+    Const.(t_of_v (Tag (i, arg_ct))),
+    fill
+  | PrimE (OptPrim, [e]) ->
+    let (arg_ct, fill) = compile_const_exp env pre_ae e in
+    Const.(t_of_v (Opt arg_ct)),
+    fill
+
+  | _ -> assert false
+
+and compile_const_decs env pre_ae decs : (VarEnv.t -> VarEnv.t) * (E.t -> VarEnv.t -> unit) =
+  let rec go pre_ae = function
+    | []          -> (fun ae -> ae), (fun _ _ -> ())
+    | [dec]       -> compile_const_dec env pre_ae dec
+    | (dec::decs) ->
+        let (extend1, fill1) = compile_const_dec env pre_ae dec in
+        let pre_ae1 = extend1 pre_ae in
+        let (extend2, fill2) = go                    pre_ae1 decs in
+        (fun ae -> extend2 (extend1 ae)),
+        (fun env ae -> fill1 env ae; fill2 env ae) in
+  go pre_ae decs
+
+and const_exp_matches_pat env ae pat exp : bool =
+  assert exp.note.Note.const;
+  let c, _ = compile_const_exp env ae exp in
+  match destruct_const_pat VarEnv.empty_ae pat c with Some _ -> true | _ -> false
+
+and destruct_const_pat ae pat const : VarEnv.t option = match pat.it with
+  | WildP -> Some ae
+  | VarP v -> Some (VarEnv.add_local_const ae v const pat.note)
+  | ObjP pfs ->
+    let fs = match const with (_, Const.Obj fs) -> fs | _ -> assert false in
+    List.fold_left (fun ae (pf : pat_field) ->
+      match ae, List.find_opt (fun (n, _) -> pf.it.name = n) fs with
+      | None, _ -> None
+      | Some ae, Some (_, c) -> destruct_const_pat ae pf.it.pat c
+      | _, None -> assert false
+    ) (Some ae) pfs
+  | AltP (p1, p2) ->
+    let l = destruct_const_pat ae p1 const in
+    if l = None then destruct_const_pat ae p2 const
+    else l
+  | TupP ps ->
+    let cs = match const with (_, Const.Array cs) -> cs | (_, Const.Unit) -> [] | _ -> assert false in
+    let go ae p c = match ae with
+      | Some ae -> destruct_const_pat ae p c
+      | _ -> None in
+    List.fold_left2 go (Some ae) ps cs
+  | LitP lp ->
+    begin match const with
+    | (_, Const.Lit lc) when Const.lit_eq (const_lit_of_lit lp, lc) -> Some ae
+    | _ -> None
+    end
+  | OptP p ->
+    begin match const with
+      | (_, Const.Opt c) -> destruct_const_pat ae p c
+      | (_, Const.(Lit Null)) -> None
+      | _ -> assert false
+    end
+  | TagP (i, p) ->
+     match const with
+     | (_, Const.Tag (ic, c)) when i = ic -> destruct_const_pat ae p c
+     | (_, Const.Tag _) -> None
+     | _ -> assert false
+
+and compile_const_dec env pre_ae dec : (VarEnv.t -> VarEnv.t) * (E.t -> VarEnv.t -> unit) =
+  (* This returns a _function_ to extend the VarEnv, instead of doing it, because
+  it needs to be extended twice: Once during the pass that gets the outer, static values
+  (no forward references), and then to implement the `fill`, which compiles the bodies
+  of functions (may contain forward references.) *)
+  match dec.it with
+  (* This should only contain constants (cf. is_const_exp) *)
+  | LetD (p, e) ->
+    let (const, fill) = compile_const_exp env pre_ae e in
+    (fun ae -> match destruct_const_pat ae p const with Some ae -> ae | _ -> assert false),
+    (fun env ae -> fill env ae)
+  | VarD _ | RefD _ -> fatal "compile_const_dec: Unexpected VarD/RefD"
+
+and compile_init_func mod_env ((cu, flavor) : Ir.prog) =
+  assert (not flavor.has_typ_field);
+  assert (not flavor.has_poly_eq);
+  assert (not flavor.has_show);
+  assert (not flavor.has_await);
+  assert (not flavor.has_async_typ);
+  match cu with
+  | LibU _ -> fatal "compile_start_func: Cannot compile library"
+  | ProgU ds ->
+    Func.define_built_in mod_env "init" [] [] (fun env ->
+      let _ae, codeW = compile_decs env VarEnv.empty_ae ds Freevars.S.empty in
+      codeW G.nop
+    )
+  | ActorU (as_opt, ds, fs, up, _t) ->
+    main_actor as_opt mod_env ds fs up
+
+and export_actor_field env  ae (f : Ir.field) =
+  (* A public actor field is guaranteed to be compiled as a PublicMethod *)
+  let fi =
+    match VarEnv.lookup_var ae f.it.var with
+    | Some (VarEnv.PublicMethod (fi, _)) -> fi
+    | _ -> assert false in
+
+  E.add_export env (nr {
+    name = Lib.Utf8.decode (match E.mode env with
+      | Flags.ICMode | Flags.RefMode ->
+        Mo_types.Type.(
+        match normalize f.note with
+        |  Func(Shared sort,_,_,_,_) ->
+           (match sort with
+            | Write -> "canister_update " ^ f.it.name
+            | Query -> "canister_query " ^ f.it.name
+            | Composite -> "canister_composite_query " ^ f.it.name
+           )
+        | _ -> assert false)
+      | _ -> assert false);
+    edesc = nr (FuncExport (nr fi))
+  })
+
+(* Main actor *)
+and main_actor as_opt mod_env ds fs up =
+  Func.define_built_in mod_env "init" [] [] (fun env ->
+    let ae0 = VarEnv.empty_ae in
+
+    let captured = Freevars.captured_vars (Freevars.actor ds fs up) in
+    (* Add any params to the environment *)
+    (* Captured ones need to go into static memory, the rest into locals *)
+    let args = match as_opt with None -> [] | Some as_ -> as_ in
+    let arg_list = List.map (fun a -> (a.it, a.note)) args in
+    let arg_names = List.map (fun a -> a.it) args in
+    let arg_tys = List.map (fun a -> a.note) args in
+    let as_local n = not (Freevars.S.mem n captured) in
+    let ae1 = VarEnv.add_arguments env ae0 as_local arg_list in
+
+    (* Reverse the fs, to a map from variable to exported name *)
+    let v2en = E.NameEnv.from_list (List.map (fun f -> (f.it.var, f.it.name)) fs) in
+
+    (* Compile the declarations *)
+    let ae2, decls_codeW = compile_decs_public env ae1 ds v2en
+      Freevars.(captured_vars (system up))
+    in
+
+    (* Export the public functions *)
+    List.iter (export_actor_field env ae2) fs;
+
+    (* Export upgrade hooks *)
+    Func.define_built_in env "pre_exp" [] [] (fun env ->
+      compile_exp_as env ae2 SR.unit up.preupgrade);
+    Func.define_built_in env "post_exp" [] [] (fun env ->
+      compile_exp_as env ae2 SR.unit up.postupgrade);
+    IC.export_upgrade_methods env;
+
+    (* Export heartbeat (but only when required) *)
+    begin match up.heartbeat.it with
+     | Ir.PrimE (Ir.TupPrim, []) -> ()
+     | _ ->
+       Func.define_built_in env "heartbeat_exp" [] [] (fun env ->
+         compile_exp_as env ae2 SR.unit up.heartbeat);
+       IC.export_heartbeat env;
+    end;
+
+    (* Export timer (but only when required) *)
+    begin match up.timer.it with
+     | Ir.PrimE (Ir.TupPrim, []) -> ()
+     | _ ->
+       Func.define_built_in env "timer_exp" [] [] (fun env ->
+         compile_exp_as env ae2 SR.unit up.timer);
+       IC.export_timer env;
+    end;
+
+    (* Export inspect (but only when required) *)
+    begin match up.inspect.it with
+     | Ir.PrimE (Ir.TupPrim, []) -> ()
+     | _ ->
+       Func.define_built_in env "inspect_exp" [] [] (fun env ->
+         compile_exp_as env ae2 SR.unit up.inspect);
+       IC.export_inspect env;
+    end;
+
+    (* Export metadata *)
+    env.E.stable_types := metadata "motoko:stable-types" up.meta.sig_;
+    env.E.service := metadata "candid:service" up.meta.candid.service;
+    env.E.args := metadata "candid:args" up.meta.candid.args;
+
+    (* Deserialize any arguments *)
+    begin match as_opt with
+      | None
+      | Some [] ->
+        (* Liberally accept empty as well as unit argument *)
+        assert (arg_tys = []);
+        IC.system_call env "msg_arg_data_size" ^^
+        G.if0 (Serialization.deserialize env arg_tys) G.nop
+      | Some (_ :: _) ->
+        Serialization.deserialize env arg_tys ^^
+        G.concat_map (Var.set_val_vanilla_from_stack env ae1) (List.rev arg_names)
+    end ^^
+    begin
+      if up.timer.at <> no_region then
+        (* initiate a timer pulse *)
+        compile_const_64 1L ^^
+        IC.system_call env "global_timer_set" ^^
+        G.i Drop
+      else
+        G.nop
+    end ^^
+    IC.init_globals env ^^
+    (* Continue with decls *)
+    decls_codeW G.nop
+  )
+
+and metadata name value =
+  if List.mem name !Flags.omit_metadata_names then None
+  else Some (
+           List.mem name !Flags.public_metadata_names,
+           value)
+
+and conclude_module env set_serialization_globals start_fi_o =
+
+  RTS_Exports.system_exports env;
+
+  FuncDec.export_async_method env;
+  FuncDec.export_gc_trigger_method env;
+
+  (* See Note [Candid subtype checks] *)
+  Serialization.set_delayed_globals env set_serialization_globals;
+
+  let static_roots = GCRoots.store_static_roots env in
+
+  (* declare before building GC *)
+
+  (* add beginning-of-heap pointer, may be changed by linker *)
+  (* needs to happen here now that we know the size of static memory *)
+  let set_heap_base = E.add_global32_delayed env "__heap_base" Immutable in
+  E.export_global env "__heap_base";
+
+  Heap.register env;
+  GCRoots.register env static_roots;
+  IC.register env;
+
+  set_heap_base (E.get_end_of_static_memory env);
+
+  (* Wrap the start function with the RTS initialization *)
+  let rts_start_fi = E.add_fun env "rts_start" (Func.of_body env [] [] (fun env1 ->
+    E.call_import env "rts" ("initialize_" ^ E.gc_strategy_name !Flags.gc_strategy ^ "_gc") ^^
+    match start_fi_o with
+    | Some fi ->
+      G.i (Call fi)
+    | None ->
+      Lifecycle.set env Lifecycle.PreInit
+  )) in
+
+  IC.default_exports env;
+
+  let func_imports = E.get_func_imports env in
+  let ni = List.length func_imports in
+  let ni' = Int32.of_int ni in
+
+  let other_imports = E.get_other_imports env in
+
+  let memories = E.get_memories env in
+
+  let funcs = E.get_funcs env in
+
+  let data = List.map (fun (offset, init) -> nr {
+    index = nr 0l;
+    offset = nr (G.to_instr_list (compile_unboxed_const offset));
+    init;
+    }) (E.get_static_memory env) in
+
+  let elems = List.map (fun (fi, fp) -> nr {
+    index = nr 0l;
+    offset = nr (G.to_instr_list (compile_unboxed_const fp));
+    init = [ nr fi ];
+    }) (E.get_elems env) in
+
+  let table_sz = E.get_end_of_table env in
+
+  let module_ = {
+      types = List.map nr (E.get_types env);
+      funcs = List.map (fun (f,_,_) -> f) funcs;
+      tables = [ nr { ttype = TableType ({min = table_sz; max = Some table_sz}, FuncRefType) } ];
+      elems;
+      start = Some (nr rts_start_fi);
+      globals = E.get_globals env;
+      memories;
+      imports = func_imports @ other_imports;
+      exports = E.get_exports env;
+      data
+    } in
+
+  let emodule =
+    let open Wasm_exts.CustomModule in
+    { module_;
+      dylink = None;
+      name = { empty_name_section with function_names =
+                 List.mapi (fun i (f,n,_) -> Int32.(add ni' (of_int i), n)) funcs;
+               locals_names =
+                 List.mapi (fun i (f,_,ln) -> Int32.(add ni' (of_int i), ln)) funcs; };
+      motoko = {
+        labels = E.get_labs env;
+        stable_types = !(env.E.stable_types);
+        compiler = metadata "motoko:compiler" (Lib.Option.get Source_id.release Source_id.id)
+      };
+      candid = {
+        args = !(env.E.args);
+        service = !(env.E.service);
+      };
+      source_mapping_url = None;
+      wasm_features = E.get_features env;
+    } in
+
+  match E.get_rts env with
+  | None -> emodule
+  | Some rts -> Linking.LinkModule.link emodule "rts" rts
+
+let compile mode rts (prog : Ir.prog) : Wasm_exts.CustomModule.extended_module =
+  let env = E.mk_global mode rts IC.trap_with (Lifecycle.end_ ()) in
+
+  IC.register_globals env;
+  Stack.register_globals env;
+  GC.register_globals env;
+  StableMem.register_globals env;
+  Serialization.Registers.register_globals env;
+
+  (* See Note [Candid subtype checks] *)
+  let set_serialization_globals = Serialization.register_delayed_globals env in
+
+  IC.system_imports env;
+  RTS.system_imports env;
+
+  compile_init_func env prog;
+  let start_fi_o = match E.mode env with
+    | Flags.ICMode | Flags.RefMode ->
+      IC.export_init env;
+      None
+    | Flags.WASIMode ->
+      IC.export_wasi_start env;
+      None
+    | Flags.WasmMode ->
+      Some (nr (E.built_in env "init"))
+  in
+
+  conclude_module env set_serialization_globals start_fi_o
+
+
+
+ + + diff --git a/coverage/codegen/die.ml.html b/coverage/codegen/die.ml.html new file mode 100644 index 00000000000..bec0d273b4c --- /dev/null +++ b/coverage/codegen/die.ml.html @@ -0,0 +1,1668 @@ + + + + + die.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+
+
open Mo_types
+open Wasm_exts.Dwarf5
+open Meta
+
+(* Note [Low_pc, High_pc, Ranges are special]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The DWARF attributes `Low_pc`, `High_pc` and `Ranges` carry information
+about the Wasm bytecode's layout in the emitted Code section for the
+compilation unit. The information is not available here, so these
+attributes have no payload at this side. Instead it is filled in
+in a tag-dependent manner by `customModuleEncode.ml`. For LexicalBlock
+the Low_pc and High_pc attributes are managed entirely by the emitter.
+ *)
+
+type dw_AT = Producer of string
+           | Language of int
+           | Name of string
+           | Stmt_list of int
+           | Comp_dir of string
+           | Use_UTF8 of bool
+           | Low_pc | High_pc | Ranges (* see Note [Low_pc, High_pc, Ranges are special] *)
+           | Addr_base of int
+           | Decl_file of string
+           | Decl_line of int
+           | Decl_column of int
+           | Prototyped of bool
+           | External of bool
+           | Byte_size of int
+           | Bit_size of int
+           | Data_bit_offset of int
+           | Discr of int (* reference *)
+           | Const_value of int
+           | Discr_value of int
+           | Artificial of bool
+           | TypeRef of int (* reference *)
+           | TypePromise of int Lib.Promise.t (* reference *)
+           | Encoding of int
+           | Location of int list
+           | DataMemberLocation of int
+
+(* DWARF tags *)
+
+type dw_TAG =
+  | Compile_unit of string * string                            (* compilation directory, file name *)
+  | Subprogram of string * Type.typ list * Source.pos          (* name, return types, location *)
+  | LexicalBlock of Source.pos
+  | Formal_parameter of (string * Source.pos * Type.typ * int) (* name, location, type, Wasm slot *)
+  | Variable of (string * Source.pos * Type.typ * int)         (* name, location, type, Wasm slot *)
+  | Type of Type.typ
+  | Typedef of string * Type.typ
+  (*| Member*)
+  | Variant_part
+  | Variant
+
+(* DWARF high-level structures *)
+
+let dw_attr' : dw_AT -> die =
+  let bool b = if b then 1 else 0 in
+  function
+  | Producer p -> StringAttribute (dw_AT_producer, p)
+  | Language l -> IntAttribute (dw_AT_language, l)
+  | Name n -> StringAttribute (dw_AT_name, n)
+  | Stmt_list l -> IntAttribute (dw_AT_stmt_list, l)
+  | Comp_dir d -> StringAttribute (dw_AT_comp_dir, d)
+  | Use_UTF8 b -> IntAttribute (dw_AT_use_UTF8, bool b)
+  | Addr_base b -> IntAttribute (dw_AT_addr_base, b)
+  | Low_pc -> OffsetAttribute dw_AT_low_pc
+  | High_pc -> OffsetAttribute dw_AT_high_pc
+  | Ranges -> OffsetAttribute dw_AT_ranges  (* see Note [Low_pc, High_pc, Ranges are special] *)
+  | Decl_file f -> StringAttribute (dw_AT_decl_file, f)
+  | Decl_line l -> IntAttribute (dw_AT_decl_line, l)
+  | Decl_column c -> IntAttribute (dw_AT_decl_column, c)
+  | Prototyped b -> IntAttribute (dw_AT_prototyped, bool b)
+  | External b -> IntAttribute (dw_AT_external, bool b)
+  | Byte_size s -> IntAttribute (dw_AT_byte_size, s)
+  | Bit_size s -> IntAttribute (dw_AT_bit_size, s)
+  | Data_bit_offset o -> IntAttribute (dw_AT_data_bit_offset, o)
+  | Artificial b -> IntAttribute (dw_AT_artificial, bool b)
+  | Discr r -> IntAttribute (dw_AT_discr, r)
+  | TypeRef r -> IntAttribute (dw_AT_type, r)
+  | TypePromise p ->
+    (* See Note [placeholder promises for typedefs] *)
+    IntAttribute (dw_AT_type, Wasm_exts.CustomModuleEncode.promise_reference_slot p)
+  | Encoding e -> IntAttribute (dw_AT_encoding, e)
+  | Discr_value v -> IntAttribute (dw_AT_discr_value, v)
+  | Const_value v -> IntAttribute (dw_AT_const_value, v)
+  | DataMemberLocation offs -> IntAttribute (dw_AT_data_member_location, offs)
+  | Location ops ->
+    let string_of_ops ops =
+      let open Buffer in
+      let buf = create 16 in
+      let rec stash = function
+        | i when i >= 0 -> assert (i < 0x100); add_char buf (Char.chr i)
+        | i when -i < 128 -> stash (-i) (* ULEB128 byte *)
+        | i -> (* needs ULEB128 chopping *)
+          let i = -i in
+          stash (i land 0x7F lor 0x80);
+          stash (- (i lsr 7)) in
+      List.iter stash ops;
+      contents buf in
+    StringAttribute (dw_AT_location, string_of_ops ops)
+
+let dw_attr at : die list = [dw_attr' at]
+
+let dw_attrs = List.map dw_attr'
+
+let unreferencable_tag tag attrs =
+  Tag (None, tag, attrs)
+
+
+let with_referencable_tag f tag attrs : die * int =
+  let refslot = Wasm_exts.CustomModuleEncode.allocate_reference_slot () in
+  f refslot;
+  Tag (Some refslot, tag, attrs),
+  refslot
+
+let with_referencable_tags f tag attrs : die list * int =
+  let t, r = with_referencable_tag f tag attrs in
+  [t], r
+
+let with_closed_referencable_tags f tag attrs : die list * int =
+  let t, r = with_referencable_tag f tag attrs in
+  [Grouped [TagClose; t]], r
+
+let referencable_tag = with_referencable_tag ignore
+
+let autoclose_unreferencable_tag tag attrs =
+  Grouped [TagClose; unreferencable_tag tag attrs]
+
+let autoclose_referencable_tag tag attrs =
+  let t, r = referencable_tag tag attrs in
+  Grouped [TagClose; t], r
+
+
+let obvious_prim_of_con c ty : Type.prim option =
+  match Type.normalize ty with
+  | Type.Prim p ->
+    if Arrange_type.(prim p = con c) then Some p else None
+  | _ -> None
+
+let is_enum =
+  let no_payload = function
+    | Type.{typ = Tup []; _} -> true
+    | _ -> false in
+  List.for_all no_payload
+
+(* Mutable state for the already referencable type DIEs *)
+let any_type = ref None
+module TypedefRefs = Map.Make (struct type t = Type.kind Cons.t let compare = compare end)
+let dw_typedefs = ref TypedefRefs.empty
+module PrimRefs = Map.Make (struct type t = Type.prim let compare = compare end)
+let dw_prims = ref PrimRefs.empty
+module EnumRefs = Map.Make (struct type t = string list let compare = compare end)
+let dw_enums = ref EnumRefs.empty
+module OptionRefs = Map.Make (struct type t = int let compare = compare end)
+let dw_options = ref OptionRefs.empty
+module VariantRefs = Map.Make (struct type t = (string * int) list let compare = compare end)
+let dw_variants = ref VariantRefs.empty
+module ObjectRefs = Map.Make (struct type t = (string * int) list let compare = compare end)
+let dw_objects = ref ObjectRefs.empty
+module TupleRefs = Map.Make (struct type t = int list let compare = compare end)
+let dw_tuples = ref TupleRefs.empty
+
+(* Factory for referencable type DIEs *)
+let rec type_ref : Type.typ -> die list * int =
+  let open Type in
+  function
+  | Any ->
+    begin match !any_type with
+    | Some r -> [], r
+    | None ->
+      let add r = any_type := Some r in
+      with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [Name "Any"; Bit_size 0; Data_bit_offset 0; Encoding dw_ATE_address])
+    end
+  | Prim pr -> prim_type_ref pr
+  | Variant vs when is_enum vs -> enum vs
+  | Variant vs -> variant vs
+  | Obj (Object, fs) -> object_ fs
+  | Tup cs -> tuple cs
+  | Con (c, _) as ty ->
+    begin match obvious_prim_of_con c ty with
+    | Some p -> type_ref (Prim p)
+    | None -> typedef_ref c ty
+    end
+  | Opt inner ->
+    let prereq, selector = type_ref inner in
+    let opt, r = option_instance selector in
+    prereq @ opt, r
+  | typ -> (*Printf.printf "Cannot type typ: %s\n" (Wasm.Sexpr.to_string 80 (Arrange_type.typ typ));*) type_ref Any (* FIXME: assert false *)
+
+and typedef_ref c ty : die list * int =
+  match TypedefRefs.find_opt c !dw_typedefs with
+  | Some r -> ([], r)
+  | None ->
+    let add r = dw_typedefs := TypedefRefs.add c r !dw_typedefs in
+    (* See Note [placeholder promises for typedefs] *)
+    let p = Lib.Promise.make () in
+    let name = match Arrange_type.con c with | Wasm.Sexpr.Atom n -> n | _ -> assert false in
+    let typedef_tag, typedef_ref = with_referencable_tag add dw_TAG_typedef (dw_attrs [Name name; TypePromise p]) in
+    let ds, reference = type_ref (Type.normalize ty) in
+    Lib.Promise.fulfill p reference;
+    typedef_tag :: ds, typedef_ref
+
+and prim_type_ref (prim : Type.prim) : die list * int =
+  match PrimRefs.find_opt prim !dw_prims with
+  | Some r -> [], r
+  | None ->
+    let name = Name (Type.string_of_prim prim) in
+    let add r = dw_prims := PrimRefs.add prim r !dw_prims in
+    let ds, r =
+      match prim with
+      | Type.Bool ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 1; Data_bit_offset 1; Encoding dw_ATE_boolean])
+      | Type.Char ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 29; Data_bit_offset 8; Encoding dw_ATE_UTF])
+      | Type.(Int | Nat) ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_signed])
+      | Type.Text -> (* FIXME: should be dynamic, like Any *)
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_UTF])
+      | Type.(Int8|Int16|Int32) ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_signed])
+      | Type.(Nat8|Nat16|Nat32) ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 32; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_unsigned])
+      | Type.Int64 ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 64; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_signed])
+      | Type.Nat64 ->
+        with_referencable_tags add dw_TAG_base_type
+          (dw_attrs [name; Bit_size 64; Data_bit_offset 0(*FIXME: for now*); Encoding dw_ATE_unsigned])
+      | ty -> (*Printf.eprintf "Cannot type: %s\n" (Wasm.Sexpr.to_string 80 (Arrange_type.prim prim));*) type_ref Type.Any (* FIXME, this is "Any" for now *)
+(* | _ -> assert false (* TODO *)*)
+    in
+    ds, r
+
+and enum vnts : die list * int =
+  let selectors = List.map (fun Type.{lab; _} -> lab) vnts in
+  match EnumRefs.find_opt selectors !dw_enums with
+  | Some r -> [], r
+  | None ->
+    let add r = dw_enums := EnumRefs.add selectors r !dw_enums in
+    let enumerator name =
+        let hash = Int32.to_int (Mo_types.Hash.hash name) in
+        unreferencable_tag dw_TAG_enumerator (dw_attrs [Name name; Const_value hash]) in
+    (*  enumeration_type, useful only with location expression *)
+    with_closed_referencable_tags add
+       dw_TAG_enumeration_type
+       (dw_attr' (Artificial true) :: List.map enumerator selectors)
+
+and option_instance key : die list * int =
+  (* TODO: make this with DW_TAG_template_alias? ... lldb-10 is not ready yet *)
+  let open Wasm_exts.Abbreviation in
+  match OptionRefs.find_opt key !dw_options with
+  | Some r -> [], r
+  | None ->
+    let add r = dw_options := OptionRefs.add key r !dw_options in
+    let prereq name(*WAT?*) : die * die =
+      let overlay_die, overlay_ref =
+        autoclose_referencable_tag dw_TAG_structure_type
+          (unreferencable_tag dw_TAG_member_In_variant
+             (dw_attrs [Name "?"; TypeRef key; DataMemberLocation 4]) ::
+           dw_attrs [Name name; Byte_size 8 (*; Artificial *)]) in
+      overlay_die,
+      unreferencable_tag dw_TAG_member_In_variant
+        (dw_attrs [Name name; TypeRef overlay_ref; DataMemberLocation 4]) in
+    (* make sure all prerequisite types are around *)
+    let overlays = List.map prereq ["FIXME:none"; "FIXME:some"] in
+    (* struct_type, assumes location points at heap tag -- NO! FIXME *)
+    let discr_tag, discr_ref =
+      referencable_tag dw_TAG_member_Variant_mark
+        (dw_attrs [Artificial true; Byte_size 4; DataMemberLocation 0]) in
+    let summand ((name, discr), member) : die =
+      autoclose_unreferencable_tag dw_TAG_variant_Named
+        (member :: dw_attrs [Name name; Discr_value discr]) in
+    let internal_struct, struct_ref =
+      with_closed_referencable_tags add dw_TAG_structure_type
+        (discr_tag ::
+         autoclose_unreferencable_tag dw_TAG_variant_part
+           (dw_attr' (Discr discr_ref) ::
+            List.map summand (List.map2 (fun nd (_, mem) -> nd, mem) ["FIXME:none", 0x0; "FIXME:some", 0x8] overlays)) ::
+         dw_attrs [Name "OPTION"; Byte_size 8]) in
+    List.map fst overlays @ internal_struct,
+    struct_ref
+
+and variant vnts : die list * int =
+  let open Wasm_exts.Abbreviation in
+  let selectors = List.map (fun Type.{lab; typ; _} -> lab, typ, type_ref typ) vnts in
+  (* make sure all prerequisite types are around *)
+  let prereqs = List.concat_map (fun (_, _, (dw, _)) -> dw) selectors in
+  let key = List.map (fun (name, _, (_, reference)) -> name, reference) selectors in
+  match VariantRefs.find_opt key !dw_variants with
+  | Some r -> prereqs, r
+  | None ->
+    let add r = dw_variants := VariantRefs.add key r !dw_variants in
+    let prereq (name, typ, _) : die list * die =
+      let (payload_pre, payload_mem) : die list * die list =
+        match typ with
+        | Type.Tup [] -> [], []
+        | _ ->
+          let ds, r = type_ref typ in
+          ds,
+          [unreferencable_tag dw_TAG_member_In_variant
+             (dw_attrs [Name ("#" ^ name); TypeRef r; DataMemberLocation 8])] in
+      let overlay_ds, (overlay_die, overlay_ref) =
+        payload_pre,
+        autoclose_referencable_tag dw_TAG_structure_type
+          (dw_attrs [Name name; Byte_size 12 (*; Artificial *)] @ payload_mem) in
+      overlay_ds @ [overlay_die],
+      unreferencable_tag dw_TAG_member_In_variant
+        (dw_attrs [Name name; TypeRef overlay_ref; DataMemberLocation 8]) in
+    (* make sure all artificial overlay types are around *)
+    let overlays = List.map prereq selectors in
+    let discr_tag, discr_ref =
+      referencable_tag dw_TAG_member_Variant_mark
+        (dw_attrs [Artificial true; Byte_size 4; DataMemberLocation 4]) in
+    (* struct_type, assumes location points at heap tag *)
+    let summand (name, member) : die =
+      let hash = Int32.to_int (Mo_types.Hash.hash name) in
+      autoclose_unreferencable_tag dw_TAG_variant_Named
+        (member :: dw_attrs [Name name; Discr_value hash]) in
+    let internal_struct, struct_ref =
+      with_closed_referencable_tags add dw_TAG_structure_type
+        (autoclose_unreferencable_tag dw_TAG_member_Tag_mark
+           (dw_attrs [Artificial true; Byte_size 4]) ::
+        discr_tag ::
+        (autoclose_unreferencable_tag
+           dw_TAG_variant_part (
+             List.map summand (List.map2 (fun (name, _, _) (_, mem) -> name, mem) selectors overlays) @
+             dw_attrs [Discr discr_ref])) ::
+        dw_attrs [Name "VARIANT"; Byte_size 8]) in
+    prereqs @ List.concat_map fst overlays @ internal_struct, struct_ref
+
+and object_ fs : die list * int =
+  let open List in
+  let open Wasm_exts.Abbreviation in
+  let selectors = map (fun Type.{lab; typ; _} -> lab, type_ref typ) fs in
+  (* make sure all prerequisite types are around *)
+  let prereqs = concat_map (fun (_, (ds, _)) -> ds) selectors in
+  let key = map (fun (name, (_, reference)) -> name, reference) selectors in
+  match ObjectRefs.find_opt key !dw_objects with
+  | Some r -> prereqs, r
+  | None ->
+    let add r = dw_objects := ObjectRefs.add key r !dw_objects in
+    let ds, r =
+      let field (name, (_, r)) : die =
+        let _hash = Lib.Uint32.to_int (Idllib.IdlHash.idl_hash name) in (* TODO *)
+        unreferencable_tag dw_TAG_member_Word_sized_typed
+          (dw_attrs [Name name; TypeRef r; Byte_size 4 (*; Location search *)]) in
+      (* reference to structure_type *)
+      with_closed_referencable_tags add dw_TAG_structure_type
+          (dw_attrs [Name "@obj"; Byte_size (4 * length selectors)] @ map field selectors) in
+    prereqs @ ds, r
+
+and tuple ts : die list * int =
+  let open List in
+  let open Wasm_exts.Abbreviation in
+  let field_types_refs = map type_ref ts in
+  let field_refs = map snd field_types_refs in
+  let prereqs = concat_map fst field_types_refs in
+  match TupleRefs.find_opt field_refs !dw_tuples with
+  | Some r -> prereqs, r
+  | None ->
+    let add r = dw_tuples := TupleRefs.add field_refs r !dw_tuples in
+    let ds, r =
+      let field index (_, r) =
+        unreferencable_tag dw_TAG_member_Word_sized_typed
+          (dw_attrs [Name (Printf.sprintf ".%d" index); TypeRef r; Byte_size 4]) in
+      with_closed_referencable_tags add dw_TAG_structure_type
+        (dw_attrs [Name "@tup"; Byte_size 4] @ mapi field field_types_refs) in
+    prereqs @ ds, r
+
+
+
+(* Location expressions for DWARF
+   These are instruction sequences that direct the debugger
+   at where the data resides.
+ *)
+let rec loc slot =
+  let unskew, past_tag = 1, 4 in
+  let open Type in
+  function (* See Note [locations for types] *)
+  | Type.Variant vs when is_enum vs ->
+    Location.local slot [ dw_OP_plus_uconst; unskew + past_tag; dw_OP_deref; dw_OP_stack_value ]
+  | Type.Variant _ -> Location.local slot [ dw_OP_plus_uconst; unskew ]
+  | Prim Text -> Location.local slot [ dw_OP_plus_uconst; unskew; dw_OP_stack_value ]
+  | Prim Char -> Location.local slot [ dw_OP_lit8; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Bool -> Location.local slot [ dw_OP_lit1; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Int8 -> Location.local slot [ dw_OP_lit24; dw_OP_shra; dw_OP_stack_value ]
+  | Prim Nat8 -> Location.local slot [ dw_OP_lit24; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Int16 -> Location.local slot [ dw_OP_lit16; dw_OP_shra; dw_OP_stack_value ]
+  | Prim Nat16 -> Location.local slot [ dw_OP_lit16; dw_OP_shr; dw_OP_stack_value ]
+  | Prim Int32 -> Location.local slot [ dw_OP_dup; dw_OP_lit1; dw_OP_and; dw_OP_bra; 5; 0;
+                                        dw_OP_lit1; dw_OP_shra; dw_OP_skip; 3; 0;
+                                        dw_OP_plus_uconst; unskew + past_tag; dw_OP_deref; dw_OP_stack_value ]
+  | Prim Nat32 -> Location.local slot [ dw_OP_dup; dw_OP_lit1; dw_OP_and; dw_OP_bra; 5; 0;
+                                                 dw_OP_lit1; dw_OP_shr; dw_OP_skip; 3; 0;
+                                                 dw_OP_plus_uconst; unskew + past_tag; dw_OP_deref; dw_OP_stack_value ]
+  (* FIXME: for Int64|Nat64|Nat|Int the heap check is ignored for now *)
+  | Prim Int64 -> Location.local slot [ dw_OP_lit1; dw_OP_shra; dw_OP_const4u; 0xFF; 0xFF; 0xFF; 0xFF; dw_OP_and; dw_OP_stack_value ]
+  | Prim Nat64 -> Location.local slot [ dw_OP_lit1; dw_OP_shr; dw_OP_const4u; 0x7F; 0xFF; 0xFF; 0xFF; dw_OP_and; dw_OP_stack_value ]
+  | Prim (Nat|Int) -> Location.local slot [ dw_OP_lit1; dw_OP_shra; dw_OP_stack_value ]
+
+  | Tup _ -> Location.local slot []
+  | Con (c, _) as ty ->
+    begin match obvious_prim_of_con c ty with
+    | Some p -> loc slot (Prim p)
+    | _ -> Location.local slot [ dw_OP_stack_value ] (* FIXME: locate real type *)
+    end
+  | _ -> Location.local slot [ dw_OP_stack_value ] (* FIXME: objects, options *)
+
+
+(* Initiate a (hierarchical) DWARF tag
+   this might produce a list of DIEs
+   and might need a subsequent closing DIE.
+   See Note [emit a DW_TAG] *)
+let tag_open : dw_TAG -> die list =
+  let prim_type prim = fst (prim_type_ref prim) in
+  let type_ ty = fst (type_ref ty) in
+  let append_tag ds t ats = ds @ [unreferencable_tag t ats] in
+  let open Type in
+  function
+  | Compile_unit (dir, file) ->
+    let base_types = (* these are emitted for inspectionability, now *)
+      List.concat_map prim_type
+        [ Bool; Char; Text; Nat8; Int8; Nat16
+        ; Int16; Nat32; Int32; Nat64; Int64] in
+    let builtin_types =
+      type_ Any @
+      prim_type Nat @
+      prim_type Int in
+    [unreferencable_tag dw_TAG_compile_unit
+       (dw_attrs
+          [ Producer (Printf.sprintf "DFINITY Motoko compiler %s" Source_id.banner);
+            Language dw_LANG_Motoko; Name file; Stmt_list 0;
+            Comp_dir dir; Use_UTF8 true; Low_pc; Addr_base 8; Ranges ] @
+        base_types @ builtin_types)]
+  | Subprogram (name, [retty], pos) ->
+    let ds, ref_ret = type_ref retty in
+    append_tag ds Wasm_exts.Abbreviation.dw_TAG_subprogram_Ret
+      (dw_attrs [Low_pc; High_pc; Name name; TypeRef ref_ret; Decl_file pos.Source.file; Decl_line pos.Source.line; Decl_column pos.Source.column; Prototyped true; External false])
+  | Subprogram (name, _, pos) ->
+    [unreferencable_tag dw_TAG_subprogram
+       (dw_attrs [Low_pc; High_pc; Name name; Decl_file pos.Source.file; Decl_line pos.Source.line; Decl_column pos.Source.column; Prototyped true; External false])]
+  | Formal_parameter (name, pos, ty, slot) ->
+    let ds, reference = type_ref ty in
+    append_tag ds dw_TAG_formal_parameter
+      (dw_attrs [Name name; Decl_line pos.Source.line; Decl_column pos.Source.column; TypeRef reference; Location (loc slot ty)])
+  | LexicalBlock pos ->
+    [unreferencable_tag dw_TAG_lexical_block
+       (dw_attrs [Decl_line pos.Source.line; Decl_column pos.Source.column])]
+  | Variable (name, pos, ty, slot) ->
+    let ds, reference = type_ref ty in
+    append_tag ds dw_TAG_variable
+      (dw_attrs [Name name; Decl_line pos.Source.line; Decl_column pos.Source.column; TypeRef reference; Location (loc slot ty)])
+  | Type ty -> type_ ty
+  | _ -> assert false
+
+
+
+ + + diff --git a/coverage/codegen/instrList.ml.html b/coverage/codegen/instrList.ml.html new file mode 100644 index 00000000000..51dad01a287 --- /dev/null +++ b/coverage/codegen/instrList.ml.html @@ -0,0 +1,970 @@ + + + + + instrList.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+
+
(*
+This module provides some convenience to assemble WASM instruction lists. The
+features are
+
+ * O(1) concatenation (using difference list internally)
+ * Managing of label depths.
+ * Some simple peephole optimizations.
+*)
+
+open Wasm_exts.Ast
+open Wasm.Source
+open Wasm.Values
+
+let combine_shifts const op = function
+  | I32 opl, ({it = I32 l'; _} as cl), I32 opr, I32 r' when opl = opr ->
+    let l, r = Int32.(to_int l', to_int r') in
+    if (l >= 0 && l < 32 && r >= 0 && r < 32 && l + r < 32) then
+      Some [{const with it = Const {cl with it = I32 (Int32.add l' r')}}; {op with it = Binary (I32 opl)}]
+    else None
+  | _ -> None
+
+(* Some simple peephole optimizations, to make the output code look less stupid *)
+(* This uses a zipper.*)
+let optimize : instr list -> instr list = fun is ->
+  let rec go l r = match l, r with
+    (* Combine adjacent Metas *)
+    | {it = Meta m2; _} as n2 :: {it = Meta m1; _} :: l', r' ->
+      let combined =
+        let open Wasm_exts.Dwarf5.Meta in
+        match m1, m2 with
+        | StatementDelimiter _, StatementDelimiter _ -> m2
+        | StatementDelimiter _, Grouped (StatementDelimiter _ :: t) -> Grouped (m2 :: t)
+        | Grouped g1, Grouped g2 -> Grouped (g2 @ g1)
+        | Grouped g1, _ -> Grouped (m2 :: g1)
+        | _, Grouped g2 -> Grouped (g2 @ [m1])
+        | _, _ -> Grouped [m2; m1] in
+      go ({ n2 with it = Meta combined } :: l') r'
+
+    (* Loading and dropping is pointless *)
+    | { it = Const _ | LocalGet _; _} :: l', { it = Drop; _ } :: r' -> go l' r'
+    (* Loading and dropping is pointless, even with intervening Meta *)
+    | { it = Meta _; _} as m :: { it = Const _ | LocalGet _; _} :: l', { it = Drop; _ } :: r' -> go l' (m :: r')
+    (* The following is not semantics preserving for general Wasm (due to out-of-memory)
+       but should be fine for the code that we create *)
+    | { it = Load _; _} :: l', { it = Drop; _ } :: _ -> go l' r
+    (* Introduce LocalTee *)
+    | { it = LocalSet n1; _} :: l', ({ it = LocalGet n2; _ } as i) :: r' when n1 = n2 ->
+      go l' ({i with it = LocalTee n2 } :: r')
+    (* Introduce LocalTee with previously intervening Meta *)
+    | { it = Meta _; _} as m :: { it = LocalSet n1; _} :: l', ({ it = LocalGet n2; _ } as i) :: r' when n1 = n2 ->
+      go l' (m :: {i with it = LocalTee n2 } :: r')
+    (* Eliminate LocalTee followed by Drop (good for confluence) *)
+    | ({ it = LocalTee n; _} as i) :: l', { it = Drop; _ } :: r' ->
+      go l' ({i with it = LocalSet n } :: r')
+    (* Eliminate Get followed by Set (typical artifact from the multi-value emulation) *)
+    | { it = LocalGet n1; _} :: l', ({ it = LocalSet n2; _ }) :: r' when n1 = n2 ->
+      go l' r'
+    | { it = GlobalGet n1; _} :: l', ({ it = GlobalSet n2; _ }) :: r' when n1 = n2 ->
+      go l' r'
+    (* Code after Return, Br or Unreachable is dead *)
+    | _, ({ it = Return | Br _ | Unreachable; _ } as i) :: t ->
+      (* see Note [funneling DIEs through Wasm.Ast] *)
+      List.(rev (i :: l) @ find_all (fun instr -> Wasm_exts.Ast.is_dwarf_like instr.it) t)
+    (* Equals zero has a dedicated operation (and works well with leg swapping) *)
+    | ({it = Compare (I32 I32Op.Eq); _} as i) :: {it = Const {it = I32 0l; _}; _} :: l', r' ->
+      go l' ({ i with it = Test (I32 I32Op.Eqz)} :: r')
+    | ({it = Compare (I64 I64Op.Eq); _} as i) :: {it = Const {it = I64 0L; _}; _} :: l', r' ->
+      go l' ({ i with it = Test (I64 I64Op.Eqz)} :: r')
+    (* Constants before `Eqz` reduce trivially *)
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Const {it = I32 n; _}; _} :: l', r' ->
+      go l' ({ i with it = Const {it = I32 (if n = 0l then 1l else 0l); at = i.at}} :: r')
+    | ({it = Test (I64 I64Op.Eqz); _} as i) :: {it = Const {it = I64 n; _}; _} :: l', r' ->
+      go l' ({ i with it = Const {it = I32 (if n = 0L then 1l else 0l); at = i.at}} :: r')
+    (* eqz after eq/ne becomes ne/eq *)
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I32 I32Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (I32 I32Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I32 I32Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (I32 I32Op.Eq)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I64 I64Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (I64 I64Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (I64 I64Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (I64 I64Op.Eq)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F32 F32Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (F32 F32Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F32 F32Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (F32 F32Op.Eq)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F64 F64Op.Eq); _} :: l', r' ->
+      go l' ({ i with it = Compare (F64 F64Op.Ne)} :: r')
+    | ({it = Test (I32 I32Op.Eqz); _} as i) :: {it = Compare (F64 F64Op.Ne); _} :: l', r' ->
+      go l' ({ i with it = Compare (F64 F64Op.Eq)} :: r')
+    (* LSBit masking before `If` is `Ctz` and switched `If` legs *)
+    | ({ it = Binary (I32 I32Op.And); _} as a) :: { it = Const {it = I32 1l; _}; _} :: l', ({it = If (res,then_,else_); _} as i) :: r' ->
+      go ({a with it = Unary (I32 I32Op.Ctz)} :: l') ({i with it = If (res,else_,then_)} :: r')
+    (* `If` blocks after pushed constants are simplifiable *)
+    | { it = Const {it = I32 0l; _}; _} :: l', ({it = If (res,_,else_); _} as i) :: r' ->
+      go l' ({i with it = Block (res, else_)} :: r')
+    | { it = Const {it = I32 _; _}; _} :: l', ({it = If (res,then_,_); _} as i) :: r' ->
+      go l' ({i with it = Block (res, then_)} :: r')
+    (* `If` blocks after negation can swap legs *)
+    | { it = Test (I32 I32Op.Eqz); _} :: l', ({it = If (res,then_,else_); _} as i) :: r' ->
+      go l' ({i with it = If (res,else_,then_)} :: r')
+    (* `If` blocks with empty legs just drop *)
+    | l', ({it = If (_,[],[]); _} as i) :: r' ->
+       go l' ({i with it = Drop} :: r')
+    (* `If` blocks with empty then after comparison can invert the comparison and swap legs *)
+    | { it = Compare (I32 I32Op.Eq); _} as comp :: l', ({it = If (res,[],else_); _} as i) :: r' ->
+      go ({comp with it = Compare (I32 I32Op.Ne)} :: l') ({i with it = If (res,else_,[])} :: r')
+    | { it = (Compare (I32 I32Op.Ne) | Binary (I32 I32Op.Xor)); _} as comp :: l', ({it = If (res,[],else_); _} as i) :: r' ->
+      go ({comp with it = Compare (I32 I32Op.Eq)} :: l') ({i with it = If (res,else_,[])} :: r')
+    (* Empty block is redundant *)
+    | l', ({ it = Block (_, []); _ }) :: r' -> go l' r'
+    (* Constant shifts can be combined *)
+    | {it = Binary (I32 I32Op.(Shl|ShrS|ShrU) as opl); _} :: {it = Const cl; _} :: l',
+      ({it = Const cr; _} as const) :: ({it = Binary opr; _} as op) :: r'
+        when Option.is_some (combine_shifts const op (opl, cl, opr, cr.it)) ->
+      go l' (Option.get (combine_shifts const op (opl, cl, opr, cr.it)) @ r')
+    (* Null shifts can be eliminated *)
+    | l', {it = Const {it = I32 0l; _}; _} :: {it = Binary (I32 I32Op.(Shl|ShrS|ShrU)); _} :: r' ->
+      go l' r'
+    (* Look further *)
+    | _, i::r' -> go (i::l) r'
+    (* Done looking *)
+    | l, [] -> List.rev l
+  in go [] is
+
+(* The main type of this module:
+   Arguments for the current depth and the current source region,
+   and producing a difference list *)
+type t = int32 -> Wasm.Source.region -> instr list -> instr list
+
+let to_instr_list (is : t) : instr list =
+  optimize (is 0l Wasm.Source.no_region [])
+
+let to_nested_list d pos is =
+  optimize (is Int32.(add d 1l) pos [])
+
+
+(* Do nothing *)
+let nop : t = fun _ _ rest -> rest
+
+(* The concatenation operator *)
+let (^^) (is1 : t) (is2 : t) : t = fun d pos rest -> is1 d pos (is2 d pos rest)
+
+(* Singletons *)
+let i (instr : instr') : t = fun _ pos rest -> (instr @@ pos) :: rest
+
+(* map and concat *)
+let concat xs = List.fold_right (^^) xs nop
+let concat_map f xs = List.fold_right (^^) (List.map f xs) nop
+let concat_mapi f xs = List.fold_right (^^) (List.mapi f xs) nop
+let table n f = List.fold_right (^^) (Lib.List.table n f) nop
+
+(* Region-managing combinator *)
+
+let cr at =
+  let left = Wasm.Source.{
+    file = at.Source.left.Source.file;
+    line = at.Source.left.Source.line;
+    column = at.Source.left.Source.column } in
+  let right = Wasm.Source.{
+    file = at.Source.right.Source.file;
+    line = at.Source.right.Source.line;
+    column = at.Source.right.Source.column } in
+  Wasm.Source.{ left; right }
+
+let with_region (pos : Source.region) (body : t) : t =
+  fun d _pos rest -> body d (cr pos) rest
+
+(* Depths-managing combinators *)
+
+let if_ (ty : block_type) (thn : t) (els : t) : t =
+  fun d pos rest ->
+    (If (ty, to_nested_list d pos thn, to_nested_list d pos els) @@ pos) :: rest
+
+(* Shortcuts for unary and nullary variants *)
+let if0 = if_ (ValBlockType None)
+let if1 ty = if_ (ValBlockType (Some ty))
+
+let block_ (ty : block_type) (body : t) : t =
+  fun d pos rest ->
+    (Block (ty, to_nested_list d pos body) @@ pos) :: rest
+let block0 = block_ (ValBlockType None)
+let block1 ty = block_ (ValBlockType (Some ty))
+
+let loop0 (body : t) : t =
+  fun d pos rest ->
+    (Loop (ValBlockType None, to_nested_list d pos body) @@ pos) :: rest
+
+(* Remember depth *)
+type depth = int32 Lib.Promise.t
+
+let new_depth_label () : depth =  Lib.Promise.make ()
+
+let remember_depth depth (is : t) : t =
+  fun d rest -> Lib.Promise.fulfill depth d; is d rest
+
+let with_current_depth (k : depth -> t) : t =
+  let depth = new_depth_label () in
+  remember_depth depth (k depth)
+
+let with_current_depth' (k : depth -> ('a * t)) : ('a * t) =
+  let depth = new_depth_label () in
+  let x, is = k depth in
+  (x, remember_depth depth is)
+
+let branch_to_ (p : depth) : t =
+  fun d pos rest ->
+    (Br (Int32.(sub d (Lib.Promise.value p)) @@ pos) @@ pos) :: rest
+
+(* Convenience combinators *)
+
+let labeled_block1 ty depth (body : t) : t =
+  block1 ty (remember_depth depth body)
+
+(* Obtain the setter from a known variable's getter *)
+
+let setter_for (getter : t) =
+  match List.map (fun {it; _} -> it) (getter 0l Wasm.Source.no_region []) with
+  | [LocalGet v] -> i (LocalSet v)
+  | [GlobalGet v] -> i (GlobalSet v)
+  | _ -> failwith "input must be a getter"
+
+(* Intended to be used within assert *)
+
+let is_nop (is : t) =
+  is 0l Wasm.Source.no_region [] = []
+
+(* DWARF tags and attributes: see Note [funneling DIEs through Wasm.Ast] *)
+
+open Wasm_exts.Dwarf5
+open Meta
+
+open Die
+
+(* Note [emit a DW_TAG]
+   ~~~~~~~~~~~~~~~~~~~~
+   There are two principal types of DWARF tags, those
+   which are intimately tied to the generated instructions
+   and those that are not. The latter ones include type
+   definitions which can be regarded as global, while
+   the former bracket or delimit instructions, like
+   scoping or variable definitions. These are required to
+   float with the instruction stream.
+
+   Another aspect of tags is whether a tag admits children.
+   When it admits children, these follow sequentially,
+   closed by dw_tag_close. The abbreviation table must
+   be consulted when deciding between
+   - dw_tag_no_children, or
+   - dw_tag.
+   The former is self-closing (no nested tags), and the
+   latter is high-level, straddling a region of code.
+   The low-level alternative to the latter is using the
+   dw_tag_open/dw_tag_close pair explicitly to demarcate
+   the enclosed instructions. This moves the burden of
+   balancing to the user.
+   See also: Note [funneling DIEs through Wasm.Ast]
+ *)
+
+(* Note [locations for types]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~
+   Motoko uses a variety of formats to store data depending on its type
+   and even the actual value. Location  expressions are necessary to teach
+   the debugger where the data can be found.
+   - For short numeric types we have a location expression that LSB-aligns
+     and leaves the value on the expression stack. This is a workaround for
+     `lldb`'s insufficiency to understand basic types that are bitfields
+     (http://lists.llvm.org/pipermail/lldb-dev/2020-August/016393.html).
+     This also implies that setting of such variables in `lldb` won't work.
+   - 32/64 bit-sized integrals may be stored on the heap, we use `DW_OP_bra`
+     to guide the debugger after examining the indirection bit.
+     We can't use the pointer key to be a discriminator for DW_TAG_variant_part
+     because of lldb (link above), and probably displaying issues.
+   - For arbitrary-precision integrals, we cannot inspect the multi-precision
+     heap representation yet
+   - Variants with no payload map to C-like `enum`s, the location expression
+     takes care of focussing on the hash value
+   - Variants map to `DW_TAG_variant_*` directly
+   - Tuples may use Rust-like decoding
+   - Objects need field search for members (when encoded as structure members)
+   - The `Any` type will need fully dynamic resolution by `lldb`
+   - Parameter types for polymorphic types/functions will be treated as `Any`.
+   - `Text` will be treated as `Any` as it needs pretty-printing in the presence
+     of concatenation nodes
+
+ *)
+
+(* injecting a tag into the instruction stream, see Note [emit a DW_TAG] *)
+let dw_tag_open tag : t =
+  let metas = concat_map (fun die -> i (Meta die)) in
+  metas (tag_open tag)
+
+let dw_tag die body =
+  let dw_tag_close : t = i (Meta TagClose) in
+  dw_tag_open die ^^ body ^^ dw_tag_close
+let dw_tag_no_children = dw_tag_open (* self-closing *)
+
+(* Marker for statement boundaries *)
+let dw_statement { Source.left; Source.right } =
+  let open Wasm.Source in
+  let left = { file = left.Source.file; line = left.Source.line; column = left.Source.column } in
+  i (Meta (StatementDelimiter left))
+
+
+
+ + + diff --git a/coverage/coverage.css b/coverage/coverage.css new file mode 100644 index 00000000000..35bb22a727f --- /dev/null +++ b/coverage/coverage.css @@ -0,0 +1,500 @@ +:root, .light:root { + --main-background: #fff; + --code-background: transparent; + --line-numbers-background: rgba(0, 0, 0, 0.025); + --navbar-background: #eee; + + --meter-unvisited-color: #f9c3c3; + --meter-visited-color: #9ed09f; + --meter-separator-color: white; + + --color: #000; + --dirname-color: #bbb; + --stats-color: #aaa; + --underline-color: #ddd; + --visited-color: #eaffea; + --visited-number-color: rgba(64, 192, 64, 0.2); + --unvisited-color: #ffecec; + --unvisited-number-color: rgba(255, 128, 128, 0.5); + --somevisited-color: #ffd; + --highlight-color: #a0fbff; + --line-number-color: rgba(0, 0, 0, 0.4); + --unvisited-margin-color: #d69e9e; + --border: #eee; + --navbar-border: #ddd; + --code-color: #000; + --hljs-link: #6a737d; + --hljs-keyword: #d73a49; + --hljs-regexp: #032f62; + --hljs-title: #900; + --hljs-type: #6f42c1; + --hljs-meta: #22863a; + --hljs-variable: #005cc5; +} + +.dark:root { + --main-background: #202020; + --code-background: #222; + --line-numbers-background: rgba(0, 0, 0, 0.125); + --navbar-background: #202020; + + --meter-unvisited-color: #622; + --meter-visited-color: #252; + --meter-separator-color: black; + + --color: #bebebe; + --dirname-color: #666; + --stats-color: #555; + --underline-color: #444; + --visited-color: #002800; + --visited-number-color: #252; + --unvisited-color: #380000; + --unvisited-number-color: #822; + --somevisited-color: #303000; + --highlight-color: #303e3f; + --line-number-color: rgba(230, 230, 230, 0.3); + --unvisited-margin-color: #622; + --border: #333; + --navbar-border: #333; + --code-color: #ccc; + --hljs-link: #999; + --hljs-keyword: #cda869; + --hljs-regexp: #f9ee98; + --hljs-title: #dcdcaa; + --hljs-type: #ac885b; + --hljs-meta: #82aaff; + --hljs-variable: #cf6a4c; +} + +@media (prefers-color-scheme: dark) { + :root { + --main-background: #202020; + --code-background: #222; + --line-numbers-background: rgba(0, 0, 0, 0.125); + --navbar-background: #202020; + + --meter-unvisited-color: #622; + --meter-visited-color: #252; + --meter-separator-color: black; + + --color: #bebebe; + --dirname-color: #666; + --underline-color: #444; + --visited-color: #002800; + --visited-number-color: #252; + --unvisited-color: #380000; + --unvisited-number-color: #822; + --somevisited-color: #303000; + --highlight-color: #303e3f; + --line-number-color: rgba(230, 230, 230, 0.3); + --unvisited-margin-color: #622; + --border: #333; + --navbar-border: #333; + --code-color: #ccc; + --hljs-link: #999; + --hljs-keyword: #cda869; + --hljs-regexp: #f9ee98; + --hljs-title: #dcdcaa; + --hljs-type: #ac885b; + --hljs-meta: #82aaff; + --hljs-variable: #cf6a4c; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.5em; + background-color: var(--main-background); +} + +pre { + margin: 0; + font-family: "Fira Code", "Cascadia Code", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 13px; + color: var(--code-color); + cursor: text; +} + +code { + font-family: inherit; +} + +a { + text-decoration: none; + color: inherit; +} + +a:visited { + color: inherit; +} + +#header { + color: var(--color); +} + +h1 { + display: inline-block; + margin: 1.5em 1.5em 0.75em 1.5em; +} + +.dirname { + color: var(--dirname-color); +} + +h2 { + display: inline-block; + position: relative; + top: -1px; +} + +#footer { + margin: 1em 0 1em 4em; + color: #aaa; + font-size: 12px; +} + +#footer a { + color: #666; + border-bottom: 1px solid #ccc; +} + +#footer a:visited { + color: #666; +} + +#navbar { + position: fixed; + top: 0; + left: 0; + width: 1em; + height: 100%; + background-color: var(--navbar-background); + border-right: 1px solid var(--navbar-border); + cursor: pointer; +} + +#navbar span { + display: block; + position: absolute; + width: 100%; + height: 5px; +} + +#navbar .unvisited, #navbar .some-visited { + background-color: var(--unvisited-margin-color); +} + +#report { + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + overflow: hidden; +} + +#lines-layer { + position: absolute; + z-index: -100; + width: 100%; + background-color: var(--code-background); +} + +#lines-layer span { + display: inline-block; + width: 100%; +} + +a[id] { + display: block; + position: relative; + top: -5.5em; +} + +#lines-layer .unvisited { + background-color: var(--unvisited-color); +} + +#lines-layer .visited { + background-color: var(--visited-color); +} + +#lines-layer .some-visited { + background-color: var(--somevisited-color); +} + +a[id]:target + span { + -webkit-animation: highlight-blank 0.5s; + -moz-animation: highlight-blank 0.5s; + -o-animation: highlight-blank 0.5s; + animation: highlight-blank 0.5s; +} + +a[id]:target + .unvisited { + -webkit-animation: highlight-unvisited 0.5s; + -moz-animation: highlight-unvisited 0.5s; + -o-animation: highlight-unvisited 0.5s; + animation: highlight-unvisited 0.5s; +} + +a[id]:target + .visited { + -webkit-animation: highlight-visited 0.5s; + -moz-animation: highlight-visited 0.5s; + -o-animation: highlight-visited 0.5s; + animation: highlight-visited 0.5s; +} + +a[id]:target + .some-visited { + -webkit-animation: highlight-some-visited 0.5s; + -moz-animation: highlight-some-visited 0.5s; + -o-animation: highlight-some-visited 0.5s; + animation: highlight-some-visited 0.5s; +} + +@-webkit-keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@-moz-keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@-o-keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@keyframes highlight-blank { + from { background-color: var(--highlight-color); } + to { background-color: transparent; } +} + +@-webkit-keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@-moz-keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@-o-keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@keyframes highlight-unvisited { + from { background-color: var(--highlight-color); } + to { background-color: var(--unvisited-color); } +} + +@-webkit-keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@-moz-keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@-o-keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@keyframes highlight-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--visited-color); } +} + +@-webkit-keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +@-moz-keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +@-o-keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +@keyframes highlight-some-visited { + from { background-color: var(--highlight-color); } + to { background-color: var(--somevisited-color); } +} + +#line-numbers { + float: left; + border-right: 1px solid var(--border); + margin-right: 1em; + color: var(--line-number-color); + background-color: var(--line-numbers-background); + text-align: right; +} + +#line-numbers a { + display: inline-block; + padding-left: 2.35em; + padding-right: 1em; + text-decoration: none; + color: var(--line-number-color); +} + +#line-numbers .unvisited { + background-color: var(--unvisted-number-color); +} + +#line-numbers .visited { + background-color: var(--visted-number-color); +} + +code span[data-count] { + background-color: var(--visited-number-color); +} + +code span[data-count="0"] { + background-color: var(--unvisited-number-color); +} + +#tool-tip { + display: none; + position: fixed; + padding: 0 0.25em; + background-color: black; + color: white; +} + +#tool-tip.visible { + display: block; +} + +#files { + padding: 1.5em 4em; + background-color: var(--code-background); + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); +} + +.meter { + display: inline-block; + position: relative; + top: 3px; + width: 5em; + height: 1em; + background-color: var(--meter-unvisited-color); +} + +.covered { + display: inline-block; + position: absolute; + width: 50%; + height: 100%; + background-color: var(--meter-visited-color); + border-right: 1px solid var(--meter-separator-color); +} + +#files div { + display: flex; +} + +summary { + cursor: pointer; + display: flex; +} + +.summary-indicator { + display: inline-block; + width: 1em; + color: var(--color); +} + +/* Adds indentation to the directory tree */ +details > details, details > div { + margin-left: 1em; +} + +details > summary > .summary-indicator { + text-align: center; + font-weight: bold; +} + +details > summary > .summary-indicator::before { + content: "+"; +} + +details[open] > summary > .summary-indicator::before { + content: "-"; +} + +.percentage { + display: inline-block; + min-width: 7.5em; + margin: 0 0.5em; + font-size: 90%; + color: var(--color); +} + +.stats { + display: inline-block; + font-size: 70%; + color: var(--stats-color); +} + +#files a { + text-decoration: none; + border-bottom: 1px solid var(--underline-color); + color: var(--color); +} + +.hljs-link, +.hljs-comment, +.hljs-quote { + color: var(--hljs-link); +} + +.hljs-built_in, +.hljs-builtin-name, +.hljs-keyword, +.hljs-selector-tag, +.hljs-subst { + color: var(--hljs-keyword); +} + +.hljs-number, +.hljs-literal, +.hljs-variable, +.hljs-template-variable, +.hljs-tag .hljs-attr { + color: var(--hljs-variable); +} + +.hljs-regexp, +.hljs-string, +.hljs-doctag { + color: var(--hljs-regexp); +} + +.hljs-title, +.hljs-section, +.hljs-selector-id { + color: var(--hljs-title); +} + +.hljs-type, +.hljs-class .hljs-title { + color: var(--hljs-type); +} + +.hljs-meta, +.hljs-tag, +.hljs-name, +.hljs-attribute { + color: var(--hljs-meta); +} diff --git a/coverage/coverage.js b/coverage/coverage.js new file mode 100644 index 00000000000..ef272543670 --- /dev/null +++ b/coverage/coverage.js @@ -0,0 +1,164 @@ +function tool_tip_element() +{ + var element = document.querySelector("#tool-tip"); + if (element === null) { + element = document.createElement("div"); + element.id = "tool-tip"; + document.querySelector("body").appendChild(element); + } + + return element; +}; + +var tool_tip = tool_tip_element(); +var html = document.getElementsByTagName("html")[0]; + +function attach_tool_tip() +{ + document.querySelector("body").onmousemove = function (event) + { + var element = event.target; + if (element.dataset.count === undefined) + element = event.target.parentNode; + + if (element.dataset.count && element.dataset.count !== "0") { + tool_tip.textContent = element.dataset.count; + tool_tip.classList.add("visible"); + + if (event.clientY < html.clientHeight - 48) + tool_tip.style.top = event.clientY + 7 + "px"; + else + tool_tip.style.top = event.clientY - 32 + "px"; + + tool_tip.style.left = event.clientX + 7 + "px"; + } + else + tool_tip.classList.remove("visible"); + } +}; + +attach_tool_tip(); + +function move_line_to_cursor(cursor_y, line_number) +{ + var id = "L" + line_number; + + var line_anchor = + document.querySelector("a[id=" + id + "] + span"); + if (line_anchor === null) + return; + + var line_y = line_anchor.getBoundingClientRect().top + 18; + + var y = window.scrollY; + window.location = "#" + id; + window.scrollTo(0, y + line_y - cursor_y); +}; + +function handle_navbar_clicks() +{ + var line_count = document.querySelectorAll("a[id]").length; + var navbar = document.querySelector("#navbar"); + + if (navbar === null) + return; + + navbar.onclick = function (event) + { + event.preventDefault(); + + var line_number = + Math.floor(event.clientY / navbar.clientHeight * line_count + 1); + + move_line_to_cursor(event.clientY, line_number); + }; +}; + +handle_navbar_clicks(); + +function handle_line_number_clicks() +{ + document.querySelector("body").onclick = function (event) + { + if (event.target.tagName != "A") + return; + + var line_number_location = event.target.href.search(/#L[0-9]+\$/); + if (line_number_location === -1) + return; + + var anchor = event.target.href.slice(line_number_location); + + event.preventDefault(); + + var y = window.scrollY; + window.location = anchor; + window.scrollTo(0, y); + }; +}; + +handle_line_number_clicks(); + +function handle_collapsible_click() +{ + document.querySelectorAll("summary").forEach( + function (summary) + { + summary.onclick = function (event) + { + var details = summary.parentElement; + + var all_open = function (sub_details) { + var all_are_open = true; + for (let details of sub_details) { + all_are_open = + all_are_open && + details.hasAttribute('open'); + } + return all_are_open; + }; + + var all_toggle = function (sub_details, toggle) { + for (let details of sub_details) { + if (toggle) + details.removeAttribute('open'); + else + details.setAttribute('open', ''); + } + }; + + // ctrl-click toggles the state of the folder and all sub-folders, recursively: + // - if all sub-folders are opened, then all sub-folders are closed + // - if at least one sub-folder is closed (or the folder itself), + // then all sub-folders are opened + if (event.ctrlKey) { + var sub_details = Array.prototype.slice.call( + details.querySelectorAll("details") + ); + sub_details.push(details); + all_toggle(sub_details, all_open(sub_details)); + return false; + } + + // shift-click toggles the state of all immediate sub-folders: + // - if the folder is closed, just open it + // - if the folder is opened: + // - if all sub-folders are opened, then all sub-folders are closed + // - if at least one sub-folder is closed, then all sub-folders are opened + if (event.shiftKey && details.hasAttribute('open')) { + details.setAttribute('open', ''); + var sub_details = + Array.prototype.filter.call( + details.querySelectorAll("details"), + function (sub_details) { + return sub_details.parentNode === details; + } + ); + all_toggle(sub_details, all_open(sub_details)); + return false; + } + }; + }); +} + +handle_collapsible_click(); diff --git a/coverage/exes/deser.ml.html b/coverage/exes/deser.ml.html new file mode 100644 index 00000000000..aa848f02ce6 --- /dev/null +++ b/coverage/exes/deser.ml.html @@ -0,0 +1,1860 @@ + + + + + deser.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+
+
open Stdio.In_channel
+open Lazy
+
+(* The type of outputters
+
+ While decoding a type, we simultaneously build an outputter (IO action),
+ that reads bytes from the stdin and dumps to stdout in a formatted way.
+*)
+
+type outputter = unit -> unit
+
+(* noise reduction *)
+
+let chatty = ref false
+
+(* read nothing *)
+
+let epsilon : outputter = ignore
+
+(* reading at byte-level *)
+
+let read_byte () : int =
+  let b = input_byte stdin in
+  match b with
+  | Some b -> b
+  | None -> failwith "EOF"
+
+let read_2byte () : int =
+  let lsb = read_byte () in
+  let msb = read_byte () in
+  msb lsl 8 + lsb
+
+let read_4byte () : int =
+  let lsb = read_2byte () in
+  let msb = read_2byte () in
+  msb lsl 16 + lsb
+
+let read_8byte () : Big_int.big_int =
+  let lsb = read_4byte () in
+  let msb = read_4byte () in
+  Big_int.(add_int_big_int lsb (mult_int_big_int 4294967296 (big_int_of_int msb)))
+
+let read_signed_byte () : bool * int =
+  let b = read_byte () in
+  if b > 127 then true, b - 128 else false, b
+
+let read_known char : unit =
+  match read_byte () with
+  | b when b = Char.code char -> ()
+  | _ -> failwith "unexpected"
+
+(* reading numbers *)
+
+let read_leb128 () : int = (* TODO: should be bigint *)
+  let rec leb128 w : int =
+  match read_signed_byte () with
+  | (true, n) -> w * n + leb128 (w * 128)
+  | (_, n) -> w * n in
+  leb128 1
+
+let read_sleb128 () : int = (* TODO: should be bigint *)
+  let rec sleb128 w : int =
+    match read_signed_byte () with
+    | (true, n) -> w * n + sleb128 (w * 128)
+    | (_, n) -> w * if n > 63 then n - 128 else n in
+  sleb128 1
+
+let read_int8 () : int =
+  match read_signed_byte () with
+  | (true, n) -> n - 128
+  | (_, n) -> n
+
+let read_int16 () : int =
+  let lsb = read_byte () in
+  let msb = read_int8 () in
+  msb lsl 8 lor lsb
+
+let read_int32 () : int =
+  let lsb = read_2byte () in
+  let msb = read_int16 () in
+  msb lsl 16 lor lsb
+
+let read_int64 () : Big_int.big_int =
+  let lsb = read_4byte () in
+  let msb = read_int32 () in
+  Big_int.(add_int_big_int lsb (mult_int_big_int 4294967296 (big_int_of_int msb)))
+
+let read_bool () : bool =
+  match read_byte () with
+  | 0 -> false
+  | 1 -> true
+  | _ -> failwith "invalid boolean"
+
+(* Magic *)
+
+let read_magic () : unit =
+  read_known 'D';
+  read_known 'I';
+  read_known 'D';
+  read_known 'L'
+
+(* Repetition *)
+
+let read_star_heralding a (heralder : int -> outputter * ('a -> int -> outputter -> outputter)) (t : outputter) : unit =
+  let rep = read_leb128 () in
+  let herald_vector, herald_member = heralder rep in
+  herald_vector ();
+  for i = 0 to rep - 1 do
+    herald_member a i t ()
+  done
+
+let read_t_star (t : unit -> 'a) : 'a array =
+  let rep = read_leb128 () in
+  Array.init rep (fun _ -> t ())
+
+(* Annotations *)
+
+type ann = Pure | Oneway
+
+let read_annotation () : ann =
+  match read_byte () with
+  | 1 -> Pure
+  | 2 -> Oneway
+  | _ -> failwith "invalid annotation"
+
+type typ = Null | Bool | Nat | NatN of int
+         | Int | IntN of int | Text | Reserved | Empty
+         | Opt of typ Lazy.t | Vec of typ Lazy.t
+         | Record of fields
+         | Variant of alts
+         | Function of typ Lazy.t array * typ Lazy.t array * ann array
+         | Future of int * Buffer.t
+
+and alts = (int * typ Lazy.t) array
+and fields = (int * typ Lazy.t) array
+
+(* type index/ground type (negative) *)
+
+let read_type_index () = let ty = read_sleb128 () in assert (ty > -18); ty
+
+let read_assoc () = let hash = read_leb128 () in
+                    let tynum = read_type_index () in
+                    if !chatty then Printf.printf "hash: %d, tynum: %d\n" hash tynum; hash, tynum
+
+module type Dump =
+sig
+val output_nat : int -> unit
+val output_int : int -> unit
+val output_bool : bool -> unit
+val output_nil : outputter
+val output_byte : int -> unit
+val output_2byte : int -> unit
+val output_4byte : int -> unit
+val output_8byte : Big_int.big_int -> unit
+val output_int8 : int -> unit
+val output_int16 : int -> unit
+val output_int32 : int -> unit
+val output_int64 : Big_int.big_int -> unit
+val output_text : int -> Stdio.In_channel.t -> Stdio.Out_channel.t -> unit
+val output_some : outputter -> unit
+val output_arguments : int -> outputter * (unit -> int -> outputter -> outputter)
+val output_vector : int -> outputter * (unit -> int -> outputter -> outputter)
+val output_record : int -> outputter * (fields -> int -> outputter -> outputter)
+val output_variant : int -> outputter * (alts -> int -> outputter -> outputter)
+end
+
+
+module OutputProse : Dump = struct
+
+(* indentation *)
+
+let indent_amount : int = 4
+let indentation : int ref = ref 0
+let continue_line : bool ref = ref false
+
+let indent () = indentation := !indentation + indent_amount
+let outdent () = indentation := !indentation - indent_amount
+let ind i = if i = 0 then indent ()
+let outd max i = if i + 1 = max then outdent ()
+let bracket max g p i f () = ind i; g p i f; outd max i
+
+let fill () = if !continue_line then (continue_line := false; "") else String.make !indentation ' '
+
+let output_string what (s : string) = Printf.printf "%s%s: %s\n" (fill ()) what s
+let output_decimal what (i : int) = Printf.printf "%s%s: %d\n" (fill ()) what i
+let output_big_decimal what (i : Big_int.big_int) = Printf.printf "%s%s: %s\n" (fill ()) what (Big_int.string_of_big_int i)
+
+(* outputters *)
+let output_nat nat = output_decimal "output_nat" nat
+let output_int int = output_decimal "output_int" int
+let output_bool b = output_string "output_bool" (if b then "true" else "false")
+let output_nil () = Printf.printf "%snull (0 bytes)\n" (fill ())
+let output_some consumer = Printf.printf "%sSome: value follows on the next line\n"  (fill ()); consumer ()
+let output_byte b = output_decimal "output_byte" b
+let output_2byte b = output_decimal "output_2byte" b
+let output_4byte b = output_decimal "output_4byte" b
+let output_8byte b = output_big_decimal "output_8byte" b
+let output_int8 i = output_decimal "output_int8" i
+let output_int16 i = output_decimal "output_int16" i
+let output_int32 i = output_decimal "output_int32" i
+let output_int64 i = output_big_decimal "output_int64" i
+let output_text bytes from tostream =
+      let buf = Buffer.create 0 in
+      ignore (input_buffer from buf ~len:bytes);
+      Printf.printf "%sText: %d bytes follow on next line\n" (fill ()) bytes;
+      Printf.printf "%s---->" (fill ());
+      Stdio.Out_channel.output_buffer tostream buf;
+      print_string "\n"
+
+let output_arguments args : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_arguments = function
+    | () when args = 0 -> Printf.printf "%sNo arguments...\n" (fill ())
+    | _ when args = 1 -> Printf.printf "%s1 argument follows\n" (fill ())
+    | _ -> Printf.printf "%s%d arguments follow\n" (fill ()) args in
+  let herald_member () i f = Printf.printf "%sArgument #%d%s: " (fill ()) i (if i + 1 = args then " (last)" else ""); continue_line := true; f () in
+  herald_arguments, bracket args herald_member
+
+let output_vector members : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_vector () = if members = 0 then Printf.printf "%sEmpty Vector\n" (fill ())
+                         else Printf.printf "%sVector with %d members follows\n" (fill ()) members in
+  let herald_member () i f = Printf.printf "%sVector member %d%s: " (fill ()) i (if i + 1 = members then " (last)" else ""); continue_line := true; f () in
+  herald_vector, bracket members herald_member
+
+let output_record members : outputter * (fields -> int -> outputter -> outputter) =
+  let herald_record () = if members = 0 then Printf.printf "%sEmpty Record\n" (fill ())
+                         else Printf.printf "%sRecord with %d members follows\n" (fill ()) members in
+  let herald_member fields i f = Printf.printf "%sRecord member %d%s: " (fill ()) (fst (Array.get fields i)) (if i + 1 = members then " (last)" else ""); continue_line := true; f () in
+  herald_record, bracket members herald_member
+
+let output_variant members : outputter * (alts -> int -> outputter -> outputter) =
+  let herald_variant () = assert (members <> 0);
+                          Printf.printf "%sVariant with %d members follows\n" (fill ()) members in
+  let herald_member alts i f () = indent (); Printf.printf "%sVariant member %d: " (fill ()) (fst (Array.get alts i)); continue_line := true; f (); outdent () in
+  herald_variant, herald_member
+
+end
+
+module OutputIdl : Dump = struct
+
+let output_string (s : string) = print_string s
+let chat_string s = if !chatty then output_string s
+let output_string_space (s : string) = output_string s; output_string " "
+let output_decimal (i : int) = Printf.printf "%d" i
+let output_big_decimal (i : Big_int.big_int) = output_string (Big_int.string_of_big_int i)
+(* let output_bignum (i : Big_int.big_int) = Printf.printf "%s" (Big_int.string_of_big_int i) *)
+let output_bignum (i : int) = output_decimal i (* for now, later: output_big_decimal *)
+let casted ty f v = match ty with
+  | IntN n -> f v; Printf.printf " : int%d" n
+  | NatN n -> f v; Printf.printf " : nat%d" n
+  | _ -> assert false
+
+let output_bool b = output_string (if b then "true" else "false")
+let output_nil () = output_string "null"
+let output_some consumer = output_string_space "opt"; consumer ()
+let output_byte, output_2byte, output_4byte =
+  casted (NatN 8) output_decimal, casted (NatN 16) output_decimal, casted (NatN 32) output_decimal
+let output_8byte = casted (NatN 64) output_big_decimal
+let output_nat, output_int = output_bignum, output_bignum
+let output_int8, output_int16, output_int32 =
+  casted (IntN 8) output_decimal, casted (IntN 16) output_decimal, casted (IntN 32) output_decimal
+let output_int64 = casted (IntN 64) output_big_decimal
+let output_text n froms tos =
+  output_string "\"";
+  let buf = Buffer.create 0 in
+  ignore (input_buffer froms buf ~len:n);
+  Stdio.Out_channel.output_buffer tos buf;
+  output_string "\""
+
+
+let output_arguments args : outputter * (unit -> int -> outputter -> outputter) =
+  let last i = i + 1 = args in
+  let herald_arguments = function
+    | () when args = 0 -> chat_string "// No arguments...\n"; output_string "()"
+    | _ when args = 1 -> chat_string "// 1 argument follows\n"
+    | _ -> if !chatty then Printf.printf "// %d arguments follow\n" args in
+  let herald_member () i f () =
+    if !chatty then Printf.printf "// Argument #%d%s:\n" i (if last i then " (last)" else "");
+    output_string (if i = 0 then "( " else ", ");
+    f ();
+    output_string (if last i then "\n)" else "\n") in
+  herald_arguments, herald_member
+
+let start i = if i = 0 then output_string_space "{"
+let stop max i = if i + 1 = max then output_string " }"
+let bracket max g p i f () = start i; g p i f; stop max i
+
+let output_vector members : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_vector () = if members = 0 then output_string_space "vec { }"
+                         else output_string_space "vec" in
+  let herald_member () i f = f (); output_string_space ";" in
+  herald_vector, bracket members herald_member
+
+let output_record members : outputter * (fields -> int -> outputter -> outputter) =
+  let herald_record () = if members = 0 then output_string_space "record { }"
+                         else output_string_space "record" in
+  let herald_member fields i f = Printf.printf "%d : " (fst (Array.get fields i)); f (); output_string_space ";" in
+  herald_record, bracket members herald_member
+
+let output_variant members : outputter * (alts -> int -> outputter -> outputter) =
+  let herald_variant () = assert (members <> 0);
+                          output_string_space "variant" in
+  let herald_member alts i f () = start 0; Printf.printf "%d : " (fst (Array.get alts i)); f (); stop 1 0 in
+  herald_variant, herald_member
+end
+
+
+module OutputJson : Dump = struct
+
+let output_string (s : string) = print_string s
+let output_string_space (s : string) = Printf.printf "%s " s
+let output_decimal (i : int) = Printf.printf "%d" i
+let output_big_decimal (i : Big_int.big_int) = output_string (Big_int.string_of_big_int i)
+let output_bignum (i : int) = output_decimal i (* for now *)
+
+let output_bool b = output_string (if b then "true" else "false")
+let output_nil () = output_string "null"
+let output_some consumer = output_string "["; consumer (); output_string "]"
+let output_byte, output_2byte, output_4byte = output_decimal, output_decimal, output_decimal
+let output_8byte = output_big_decimal
+let output_nat, output_int = output_bignum, output_bignum
+let output_int8, output_int16, output_int32 = output_decimal, output_decimal, output_decimal
+let output_int64 = output_big_decimal
+let output_text n froms tos =
+  output_string "\"";
+  let buf = Buffer.create 0 in
+  ignore (input_buffer froms buf ~len:n);
+  Stdio.Out_channel.output_buffer tos buf;
+  output_string "\""
+
+
+let output_arguments args : outputter * (unit -> int -> outputter -> outputter) =
+  let herald_arguments = function
+    | () when args = 0 -> output_string "# No arguments...\n"
+    | _ when args = 1 -> output_string "# 1 argument follows"
+    | _ -> Printf.printf "# %d arguments follow" args in
+  let herald_member () i f () = Printf.printf "\n# Argument #%d%s:\n" i (if i + 1 = args then " (last)" else ""); f () in
+  herald_arguments, (*bracket args*) herald_member
+
+let start punct i = if i = 0 then output_string (String.make 1 punct)
+let stop punct max i = if i + 1 = max then output_string (String.make 1 punct)
+let bracket punct max g p i f () = start (punct.[0]) i; g p i f; stop (punct.[1]) max i
+
+let output_vector members : outputter * (unit -> int -> outputter -> outputter) =
+  let punct = "[]" in
+  let herald_vector () = if members = 0 then output_string_space punct in
+  let herald_member () i f = if (i > 0) then output_string_space ","; f () in
+  herald_vector, bracket punct members herald_member
+
+let output_record members : outputter * (fields -> int -> outputter -> outputter) =
+  let punct = "{}" in
+  let herald_record () = if members = 0 then output_string_space punct in
+  let herald_member fields i f = if (i > 0) then output_string_space ","; Printf.printf "\"_%d_\": " (fst (Array.get fields i)); f () in
+  herald_record, bracket punct members herald_member
+
+let output_variant members : outputter * (alts -> int -> outputter -> outputter) =
+  let herald_variant () = assert (members <> 0) in
+  let herald_member alts i f () = start '{' 0; Printf.printf "_%d_ : " (fst (Array.get alts i)); f (); stop '}' 1 0 in
+  herald_variant, herald_member
+end
+
+(* IDL binary mode:
+   - Legacy: top-level encoded as one value
+   - Default: top-level are several values
+ *)
+type mode = Unary | Nary
+
+module MakeOutputter(F : Dump) = struct
+
+let decode_primitive_type : int -> typ * outputter =
+  let open F in
+  function
+  | -1 -> Null, output_nil
+  | -2 -> Bool, (fun () -> output_bool (read_bool ()))
+  | -3 -> Nat, (fun () -> output_nat (read_leb128 ()))
+  | -4 -> Int, (fun () -> output_int (read_sleb128 ()))
+  | -5 -> NatN 8, (fun () -> output_byte (read_byte ()))
+  | -6 -> NatN 16, (fun () -> output_2byte (read_2byte ()))
+  | -7 -> NatN 32, (fun () -> output_4byte (read_4byte ()))
+  | -8 -> NatN 64, (fun () -> output_8byte (read_8byte ()))
+  | -9 -> IntN 8, (fun () -> output_int8 (read_int8 ()))
+  | -10 -> IntN 16, (fun () -> output_int16 (read_int16 ()))
+  | -11 -> IntN 32, (fun () -> output_int32 (read_int32 ()))
+  | -12 -> IntN 64, (fun () -> output_int64 (read_int64 ()))
+  | -13 | -14 -> failwith "no floats yet" (* TODO *)
+  | -15 -> Text, (fun () -> let len = read_leb128 () in output_text len stdin stdout)
+  | -16 -> Reserved, ignore
+  | -17 -> Empty, ignore
+  | _ -> failwith "unrecognised primitive type"
+
+
+let read_type lookup : (typ * outputter) Lazy.t =
+  let lprim_or_lookup = function
+    | p when p < -17 -> assert false
+    | p when p < 0 -> lazy (decode_primitive_type p)
+    | i -> lookup i in
+  let prim_or_lookup ty = force (lprim_or_lookup ty) in
+
+  let lfst p = lazy (let lazy (f, _) = p in f) in
+  let lsnd p = lazy (let lazy (_, s) = p in s) in
+
+  let open F in
+  match read_sleb128 () with
+  | p when p < 0 && p > -18 -> from_val (decode_primitive_type p)
+  | -18 ->
+    let reader consumer () =
+      match read_byte () with
+      | 0 -> output_nil ()
+      | 1 -> output_some (force consumer)
+      | _ -> failwith "invalid optional" in
+    let i = read_type_index () in
+    lazy (let p = lprim_or_lookup i in
+          Opt (lfst p), reader (lsnd p))
+  | -19 -> let i = read_type_index () in
+           lazy
+             (let p = lprim_or_lookup i in
+              Vec (lfst p), fun () -> read_star_heralding () output_vector (force (lsnd p)))
+  | -20 -> let assocs = read_t_star read_assoc in
+           lazy (let herald_record, herald_member = output_record (Array.length assocs) in
+                 let members = Array.map (fun (i, tynum) -> i, lfst (lprim_or_lookup tynum)) assocs in
+                 let consumers = Array.mapi (herald_member members) (Array.map (fun (_, tynum) () -> snd (prim_or_lookup tynum) ()) assocs) in
+                 Record members, fun () -> herald_record (); Array.iter (fun f -> f ()) consumers)
+  | -21 -> let assocs = read_t_star read_assoc in
+           lazy (let herald_variant, herald_member = output_variant (Array.length assocs) in
+                 let alts = Array.map (fun (i, tynum) -> i, lfst (lprim_or_lookup tynum)) assocs in
+                 let consumers = Array.map (fun (_, tynum) () -> snd (prim_or_lookup tynum) ()) assocs in
+                 Variant alts, fun () -> herald_variant (); let i = read_leb128 () in herald_member alts i (Array.get consumers i) ())
+  | -22 -> let types1 = read_t_star read_type_index in
+           let types2 = read_t_star read_type_index in
+           let anns = read_t_star read_annotation in
+           lazy (let args = Array.map (fun tynum -> lfst (lprim_or_lookup tynum)) types1 in
+                 let rslts = Array.map (fun tynum -> lfst (lprim_or_lookup tynum)) types2 in
+                 Function (args, rslts, anns), epsilon)
+
+(*
+T(service {<methtype>*}) = sleb128(-23) T*(<methtype>* )
+*)
+  | -23 -> failwith "service types not supported yet"
+
+  | t -> (* future type *)
+    let bytes = read_leb128 () in
+    let buf = Buffer.create 0 in
+    ignore (input_buffer stdin buf ~len:bytes);
+    let ingest () =
+      let bytes = read_leb128 () in
+      let refs = read_leb128 () in
+      let buf = Buffer.create 0 in
+      assert (refs = 0);
+      ignore (input_buffer stdin buf ~len:bytes) in
+    lazy (Future (t, buf), ingest)
+
+
+let read_type_table (t : unit -> (typ * outputter) Lazy.t) : (typ * outputter) Lazy.t array =
+  let rep = read_leb128 () in
+  Array.init rep (fun i -> if !chatty then Printf.printf "read_type_table: %d\n" i; t ())
+
+(* Utilities *)
+
+let chat_string = if !chatty then print_string else ignore
+
+(* Top-level *)
+
+let top_level md : unit =
+  chat_string "\nDESER, to your service!\n";
+  read_magic ();
+  chat_string "\n========================== Type section\n";
+  let tab =
+    let rec tab = lazy (read_type_table (fun () -> read_type lookup))
+    and lookup = fun indx -> (*Printf.printf "{indx: %d}" indx; *)Array.get (force tab) indx in
+    Array.map force (force tab) in
+  chat_string "\n========================== Value section\n";
+  let open F in
+  begin match md with
+  | Nary ->
+    let argtys = read_t_star read_type_index in
+    let herald_arguments, herald_member = output_arguments (Array.length argtys) in
+    herald_arguments ();
+    let typ_ingester = function
+      | prim when prim < 0 -> decode_primitive_type prim
+      | index -> Array.get tab index in
+    let consumers = Array.map (fun tynum -> let (ty, m) = typ_ingester tynum in m) argtys in
+    Array.iteri (fun i f -> herald_member () i f ()) consumers
+  | Unary ->
+    let argty = read_type_index () in
+    if !chatty then Printf.printf "# ARGTY: %d\n" argty;
+    snd (Array.get tab argty) ()
+  end;
+  chat_string "\n-------- DESER DONE\n"
+
+end
+
+(* CLI *)
+
+let name = "deser"
+let banner = "Candid toolkit " ^ Source_id.banner
+let usage = "Usage: " ^ name ^ " [option] [file ...]"
+
+let mode = ref Nary
+
+let set_mode m () =
+  if !mode <> Nary then begin
+    Printf.eprintf "deser: multiple execution modes specified"; exit 1
+  end;
+  mode := m
+
+type format = Idl | Prose | Json
+
+let output_format = ref Idl
+
+let set_format f () =
+  if !output_format <> Idl then begin
+    Printf.eprintf "deser: multiple output formats specified"; exit 1
+  end;
+  output_format := f
+
+let argspec = Arg.align
+[
+  "--unary", Arg.Unit (set_mode Unary), " decode legacy (unary) message API";
+  "--prose", Arg.Unit (set_format Prose), " output indented prose";
+  "--json", Arg.Unit (set_format Json), " output JSON values";
+  "--idl", Arg.Unit (set_format Idl), " output IDL values (default)";
+  "--verbose", Arg.Unit (fun () -> chatty := true), " amend commentary";
+  "--version",
+    Arg.Unit (fun () -> Printf.printf "%s\n" banner; exit 0), " show version";
+]
+
+let add_arg source = () (* args := !args @ [source] *)
+
+(* run it *)
+
+let () =
+  Arg.parse argspec add_arg usage;
+  begin match !output_format with
+  | Prose -> let module Prose = MakeOutputter(OutputProse) in Prose.top_level !mode;
+  | Idl -> let module Idl = MakeOutputter(OutputIdl) in Idl.top_level !mode;
+  | Json -> let module Json = MakeOutputter(OutputJson) in Json.top_level !mode;
+  end;
+  match input_byte stdin with
+  | Some _ -> failwith "surplus bytes in input"
+  | None -> ()
+
+
+
+(* TODOs:
+  - use bigint where necessary
+  - floats
+  - service types
+  - escaping in text
+  - heralding/outputting of type table
+ *)
+
+
+
+ + + diff --git a/coverage/exes/didc.ml.html b/coverage/exes/didc.ml.html new file mode 100644 index 00000000000..ed74e2b4440 --- /dev/null +++ b/coverage/exes/didc.ml.html @@ -0,0 +1,288 @@ + + + + + didc.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
+
open Idllib
+open Printf
+
+let name = "didc"
+let banner = "Candid compiler " ^ Source_id.banner
+let usage = "Usage: " ^ name ^ " [option] [file ...]"
+
+
+(* Argument handling *)
+
+type mode = Default | Check | Js | PrettyPrint
+
+let mode = ref Default
+let args = ref []
+let add_arg source = args := !args @ [source]
+
+let set_mode m () =
+  if !mode <> Default then begin
+    eprintf "didc: multiple execution modes specified"; exit 1
+  end;
+  mode := m
+
+let out_file = ref ""
+
+let argspec =
+[
+  "--js", Arg.Unit (set_mode Js), " output JavaScript binding";
+  "--check", Arg.Unit (set_mode Check), " type-check only";
+  "--pp", Arg.Unit (set_mode PrettyPrint), " Pretty print did file";
+  "-v", Arg.Set Flags.verbose, " verbose output";
+  "-dp", Arg.Set Flags.dump_parse, " dump parse";
+  "-o", Arg.Set_string out_file, "<file>  output file";
+  "--version",
+    Arg.Unit (fun () -> printf "%s\n" banner; exit 0), " show version";
+]
+
+
+(* Main *)
+
+let process_file file : unit =
+  match !mode with
+  | Default ->
+     assert false
+  | Check ->
+     ignore (Diag.run (Pipeline.check_file file))
+  | PrettyPrint ->
+     let (ast, _, _) = Diag.run (Pipeline.check_file file) in
+     printf "%s" (Idllib.Arrange_idl.string_of_prog ast);
+  | Js ->
+     if !out_file = "" then
+         out_file := Filename.remove_extension (Filename.basename file) ^ ".js";
+     let buf = Diag.run Pipeline.(compile_js_file file) in
+     if Buffer.length buf = 0 then begin
+         eprintf "No actor found, cannot generate JS bindings"; exit 1
+     end;
+     let oc = open_out !out_file in
+     Buffer.add_string buf "\n";
+     Buffer.output_buffer oc buf;
+     close_out oc
+
+let print_exn exn =
+  Printf.printf "%!";
+  Printf.eprintf "Internal error, %s\n" (Printexc.to_string exn);
+  Printexc.print_backtrace stderr;
+  Printf.eprintf "%!"
+
+let () =
+  (*
+  Sys.catch_break true; - enable to get stacktrace on interrupt
+  (useful for debugging infinite loops)
+  *)
+  Printexc.record_backtrace true;
+  try
+    Arg.parse argspec add_arg usage;
+    if !mode = Default then mode := Js;
+    match !args with
+    | [file] -> process_file file
+    | _ -> eprintf "didc can only take one .did file\n"; exit 1
+  with exn ->
+    print_exn exn
+
+
+
+ + + diff --git a/coverage/exes/mo_ld.ml.html b/coverage/exes/mo_ld.ml.html new file mode 100644 index 00000000000..68b07167d8c --- /dev/null +++ b/coverage/exes/mo_ld.ml.html @@ -0,0 +1,268 @@ + + + + + mo_ld.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+
+
open Linking
+open Wasm_exts
+open Printf
+
+let name = "mo-ld"
+let version = "0.1"
+let banner = "Motoko " ^ version ^ " linker"
+let usage = "Usage: " ^ name ^ " -b base.wasm -l shared.wasm -o out.wasm"
+
+(* Argument handling *)
+
+let base_file = ref ""
+let lib_file = ref ""
+let lib_name = ref "rts"
+let out_file = ref ""
+
+let print_banner () =
+  printf "%s\n" banner;
+  exit 0
+
+let usage_err s =
+  eprintf "%s: %s\n" name s;
+  eprintf "%s\n" usage;
+  exit 1
+
+let argspec =
+[
+  "-b", Arg.Set_string base_file, "<file> base file (e.g. output of moc --no-link)";
+  "-l", Arg.Set_string lib_file, "<file> library file";
+  "-o", Arg.Set_string out_file, "<file> output file";
+  "-n", Arg.Set_string lib_name, "<name> library name (defaults to \"rts\")";
+  "--version", Arg.Unit print_banner, " show version";
+]
+
+(* IO *)
+
+let load_file f =
+  let ic = open_in_bin f in
+  let n = in_channel_length ic in
+  let s = Bytes.create n in
+  really_input ic s 0 n;
+  close_in ic;
+  Bytes.to_string s
+
+let decode_file f =
+  let wasm = load_file f in
+  CustomModuleDecode.decode "f" wasm
+
+let write_file f s =
+  let oc_ = open_out f in
+  output_string oc_ s;
+  close_out oc_
+
+(* Main *)
+let () =
+  if Array.length Sys.argv = 1 then print_banner ();
+  Arg.parse argspec (fun _ -> usage_err "no arguments expected") usage;
+  if !base_file = "" then usage_err "no base file specified";
+  if !lib_file = "" then usage_err "no library file specified";
+  if !out_file = "" then usage_err "no output file specified";
+
+  Mo_config.Flags.debug_info := true; (* linking mode: preserve debug info *)
+
+  let base = decode_file !base_file in
+  let lib = decode_file !lib_file in
+  let linked =
+    try LinkModule.link base !lib_name lib
+    with LinkModule.LinkError e ->
+      Printf.eprintf "%s\n" e;
+      exit 1
+  in
+  let (_map, wasm) = CustomModuleEncode.encode linked in
+  write_file !out_file wasm
+
+
+
+
+ + + diff --git a/coverage/exes/moc.ml.html b/coverage/exes/moc.ml.html new file mode 100644 index 00000000000..9fe75a69f5a --- /dev/null +++ b/coverage/exes/moc.ml.html @@ -0,0 +1,1115 @@ + + + + + moc.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+
+
open Wasm_exts
+open Mo_config
+
+open Printf
+
+let name = "moc"
+let banner = "Motoko compiler " ^ Source_id.banner
+let usage = "Usage: " ^ name ^ " [option] [file ...]"
+
+
+(* Argument handling *)
+
+type mode = Default | Check | StableCompatible | Compile | Run | Interact | PrintDeps | Explain | Viper
+
+let mode = ref Default
+let args = ref []
+let add_arg source = args := !args @ [source]
+
+let set_mode m () =
+  if !mode <> Default && !mode <> m then begin
+    eprintf "moc: multiple execution modes specified"; exit 1
+  end;
+  mode := m
+
+let out_file = ref ""
+let link = ref true
+let interpret_ir = ref false
+let gen_source_map = ref false
+let explain_code = ref ""
+let stable_types = ref false
+let idl = ref false
+
+let valid_metadata_names =
+    ["candid:args";
+     "candid:service";
+     "motoko:stable-types";
+     "motoko:compiler"]
+
+let argspec = [
+  "-c", Arg.Unit (set_mode Compile), " compile programs to WebAssembly";
+  "-g", Arg.Set Flags.debug_info, " generate source-level debug information";
+  "-r", Arg.Unit (set_mode Run), " interpret programs";
+  "-i", Arg.Unit (set_mode Interact), " run interactive REPL (implies -r)";
+  "--check", Arg.Unit (set_mode Check), " type-check only";
+  "--viper", Arg.Unit (set_mode Viper), " emit viper code";
+  "--stable-compatible",
+    Arg.Tuple [
+      Arg.String (fun fp -> Flags.pre_ref := Some fp);
+      Arg.String (fun fp -> Flags.post_ref := Some fp);
+      Arg.Unit (set_mode StableCompatible);
+      ],
+    "<pre> <post> test upgrade compatibility between stable-type signatures <pre> and <post>";
+  "--idl", Arg.Unit (fun () ->
+    idl := true;
+    set_mode Compile ()), (* similar to --stable-types *)
+      " compile and emit Candid IDL specification to `.did` file";
+  "--print-deps", Arg.Unit (set_mode PrintDeps), " prints the dependencies for a given source file";
+  "--explain", Arg.String (fun c -> explain_code := c; set_mode Explain ()), " provides a detailed explanation of an error message";
+  "-o", Arg.Set_string out_file, "<file>  output file";
+
+  "-v", Arg.Set Flags.verbose, " verbose output";
+  "-p", Arg.Set_int Flags.print_depth, "<n>  set print depth";
+  "--hide-warnings", Arg.Clear Flags.print_warnings, " hide warnings";
+  "-Werror", Arg.Set Flags.warnings_are_errors, " treat warnings as errors";
+  ]
+
+  @ Args.error_args
+
+  @ [
+
+  "--version",
+    Arg.Unit (fun () -> printf "%s\n%!" banner; exit 0), " show version";
+  "--map", Arg.Set gen_source_map, " output source map";
+
+  "-t", Arg.Set Flags.trace, " activate tracing in interpreters"]
+
+  @ Args.package_args
+
+  @ [
+  "--profile", Arg.Set Flags.profile, " activate profiling counters in interpreters ";
+  "--profile-file", Arg.Set_string Flags.profile_file, "<file>  set profiling output file ";
+  "--profile-line-prefix", Arg.Set_string Flags.profile_line_prefix, "<string>  prefix each profile line with the given string ";
+  "--profile-field",
+    Arg.String (fun n -> Flags.(profile_field_names := n :: !profile_field_names)),
+      "<field>  profile file includes the given field from the program result ";
+
+  "--public-metadata",
+    Arg.String (fun n -> Flags.(public_metadata_names := n :: !public_metadata_names)),
+    "<name>  emit icp custom section <name> (" ^
+      String.concat " or " valid_metadata_names ^
+      ") as `public` (default is `private`)";
+
+  "--omit-metadata",
+    Arg.String (fun n -> Flags.(omit_metadata_names := n :: !omit_metadata_names)),
+    "<name>  omit icp custom section <name> (" ^
+      String.concat " or " valid_metadata_names ^
+      ")";
+
+  "-iR", Arg.Set interpret_ir, " interpret the lowered code";
+  "-measure-rts-stack", Arg.Set Flags.measure_rts_stack, " measure the maximum rts stack usage (reported by prim \"rts_max_stack\")";
+  "-no-await", Arg.Clear Flags.await_lowering, " no await-lowering (with -iR)";
+  "-no-async", Arg.Clear Flags.async_lowering, " no async-lowering (with -iR)";
+
+  "-no-link", Arg.Clear link, " do not statically link-in runtime";
+  "-no-timer", Arg.Clear Flags.global_timer, " do not create a global timer expiration endpoint";
+  "-no-system-api",
+    Arg.Unit (fun () -> Flags.(compile_mode := WasmMode)),
+      " do not import any system API";
+  "-wasi-system-api",
+    Arg.Unit (fun () -> Flags.(compile_mode := WASIMode)),
+      " use the WASI system API (wasmtime)";
+  "-ref-system-api",
+  Arg.Unit (fun () -> Flags.(compile_mode := RefMode)),
+      " use the reference implementation of the Internet Computer system API (ic-ref-run)";
+  (* TODO: bring this back (possibly with flipped default)
+           as soon as the multi-value `wasm` library is out.
+  "-multi-value", Arg.Set Flags.multi_value, " use multi-value extension";
+  "-no-multi-value", Arg.Clear Flags.multi_value, " avoid multi-value extension";
+   *)
+
+  "-dp", Arg.Set Flags.dump_parse, " dump parse";
+  "-dt", Arg.Set Flags.dump_tc, " dump type-checked AST";
+  "-dl", Arg.Set Flags.dump_lowering, " dump intermediate representation";
+  "-no-check-ir", Arg.Clear Flags.check_ir, " do not check intermediate code";
+  "--release",
+  Arg.Unit
+    (fun () -> Flags.release_mode := true),
+      " ignore debug expressions in source";
+  "--debug",
+  Arg.Unit
+    (fun () -> Flags.release_mode := false),
+      " respect debug expressions in source (the default)";
+  "--sanity-checks",
+  Arg.Unit
+    (fun () -> Flags.sanity := true),
+  " enable sanity checking in the RTS and generated code";
+
+  "--stable-types",
+  Arg.Unit (fun () ->
+    stable_types := true;
+    set_mode Compile ()), (* similar to --idl *)
+      " compile and emit signature of stable types to `.most` file";
+
+  "--stable-regions",
+  Arg.Unit (fun () ->
+    Flags.use_stable_regions := true),
+      " force eager initialization of stable regions metadata (for testing purposes); consumes between 386KiB or 8MiB of additional physical stable memory, depending on current use of ExperimentalStableMemory library";
+
+  "--generational-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.Generational),
+  " use generational GC";
+
+  "--incremental-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.Incremental),
+  " use incremental GC";
+
+  "--compacting-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.MarkCompact),
+  " use compacting GC";
+
+  "--copying-gc",
+  Arg.Unit (fun () -> Flags.gc_strategy := Mo_config.Flags.Copying),
+  " use copying GC (default)";
+
+  "--force-gc",
+  Arg.Unit (fun () -> Flags.force_gc := true),
+  " disable GC scheduling, always do GC after an update message (for testing)";
+
+  "--max-stable-pages",
+  Arg.Set_int Flags.max_stable_pages,
+  "<n>  set maximum number of pages available for library `ExperimentalStableMemory.mo` (default " ^ (Int.to_string Flags.max_stable_pages_default) ^ ")";
+
+  "--experimental-field-aliasing",
+  Arg.Unit (fun () -> Flags.experimental_field_aliasing := true),
+  " enable experimental support for aliasing of var fields";
+
+  "--experimental-rtti",
+  Arg.Unit (fun () -> Flags.rtti := true),
+  " enable experimental support for precise runtime type information (to assess performance changes only)";
+
+  "--rts-stack-pages",
+  Arg.Set_int Flags.rts_stack_pages,
+  "<n>  set maximum number of pages available for runtime system stack (default " ^ (Int.to_string Flags.rts_stack_pages_default) ^ ")";
+
+  "--trap-on-call-error",
+  Arg.Unit (fun () -> Flags.trap_on_call_error := true),
+  " Trap, don't throw an `Error`, when an IC call fails due to destination queue full or freezing threshold is crossed. Emulates behaviour of moc versions < 0.8.0.";
+
+  (* optimizations *)
+  "-fno-shared-code",
+  Arg.Unit (fun () -> Flags.share_code := false),
+  " do *not* share low-level utility code: larger code size but decreased cycle consumption (default)";
+
+  "-fshared-code",
+  Arg.Unit (fun () -> Flags.share_code := true),
+  " do share low-level utility code: smaller code size but increased cycle consumption"
+
+  ]
+
+  @ Args.inclusion_args
+
+
+
+let set_out_file files ext =
+  if !out_file = "" then begin
+    match files with
+    | [n] -> out_file := Filename.remove_extension (Filename.basename n) ^ ext
+    | ns -> eprintf "moc: no output file specified"; exit 1
+  end
+
+(* Main *)
+
+let exit_on_none = function
+  | None -> exit 1
+  | Some x -> x
+
+let process_files files : unit =
+  match !mode with
+  | Default ->
+    assert false
+  | Run ->
+    if !interpret_ir
+    then exit_on_none (Pipeline.interpret_ir_files files)
+    else exit_on_none (Pipeline.run_files files)
+  | Interact ->
+    printf "%s\n%!" banner;
+    exit_on_none (Pipeline.run_files_and_stdin files)
+  | Check ->
+    Diag.run (Pipeline.check_files files)
+  | Viper ->
+    let (s, _) = Diag.run (Pipeline.viper_files files) in
+    printf "%s" s
+  | StableCompatible ->
+    begin
+      match (!Flags.pre_ref, !Flags.post_ref) with
+      | Some pre, Some post ->
+        Diag.run (Pipeline.stable_compatible pre post); (* exit 1 on error *)
+        exit 0;
+      | _ -> assert false
+    end
+  | Compile ->
+    set_out_file files ".wasm";
+    let source_map_file = !out_file ^ ".map" in
+    let (idl_prog, module_) = Diag.run Pipeline.(compile_files !Flags.compile_mode !link files) in
+    let module_ = CustomModule.{ module_ with
+      source_mapping_url =
+        if !gen_source_map
+        then Some (Filename.basename source_map_file)
+        else None
+    } in
+
+    let oc = open_out !out_file in
+    let (source_map, wasm) = CustomModuleEncode.encode module_ in
+    output_string oc wasm; close_out oc;
+
+    if !gen_source_map then begin
+      let oc_ = open_out source_map_file in
+      output_string oc_ source_map; close_out oc_
+      end;
+
+    if !idl then begin
+      let open Idllib in
+      let did_file = Filename.remove_extension !out_file ^ ".did" in
+      let oc = open_out did_file in
+      let module WithComments = Arrange_idl.Make(struct let trivia = Some idl_prog.Source.note.Syntax.trivia end) in
+      let idl_code = WithComments.string_of_prog idl_prog in
+      output_string oc idl_code; close_out oc
+    end;
+
+    if !stable_types then begin
+      let sig_file = Filename.remove_extension !out_file ^ ".most"
+      in
+      CustomModule.(
+        match module_.motoko.stable_types with
+        | Some (_, txt) ->
+          let oc_ = open_out sig_file in
+          output_string oc_ txt; close_out oc_
+        | _ -> ())
+    end
+
+  | PrintDeps -> begin
+     match files with
+     | [file] -> Pipeline.print_deps file
+     | _ ->
+        (eprintf "--print-deps expects exactly one source file as an argument";
+         exit 1)
+    end
+  | Explain ->
+     match List.find_opt (fun (c, _) -> String.equal c !explain_code) Error_codes.error_codes with
+     | Some (_, Some(explanation)) ->
+        printf "%s" explanation
+     | Some (_, None) ->
+        printf "Unfortunately there is no detailed explanation for this error yet"
+     | None ->
+        printf "%s is not a known error code. Make sure you pass a code format like this: '--explain M0123'" !explain_code
+
+(* Copy relevant flags into the profiler library's (global) settings.
+   This indirection affords the profiler library an independence from the (hacky) Flags library.
+   See also, this discussion:
+   https://github.com/dfinity/motoko/pull/405#issuecomment-503326551
+*)
+let process_profiler_flags () =
+  ProfilerFlags.profile             := !Flags.profile;
+  ProfilerFlags.profile_verbose     := !Flags.profile_verbose;
+  ProfilerFlags.profile_file        := !Flags.profile_file;
+  ProfilerFlags.profile_line_prefix := !Flags.profile_line_prefix;
+  ProfilerFlags.profile_field_names := !Flags.profile_field_names;
+  ()
+
+let process_metadata_names kind =
+  List.iter
+    (fun s ->
+      if not (List.mem s valid_metadata_names) then
+        begin
+          eprintf "moc: --%s-metadata argument %s must be one of %s"
+            kind
+            s
+            (String.concat ", " valid_metadata_names);
+          exit 1
+        end)
+
+let () =
+  (*
+  Sys.catch_break true; - enable to get stacktrace on interrupt
+  (useful for debugging infinite loops)
+  *)
+  Internal_error.setup_handler ();
+  Arg.parse_expand argspec add_arg usage;
+  if !mode = Default then mode := (if !args = [] then Interact else Compile);
+  Flags.compiled := !mode = Compile;
+
+  if !Flags.warnings_are_errors && (not !Flags.print_warnings)
+  then begin
+    eprintf "moc: --hide-warnings and -Werror together do not make sense"; exit 1
+  end;
+
+  process_profiler_flags ();
+  process_metadata_names "public" !Flags.public_metadata_names;
+  process_metadata_names "omit" !Flags.omit_metadata_names;
+  try
+    process_files !args
+  with
+  | Sys_error msg ->
+    (* IO error *)
+    eprintf "%s\n" msg;
+    exit 1
+
+
+
+ + + diff --git a/coverage/highlight.pack.js b/coverage/highlight.pack.js new file mode 100644 index 00000000000..2e55d491547 --- /dev/null +++ b/coverage/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.15.8 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(//g,">")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"
":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){a+=""}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("reasonml",function(r){var e="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",c="("+["||","&&","++","**","+.","*","/","*.","/.","...","|>"].map(function(r){return r.split("").map(function(r){return"\\"+r}).join("")}).join("|")+"|==|===)",n="\\s+"+c+"\\s+",t={keyword:"and as asr assert begin class constraint do done downto else end exception externalfor fun function functor if in include inherit initializerland lazy let lor lsl lsr lxor match method mod module mutable new nonrecobject of open or private rec sig struct then to try type val virtual when while with",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ",literal:"true false"},i="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",s={cN:"number",r:0,v:[{b:i},{b:"\\(\\-"+i+"\\)"}]},b={cN:"operator",r:0,b:c},o=[{cN:"identifier",r:0,b:e},b,s],l=[r.QSM,b,{cN:"module",b:"\\b"+a,rB:!0,e:".",c:[{cN:"identifier",b:a,r:0}]}],u=[{cN:"module",b:"\\b"+a,rB:!0,e:".",r:0,c:[{cN:"identifier",b:a,r:0}]}],_={cN:"function",r:0,k:t,v:[{b:"\\s(\\(\\.?.*?\\)|"+e+")\\s*=>",e:"\\s*=>",rB:!0,r:0,c:[{cN:"params",v:[{b:e},{b:"~?[a-z$_][0-9a-zA-Z$_]*(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?(s*:s*[a-z$_][0-9a-z$_]*((s*('?[a-z$_][0-9a-z$_]*s*(,'?[a-z$_][0-9a-z$_]*)*)?s*))?)?"},{b:/\(\s*\)/}]}]},{b:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",e:"\\s=>",rB:!0,r:0,c:[{cN:"params",r:0,v:[{b:e,e:"(,|\\n|\\))",r:0,c:[b,{cN:"typing",b:":",e:"(,|\\n)",rB:!0,r:0,c:u}]}]}]},{b:"\\(\\.\\s"+e+"\\)\\s*=>"}]};l.push(_);var N={cN:"constructor",b:a+"\\(",e:"\\)",i:"\\n",k:t,c:[r.QSM,b,{cN:"params",b:"\\b"+e}]},d={cN:"pattern-match",b:"\\|",rB:!0,k:t,e:"=>",r:0,c:[N,b,{r:0,cN:"constructor",b:a}]},z={cN:"module-access",k:t,rB:!0,v:[{b:"\\b("+a+"\\.)+"+e},{b:"\\b("+a+"\\.)+\\(",e:"\\)",rB:!0,c:[_,{b:"\\(",e:"\\)",skip:!0}].concat(l)},{b:"\\b("+a+"\\.)+{",e:"}"}],c:l};return u.push(z),{aliases:["re"],k:t,i:"(:\\-|:=|\\${|\\+=)",c:[r.C("/\\*","\\*/",{i:"^(\\#,\\/\\/)"}),{cN:"character",b:"'(\\\\[^']+|[^'])'",i:"\\n",r:0},r.QSM,{cN:"literal",b:"\\(\\)",r:0},{cN:"literal",b:"\\[\\|",e:"\\|\\]",r:0,c:o},{cN:"literal",b:"\\[",e:"\\]",r:0,c:o},N,{cN:"operator",b:n,i:"\\-\\->",r:0},s,r.CLCM,d,_,{cN:"module-def",b:"\\bmodule\\s+"+e+"\\s+"+a+"\\s+=\\s+{",e:"}",rB:!0,k:t,r:0,c:[{cN:"module",r:0,b:a},{b:"{",e:"}",skip:!0}].concat(l)},z]}}); \ No newline at end of file diff --git a/coverage/ic/url.ml.html b/coverage/ic/url.ml.html new file mode 100644 index 00000000000..644da8095cc --- /dev/null +++ b/coverage/ic/url.ml.html @@ -0,0 +1,317 @@ + + + + + url.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+
+
(* Parsing known URLs from mo: and ic: URLs *)
+
+(*
+   For usage examples take a look at url_test.ml
+*)
+
+let checkbytes s : string =
+  let buf = Buffer.create 4 in
+  Buffer.add_int32_be buf (Lib.CRC.crc32 s); (* NB: big endian *)
+  Buffer.contents buf
+
+let rec group s =
+  let open String in
+  if length s <= 5 then s else
+  sub s 0 5 ^ "-" ^ group (sub s 5 (length s - 5))
+
+let encode_principal bytes : string =
+  group (String.map Char.lowercase_ascii (Lib.Base32.encode (checkbytes bytes ^ bytes)))
+
+(* Decode a principal according to https://sdk.dfinity.org/docs/interface-spec/index.html#textual-ids *)
+let decode_principal principal : (string, string) result =
+  let open Stdlib.String in
+
+  if principal = "" then Error "principal cannot be empty" else
+  let filtered =
+    to_seq principal |>
+      Seq.map Char.uppercase_ascii |>
+      Seq.filter (fun c -> c >= '0' && c <= '9' || c >= 'A' && c <= 'Z') |>
+      of_seq in
+  match Lib.Base32.decode filtered with
+  | Error e -> Error e
+  | Ok bytes ->
+    if length bytes < 4 then Error "principal too short" else
+    let payload = sub bytes 4 (length bytes - 4) in
+    let expected = encode_principal payload in
+    if principal <> expected
+    then Error (Printf.sprintf "invalid principal. Did you mean %S?" expected)
+    else Ok payload
+
+type parsed =
+  | Package of (string * string)
+  | Relative of string
+  | Ic of string
+  | IcAlias of string
+  | Prim
+
+let string_of_parsed = function
+  | Package (x, y) -> Printf.sprintf "Package (%s, %s)" x y
+  | Relative x -> Printf.sprintf "Relative %s" x
+  | Ic x -> Printf.sprintf "Ic %s" x
+  | IcAlias x -> Printf.sprintf "IcAlias %s" x
+  | Prim -> "Prim"
+
+let parse (f: string) : (parsed, string) result =
+  match Lib.String.chop_prefix "mo:" f with
+  | Some suffix ->
+    begin match Stdlib.String.index_opt suffix '/' with
+    | None ->
+      if suffix = "prim" || suffix = "⛔"
+      then Ok Prim
+      else Ok (Package (suffix, ""))
+    | Some i ->
+      if suffix = "prim" || suffix = "⛔"
+      then Error "The prim package has no modules"
+      else
+        let pkg = Stdlib.String.sub suffix 0 i in
+        let path = Stdlib.String.sub suffix (i+1) (Stdlib.String.length suffix - (i+1)) in
+        if Option.is_some (Lib.String.chop_prefix ".." (Lib.FilePath.normalise path))
+        then Error (Printf.sprintf "Package imports musn't access parent directories: %s is invalid." path)
+        else Ok (Package (pkg, path))
+    end
+  | None ->
+    match Lib.String.chop_prefix "ic:" f with
+    | Some principal -> begin match decode_principal principal with
+      | Ok bytes -> Ok (Ic bytes)
+      | Error err -> Error err
+      end
+    | None ->
+      match Lib.String.chop_prefix "canister:" f with
+      | Some suffix -> Ok (IcAlias suffix)
+      | None ->
+        begin match Stdlib.String.index_opt f ':' with
+        | Some _ -> Error "Unrecognized URL"
+        | None -> Ok (Relative (Lib.FilePath.normalise f))
+        end
+
+
+(* Basename of the IDL file searched (see DFX-Interface.md) *)
+let idl_basename_of_blob bytes =
+  encode_principal bytes ^ ".did"
+
+
+
+ + + diff --git a/coverage/idllib/arrange_idl.ml.html b/coverage/idllib/arrange_idl.ml.html new file mode 100644 index 00000000000..0ac1f6133be --- /dev/null +++ b/coverage/idllib/arrange_idl.ml.html @@ -0,0 +1,952 @@ + + + + + arrange_idl.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+
+
open Source
+open Syntax
+open Wasm.Sexpr
+
+let string_of_prim p =
+  match p with
+  | Nat -> "nat"
+  | Nat8 -> "nat8"
+  | Nat16 -> "nat16"
+  | Nat32 -> "nat32"
+  | Nat64 -> "nat64"
+  | Int -> "int"
+  | Int8 -> "int8"
+  | Int16 -> "int16"
+  | Int32 -> "int32"
+  | Int64 -> "int64"
+  | Float32 -> "float32"
+  | Float64 -> "float64"
+  | Bool -> "bool"
+  | Text -> "text"
+  | Null -> "null"
+  | Reserved -> "reserved"
+  | Empty -> "empty"
+
+let string_of_mode m =
+  match m.it with
+  | Oneway -> " oneway"
+  | Query -> " query"
+  | Composite -> " composite_query"
+
+
+let ($$) head inner = Node (head, inner)
+
+and id i = Atom i.it
+and tag i = Atom ("#" ^ i.it)
+
+let field_tag (tf : field_label)
+  = match tf.it with
+  | Id n -> Lib.Uint32.to_string n
+  | Named name -> name
+  | Unnamed n -> Lib.Uint32.to_string n
+
+let rec typ_field (tf : typ_field)
+  = field_tag (tf.it.label) $$ [typ tf.it.typ]
+
+and typ_meth (tb : typ_meth)
+  = tb.it.var.it $$ [typ tb.it.meth]
+
+and mode m = Atom (string_of_mode m)
+
+and typ t = match t.it with
+  | VarT s        -> "VarT" $$ [id s]
+  | PrimT p             -> "PrimT" $$ [Atom (string_of_prim p)]
+  | RecordT ts        -> "RecordT" $$ List.map typ_field ts
+  | VecT t       -> "VecT" $$ [typ t]
+  | BlobT -> Atom "BlobT"
+  | OptT t              -> "OptT" $$ [typ t]
+  | VariantT cts        -> "VariantT" $$ List.map typ_field cts
+  | FuncT (ms, s, t) -> "FuncT" $$ List.map typ s @ List.map typ t @ List.map mode ms
+  | ServT ts -> "ServT" $$ List.map typ_meth ts
+  | ClassT (ts, t) -> "ClassT" $$ List.map typ ts @ [typ t]
+  | PrincipalT -> Atom "PrincipalT"
+  | PreT -> Atom "PreT"
+
+and dec d = match d.it with
+  | TypD (x, t) ->
+     "TypD" $$ [id x] @ [typ t]
+  | ImportD (f, fp) ->
+     "ImportD" $$ [Atom (if !fp = "" then f else !fp)]
+
+and actor = function
+  | None -> Atom "NoActor"
+  | Some t ->
+     "Actor" $$ [typ t]
+
+and prog prog = "Decs" $$ List.map dec prog.it.decs @ [actor prog.it.actor]
+
+
+(* Pretty printing  *)
+module type Config = sig
+  val trivia : Trivia.trivia_info Trivia.PosHashtbl.t option
+end
+
+module Default = struct
+  let trivia = None
+end
+
+module Make (Cfg : Config) = struct
+  open Format
+  let str ppf s = pp_print_string ppf s
+  let space = pp_print_space
+  let kwd ppf s = str ppf s; space ppf ()
+  let quote ppf s =
+    pp_open_hbox ppf ();
+    str ppf "\""; str ppf (Lib.String.lightweight_escaped s); str ppf "\"";
+    pp_close_box ppf ()
+  let text ppf s =
+    if Escape.needs_candid_quote s then quote ppf s else str ppf s
+
+  let rec pp_typ ppf t =
+    pp_open_hovbox ppf 1;
+    (match t.it with
+    | VarT id -> str ppf id.it
+    | PrimT p -> str ppf (string_of_prim p)
+    | OptT t -> kwd ppf "opt"; pp_typ ppf t
+    | VecT t -> kwd ppf "vec"; pp_typ ppf t
+    | BlobT -> str ppf "blob"
+    | RecordT fs -> pp_fields ppf "record" fs
+    | VariantT fs -> pp_fields ppf "variant" fs
+    | FuncT (ms,s,t) ->
+      kwd ppf "func";
+      pp_func ppf (ms,s,t)
+    | ServT ms ->
+      pp_open_vbox ppf 2;
+      str ppf "service {";
+      List.iter (fun m -> pp_print_cut ppf (); pp_meth ppf m; str ppf ";") ms;
+      pp_print_break ppf 0 (-2);
+      str ppf "}";
+      pp_close_box ppf ()
+    | PrincipalT -> str ppf "principal"
+    | ClassT _ -> assert false
+    | PreT -> assert false);
+    pp_close_box ppf ()
+  and pp_fields ppf name fs =
+    let is_variant = name = "variant" in
+    if List.length fs > 1 then
+      pp_open_vbox ppf 2
+    else
+      pp_open_hovbox ppf 2;
+    str ppf (name ^ " {");
+    List.iter (fun f -> pp_print_cut ppf (); pp_field ppf is_variant f; str ppf ";") fs;
+    pp_print_break ppf 0 (-2);
+    str ppf "}";
+    pp_close_box ppf ()
+  and pp_field ppf is_variant f =
+    pp_doc ppf f.at;
+    let hide_type = is_variant && f.it.typ.it = PrimT Null in
+    pp_open_hovbox ppf 1;
+    (match f.it.label.it with
+    | Named name ->
+      text ppf name;
+      if not hide_type then
+        (kwd ppf ":"; pp_typ ppf f.it.typ)
+    | Id n ->
+      str ppf (Lib.Uint32.to_string n);
+      if not hide_type then
+        (kwd ppf ":"; pp_typ ppf f.it.typ)
+    | Unnamed _ -> pp_typ ppf f.it.typ);
+    pp_close_box ppf ()
+
+  and pp_func ppf (ms,s,t) =
+    pp_args ppf s;
+    kwd ppf " ->";
+    pp_args ppf t;
+    List.iter (fun m -> str ppf (string_of_mode m)) ms
+
+  and pp_args ppf fs =
+    let n = List.length fs in
+    str ppf "(";
+    List.iteri (fun i f ->
+        pp_typ ppf f;
+        if i < n-1 then
+          kwd ppf ",";
+      ) fs;
+    str ppf ")"
+
+  and pp_meth ppf m =
+    pp_doc ppf m.at;
+    pp_open_hovbox ppf 1;
+    text ppf m.it.var.it;
+    kwd ppf ":";
+    (match m.it.meth.it with
+    | FuncT (ms,s,t) -> pp_func ppf (ms,s,t)
+    | _ -> pp_typ ppf m.it.meth);
+    pp_close_box ppf ()
+
+  and pp_doc ppf at =
+    let open Trivia in
+    match Cfg.trivia with
+    | Some t ->
+      let pos = { line = at.left.line; column = at.left.column } in
+      let trivia = PosHashtbl.find_opt t pos in
+      (match trivia with
+      | Some t ->
+        List.iter (function
+        | LineComment s ->
+          str ppf "/// ";
+          str ppf s;
+          pp_force_newline ppf ()
+        | BlockComment s ->
+          List.iter (fun line ->
+            if String.length line > 0 then (
+              str ppf "/// ";
+              str ppf line;
+              pp_force_newline ppf ()))
+          (String.split_on_char '\n' s))
+        (docs_of_trivia_info t)
+      | None -> ())
+    | None -> ()
+
+  let rec is_linebreak_type t =
+    match t.it with
+    | ServT _ -> true
+    | RecordT fs | VariantT fs -> List.length fs > 1
+    | VecT t | OptT t -> is_linebreak_type t
+    | _ -> false
+
+  let pp_dec ppf d =
+    pp_doc ppf d.at;
+    pp_open_vbox ppf 1;
+    (match d.it with
+    | TypD (id, typ) ->
+        pp_open_hbox ppf ();
+        kwd ppf "type";
+        kwd ppf id.it;
+        kwd ppf "=";
+        pp_close_box ppf ();
+        if is_linebreak_type typ then
+          pp_print_cut ppf ();
+        pp_typ ppf typ
+    | ImportD (f, fp) ->
+        str ppf "import \"";
+        str ppf f;
+        str ppf "\""
+    );
+    pp_close_box ppf ()
+
+  let pp_actor ppf actor =
+    Option.iter (fun a -> pp_doc ppf a.at) actor;
+    (match actor with
+    | None -> ()
+    | Some {it=ServT ms; _} ->
+      pp_open_vbox ppf 2;
+      pp_open_hbox ppf ();
+      str ppf "service : {";
+      pp_close_box ppf ();
+      List.iter (fun m -> pp_print_cut ppf (); pp_meth ppf m; str ppf ";") ms;
+      pp_print_break ppf 0 (-2);
+      str ppf "}";
+      pp_close_box ppf ()
+    | Some {it=VarT x; _} ->
+      pp_open_hbox ppf ();
+      kwd ppf "service";
+      kwd ppf ":";
+      str ppf x.it;
+      pp_close_box ppf ()
+    | Some {it=ClassT(args, t); _} ->
+      pp_open_hbox ppf ();
+      kwd ppf "service";
+      kwd ppf ":";
+      pp_args ppf args;
+      str ppf " -> ";
+      pp_typ ppf t;
+      pp_close_box ppf ()
+    | _ -> assert false);
+    pp_print_cut ppf ()
+
+  let pp_prog ppf prog =
+    pp_open_vbox ppf 0;
+    List.iter (fun d ->
+        pp_dec ppf d;
+        str ppf ";";
+        pp_print_cut ppf ()
+      ) prog.it.decs;
+    pp_doc ppf prog.at;
+    pp_actor ppf prog.it.actor;
+    pp_close_box ppf ()
+
+  let string_of_typ t =
+    let buf = Buffer.create 100 in
+    let ppf = formatter_of_buffer buf in
+    pp_typ ppf t;
+    pp_print_flush ppf ();
+    Buffer.contents buf
+
+  let string_of_prog prog =
+    let buf = Buffer.create 100 in
+    let ppf = formatter_of_buffer buf in
+    pp_prog ppf prog;
+    pp_print_flush ppf ();
+    Buffer.contents buf
+
+  let string_of_args ts =
+    let buf = Buffer.create 100 in
+    let ppf = formatter_of_buffer buf in
+    pp_args ppf ts;
+    pp_print_flush ppf ();
+    Buffer.contents buf
+end
+
+(* Defaults *)
+include Make (Default)
+
+
+
+ + + diff --git a/coverage/idllib/compile_js.ml.html b/coverage/idllib/compile_js.ml.html new file mode 100644 index 00000000000..a0805333292 --- /dev/null +++ b/coverage/idllib/compile_js.ml.html @@ -0,0 +1,851 @@ + + + + + compile_js.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+
+

+open Format
+open Syntax
+open Source
+
+module Env = Typing.Env
+module TS = Set.Make(String)
+
+type typ_info = {
+    var : string;
+    typ : typ;
+    is_rec : bool;
+  }
+
+let as_tuple fs =
+  let open List in
+  let fs2 = mapi (fun i f -> (i, f)) fs in
+  let is_tuple = length fs > 0 && for_all (fun (i, f) ->
+      match f.it.label.it with
+      | Unnamed id -> Lib.Uint32.to_int id = i
+      | _ -> false) fs2 in
+  if is_tuple then
+    Some (map (fun (f : typ_field) -> f.it.typ) fs)
+  else
+    None
+
+(* Gather type definitions from actor and sort the definitions in topological order *)
+let chase_env env actor =
+  let new_env = ref [] in
+  let seen = ref TS.empty in
+  let rec chase t =
+    match t.it with
+    | PrimT _ -> ()
+    | PrincipalT -> ()
+    | BlobT -> ()
+    | VarT id ->
+       if not (TS.mem id.it !seen) then begin
+         seen := TS.add id.it !seen;
+         let t = Env.find id.it env in
+         chase t;
+         new_env := {var = id.it; typ = t; is_rec = false} :: !new_env;
+         end
+    | ServT ms -> List.iter (fun m -> chase m.it.meth) ms
+    | OptT t -> chase t
+    | VecT t -> chase t
+    | RecordT fs -> chase_fields fs
+    | VariantT fs -> chase_fields fs
+    | FuncT (ms, fs1, fs2) -> List.iter chase fs1; List.iter chase fs2
+    | ClassT _ -> assert false
+    | PreT -> assert false
+  and chase_fields fs =
+    List.iter (fun (f : typ_field) -> chase f.it.typ) fs
+  in
+  chase actor;
+  List.rev (!new_env)
+
+(* Given a topologically sorted type definition list, infer which types are recursive *)
+let infer_rec env_list =
+  let seen = ref TS.empty in
+  let recs = ref TS.empty in
+  let rec go t =
+    match t.it with
+    | PrimT _ -> ()
+    | PrincipalT -> ()
+    | BlobT -> ()
+    | VarT id ->
+       if not (TS.mem id.it !seen) then begin
+         seen := TS.add id.it !seen;
+         recs := TS.add id.it !recs
+         end
+    | ServT ms -> List.iter (fun m -> go m.it.meth) ms
+    | OptT t -> go t
+    | VecT t -> go t
+    | RecordT fs -> go_fields fs
+    | VariantT fs -> go_fields fs
+    | FuncT (_, fs1, fs2) -> List.iter go fs1; List.iter go fs2
+    | ClassT _ -> assert false
+    | PreT -> assert false
+  and go_fields fs =
+    List.iter (fun (f:typ_field) -> go f.it.typ) fs
+  in
+  List.iter (fun {var;typ;_} -> go typ; seen := TS.add var !seen) env_list;
+  !recs
+
+let str ppf s = pp_print_string ppf s; pp_print_cut ppf ()
+let id ppf s = str ppf s.it; pp_print_cut ppf ()
+let space = pp_print_space
+let kwd ppf s = str ppf s; space ppf ()
+let quote_name ppf s = pp_open_hbox ppf (); str ppf "'"; str ppf (Lib.String.lightweight_escaped s); str ppf "'"; pp_close_box ppf (); pp_print_cut ppf ()
+
+let pp_prim p =
+  match p with
+  | Nat -> "Nat"
+  | Nat8 -> "Nat8"
+  | Nat16 -> "Nat16"
+  | Nat32 -> "Nat32"
+  | Nat64 -> "Nat64"
+  | Int -> "Int"
+  | Int8 -> "Int8"
+  | Int16 -> "Int16"
+  | Int32 -> "Int32"
+  | Int64 -> "Int64"
+  | Float32 -> "Float32"
+  | Float64 -> "Float64"
+  | Bool -> "Bool"
+  | Text -> "Text"
+  | Null -> "Null"
+  | Reserved -> "None"
+  | Empty -> "None"
+
+let pp_mode ppf m =
+  match m.it with
+  | Oneway -> str ppf "'oneway'"
+  | Query -> str ppf "'query'"
+  | Composite -> str ppf "'composite_query'"
+
+let rec concat ppf f sep list =
+  match list with
+  | [] -> ()
+  | e::[] -> f ppf e; pp_print_cut ppf ()
+  | e::tail -> f ppf e; str ppf sep; space ppf (); concat ppf f sep tail
+
+let rec pp_typ ppf t =
+  pp_open_box ppf 1;
+  (match t.it with
+  | VarT s -> id ppf s
+  | PrimT p -> str ppf ("IDL."^(pp_prim p))
+  | PrincipalT -> str ppf "IDL.Principal"
+  | RecordT ts -> pp_fields ppf ts
+  | VecT t -> str ppf "IDL.Vec("; pp_typ ppf t; str ppf ")";
+  | BlobT -> str ppf "IDL.Vec(IDL.Nat8)";
+  | OptT t -> str ppf "IDL.Opt("; pp_typ ppf t; str ppf ")";
+  | VariantT ts -> str ppf "IDL.Variant({"; concat ppf pp_field "," ts; str ppf "})";
+  | FuncT (ms, t1, t2) ->
+     str ppf "IDL.Func(";
+     pp_args ppf t1;
+     kwd ppf ",";
+     pp_args ppf t2;
+     kwd ppf ",";
+     pp_modes ppf ms;
+     str ppf ")";
+  | ServT ts ->
+     pp_open_hovbox ppf 1;
+     str ppf "IDL.Service({";
+     concat ppf pp_meth "," ts;
+     str ppf "})";
+     pp_close_box ppf ();
+  | ClassT _ -> assert false
+  | PreT -> assert false
+  );
+  pp_close_box ppf ()
+
+and pp_args ppf args =
+  pp_open_box ppf 1;
+  str ppf "[";
+  concat ppf pp_typ "," args;
+  str ppf "]";
+  pp_close_box ppf ()
+
+and pp_modes ppf modes =
+  pp_open_box ppf 1;
+  str ppf "[";
+  concat ppf pp_mode "," modes;
+  str ppf "]";
+  pp_close_box ppf ()
+
+and pp_fields ppf fs =
+  pp_open_box ppf 1;
+  (match as_tuple fs with
+  | None ->
+     str ppf "IDL.Record({";
+     concat ppf pp_field "," fs;
+     str ppf "})";
+  | Some typs ->
+     str ppf "IDL.Tuple(";
+     concat ppf pp_typ "," typs;
+     str ppf ")");
+  pp_close_box ppf ()
+
+and pp_field ppf tf =
+  pp_open_box ppf 1;
+  let f_name =
+    match tf.it.label.it with
+    | Named name -> name
+    | Id n | Unnamed n -> "_" ^ (Lib.Uint32.to_string n) ^ "_"
+  in quote_name ppf f_name; kwd ppf ":"; pp_typ ppf tf.it.typ;
+  pp_close_box ppf ()
+
+and pp_meth ppf meth =
+  pp_open_box ppf 1;
+  quote_name ppf meth.it.var.it;
+  kwd ppf ":";
+  pp_typ ppf meth.it.meth;
+  pp_close_box ppf ()
+
+let pp_dec ppf {var;typ;is_rec} =
+  pp_open_hovbox ppf 1;
+  if is_rec then begin
+      str ppf var;
+      str ppf ".fill(";
+      pp_typ ppf typ;
+      str ppf ")";
+    end
+  else begin
+      kwd ppf "const";
+      kwd ppf var;
+      kwd ppf "=";
+      pp_typ ppf typ;
+    end;
+  pp_close_box ppf ();
+  pp_print_cut ppf ()
+
+let pp_rec ppf x =
+  pp_open_hovbox ppf 1;
+  kwd ppf "const";
+  kwd ppf x;
+  kwd ppf "=";
+  str ppf "IDL.Rec()";
+  pp_close_box ppf ();
+  pp_print_cut ppf ()
+
+let pp_actor ppf t recs =
+  pp_open_hovbox ppf 1;
+  kwd ppf "return";
+  (match t.it with
+   | ServT tp ->
+      str ppf "IDL.Service({";
+      concat ppf pp_meth "," tp;
+      str ppf "});"
+   | VarT var ->
+      if TS.mem var.it recs then
+        str ppf (var.it ^ ".getType();")
+      else
+        str ppf var.it;
+   | _ -> assert false
+  );
+  pp_close_box ppf ()
+
+let pp_header ppf () =
+  pp_open_vbox ppf 1;
+  str ppf "export default ({ IDL }) => {"
+
+let pp_footer ppf () =
+  pp_close_box ppf ();
+  pp_force_newline ppf ();
+  pp_print_string ppf "};"
+
+let pp_prog ppf env prog =
+  match prog.it.actor with
+  | None -> ()
+  | Some actor ->
+     let env_list = chase_env env actor in
+     let recs = infer_rec env_list in
+     let env_list =
+       List.map (fun (e:typ_info) ->
+           if TS.mem e.var recs then {e with is_rec = true} else e)
+         env_list in
+     pp_header ppf ();
+     TS.iter (pp_rec ppf) recs;
+     List.iter (pp_dec ppf) env_list;
+     pp_actor ppf actor recs;
+     pp_footer ppf ()
+
+let compile (scope : Typing.scope) (prog : Syntax.prog) =
+  let buf = Buffer.create 100 in
+  let ppf = formatter_of_buffer buf in
+  pp_prog ppf scope prog;
+  pp_print_flush ppf ();
+  buf
+
+
+
+ + + diff --git a/coverage/idllib/escape.ml.html b/coverage/idllib/escape.ml.html new file mode 100644 index 00000000000..56ef268f7a2 --- /dev/null +++ b/coverage/idllib/escape.ml.html @@ -0,0 +1,601 @@ + + + + + escape.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+
+
(*
+This module implements the field name mapping from Motoko to IDL
+and back.
+
+(It could live in mo_idl/, but mo_idl depends on mo_def/, codegen/ needs this
+encoding, but codegen/ should not depend on mo_def/.)
+*)
+
+(* Utilities (cf. lexer.mll) *)
+
+let is_underscore c = c = '_'
+let is_letter c = ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
+let is_digit c = '0' <= c && c <= '9'
+
+let is_valid_as_id str = match Lib.String.explode str with
+  | c::cs ->
+    (is_underscore c || is_letter c) &&
+    List.for_all (fun c -> is_underscore c || is_letter c || is_digit c) cs
+  | _ -> false
+
+let ends_with_underscore str = Lib.String.chop_suffix "_" str <> None
+
+let is_candid_keyword = function
+  | "import"
+  | "service"
+  | "func"
+  | "type"
+  | "opt"
+  | "vec"
+  | "record"
+  | "variant"
+  | "blob"
+  | "principal"
+  | "nat"
+  | "nat8"
+  | "nat16"
+  | "nat32"
+  | "nat64"
+  | "int"
+  | "int8"
+  | "int16"
+  | "int32"
+  | "int64"
+  | "float32"
+  | "float64"
+  | "bool"
+  | "text"
+  | "null"
+  | "reserved"
+  | "empty"
+  | "oneway"
+  | "query"
+  -> true
+  | _
+  -> false
+
+let is_motoko_keyword = function
+  | "actor"
+  | "and"
+  | "async"
+  | "async*"
+  | "assert"
+  | "await"
+  | "await*"
+  | "break"
+  | "case"
+  | "catch"
+  | "class"
+  | "continue"
+  | "composite"
+  | "debug"
+  | "debug_show"
+  | "do"
+  | "else"
+  | "false"
+  | "flexible"
+  | "for"
+  | "from_candid"
+  | "func"
+  | "if"
+  | "ignore"
+  | "in"
+  | "import"
+  | "module"
+  | "not"
+  | "null"
+  | "object"
+  | "or"
+  | "label"
+  | "let"
+  | "loop"
+  | "private"
+  | "public"
+  | "query"
+  | "return"
+  | "shared"
+  | "stable"
+  | "switch"
+  | "system"
+  | "try"
+  | "throw"
+  | "to_candid"
+  | "true"
+  | "type"
+  | "var"
+  | "while"
+  | "with"
+  -> true
+  | _
+  -> false
+
+(* Escaping (used for Candid → Motoko) *)
+
+let escape_num h = Printf.sprintf "_%s_" (Lib.Uint32.to_string h)
+
+let escape str =
+  if is_motoko_keyword str then str ^ "_" else
+  if is_valid_as_id str
+  then if ends_with_underscore str then str ^ "_" else str
+  else escape_num (IdlHash.idl_hash str)
+
+let escape_method at str =
+  if is_motoko_keyword str then str ^ "_" else
+  if is_valid_as_id str
+  then if ends_with_underscore str then str ^ "_" else str
+  else raise (Exception.UnsupportedCandidFeature
+    (Diag.error_message at "M0160" "import"
+      (Printf.sprintf "Candid method name '%s' is not a valid Motoko identifier" str)))
+
+(* Unescaping (used for Motoko → Candid) *)
+
+let is_escaped_num str =
+  match Lib.String.chop_prefix "_" str with
+  | Some str ->
+    begin match Lib.String.chop_suffix "_" str with
+    | Some str
+      when String.length str > 0 &&
+           List.for_all is_digit (Lib.String.explode str)
+      -> Lib.Uint32.of_string_opt str
+    | _ -> None
+    end
+  | _ -> None
+
+(* This (or a type like this) could move into the IDL AST *)
+type label = Nat of Lib.Uint32.t | Id of string
+
+let unescape str =
+  match is_escaped_num str with
+  | Some h -> Nat h
+  | _ -> match Lib.String.chop_suffix "_" str with
+    | Some str' -> Id str'
+    | _ -> Id str
+
+let unescape_hash str = match unescape str with
+  | Nat h -> h
+  | Id s -> IdlHash.idl_hash s
+
+let unescape_method str =
+  match Lib.String.chop_suffix "_" str with
+    | Some str' -> str'
+    | _ -> str
+
+let needs_candid_quote str =
+  not (is_valid_as_id str) || is_candid_keyword str
+
+
+
+ + + diff --git a/coverage/idllib/exception.ml.html b/coverage/idllib/exception.ml.html new file mode 100644 index 00000000000..11da02d0961 --- /dev/null +++ b/coverage/idllib/exception.ml.html @@ -0,0 +1,41 @@ + + + + + exception.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+
+
+
+
+1
+2
+
+
exception UnsupportedCandidFeature of Diag.message
+
+
+
+
+ + + diff --git a/coverage/idllib/flags.ml.html b/coverage/idllib/flags.ml.html new file mode 100644 index 00000000000..5858ac7cfd0 --- /dev/null +++ b/coverage/idllib/flags.ml.html @@ -0,0 +1,47 @@ + + + + + flags.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+
+
let verbose = ref false
+let dump_parse = ref false
+
+
+
+
+
+ + + diff --git a/coverage/idllib/idlHash.ml.html b/coverage/idllib/idlHash.ml.html new file mode 100644 index 00000000000..522e5b8fe7f --- /dev/null +++ b/coverage/idllib/idlHash.ml.html @@ -0,0 +1,59 @@ + + + + + idlHash.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+
+
(* IDL field hashes *)
+let idl_hash : string -> Lib.Uint32.t = fun s ->
+  let open Lib.Uint32 in
+  List.fold_left
+    (fun s c -> add (mul s (of_int 223)) (of_int (Char.code c)))
+    zero
+    (* TODO: also unescape the string, once #465 is approved *)
+    (Lib.String.explode s)
+
+
+
+ + + diff --git a/coverage/idllib/lexer.ml.html b/coverage/idllib/lexer.ml.html new file mode 100644 index 00000000000..7dcb59c6285 --- /dev/null +++ b/coverage/idllib/lexer.ml.html @@ -0,0 +1,9559 @@ + + + + + lexer.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+
+
# 1 "idllib/lexer.mll"
+ 
+open Parser
+module Utf8 = Lib.Utf8
+
+let convert_pos pos =
+  { Source.file = pos.Lexing.pos_fname;
+    Source.line = pos.Lexing.pos_lnum;
+    Source.column = pos.Lexing.pos_cnum - pos.Lexing.pos_bol
+  }
+
+let region lexbuf =
+  let left = convert_pos (Lexing.lexeme_start_p lexbuf) in
+  let right = convert_pos (Lexing.lexeme_end_p lexbuf) in
+  {Source.left = left; Source.right = right}
+
+let error lexbuf msg = raise (Source.ParseError (region lexbuf, msg))
+let error_nest start lexbuf msg =
+  lexbuf.Lexing.lex_start_p <- start;
+  error lexbuf msg
+
+
+let utf8 s i =
+  let len = if s.[!i] < '\xe0' then 1 else if s.[!i] < '\xf0' then 2 else 3 in
+  i := !i + len;
+  List.hd (Utf8.decode (String.sub s (!i - len) (1 + len)))
+
+let codepoint lexbuf s i =
+  let u =
+    if s.[!i] >= '\x80' then Utf8.encode [utf8 s i] else
+    if s.[!i] <> '\\' then Utf8.encode [Char.code s.[!i]] else
+    match (incr i; s.[!i]) with
+    | 'n' -> Utf8.encode [Char.code '\n']
+    | 'r' -> Utf8.encode [Char.code '\r']
+    | 't' -> Utf8.encode [Char.code '\t']
+    | '\\' -> Utf8.encode [Char.code '\\']
+    | '\'' -> Utf8.encode [Char.code '\'']
+    | '\"' -> Utf8.encode [Char.code '\"']
+    | 'u' ->
+      let j = !i + 2 in
+      i := String.index_from s j '}';
+      Utf8.encode [
+        try
+          let n = int_of_string ("0x" ^ String.sub s j (!i - j)) in
+          if 0 <= n && n < 0xD800 || 0xE000 <= n && n < 0x110000 then n else raise (Failure "")
+        with Failure _ -> error lexbuf "unicode escape out of range"
+      ]
+    | h ->
+      incr i;
+      let b = int_of_string ("0x" ^ String.make 1 h ^ String.make 1 s.[!i]) in
+      String.of_seq (Seq.return (Char.chr b))
+  in incr i; u
+
+let text lexbuf s =
+  let b = Buffer.create (String.length s) in
+  let i = ref 1 in
+  while !i < String.length s - 1 do
+    let bs = codepoint lexbuf s i in
+    Buffer.add_substring b bs 0 (String.length bs)
+  done;
+  Buffer.contents b
+
+# 64 "idllib/lexer.ml"
+let __ocaml_lex_tables = {
+  Lexing.lex_base =
+   "\000\000\214\255\000\000\129\000\129\000\193\000\001\001\001\001\
+    \065\001\215\255\216\255\217\255\218\255\203\000\209\001\028\002\
+    \103\002\178\002\253\002\072\003\147\003\222\003\041\004\116\004\
+    \191\004\010\005\133\005\120\005\131\005\130\000\188\000\132\000\
+    \248\255\249\255\250\255\251\255\252\255\253\255\254\255\255\255\
+    \246\255\244\255\245\255\243\255\141\005\179\005\086\006\109\006\
+    \238\255\239\255\240\255\164\006\154\006\107\006\202\006\037\007\
+    \101\007\101\007\165\007\101\008\230\008\038\009\102\009\166\009\
+    \230\009\038\010\102\010\166\010\230\010\237\255\124\000\166\011\
+    \088\008\111\008\153\011\119\012\157\012\232\012\051\013\126\013\
+    \201\013\020\014\095\014\170\014\245\014\064\015\139\015\214\015\
+    \033\016\108\016\183\016\002\017\077\017\152\017\227\017\046\018\
+    \121\018\196\018\015\019\090\019\165\019\240\019\059\020\134\020\
+    \209\020\028\021\103\021\178\021\253\021\072\022\147\022\222\022\
+    \041\023\116\023\191\023\010\024\085\024\160\024\235\024\054\025\
+    \129\025\204\025\023\026\098\026\173\026\248\026\067\027\142\027\
+    \217\027\036\028\111\028\186\028\005\029\080\029\155\029\230\029\
+    \049\030\124\030\199\030\018\031\093\031\168\031\219\255\174\031\
+    \221\255\222\255\047\032\010\007\095\032\159\032\223\032\223\032\
+    \031\033\095\033\159\033\223\033\031\034\095\034\159\034\223\034\
+    \031\035\095\035\159\035\223\035\031\036\095\036\159\036\223\036\
+    \031\037\095\037\159\037\085\038\250\255\005\038\096\011\198\038\
+    \006\039\070\039\070\039\134\039\251\255\252\255\253\255\206\000\
+    \204\000\255\255\254\255\198\039\006\040\070\040\134\040\198\040\
+    \006\041\070\041\134\041\198\041";
+  Lexing.lex_backtrk =
+   "\255\255\255\255\041\000\041\000\041\000\041\000\041\000\041\000\
+    \041\000\255\255\255\255\255\255\255\255\040\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\040\000\014\000\014\000\013\000\040\000\008\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\014\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\018\000\018\000\
+    \018\000\255\255\255\255\255\255\032\000\032\000\032\000\032\000\
+    \019\000\032\000\032\000\032\000\032\000\032\000\020\000\032\000\
+    \032\000\021\000\032\000\032\000\022\000\032\000\032\000\023\000\
+    \032\000\032\000\032\000\029\000\032\000\032\000\024\000\032\000\
+    \032\000\032\000\032\000\026\000\032\000\032\000\032\000\032\000\
+    \025\000\032\000\032\000\027\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\028\000\032\000\032\000\032\000\030\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\031\000\255\255\035\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\255\255\255\255\255\255\004\000\
+    \004\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255";
+  Lexing.lex_default =
+   "\001\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\000\000\000\000\000\000\000\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\059\000\255\255\255\255\255\255\255\255\255\255\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\
+    \000\000\000\000\000\000\069\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\059\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\000\000\255\255\059\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\000\000\143\000\
+    \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\180\000\000\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\000\000\000\000\000\000\255\255\
+    \255\255\000\000\000\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255";
+  Lexing.lex_trans =
+   "\009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\012\000\011\000\009\000\009\000\012\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \012\000\030\000\026\000\009\000\009\000\009\000\009\000\009\000\
+    \039\000\038\000\009\000\009\000\034\000\029\000\033\000\013\000\
+    \028\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\032\000\035\000\009\000\031\000\009\000\009\000\
+    \009\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\009\000\009\000\009\000\009\000\014\000\
+    \009\000\014\000\018\000\015\000\014\000\014\000\023\000\014\000\
+    \014\000\025\000\014\000\014\000\014\000\014\000\014\000\021\000\
+    \017\000\016\000\019\000\024\000\022\000\014\000\020\000\014\000\
+    \014\000\014\000\014\000\037\000\009\000\036\000\009\000\009\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \043\000\040\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \007\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\006\000\005\000\005\000\
+    \004\000\002\000\002\000\002\000\003\000\142\000\042\000\073\000\
+    \186\000\041\000\143\000\185\000\000\000\000\000\000\000\000\000\
+    \010\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\128\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\124\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\116\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\113\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\108\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\100\000\014\000\014\000\014\000\
+    \101\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\093\000\014\000\094\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\090\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\087\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\081\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\076\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\049\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\000\000\000\000\050\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\000\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\046\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\000\000\000\000\000\000\045\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\051\000\045\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\044\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\048\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\057\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\056\000\055\000\055\000\054\000\052\000\052\000\
+    \052\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\049\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\000\000\047\000\000\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\071\000\000\000\
+    \000\000\000\000\000\000\071\000\000\000\000\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\072\000\072\000\072\000\072\000\
+    \072\000\072\000\072\000\072\000\072\000\072\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\072\000\072\000\072\000\
+    \072\000\072\000\072\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\000\000\000\000\000\000\000\000\000\000\
+    \071\000\000\000\000\000\000\000\000\000\072\000\072\000\072\000\
+    \072\000\072\000\072\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\071\000\000\000\000\000\000\000\071\000\000\000\
+    \071\000\070\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\255\255\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\049\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\000\000\000\000\050\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\059\000\059\000\059\000\059\000\059\000\059\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\000\000\000\000\
+    \000\000\059\000\059\000\059\000\059\000\059\000\059\000\000\000\
+    \000\000\051\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\048\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\057\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\056\000\055\000\055\000\054\000\052\000\052\000\
+    \052\000\053\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\049\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \049\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\
+    \048\000\048\000\048\000\048\000\048\000\048\000\000\000\000\000\
+    \050\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \075\000\000\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \000\000\000\000\051\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\059\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\048\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\057\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\056\000\055\000\055\000\054\000\052\000\
+    \052\000\052\000\053\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\049\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\077\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\078\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\079\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\080\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\082\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\083\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\084\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \085\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\086\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\088\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\089\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\091\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\092\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\096\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\095\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \097\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\098\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \099\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\103\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\102\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\104\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\105\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\106\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\107\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \109\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\110\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\111\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\112\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\114\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\115\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\117\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\118\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\119\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\120\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\121\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\122\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\123\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\125\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\126\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\127\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\014\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\129\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\130\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\131\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\132\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\133\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\134\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\014\000\000\000\014\000\014\000\014\000\014\000\
+    \135\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\136\000\000\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \014\000\000\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\137\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\014\000\000\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\138\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\014\000\000\000\
+    \014\000\014\000\014\000\014\000\139\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\000\000\000\000\000\000\
+    \000\000\014\000\000\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\140\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \144\000\000\000\000\000\000\000\014\000\000\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\141\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\014\000\
+    \000\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\151\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\150\000\149\000\149\000\148\000\146\000\
+    \146\000\146\000\147\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\145\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\182\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\184\000\
+    \000\000\000\000\000\000\000\000\183\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\178\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\177\000\176\000\176\000\175\000\173\000\173\000\
+    \173\000\174\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\181\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000";
+  Lexing.lex_check =
+   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \029\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\013\000\030\000\070\000\
+    \183\000\030\000\013\000\184\000\255\255\255\255\255\255\255\255\
+    \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\255\255\255\255\255\255\255\255\
+    \014\000\255\255\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\014\000\014\000\014\000\014\000\
+    \014\000\014\000\014\000\014\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\255\255\
+    \255\255\255\255\255\255\015\000\255\255\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\255\255\255\255\255\255\255\255\016\000\255\255\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\255\255\255\255\255\255\
+    \255\255\017\000\255\255\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \255\255\255\255\255\255\255\255\018\000\255\255\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\255\255\255\255\255\255\255\255\019\000\
+    \255\255\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\255\255\255\255\
+    \255\255\255\255\020\000\255\255\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\255\255\255\255\255\255\255\255\021\000\255\255\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\255\255\255\255\255\255\255\255\
+    \022\000\255\255\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\255\255\
+    \255\255\255\255\255\255\023\000\255\255\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\255\255\255\255\255\255\255\255\024\000\255\255\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\255\255\255\255\255\255\
+    \255\255\025\000\255\255\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\255\255\255\255\026\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\255\255\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\044\000\044\000\044\000\
+    \044\000\044\000\044\000\044\000\044\000\044\000\044\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\044\000\044\000\
+    \044\000\044\000\044\000\044\000\255\255\255\255\255\255\027\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\026\000\028\000\045\000\045\000\045\000\045\000\045\000\
+    \045\000\045\000\045\000\045\000\045\000\255\255\044\000\044\000\
+    \044\000\044\000\044\000\044\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\028\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\046\000\046\000\
+    \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\046\000\
+    \046\000\046\000\046\000\046\000\046\000\047\000\047\000\047\000\
+    \047\000\047\000\047\000\047\000\047\000\047\000\047\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\047\000\047\000\
+    \047\000\047\000\047\000\047\000\255\255\046\000\255\255\046\000\
+    \046\000\046\000\046\000\046\000\046\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\051\000\255\255\
+    \255\255\255\255\255\255\051\000\255\255\255\255\047\000\047\000\
+    \047\000\047\000\047\000\047\000\051\000\051\000\051\000\051\000\
+    \051\000\051\000\051\000\051\000\051\000\051\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\051\000\051\000\051\000\
+    \051\000\051\000\051\000\053\000\053\000\053\000\053\000\053\000\
+    \053\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
+    \053\000\053\000\053\000\255\255\255\255\255\255\255\255\255\255\
+    \051\000\255\255\255\255\255\255\255\255\051\000\051\000\051\000\
+    \051\000\051\000\051\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\051\000\255\255\255\255\255\255\051\000\255\255\
+    \051\000\051\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\052\000\052\000\052\000\052\000\052\000\052\000\
+    \052\000\052\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\054\000\054\000\054\000\054\000\054\000\054\000\
+    \054\000\054\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\051\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\055\000\055\000\055\000\
+    \055\000\055\000\055\000\055\000\055\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\
+    \056\000\056\000\056\000\056\000\056\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\057\000\057\000\057\000\
+    \057\000\057\000\057\000\057\000\057\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\
+    \058\000\058\000\058\000\058\000\058\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\255\255\255\255\059\000\
+    \072\000\072\000\072\000\072\000\072\000\072\000\072\000\072\000\
+    \072\000\072\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\072\000\072\000\072\000\072\000\072\000\072\000\073\000\
+    \073\000\073\000\073\000\073\000\073\000\073\000\073\000\073\000\
+    \073\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \073\000\073\000\073\000\073\000\073\000\073\000\255\255\255\255\
+    \255\255\072\000\072\000\072\000\072\000\072\000\072\000\255\255\
+    \255\255\059\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \073\000\073\000\073\000\073\000\073\000\073\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\
+    \059\000\059\000\059\000\059\000\059\000\059\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\060\000\060\000\
+    \060\000\060\000\060\000\060\000\060\000\060\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\061\000\061\000\
+    \061\000\061\000\061\000\061\000\061\000\061\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\062\000\062\000\
+    \062\000\062\000\062\000\062\000\062\000\062\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\063\000\063\000\
+    \063\000\063\000\063\000\063\000\063\000\063\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\064\000\064\000\
+    \064\000\064\000\064\000\064\000\064\000\064\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\065\000\065\000\
+    \065\000\065\000\065\000\065\000\065\000\065\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\066\000\066\000\
+    \066\000\066\000\066\000\066\000\066\000\066\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\067\000\067\000\
+    \067\000\067\000\067\000\067\000\067\000\067\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\068\000\068\000\
+    \068\000\068\000\068\000\068\000\068\000\068\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\255\255\255\255\
+    \071\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\074\000\074\000\074\000\074\000\074\000\074\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \074\000\255\255\074\000\074\000\074\000\074\000\074\000\074\000\
+    \255\255\255\255\071\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\074\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\071\000\
+    \071\000\071\000\071\000\071\000\071\000\071\000\071\000\075\000\
+    \075\000\075\000\075\000\075\000\075\000\075\000\075\000\075\000\
+    \075\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \075\000\075\000\075\000\075\000\075\000\075\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\255\255\
+    \075\000\075\000\075\000\075\000\075\000\075\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \255\255\255\255\255\255\255\255\076\000\255\255\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \076\000\076\000\076\000\076\000\076\000\076\000\076\000\076\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\255\255\255\255\255\255\255\255\077\000\
+    \255\255\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\077\000\077\000\077\000\077\000\077\000\
+    \077\000\077\000\077\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\255\255\255\255\
+    \255\255\255\255\078\000\255\255\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\078\000\078\000\
+    \078\000\078\000\078\000\078\000\078\000\078\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\255\255\255\255\255\255\255\255\079\000\255\255\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\079\000\079\000\079\000\079\000\079\000\079\000\079\000\
+    \079\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\255\255\255\255\255\255\255\255\
+    \080\000\255\255\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\080\000\080\000\080\000\080\000\
+    \080\000\080\000\080\000\080\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\255\255\
+    \255\255\255\255\255\255\081\000\255\255\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\081\000\
+    \081\000\081\000\081\000\081\000\081\000\081\000\081\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\255\255\255\255\255\255\255\255\082\000\255\255\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\082\000\082\000\082\000\082\000\082\000\082\000\
+    \082\000\082\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\255\255\255\255\255\255\
+    \255\255\083\000\255\255\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\083\000\083\000\083\000\
+    \083\000\083\000\083\000\083\000\083\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \255\255\255\255\255\255\255\255\084\000\255\255\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \084\000\084\000\084\000\084\000\084\000\084\000\084\000\084\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\255\255\255\255\255\255\255\255\085\000\
+    \255\255\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\085\000\085\000\085\000\085\000\085\000\
+    \085\000\085\000\085\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\255\255\255\255\
+    \255\255\255\255\086\000\255\255\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\086\000\086\000\
+    \086\000\086\000\086\000\086\000\086\000\086\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\255\255\255\255\255\255\255\255\087\000\255\255\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\087\000\087\000\087\000\087\000\087\000\087\000\087\000\
+    \087\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\255\255\255\255\255\255\255\255\
+    \088\000\255\255\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\088\000\088\000\088\000\088\000\
+    \088\000\088\000\088\000\088\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\255\255\
+    \255\255\255\255\255\255\089\000\255\255\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\089\000\
+    \089\000\089\000\089\000\089\000\089\000\089\000\089\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\255\255\255\255\255\255\255\255\090\000\255\255\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\090\000\090\000\090\000\090\000\090\000\090\000\
+    \090\000\090\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\255\255\255\255\255\255\
+    \255\255\091\000\255\255\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\091\000\091\000\091\000\
+    \091\000\091\000\091\000\091\000\091\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \255\255\255\255\255\255\255\255\092\000\255\255\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \092\000\092\000\092\000\092\000\092\000\092\000\092\000\092\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\255\255\255\255\255\255\255\255\093\000\
+    \255\255\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\093\000\093\000\093\000\093\000\093\000\
+    \093\000\093\000\093\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\255\255\255\255\
+    \255\255\255\255\094\000\255\255\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\094\000\094\000\
+    \094\000\094\000\094\000\094\000\094\000\094\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\255\255\255\255\255\255\255\255\095\000\255\255\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\095\000\095\000\095\000\095\000\095\000\095\000\095\000\
+    \095\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\255\255\255\255\255\255\255\255\
+    \096\000\255\255\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\255\255\
+    \255\255\255\255\255\255\097\000\255\255\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\097\000\
+    \097\000\097\000\097\000\097\000\097\000\097\000\097\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\255\255\255\255\255\255\255\255\098\000\255\255\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\255\255\255\255\255\255\
+    \255\255\099\000\255\255\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \255\255\255\255\255\255\255\255\100\000\255\255\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\255\255\255\255\255\255\255\255\101\000\
+    \255\255\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\255\255\255\255\
+    \255\255\255\255\102\000\255\255\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\255\255\255\255\255\255\255\255\103\000\255\255\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\255\255\255\255\255\255\255\255\
+    \104\000\255\255\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\255\255\
+    \255\255\255\255\255\255\105\000\255\255\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\255\255\255\255\255\255\255\255\106\000\255\255\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\255\255\255\255\255\255\
+    \255\255\107\000\255\255\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \255\255\255\255\255\255\255\255\108\000\255\255\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\255\255\255\255\255\255\255\255\109\000\
+    \255\255\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\255\255\255\255\
+    \255\255\255\255\110\000\255\255\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\255\255\255\255\255\255\255\255\111\000\255\255\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\255\255\255\255\255\255\255\255\
+    \112\000\255\255\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\255\255\
+    \255\255\255\255\255\255\113\000\255\255\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\255\255\255\255\255\255\255\255\114\000\255\255\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\114\000\114\000\114\000\114\000\114\000\114\000\
+    \114\000\114\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\255\255\255\255\255\255\
+    \255\255\115\000\255\255\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\115\000\115\000\115\000\
+    \115\000\115\000\115\000\115\000\115\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \255\255\255\255\255\255\255\255\116\000\255\255\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \116\000\116\000\116\000\116\000\116\000\116\000\116\000\116\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\255\255\255\255\255\255\255\255\117\000\
+    \255\255\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\117\000\117\000\117\000\117\000\117\000\
+    \117\000\117\000\117\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\255\255\255\255\
+    \255\255\255\255\118\000\255\255\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\118\000\118\000\
+    \118\000\118\000\118\000\118\000\118\000\118\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\255\255\255\255\255\255\255\255\119\000\255\255\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\119\000\119\000\119\000\119\000\119\000\119\000\119\000\
+    \119\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\255\255\255\255\255\255\255\255\
+    \120\000\255\255\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\255\255\
+    \255\255\255\255\255\255\121\000\255\255\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\255\255\255\255\255\255\255\255\122\000\255\255\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\255\255\255\255\255\255\
+    \255\255\123\000\255\255\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \255\255\255\255\255\255\255\255\124\000\255\255\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\255\255\255\255\255\255\255\255\125\000\
+    \255\255\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\125\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\255\255\255\255\
+    \255\255\255\255\126\000\255\255\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\126\000\126\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\255\255\255\255\255\255\255\255\127\000\255\255\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\255\255\255\255\255\255\255\255\
+    \128\000\255\255\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\255\255\
+    \255\255\255\255\255\255\129\000\255\255\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\255\255\255\255\255\255\255\255\130\000\255\255\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\255\255\255\255\255\255\
+    \255\255\131\000\255\255\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\131\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \255\255\255\255\255\255\255\255\132\000\255\255\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\255\255\255\255\255\255\255\255\133\000\
+    \255\255\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\255\255\255\255\
+    \255\255\255\255\134\000\255\255\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\134\000\134\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\255\255\255\255\255\255\255\255\135\000\255\255\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\255\255\255\255\255\255\255\255\
+    \136\000\255\255\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\136\000\136\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\255\255\
+    \255\255\255\255\255\255\137\000\255\255\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\255\255\255\255\255\255\255\255\138\000\255\255\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\255\255\255\255\255\255\
+    \255\255\139\000\255\255\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\139\000\139\000\139\000\139\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \143\000\255\255\255\255\255\255\140\000\255\255\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\255\255\255\255\255\255\255\255\141\000\
+    \255\255\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\
+    \156\000\156\000\156\000\156\000\156\000\156\000\156\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\159\000\
+    \159\000\159\000\159\000\159\000\159\000\159\000\159\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\160\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\161\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\162\000\162\000\162\000\162\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\164\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\166\000\
+    \166\000\166\000\166\000\166\000\166\000\166\000\166\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\
+    \167\000\167\000\167\000\167\000\167\000\167\000\167\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\169\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\171\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\171\000\
+    \255\255\255\255\255\255\255\255\171\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\187\000\187\000\
+    \187\000\187\000\187\000\187\000\187\000\187\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\192\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255";
+  Lexing.lex_base_code =
+   "";
+  Lexing.lex_backtrk_code =
+   "";
+  Lexing.lex_default_code =
+   "";
+  Lexing.lex_trans_code =
+   "";
+  Lexing.lex_check_code =
+   "";
+  Lexing.lex_code =
+   "";
+}
+
+let rec token lexbuf =
+   __ocaml_lex_token_rec lexbuf 0
+and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+# 104 "idllib/lexer.mll"
+        ( LPAR )
+# 2905 "idllib/lexer.ml"
+
+  | 1 ->
+# 105 "idllib/lexer.mll"
+        ( RPAR )
+# 2910 "idllib/lexer.ml"
+
+  | 2 ->
+# 106 "idllib/lexer.mll"
+        ( LCURLY )
+# 2915 "idllib/lexer.ml"
+
+  | 3 ->
+# 107 "idllib/lexer.mll"
+        ( RCURLY )
+# 2920 "idllib/lexer.ml"
+
+  | 4 ->
+# 108 "idllib/lexer.mll"
+        ( SEMICOLON )
+# 2925 "idllib/lexer.ml"
+
+  | 5 ->
+# 109 "idllib/lexer.mll"
+        ( COMMA )
+# 2930 "idllib/lexer.ml"
+
+  | 6 ->
+# 110 "idllib/lexer.mll"
+        ( PERIOD )
+# 2935 "idllib/lexer.ml"
+
+  | 7 ->
+# 111 "idllib/lexer.mll"
+        ( COLON )
+# 2940 "idllib/lexer.ml"
+
+  | 8 ->
+# 112 "idllib/lexer.mll"
+        ( EQ )
+# 2945 "idllib/lexer.ml"
+
+  | 9 ->
+# 113 "idllib/lexer.mll"
+         ( EQQ )
+# 2950 "idllib/lexer.ml"
+
+  | 10 ->
+# 114 "idllib/lexer.mll"
+         ( NOTCOLON )
+# 2955 "idllib/lexer.ml"
+
+  | 11 ->
+# 115 "idllib/lexer.mll"
+         ( NOTEQ )
+# 2960 "idllib/lexer.ml"
+
+  | 12 ->
+# 116 "idllib/lexer.mll"
+         ( ARROW )
+# 2965 "idllib/lexer.ml"
+
+  | 13 ->
+# 117 "idllib/lexer.mll"
+        ( MINUS )
+# 2970 "idllib/lexer.ml"
+
+  | 14 ->
+let
+# 119 "idllib/lexer.mll"
+           s
+# 2976 "idllib/lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 119 "idllib/lexer.mll"
+             ( NAT s )
+# 2980 "idllib/lexer.ml"
+
+  | 15 ->
+let
+# 120 "idllib/lexer.mll"
+            s
+# 2986 "idllib/lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 120 "idllib/lexer.mll"
+              ( TEXT (text lexbuf s) )
+# 2990 "idllib/lexer.ml"
+
+  | 16 ->
+# 122 "idllib/lexer.mll"
+    ( error lexbuf "unclosed text literal" )
+# 2995 "idllib/lexer.ml"
+
+  | 17 ->
+# 124 "idllib/lexer.mll"
+    ( error lexbuf "illegal control character in text literal" )
+# 3000 "idllib/lexer.ml"
+
+  | 18 ->
+# 126 "idllib/lexer.mll"
+    ( error_nest (Lexing.lexeme_end_p lexbuf) lexbuf "illegal escape" )
+# 3005 "idllib/lexer.ml"
+
+  | 19 ->
+# 128 "idllib/lexer.mll"
+             ( IMPORT )
+# 3010 "idllib/lexer.ml"
+
+  | 20 ->
+# 129 "idllib/lexer.mll"
+              ( SERVICE )
+# 3015 "idllib/lexer.ml"
+
+  | 21 ->
+# 130 "idllib/lexer.mll"
+           ( FUNC )
+# 3020 "idllib/lexer.ml"
+
+  | 22 ->
+# 131 "idllib/lexer.mll"
+           ( TYPE )
+# 3025 "idllib/lexer.ml"
+
+  | 23 ->
+# 132 "idllib/lexer.mll"
+          ( OPT )
+# 3030 "idllib/lexer.ml"
+
+  | 24 ->
+# 133 "idllib/lexer.mll"
+          ( VEC )
+# 3035 "idllib/lexer.ml"
+
+  | 25 ->
+# 134 "idllib/lexer.mll"
+             ( RECORD )
+# 3040 "idllib/lexer.ml"
+
+  | 26 ->
+# 135 "idllib/lexer.mll"
+              ( VARIANT )
+# 3045 "idllib/lexer.ml"
+
+  | 27 ->
+# 136 "idllib/lexer.mll"
+           ( BLOB )
+# 3050 "idllib/lexer.ml"
+
+  | 28 ->
+# 137 "idllib/lexer.mll"
+                ( PRINCIPAL )
+# 3055 "idllib/lexer.ml"
+
+  | 29 ->
+# 138 "idllib/lexer.mll"
+             ( ONEWAY )
+# 3060 "idllib/lexer.ml"
+
+  | 30 ->
+# 139 "idllib/lexer.mll"
+            ( QUERY )
+# 3065 "idllib/lexer.ml"
+
+  | 31 ->
+# 140 "idllib/lexer.mll"
+                      ( COMPOSITE_QUERY )
+# 3070 "idllib/lexer.ml"
+
+  | 32 ->
+let
+# 142 "idllib/lexer.mll"
+          s
+# 3076 "idllib/lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 142 "idllib/lexer.mll"
+            ( ID s )
+# 3080 "idllib/lexer.ml"
+
+  | 33 ->
+# 144 "idllib/lexer.mll"
+                       ( EOF )
+# 3085 "idllib/lexer.ml"
+
+  | 34 ->
+# 145 "idllib/lexer.mll"
+                        ( Lexing.new_line lexbuf; token lexbuf )
+# 3090 "idllib/lexer.ml"
+
+  | 35 ->
+# 146 "idllib/lexer.mll"
+                    ( token lexbuf (* causes error on following position *) )
+# 3095 "idllib/lexer.ml"
+
+  | 36 ->
+# 147 "idllib/lexer.mll"
+         ( comment (Lexing.lexeme_start_p lexbuf) lexbuf; token lexbuf )
+# 3100 "idllib/lexer.ml"
+
+  | 37 ->
+# 148 "idllib/lexer.mll"
+               ( token lexbuf )
+# 3105 "idllib/lexer.ml"
+
+  | 38 ->
+# 149 "idllib/lexer.mll"
+         ( Lexing.new_line lexbuf; token lexbuf )
+# 3110 "idllib/lexer.ml"
+
+  | 39 ->
+# 150 "idllib/lexer.mll"
+        ( EOF )
+# 3115 "idllib/lexer.ml"
+
+  | 40 ->
+# 152 "idllib/lexer.mll"
+         ( error lexbuf "malformed operator" )
+# 3120 "idllib/lexer.ml"
+
+  | 41 ->
+# 153 "idllib/lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 3125 "idllib/lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_token_rec lexbuf __ocaml_lex_state
+
+and comment start lexbuf =
+   __ocaml_lex_comment_rec start lexbuf 171
+and __ocaml_lex_comment_rec start lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+# 156 "idllib/lexer.mll"
+         ( () )
+# 3137 "idllib/lexer.ml"
+
+  | 1 ->
+# 157 "idllib/lexer.mll"
+         ( comment (Lexing.lexeme_start_p lexbuf) lexbuf; comment start lexbuf )
+# 3142 "idllib/lexer.ml"
+
+  | 2 ->
+# 158 "idllib/lexer.mll"
+         ( Lexing.new_line lexbuf; comment start lexbuf )
+# 3147 "idllib/lexer.ml"
+
+  | 3 ->
+# 159 "idllib/lexer.mll"
+        ( error_nest start lexbuf "unclosed comment" )
+# 3152 "idllib/lexer.ml"
+
+  | 4 ->
+# 160 "idllib/lexer.mll"
+         ( comment start lexbuf )
+# 3157 "idllib/lexer.ml"
+
+  | 5 ->
+# 161 "idllib/lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 3162 "idllib/lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_comment_rec start lexbuf __ocaml_lex_state
+
+;;
+
+
+
+
+ + + diff --git a/coverage/idllib/parser.ml.html b/coverage/idllib/parser.ml.html new file mode 100644 index 00000000000..29d97be1cfb --- /dev/null +++ b/coverage/idllib/parser.ml.html @@ -0,0 +1,16076 @@ + + + + + parser.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+
+

+module MenhirBasics = struct
+  
+  exception Error
+  
+  let _eRR =
+    fun _s ->
+      raise Error
+  
+  type token = 
+    | VEC
+    | VARIANT
+    | TYPE
+    | TEXT of (
+# 60 "idllib/parser.mly"
+      (string)
+# 18 "idllib/parser.ml"
+  )
+    | SERVICE
+    | SEMICOLON
+    | RPAR
+    | RECORD
+    | RCURLY
+    | QUERY
+    | PRINCIPAL
+    | PERIOD
+    | OPT
+    | ONEWAY
+    | NOTEQ
+    | NOTCOLON
+    | NAT of (
+# 58 "idllib/parser.mly"
+      (string)
+# 35 "idllib/parser.ml"
+  )
+    | MINUS
+    | LPAR
+    | LCURLY
+    | IMPORT
+    | ID of (
+# 59 "idllib/parser.mly"
+      (string)
+# 44 "idllib/parser.ml"
+  )
+    | FUNC
+    | EQQ
+    | EQ
+    | EOF
+    | COMPOSITE_QUERY
+    | COMMA
+    | COLON
+    | BLOB
+    | ARROW
+  
+end
+
+include MenhirBasics
+
+# 1 "idllib/parser.mly"
+  
+
+open Syntax
+open Source
+
+module Uint32 = Lib.Uint32
+
+(* Position handling *)
+
+let position_to_pos position =
+  (* TBR: Remove assertion once the menhir bug is fixed. *)
+  assert (Obj.is_block (Obj.repr position));
+  { file = position.Lexing.pos_fname;
+    line = position.Lexing.pos_lnum;
+    column = position.Lexing.pos_cnum - position.Lexing.pos_bol
+  }
+
+let positions_to_region position1 position2 =
+  { left = position_to_pos position1;
+    right = position_to_pos position2
+  }
+
+let at (startpos, endpos) = positions_to_region startpos endpos
+
+let _anon sort at = "anon-" ^ sort ^ "-" ^ string_of_pos at.left
+
+let prim_typs = ["nat", Nat; "nat8", Nat8; "nat16", Nat16; "nat32", Nat32; "nat64", Nat64;
+                 "int", Int; "int8", Int8; "int16", Int16; "int32", Int32; "int64", Int64;
+                 "float32", Float32; "float64", Float64; "bool", Bool; "text", Text;
+                 "null", Null; "reserved", Reserved; "empty", Empty]
+let is_prim_typs t = List.assoc_opt t prim_typs
+
+let hash = IdlHash.idl_hash
+let record_fields get_label fs =
+  let open Uint32 in
+  let rec go start fs =
+    match fs with
+    | [] -> []
+    | hd :: tl ->
+       let field = hd start in
+       let next =
+         (match (get_label field.it).it with
+         | Id n -> succ n
+         | Named name -> succ (hash name)
+         | Unnamed n -> succ n) in
+       field :: (go next tl)
+  in go zero fs
+
+# 109 "idllib/parser.ml"
+
+type ('s, 'r) _menhir_state = 
+  | MenhirState001 : ('s _menhir_cell0_LPAR, _menhir_box_parse_args) _menhir_state
+    (** State 001.
+        Stack shape : LPAR.
+        Start symbol: parse_args. *)
+
+  | MenhirState003 : (('s, _menhir_box_parse_args) _menhir_cell1_VEC _menhir_cell0_LCURLY, _menhir_box_parse_args) _menhir_state
+    (** State 003.
+        Stack shape : VEC LCURLY.
+        Start symbol: parse_args. *)
+
+  | MenhirState007 : (('s, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_TEXT, _menhir_box_parse_args) _menhir_state
+    (** State 007.
+        Stack shape : VARIANT LCURLY TEXT.
+        Start symbol: parse_args. *)
+
+  | MenhirState013 : (('s, _menhir_box_parse_args) _menhir_cell1_RECORD _menhir_cell0_LCURLY, _menhir_box_parse_args) _menhir_state
+    (** State 013.
+        Stack shape : RECORD LCURLY.
+        Start symbol: parse_args. *)
+
+  | MenhirState015 : (('s, _menhir_box_parse_args) _menhir_cell1_TEXT, _menhir_box_parse_args) _menhir_state
+    (** State 015.
+        Stack shape : TEXT.
+        Start symbol: parse_args. *)
+
+  | MenhirState019 : (('s, _menhir_box_parse_args) _menhir_cell1_OPT, _menhir_box_parse_args) _menhir_state
+    (** State 019.
+        Stack shape : OPT.
+        Start symbol: parse_args. *)
+
+  | MenhirState021 : (('s, _menhir_box_parse_args) _menhir_cell1_NAT _menhir_cell0_PERIOD, _menhir_box_parse_args) _menhir_state
+    (** State 021.
+        Stack shape : NAT PERIOD.
+        Start symbol: parse_args. *)
+
+  | MenhirState023 : (('s, _menhir_box_parse_args) _menhir_cell1_MINUS, _menhir_box_parse_args) _menhir_state
+    (** State 023.
+        Stack shape : MINUS.
+        Start symbol: parse_args. *)
+
+  | MenhirState042 : (('s, _menhir_box_parse_args) _menhir_cell1_NAT, _menhir_box_parse_args) _menhir_state
+    (** State 042.
+        Stack shape : NAT.
+        Start symbol: parse_args. *)
+
+  | MenhirState045 : (('s, _menhir_box_parse_args) _menhir_cell1_ID, _menhir_box_parse_args) _menhir_state
+    (** State 045.
+        Stack shape : ID.
+        Start symbol: parse_args. *)
+
+  | MenhirState051 : (('s, _menhir_box_parse_args) _menhir_cell1_field_value _menhir_cell0_SEMICOLON, _menhir_box_parse_args) _menhir_state
+    (** State 051.
+        Stack shape : field_value SEMICOLON.
+        Start symbol: parse_args. *)
+
+  | MenhirState055 : (('s, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_NAT, _menhir_box_parse_args) _menhir_state
+    (** State 055.
+        Stack shape : VARIANT LCURLY NAT.
+        Start symbol: parse_args. *)
+
+  | MenhirState058 : (('s, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_ID, _menhir_box_parse_args) _menhir_state
+    (** State 058.
+        Stack shape : VARIANT LCURLY ID.
+        Start symbol: parse_args. *)
+
+  | MenhirState063 : (('s, _menhir_box_parse_args) _menhir_cell1_value _menhir_cell0_SEMICOLON, _menhir_box_parse_args) _menhir_state
+    (** State 063.
+        Stack shape : value SEMICOLON.
+        Start symbol: parse_args. *)
+
+  | MenhirState072 : (('s, _menhir_box_parse_args) _menhir_cell1_annval, _menhir_box_parse_args) _menhir_state
+    (** State 072.
+        Stack shape : annval.
+        Start symbol: parse_args. *)
+
+  | MenhirState075 : ('s, _menhir_box_parse_prog) _menhir_state
+    (** State 075.
+        Stack shape : .
+        Start symbol: parse_prog. *)
+
+  | MenhirState078 : (('s, 'r) _menhir_cell1_TYPE _menhir_cell0_ID, 'r) _menhir_state
+    (** State 078.
+        Stack shape : TYPE ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState079 : (('s, 'r) _menhir_cell1_VEC, 'r) _menhir_state
+    (** State 079.
+        Stack shape : VEC.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState081 : (('s, 'r) _menhir_cell1_VARIANT _menhir_cell0_LCURLY, 'r) _menhir_state
+    (** State 081.
+        Stack shape : VARIANT LCURLY.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState083 : (('s, 'r) _menhir_cell1_TEXT, 'r) _menhir_state
+    (** State 083.
+        Stack shape : TEXT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState084 : (('s, 'r) _menhir_cell1_SERVICE, 'r) _menhir_state
+    (** State 084.
+        Stack shape : SERVICE.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState085 : (('s, 'r) _menhir_cell1_LCURLY, 'r) _menhir_state
+    (** State 085.
+        Stack shape : LCURLY.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState087 : (('s, 'r) _menhir_cell1_TEXT, 'r) _menhir_state
+    (** State 087.
+        Stack shape : TEXT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState088 : (('s, 'r) _menhir_cell1_LPAR, 'r) _menhir_state
+    (** State 088.
+        Stack shape : LPAR.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState090 : (('s, 'r) _menhir_cell1_TEXT, 'r) _menhir_state
+    (** State 090.
+        Stack shape : TEXT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState092 : (('s, 'r) _menhir_cell1_RECORD _menhir_cell0_LCURLY, 'r) _menhir_state
+    (** State 092.
+        Stack shape : RECORD LCURLY.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState095 : (('s, 'r) _menhir_cell1_OPT, 'r) _menhir_state
+    (** State 095.
+        Stack shape : OPT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState097 : (('s, 'r) _menhir_cell1_FUNC, 'r) _menhir_state
+    (** State 097.
+        Stack shape : FUNC.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState099 : (('s, 'r) _menhir_cell1_param_typs, 'r) _menhir_state
+    (** State 099.
+        Stack shape : param_typs.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState100 : ((('s, 'r) _menhir_cell1_param_typs, 'r) _menhir_cell1_param_typs, 'r) _menhir_state
+    (** State 100.
+        Stack shape : param_typs param_typs.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState105 : (('s, 'r) _menhir_cell1_func_mode, 'r) _menhir_state
+    (** State 105.
+        Stack shape : func_mode.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState114 : (('s, 'r) _menhir_cell1_NAT, 'r) _menhir_state
+    (** State 114.
+        Stack shape : NAT.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState117 : (('s, 'r) _menhir_cell1_ID, 'r) _menhir_state
+    (** State 117.
+        Stack shape : ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState122 : (('s, 'r) _menhir_cell1_record_typ _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 122.
+        Stack shape : record_typ SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState129 : (('s, 'r) _menhir_cell1_ID, 'r) _menhir_state
+    (** State 129.
+        Stack shape : ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState134 : (('s, 'r) _menhir_cell1_param_typ, 'r) _menhir_state
+    (** State 134.
+        Stack shape : param_typ.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState140 : (('s, 'r) _menhir_cell1_ID, 'r) _menhir_state
+    (** State 140.
+        Stack shape : ID.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState146 : (('s, 'r) _menhir_cell1_meth_typ _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 146.
+        Stack shape : meth_typ SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState153 : (('s, 'r) _menhir_cell1_variant_typ _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 153.
+        Stack shape : variant_typ SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState167 : (('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_state
+    (** State 167.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt.
+        Start symbol: parse_prog. *)
+
+  | MenhirState168 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_ID, _menhir_box_parse_prog) _menhir_state
+    (** State 168.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt ID.
+        Start symbol: parse_prog. *)
+
+  | MenhirState172 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_param_typs, _menhir_box_parse_prog) _menhir_state
+    (** State 172.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt param_typs.
+        Start symbol: parse_prog. *)
+
+  | MenhirState175 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_typ, _menhir_box_parse_prog) _menhir_state
+    (** State 175.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt actor_typ.
+        Start symbol: parse_prog. *)
+
+  | MenhirState177 : ((('s, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_class_typ, _menhir_box_parse_prog) _menhir_state
+    (** State 177.
+        Stack shape : seplist(def,SEMICOLON) SERVICE id_opt actor_class_typ.
+        Start symbol: parse_prog. *)
+
+  | MenhirState183 : (('s, 'r) _menhir_cell1_def _menhir_cell0_SEMICOLON, 'r) _menhir_state
+    (** State 183.
+        Stack shape : def SEMICOLON.
+        Start symbol: <undetermined>. *)
+
+  | MenhirState185 : ('s, _menhir_box_parse_tests) _menhir_state
+    (** State 185.
+        Stack shape : .
+        Start symbol: parse_tests. *)
+
+  | MenhirState187 : (('s, _menhir_box_parse_tests) _menhir_cell1_endlist_def_SEMICOLON_, _menhir_box_parse_tests) _menhir_state
+    (** State 187.
+        Stack shape : endlist(def,SEMICOLON).
+        Start symbol: parse_tests. *)
+
+  | MenhirState188 : (('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_state
+    (** State 188.
+        Stack shape : ID.
+        Start symbol: parse_tests. *)
+
+  | MenhirState193 : ((('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input, _menhir_box_parse_tests) _menhir_state
+    (** State 193.
+        Stack shape : ID input.
+        Start symbol: parse_tests. *)
+
+  | MenhirState197 : ((('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input, _menhir_box_parse_tests) _menhir_state
+    (** State 197.
+        Stack shape : ID input.
+        Start symbol: parse_tests. *)
+
+  | MenhirState201 : ((('s, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_assertion, _menhir_box_parse_tests) _menhir_state
+    (** State 201.
+        Stack shape : ID assertion.
+        Start symbol: parse_tests. *)
+
+  | MenhirState206 : (('s, _menhir_box_parse_tests) _menhir_cell1_test _menhir_cell0_SEMICOLON, _menhir_box_parse_tests) _menhir_state
+    (** State 206.
+        Stack shape : test SEMICOLON.
+        Start symbol: parse_tests. *)
+
+  | MenhirState211 : (('s, _menhir_box_parse_tests) _menhir_cell1_def _menhir_cell0_SEMICOLON, _menhir_box_parse_tests) _menhir_state
+    (** State 211.
+        Stack shape : def SEMICOLON.
+        Start symbol: parse_tests. *)
+
+
+and ('s, 'r) _menhir_cell1_actor_class_typ = 
+  | MenhirCell1_actor_class_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_actor_typ = 
+  | MenhirCell1_actor_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ_meth list) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_annval = 
+  | MenhirCell1_annval of 's * ('s, 'r) _menhir_state * (Syntax.value)
+
+and ('s, 'r) _menhir_cell1_assertion = 
+  | MenhirCell1_assertion of 's * ('s, 'r) _menhir_state * (Syntax.test_assertion)
+
+and ('s, 'r) _menhir_cell1_def = 
+  | MenhirCell1_def of 's * ('s, 'r) _menhir_state * (Syntax.dec) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_endlist_def_SEMICOLON_ = 
+  | MenhirCell1_endlist_def_SEMICOLON_ of 's * ('s, 'r) _menhir_state * (Syntax.dec list) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_field_value = 
+  | MenhirCell1_field_value of 's * ('s, 'r) _menhir_state * (Uint32.t -> Syntax.field_value)
+
+and ('s, 'r) _menhir_cell1_func_mode = 
+  | MenhirCell1_func_mode of 's * ('s, 'r) _menhir_state * (Syntax.func_mode)
+
+and 's _menhir_cell0_id_opt = 
+  | MenhirCell0_id_opt of 's * (unit)
+
+and ('s, 'r) _menhir_cell1_input = 
+  | MenhirCell1_input of 's * ('s, 'r) _menhir_state * (Syntax.input)
+
+and ('s, 'r) _menhir_cell1_meth_typ = 
+  | MenhirCell1_meth_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ_meth' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_param_typ = 
+  | MenhirCell1_param_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ)
+
+and ('s, 'r) _menhir_cell1_param_typs = 
+  | MenhirCell1_param_typs of 's * ('s, 'r) _menhir_state * (Syntax.typ list) * Lexing.position
+
+and ('s, 'r) _menhir_cell1_record_typ = 
+  | MenhirCell1_record_typ of 's * ('s, 'r) _menhir_state * (Uint32.t -> Syntax.typ_field' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_seplist_def_SEMICOLON_ = 
+  | MenhirCell1_seplist_def_SEMICOLON_ of 's * ('s, 'r) _menhir_state * (Syntax.dec list) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_test = 
+  | MenhirCell1_test of 's * ('s, 'r) _menhir_state * (Syntax.test' Source.phrase) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_value = 
+  | MenhirCell1_value of 's * ('s, 'r) _menhir_state * (Syntax.value' Source.phrase) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_variant_typ = 
+  | MenhirCell1_variant_typ of 's * ('s, 'r) _menhir_state * (Syntax.typ_field' Source.phrase)
+
+and ('s, 'r) _menhir_cell1_FUNC = 
+  | MenhirCell1_FUNC of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_ID = 
+  | MenhirCell1_ID of 's * ('s, 'r) _menhir_state * (
+# 59 "idllib/parser.mly"
+      (string)
+# 439 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and 's _menhir_cell0_ID = 
+  | MenhirCell0_ID of 's * (
+# 59 "idllib/parser.mly"
+      (string)
+# 446 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_LCURLY = 
+  | MenhirCell1_LCURLY of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_LCURLY = 
+  | MenhirCell0_LCURLY of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_LPAR = 
+  | MenhirCell1_LPAR of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_LPAR = 
+  | MenhirCell0_LPAR of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_MINUS = 
+  | MenhirCell1_MINUS of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_NAT = 
+  | MenhirCell1_NAT of 's * ('s, 'r) _menhir_state * (
+# 58 "idllib/parser.mly"
+      (string)
+# 468 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and 's _menhir_cell0_NAT = 
+  | MenhirCell0_NAT of 's * (
+# 58 "idllib/parser.mly"
+      (string)
+# 475 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_OPT = 
+  | MenhirCell1_OPT of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_PERIOD = 
+  | MenhirCell0_PERIOD of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_RECORD = 
+  | MenhirCell1_RECORD of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_SEMICOLON = 
+  | MenhirCell0_SEMICOLON of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_SERVICE = 
+  | MenhirCell1_SERVICE of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and 's _menhir_cell0_SERVICE = 
+  | MenhirCell0_SERVICE of 's * Lexing.position
+
+and ('s, 'r) _menhir_cell1_TEXT = 
+  | MenhirCell1_TEXT of 's * ('s, 'r) _menhir_state * (
+# 60 "idllib/parser.mly"
+      (string)
+# 500 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and 's _menhir_cell0_TEXT = 
+  | MenhirCell0_TEXT of 's * (
+# 60 "idllib/parser.mly"
+      (string)
+# 507 "idllib/parser.ml"
+) * Lexing.position * Lexing.position
+
+and ('s, 'r) _menhir_cell1_TYPE = 
+  | MenhirCell1_TYPE of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_VARIANT = 
+  | MenhirCell1_VARIANT of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and ('s, 'r) _menhir_cell1_VEC = 
+  | MenhirCell1_VEC of 's * ('s, 'r) _menhir_state * Lexing.position
+
+and _menhir_box_parse_tests = 
+  | MenhirBox_parse_tests of (string -> Syntax.tests) [@@unboxed]
+
+and _menhir_box_parse_prog = 
+  | MenhirBox_parse_prog of (string -> Syntax.prog) [@@unboxed]
+
+and _menhir_box_parse_args = 
+  | MenhirBox_parse_args of (Syntax.value list Source.phrase) [@@unboxed]
+
+let _menhir_action_003 =
+  fun () ->
+    (
+# 195 "idllib/parser.mly"
+                ( None )
+# 533 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_004 =
+  fun _endpos_tys_ _startpos_tys_ tys ->
+    let _loc_tys_ = (_startpos_tys_, _endpos_tys_) in
+    (
+# 197 "idllib/parser.mly"
+    ( Some (ServT tys @@ at _loc_tys_) )
+# 542 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_005 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 554 "idllib/parser.ml"
+      
+    in
+    (
+# 199 "idllib/parser.mly"
+    ( Some (VarT x @@ x.at) )
+# 560 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_006 =
+  fun t ->
+    (
+# 201 "idllib/parser.mly"
+    ( Some t )
+# 568 "idllib/parser.ml"
+     : (Syntax.typ option))
+
+let _menhir_action_007 =
+  fun _endpos_tys_ _startpos_args_ _startpos_tys_ args tys ->
+    let _endpos = _endpos_tys_ in
+    let _symbolstartpos = _startpos_args_ in
+    let _loc_tys_ = (_startpos_tys_, _endpos_tys_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 190 "idllib/parser.mly"
+    ( ClassT (args, ServT tys @@ at _loc_tys_) @@ at _sloc )
+# 580 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_008 =
+  fun _endpos_id_ _startpos_args_ _startpos_id_ args id ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 592 "idllib/parser.ml"
+      
+    in
+    let _endpos_x_ = _endpos_id_ in
+    let _endpos = _endpos_x_ in
+    let _symbolstartpos = _startpos_args_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 192 "idllib/parser.mly"
+    ( ClassT (args, VarT x @@ x.at) @@ at _sloc )
+# 602 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_009 =
+  fun ds ->
+    (
+# 173 "idllib/parser.mly"
+    ( ds )
+# 610 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_010 =
+  fun v ->
+    (
+# 265 "idllib/parser.mly"
+            ( v )
+# 618 "idllib/parser.ml"
+     : (Syntax.value))
+
+let _menhir_action_011 =
+  fun input ->
+    (
+# 278 "idllib/parser.mly"
+                         ( ParsesAs (true,  input) )
+# 626 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_012 =
+  fun input ->
+    (
+# 279 "idllib/parser.mly"
+                         ( ParsesAs (false, input) )
+# 634 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_013 =
+  fun i1 i2 ->
+    (
+# 280 "idllib/parser.mly"
+                                  ( ParsesEqual (true,  i1, i2) )
+# 642 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_014 =
+  fun i1 i2 ->
+    (
+# 281 "idllib/parser.mly"
+                                  ( ParsesEqual (false, i1, i2) )
+# 650 "idllib/parser.ml"
+     : (Syntax.test_assertion))
+
+let _menhir_action_015 =
+  fun _endpos_t_ _startpos__1_ t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 133 "idllib/parser.mly"
+                   ( OptT t @@ at _sloc )
+# 661 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_016 =
+  fun _endpos_t_ _startpos__1_ t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 134 "idllib/parser.mly"
+                   ( VecT t @@ at _sloc )
+# 672 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_017 =
+  fun _endpos_fs_ _startpos__1_ fs ->
+    let _endpos = _endpos_fs_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 135 "idllib/parser.mly"
+                          ( RecordT fs @@ at _sloc )
+# 683 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_018 =
+  fun _endpos_fs_ _startpos__1_ fs ->
+    let _endpos = _endpos_fs_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 136 "idllib/parser.mly"
+                            ( VariantT fs @@ at _sloc )
+# 694 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_019 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 137 "idllib/parser.mly"
+         ( BlobT @@ at _sloc )
+# 705 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_020 =
+  fun t ->
+    (
+# 140 "idllib/parser.mly"
+               ( t )
+# 713 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_021 =
+  fun t ->
+    (
+# 141 "idllib/parser.mly"
+              ( t )
+# 721 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_022 =
+  fun t ->
+    (
+# 142 "idllib/parser.mly"
+               ( t )
+# 729 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_023 =
+  fun _endpos_id_ _endpos_t_ _startpos__1_ _startpos_id_ id t ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 741 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 179 "idllib/parser.mly"
+    ( TypD(x, t) @@ at _sloc )
+# 750 "idllib/parser.ml"
+     : (Syntax.dec))
+
+let _menhir_action_024 =
+  fun _endpos_s_ _startpos__1_ _startpos_s_ s ->
+    let file =
+      let _endpos = _endpos_s_ in
+      let _symbolstartpos = _startpos_s_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 764 "idllib/parser.ml"
+      
+    in
+    let _endpos_file_ = _endpos_s_ in
+    let _endpos = _endpos_file_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 182 "idllib/parser.mly"
+    ( ImportD (file, ref "") @@ at _sloc )
+# 774 "idllib/parser.ml"
+     : (Syntax.dec))
+
+let _menhir_action_025 =
+  fun () ->
+    (
+# 71 "idllib/parser.mly"
+                ( [] )
+# 782 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_026 =
+  fun x xs ->
+    (
+# 72 "idllib/parser.mly"
+                               ( x::xs )
+# 790 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_027 =
+  fun _endpos_n_ _endpos_t_ _startpos_n_ n t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 109 "idllib/parser.mly"
+    ( { label = Id (Uint32.of_string n) @@ at _loc_n_; typ = t } @@ at _sloc )
+# 802 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_028 =
+  fun _endpos_id_ _endpos_t_ _startpos_id_ id t ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 814 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 111 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = t } @@ at _sloc )
+# 825 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_029 =
+  fun _endpos_s_ _endpos_t_ _startpos_s_ s t ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 840 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 850 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 111 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = t } @@ at _sloc )
+# 861 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_030 =
+  fun _endpos_n_ _endpos_v_ _startpos_n_ n v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 258 "idllib/parser.mly"
+    ( fun _ -> (Id (Uint32.of_string n) @@ at _loc_n_, v) @@ at _sloc )
+# 873 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_031 =
+  fun _endpos_id_ _endpos_v_ _startpos_id_ id v ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 885 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 260 "idllib/parser.mly"
+    ( fun _ -> (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 896 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_032 =
+  fun _endpos_s_ _endpos_v_ _startpos_s_ s v ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 911 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 921 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 260 "idllib/parser.mly"
+    ( fun _ -> (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 932 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_033 =
+  fun _endpos_v_ _startpos_v_ v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_v_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 262 "idllib/parser.mly"
+    ( fun n -> (Unnamed n @@ no_region, v) @@ at _sloc )
+# 943 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.field_value))
+
+let _menhir_action_034 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 153 "idllib/parser.mly"
+           ( Oneway @@ at _sloc )
+# 954 "idllib/parser.ml"
+     : (Syntax.func_mode))
+
+let _menhir_action_035 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 154 "idllib/parser.mly"
+          ( Query @@ at _sloc )
+# 965 "idllib/parser.ml"
+     : (Syntax.func_mode))
+
+let _menhir_action_036 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 155 "idllib/parser.mly"
+                    ( Composite @@ at _sloc )
+# 976 "idllib/parser.ml"
+     : (Syntax.func_mode))
+
+let _menhir_action_037 =
+  fun () ->
+    (
+# 158 "idllib/parser.mly"
+                ( [] )
+# 984 "idllib/parser.ml"
+     : (Syntax.func_mode list))
+
+let _menhir_action_038 =
+  fun m ms ->
+    (
+# 159 "idllib/parser.mly"
+                                  ( m::ms )
+# 992 "idllib/parser.ml"
+     : (Syntax.func_mode list))
+
+let _menhir_action_039 =
+  fun _endpos_ms_ _startpos_t1_ ms t1 t2 ->
+    let _endpos = _endpos_ms_ in
+    let _symbolstartpos = _startpos_t1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 163 "idllib/parser.mly"
+    ( FuncT(ms, t1, t2) @@ at _sloc )
+# 1003 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_040 =
+  fun () ->
+    (
+# 185 "idllib/parser.mly"
+                ( )
+# 1011 "idllib/parser.ml"
+     : (unit))
+
+let _menhir_action_041 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let _1 =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1023 "idllib/parser.ml"
+      
+    in
+    (
+# 186 "idllib/parser.mly"
+       ( )
+# 1029 "idllib/parser.ml"
+     : (unit))
+
+let _menhir_action_042 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let text =
+      let _endpos = _endpos_s_ in
+      let _symbolstartpos = _startpos_s_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1043 "idllib/parser.ml"
+      
+    in
+    (
+# 274 "idllib/parser.mly"
+              ( TextualInput text )
+# 1049 "idllib/parser.ml"
+     : (Syntax.input))
+
+let _menhir_action_043 =
+  fun text ->
+    (
+# 275 "idllib/parser.mly"
+                   ( BinaryInput text )
+# 1057 "idllib/parser.ml"
+     : (Syntax.input))
+
+let _menhir_action_044 =
+  fun _endpos_id_ _endpos_t_ _startpos_id_ id t ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1069 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_id_ in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 167 "idllib/parser.mly"
+    ( { var = x; meth = t } @@ at _sloc )
+# 1079 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_045 =
+  fun _endpos_s_ _endpos_t_ _startpos_s_ s t ->
+    let x =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1094 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1104 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_s_ in
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 167 "idllib/parser.mly"
+    ( { var = x; meth = t } @@ at _sloc )
+# 1114 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_046 =
+  fun _endpos_id_ _endpos_id_inlined1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 ->
+    let id =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1126 "idllib/parser.ml"
+      
+    in
+    let x =
+      let (_endpos_id_, _startpos_id_, id) = (_endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) in
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1137 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_id_inlined1_ in
+    let _endpos = _endpos_id_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 169 "idllib/parser.mly"
+    ( { var = x; meth = VarT id @@ at _sloc } @@ at _sloc )
+# 1147 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_047 =
+  fun _endpos_id_ _endpos_s_ _startpos_id_ _startpos_s_ id s ->
+    let id =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1159 "idllib/parser.ml"
+      
+    in
+    let x =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1172 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1182 "idllib/parser.ml"
+      
+    in
+    let _startpos_x_ = _startpos_s_ in
+    let _endpos = _endpos_id_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 169 "idllib/parser.mly"
+    ( { var = x; meth = VarT id @@ at _sloc } @@ at _sloc )
+# 1192 "idllib/parser.ml"
+     : (Syntax.typ_meth' Source.phrase))
+
+let _menhir_action_048 =
+  fun n n2 ->
+    (
+# 216 "idllib/parser.mly"
+                        ( n ^ "." ^ n2 )
+# 1200 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_049 =
+  fun n ->
+    (
+# 217 "idllib/parser.mly"
+                 ( n ^ "." )
+# 1208 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_050 =
+  fun n ->
+    (
+# 218 "idllib/parser.mly"
+          ( n )
+# 1216 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_051 =
+  fun () ->
+    (
+# 111 "<standard.mly>"
+    ( None )
+# 1224 "idllib/parser.ml"
+     : (unit option))
+
+let _menhir_action_052 =
+  fun x ->
+    (
+# 113 "<standard.mly>"
+    ( Some x )
+# 1232 "idllib/parser.ml"
+     : (unit option))
+
+let _menhir_action_053 =
+  fun () ->
+    (
+# 111 "<standard.mly>"
+    ( None )
+# 1240 "idllib/parser.ml"
+     : (string option))
+
+let _menhir_action_054 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let x =
+      let _endpos = _endpos_s_ in
+      let _symbolstartpos = _startpos_s_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1254 "idllib/parser.ml"
+      
+    in
+    (
+# 113 "<standard.mly>"
+    ( Some x )
+# 1260 "idllib/parser.ml"
+     : (string option))
+
+let _menhir_action_055 =
+  fun t ->
+    (
+# 149 "idllib/parser.mly"
+               ( t )
+# 1268 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_056 =
+  fun _endpos_id_ _startpos_id_ id t ->
+    let _1 =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1280 "idllib/parser.ml"
+      
+    in
+    (
+# 150 "idllib/parser.mly"
+                          ( t )
+# 1286 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_057 =
+  fun _endpos_s_ _startpos_s_ s t ->
+    let _1 =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1301 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1311 "idllib/parser.ml"
+      
+    in
+    (
+# 150 "idllib/parser.mly"
+                          ( t )
+# 1317 "idllib/parser.ml"
+     : (Syntax.typ))
+
+let _menhir_action_058 =
+  fun fs ->
+    (
+# 146 "idllib/parser.mly"
+    ( fs )
+# 1325 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_059 =
+  fun _endpos__4_ _startpos__1_ vs ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 268 "idllib/parser.mly"
+                                            ( vs @@ at _sloc )
+# 1336 "idllib/parser.ml"
+     : (Syntax.value list Source.phrase))
+
+let _menhir_action_060 =
+  fun _endpos__3_ _endpos_actor_ _endpos_ds_ _startpos__3_ _startpos_actor_ _startpos_ds_ actor ds ->
+    let _endpos = _endpos__3_ in
+    let _symbolstartpos = if _startpos_ds_ != _endpos_ds_ then
+      _startpos_ds_
+    else
+      if _startpos_actor_ != _endpos_actor_ then
+        _startpos_actor_
+      else
+        _startpos__3_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 207 "idllib/parser.mly"
+    (
+      let trivia = Trivia.PosHashtbl.create 0 in
+      fun filename -> {it = {decs=ds; actor=actor}; at = at _sloc; note = {filename; trivia}} )
+# 1355 "idllib/parser.ml"
+     : (string -> Syntax.prog))
+
+let _menhir_action_061 =
+  fun _endpos__3_ _endpos_tdecs_ _endpos_tests_ _startpos__3_ _startpos_tdecs_ _startpos_tests_ tdecs tests ->
+    let _endpos = _endpos__3_ in
+    let _symbolstartpos = if _startpos_tdecs_ != _endpos_tdecs_ then
+      _startpos_tdecs_
+    else
+      if _startpos_tests_ != _endpos_tests_ then
+        _startpos_tests_
+      else
+        _startpos__3_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 290 "idllib/parser.mly"
+    ( fun filename -> {it = {tdecs; tests}; at = at _sloc; note = filename} )
+# 1372 "idllib/parser.ml"
+     : (string -> Syntax.tests))
+
+let _menhir_action_062 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let x =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1384 "idllib/parser.ml"
+      
+    in
+    let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_x_ in
+    let _symbolstartpos = _startpos_x_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 98 "idllib/parser.mly"
+    ( (match is_prim_typs x.it with
+         None -> VarT x
+       | Some t -> PrimT t) @@ at _sloc )
+# 1396 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_063 =
+  fun f ->
+    (
+# 114 "idllib/parser.mly"
+                ( fun _ -> f )
+# 1404 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.typ_field' Source.phrase))
+
+let _menhir_action_064 =
+  fun _endpos_t_ _startpos_t_ t ->
+    let _endpos = _endpos_t_ in
+    let _symbolstartpos = _startpos_t_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 116 "idllib/parser.mly"
+    ( fun x -> { label = Unnamed x @@ no_region; typ = t } @@ at _sloc )
+# 1415 "idllib/parser.ml"
+     : (Uint32.t -> Syntax.typ_field' Source.phrase))
+
+let _menhir_action_065 =
+  fun fs ->
+    (
+# 127 "idllib/parser.mly"
+    ( record_fields (fun f -> f.label) fs )
+# 1423 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_066 =
+  fun t ->
+    (
+# 103 "idllib/parser.mly"
+                    ( t )
+# 1431 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_067 =
+  fun _endpos_ts_ _startpos__1_ ts ->
+    let _endpos = _endpos_ts_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 104 "idllib/parser.mly"
+                         ( ServT ts @@ at _sloc )
+# 1442 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_068 =
+  fun _endpos__1_ _startpos__1_ ->
+    let _endpos = _endpos__1_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 105 "idllib/parser.mly"
+              ( PrincipalT @@ at _sloc )
+# 1453 "idllib/parser.ml"
+     : (Syntax.typ' Source.phrase))
+
+let _menhir_action_069 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1461 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_070 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1469 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_071 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1477 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_072 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1485 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_073 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1493 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_074 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1501 "idllib/parser.ml"
+     : (Syntax.dec list))
+
+let _menhir_action_075 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1509 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.field_value) list))
+
+let _menhir_action_076 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1517 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.field_value) list))
+
+let _menhir_action_077 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1525 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.field_value) list))
+
+let _menhir_action_078 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1533 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_079 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1541 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_080 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1549 "idllib/parser.ml"
+     : (Syntax.typ_meth list))
+
+let _menhir_action_081 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1557 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_082 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1565 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_083 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1573 "idllib/parser.ml"
+     : (Syntax.typ list))
+
+let _menhir_action_084 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1581 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.typ_field' Source.phrase) list))
+
+let _menhir_action_085 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1589 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.typ_field' Source.phrase) list))
+
+let _menhir_action_086 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1597 "idllib/parser.ml"
+     : ((Uint32.t -> Syntax.typ_field' Source.phrase) list))
+
+let _menhir_action_087 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1605 "idllib/parser.ml"
+     : (Syntax.test list))
+
+let _menhir_action_088 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1613 "idllib/parser.ml"
+     : (Syntax.test list))
+
+let _menhir_action_089 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1621 "idllib/parser.ml"
+     : (Syntax.test list))
+
+let _menhir_action_090 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1629 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_091 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1637 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_092 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1645 "idllib/parser.ml"
+     : (Syntax.value list))
+
+let _menhir_action_093 =
+  fun () ->
+    (
+# 75 "idllib/parser.mly"
+                ( [] )
+# 1653 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_094 =
+  fun x ->
+    (
+# 76 "idllib/parser.mly"
+        ( [x] )
+# 1661 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_095 =
+  fun x xs ->
+    (
+# 77 "idllib/parser.mly"
+                               ( x::xs )
+# 1669 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_096 =
+  fun n ->
+    (
+# 221 "idllib/parser.mly"
+                ( "-" ^ n )
+# 1677 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_097 =
+  fun n ->
+    (
+# 222 "idllib/parser.mly"
+          ( n )
+# 1685 "idllib/parser.ml"
+     : (string))
+
+let _menhir_action_098 =
+  fun _endpos_desc_ _endpos_id_ _startpos_id_ assertion desc id tys ->
+    let id =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1697 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_desc_ in
+    let _symbolstartpos = _startpos_id_ in
+    let _loc_id_ = (_startpos_id_, _endpos_id_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 285 "idllib/parser.mly"
+    ( if id.it <> "assert" then raise (ParseError (at _loc_id_, id.it))
+      else { ttyp=tys; assertion; desc } @@ at _sloc )
+# 1708 "idllib/parser.ml"
+     : (Syntax.test' Source.phrase))
+
+let _menhir_action_099 =
+  fun _endpos_n_ _startpos_n_ n ->
+    let _endpos = _endpos_n_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 225 "idllib/parser.mly"
+                 ( NumV n @@ at _sloc )
+# 1719 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_100 =
+  fun _endpos_v_ _startpos__1_ v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 226 "idllib/parser.mly"
+                ( OptV v @@ at _sloc )
+# 1730 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_101 =
+  fun _endpos__4_ _startpos__1_ vs ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 228 "idllib/parser.mly"
+    ( VecV vs @@ at _sloc )
+# 1741 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_102 =
+  fun _endpos_text_ _startpos__1_ text ->
+    let _endpos = _endpos_text_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 229 "idllib/parser.mly"
+                   ( BlobV text @@ at _sloc )
+# 1752 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_103 =
+  fun _endpos_text_ _startpos_text_ text ->
+    let _endpos = _endpos_text_ in
+    let _symbolstartpos = _startpos_text_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 230 "idllib/parser.mly"
+              ( TextV text @@ at _sloc )
+# 1763 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_104 =
+  fun _endpos__4_ _startpos__1_ fs ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 232 "idllib/parser.mly"
+    ( RecordV (record_fields (fun f -> fst f) fs) @@ at _sloc )
+# 1774 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_105 =
+  fun _endpos__4_ _startpos__1_ f ->
+    let _endpos = _endpos__4_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 234 "idllib/parser.mly"
+    ( VariantV f @@ at _sloc )
+# 1785 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_106 =
+  fun _endpos_id_ _startpos__1_ _startpos_id_ id ->
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1797 "idllib/parser.ml"
+      
+    in
+    let _endpos_s_ = _endpos_id_ in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 235 "idllib/parser.mly"
+                   ( ServiceV s.it @@ at _sloc )
+# 1807 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_107 =
+  fun _endpos_s_ _startpos__1_ _startpos_s_ s ->
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1822 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1832 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 235 "idllib/parser.mly"
+                   ( ServiceV s.it @@ at _sloc )
+# 1841 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_108 =
+  fun _endpos_id_ _endpos_id_inlined1_ _startpos__1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 ->
+    let m =
+      let (_endpos_id_, _startpos_id_, id) = (_endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) in
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1854 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_id_inlined1_ in
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1865 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 236 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 1874 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_109 =
+  fun _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s ->
+    let m =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1889 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1899 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_s_ in
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1910 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 236 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 1919 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_110 =
+  fun _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s ->
+    let m =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 1931 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_id_ in
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1945 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1955 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 236 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 1964 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_111 =
+  fun _endpos_s_ _endpos_s_inlined1_ _startpos__1_ _startpos_s_ _startpos_s_inlined1_ s s_inlined1 ->
+    let m =
+      let (_endpos_s_, _startpos_s_, s) = (_endpos_s_inlined1_, _startpos_s_inlined1_, s_inlined1) in
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 1980 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 1990 "idllib/parser.ml"
+      
+    in
+    let _endpos_m_ = _endpos_s_inlined1_ in
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2004 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2014 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_m_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 236 "idllib/parser.mly"
+                              ( FuncV (s.it, m.it) @@ at _sloc )
+# 2023 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_112 =
+  fun _endpos_id_ _startpos__1_ _startpos_id_ id ->
+    let s =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2035 "idllib/parser.ml"
+      
+    in
+    let _endpos_s_ = _endpos_id_ in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 237 "idllib/parser.mly"
+                     ( PrincipalV s.it @@ at _sloc )
+# 2045 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_113 =
+  fun _endpos_s_ _startpos__1_ _startpos_s_ s ->
+    let s =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2060 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2070 "idllib/parser.ml"
+      
+    in
+    let _endpos = _endpos_s_ in
+    let _symbolstartpos = _startpos__1_ in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 237 "idllib/parser.mly"
+                     ( PrincipalV s.it @@ at _sloc )
+# 2079 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_114 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let b =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 88 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2091 "idllib/parser.ml"
+      
+    in
+    let (_endpos_b_, _startpos_b_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_b_ in
+    let _symbolstartpos = _startpos_b_ in
+    let _loc_b_ = (_startpos_b_, _endpos_b_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 239 "idllib/parser.mly"
+    ( match b.it with
+      | "null" -> NullV @@ at _sloc
+      | "true" -> BoolV true @@ at _sloc
+      | "false" -> BoolV false @@ at _sloc
+      | _ -> raise (ParseError (at _loc_b_, b.it))
+    )
+# 2107 "idllib/parser.ml"
+     : (Syntax.value' Source.phrase))
+
+let _menhir_action_115 =
+  fun f ->
+    (
+# 119 "idllib/parser.mly"
+                ( f )
+# 2115 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_116 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2127 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 121 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = PrimT Null @@ no_region } @@ at _sloc )
+# 2138 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_117 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2153 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2163 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 121 "idllib/parser.mly"
+    ( { label = Named name.it @@ at _loc_name_; typ = PrimT Null @@ no_region } @@ at _sloc )
+# 2174 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_118 =
+  fun _endpos_n_ _startpos_n_ n ->
+    let _endpos = _endpos_n_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 123 "idllib/parser.mly"
+    ( { label = Id (Uint32.of_string n) @@ at _loc_n_; typ = PrimT Null @@ no_region } @@ at _sloc )
+# 2186 "idllib/parser.ml"
+     : (Syntax.typ_field' Source.phrase))
+
+let _menhir_action_119 =
+  fun fs ->
+    (
+# 130 "idllib/parser.mly"
+                                                     ( fs )
+# 2194 "idllib/parser.ml"
+     : (Syntax.typ_field list))
+
+let _menhir_action_120 =
+  fun _endpos_n_ _endpos_v_ _startpos_n_ n v ->
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 248 "idllib/parser.mly"
+    ( (Id (Uint32.of_string n) @@ at _loc_n_, v ) @@ at _sloc )
+# 2206 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_121 =
+  fun _endpos_id_ _endpos_v_ _startpos_id_ id v ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2218 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 250 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 2229 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_122 =
+  fun _endpos_s_ _endpos_v_ _startpos_s_ s v ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2244 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2254 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_v_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 250 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, v) @@ at _sloc )
+# 2265 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_123 =
+  fun _endpos_n_ _startpos_n_ n ->
+    let _endpos = _endpos_n_ in
+    let _symbolstartpos = _startpos_n_ in
+    let _loc_n_ = (_startpos_n_, _endpos_n_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 252 "idllib/parser.mly"
+    ( (Id (Uint32.of_string n) @@ at _loc_n_, NullV @@ no_region) @@ at _sloc )
+# 2277 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_124 =
+  fun _endpos_id_ _startpos_id_ id ->
+    let name =
+      let _endpos = _endpos_id_ in
+      let _symbolstartpos = _startpos_id_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 91 "idllib/parser.mly"
+          ( id @@ at _sloc )
+# 2289 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_id_, _startpos_id_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 254 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, NullV @@ no_region) @@ at _sloc )
+# 2300 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_action_125 =
+  fun _endpos_s_ _startpos_s_ s ->
+    let name =
+      let text =
+        let _endpos = _endpos_s_ in
+        let _symbolstartpos = _startpos_s_ in
+        let _sloc = (_symbolstartpos, _endpos) in
+        
+# 83 "idllib/parser.mly"
+   ( try ignore (Lib.Utf8.decode s); s
+     with Lib.Utf8.Utf8 -> raise (ParseError (at _sloc, "Invalid UTF-8"))
+   )
+# 2315 "idllib/parser.ml"
+        
+      in
+      let (_endpos_text_, _startpos_text_) = (_endpos_s_, _startpos_s_) in
+      let _endpos = _endpos_text_ in
+      let _symbolstartpos = _startpos_text_ in
+      let _sloc = (_symbolstartpos, _endpos) in
+      
+# 92 "idllib/parser.mly"
+              ( text @@ at _sloc )
+# 2325 "idllib/parser.ml"
+      
+    in
+    let (_endpos_name_, _startpos_name_) = (_endpos_s_, _startpos_s_) in
+    let _endpos = _endpos_name_ in
+    let _symbolstartpos = _startpos_name_ in
+    let _loc_name_ = (_startpos_name_, _endpos_name_) in
+    let _sloc = (_symbolstartpos, _endpos) in
+    (
+# 254 "idllib/parser.mly"
+    ( (Named name.it @@ at _loc_name_, NullV @@ no_region) @@ at _sloc )
+# 2336 "idllib/parser.ml"
+     : ((Syntax.field_label * Syntax.value) Source.phrase))
+
+let _menhir_print_token : token -> string =
+  fun _tok ->
+    match _tok with
+    | ARROW ->
+        "ARROW"
+    | BLOB ->
+        "BLOB"
+    | COLON ->
+        "COLON"
+    | COMMA ->
+        "COMMA"
+    | COMPOSITE_QUERY ->
+        "COMPOSITE_QUERY"
+    | EOF ->
+        "EOF"
+    | EQ ->
+        "EQ"
+    | EQQ ->
+        "EQQ"
+    | FUNC ->
+        "FUNC"
+    | ID _ ->
+        "ID"
+    | IMPORT ->
+        "IMPORT"
+    | LCURLY ->
+        "LCURLY"
+    | LPAR ->
+        "LPAR"
+    | MINUS ->
+        "MINUS"
+    | NAT _ ->
+        "NAT"
+    | NOTCOLON ->
+        "NOTCOLON"
+    | NOTEQ ->
+        "NOTEQ"
+    | ONEWAY ->
+        "ONEWAY"
+    | OPT ->
+        "OPT"
+    | PERIOD ->
+        "PERIOD"
+    | PRINCIPAL ->
+        "PRINCIPAL"
+    | QUERY ->
+        "QUERY"
+    | RCURLY ->
+        "RCURLY"
+    | RECORD ->
+        "RECORD"
+    | RPAR ->
+        "RPAR"
+    | SEMICOLON ->
+        "SEMICOLON"
+    | SERVICE ->
+        "SERVICE"
+    | TEXT _ ->
+        "TEXT"
+    | TYPE ->
+        "TYPE"
+    | VARIANT ->
+        "VARIANT"
+    | VEC ->
+        "VEC"
+
+let _menhir_fail : unit -> 'a =
+  fun () ->
+    Printf.eprintf "Internal failure -- please contact the parser generator's developers.\n%!";
+    assert false
+
+include struct
+  
+  [@@@ocaml.warning "-4-37"]
+  
+  let _menhir_run_068 : type  ttv_stack. ttv_stack _menhir_cell0_LPAR -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | EOF ->
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let MenhirCell0_LPAR (_menhir_stack, _startpos__1_) = _menhir_stack in
+          let (_endpos__4_, vs) = (_endpos, _v) in
+          let _v = _menhir_action_059 _endpos__4_ _startpos__1_ vs in
+          MenhirBox_parse_args _v
+      | _ ->
+          _eRR ()
+  
+  let rec _menhir_run_073 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_annval -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell1_annval (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_071 x xs in
+      _menhir_goto_seplist_annval_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_annval_COMMA_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState072 ->
+          _menhir_run_073 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState001 ->
+          _menhir_run_068 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  let rec _menhir_run_002 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | TEXT _v ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState003
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState003
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | ID _v ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState003
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState003
+          | RCURLY ->
+              let _v = _menhir_action_090 () in
+              _menhir_run_065 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_004 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | EQ ->
+                  let _menhir_stack = MenhirCell0_TEXT (_menhir_stack, _v, _startpos_1, _endpos) in
+                  let _menhir_s = MenhirState007 in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  (match (_tok : MenhirBasics.token) with
+                  | VEC ->
+                      _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | VARIANT ->
+                      _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | TEXT _v ->
+                      _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | SERVICE ->
+                      _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | RECORD ->
+                      _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | PRINCIPAL ->
+                      _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | OPT ->
+                      _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | NAT _v ->
+                      _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | MINUS ->
+                      _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | ID _v ->
+                      _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | FUNC ->
+                      _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | BLOB ->
+                      _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | _ ->
+                      _eRR ())
+              | RCURLY ->
+                  let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos_1, _v) in
+                  let _v = _menhir_action_125 _endpos_s_ _startpos_s_ s in
+                  _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+              | _ ->
+                  _eRR ())
+          | NAT _v ->
+              let _startpos_5 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | EQ ->
+                  let _menhir_stack = MenhirCell0_NAT (_menhir_stack, _v, _startpos_5, _endpos) in
+                  let _menhir_s = MenhirState055 in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  (match (_tok : MenhirBasics.token) with
+                  | VEC ->
+                      _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | VARIANT ->
+                      _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | TEXT _v ->
+                      _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | SERVICE ->
+                      _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | RECORD ->
+                      _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | PRINCIPAL ->
+                      _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | OPT ->
+                      _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | NAT _v ->
+                      _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | MINUS ->
+                      _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | ID _v ->
+                      _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | FUNC ->
+                      _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | BLOB ->
+                      _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | _ ->
+                      _eRR ())
+              | RCURLY ->
+                  let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos_5, _v) in
+                  let _v = _menhir_action_123 _endpos_n_ _startpos_n_ n in
+                  _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+              | _ ->
+                  _eRR ())
+          | ID _v ->
+              let _startpos_9 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | EQ ->
+                  let _menhir_stack = MenhirCell0_ID (_menhir_stack, _v, _startpos_9, _endpos) in
+                  let _menhir_s = MenhirState058 in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  (match (_tok : MenhirBasics.token) with
+                  | VEC ->
+                      _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | VARIANT ->
+                      _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | TEXT _v ->
+                      _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | SERVICE ->
+                      _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | RECORD ->
+                      _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | PRINCIPAL ->
+                      _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | OPT ->
+                      _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | NAT _v ->
+                      _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | MINUS ->
+                      _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | ID _v ->
+                      _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+                  | FUNC ->
+                      _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | BLOB ->
+                      _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+                  | _ ->
+                      _eRR ())
+              | RCURLY ->
+                  let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos_9, _v) in
+                  let _v = _menhir_action_124 _endpos_id_ _startpos_id_ id in
+                  _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_008 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos_text_ _v _menhir_s _tok
+  
+  and _menhir_goto_value : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState072 ->
+          _menhir_run_067 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState001 ->
+          _menhir_run_067 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState063 ->
+          _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState003 ->
+          _menhir_run_062 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState058 ->
+          _menhir_run_059 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState055 ->
+          _menhir_run_056 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState007 ->
+          _menhir_run_053 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState051 ->
+          _menhir_run_047 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState013 ->
+          _menhir_run_047 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState045 ->
+          _menhir_run_046 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState042 ->
+          _menhir_run_043 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState015 ->
+          _menhir_run_040 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState019 ->
+          _menhir_run_037 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_067 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      let v = _v in
+      let _v = _menhir_action_010 v in
+      match (_tok : MenhirBasics.token) with
+      | COMMA ->
+          let _menhir_stack = MenhirCell1_annval (_menhir_stack, _menhir_s, _v) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | TEXT _v_0 ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState072
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | NAT _v_1 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState072
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | ID _v_2 ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2 MenhirState072
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState072
+          | RPAR ->
+              let _v_3 = _menhir_action_069 () in
+              _menhir_run_073 _menhir_stack _menhir_lexbuf _menhir_lexer _v_3
+          | _ ->
+              _eRR ())
+      | RPAR ->
+          let x = _v in
+          let _v = _menhir_action_070 x in
+          _menhir_goto_seplist_annval_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_009 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos, _startpos_0, _v, _startpos) in
+          let _v = _menhir_action_107 _endpos_s_ _startpos__1_ _startpos_s_ s in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+      | ID _v ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_id_, _startpos_id_, id, _startpos__1_) = (_endpos, _startpos_1, _v, _startpos) in
+          let _v = _menhir_action_106 _endpos_id_ _startpos__1_ _startpos_id_ id in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_012 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | TEXT _v ->
+              _menhir_run_014 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | NAT _v ->
+              _menhir_run_041 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | ID _v ->
+              _menhir_run_044 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState013
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState013
+          | RCURLY ->
+              let _v = _menhir_action_075 () in
+              _menhir_run_048 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_014 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | EQ ->
+          let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _menhir_s = MenhirState015 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | TEXT _v ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | ID _v ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | RCURLY | SEMICOLON ->
+          let (_endpos_text_, _startpos_text_, text) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_103 _endpos_text_ _startpos_text_ text in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos_text_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_016 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos_1, _startpos_0, _v, _startpos) in
+          let _v = _menhir_action_113 _endpos_s_ _startpos__1_ _startpos_s_ s in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+      | ID _v ->
+          let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_3 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_id_, _startpos_id_, id, _startpos__1_) = (_endpos_3, _startpos_2, _v, _startpos) in
+          let _v = _menhir_action_112 _endpos_id_ _startpos__1_ _startpos_id_ id in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_019 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos) in
+      let _menhir_s = MenhirState019 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | VARIANT ->
+          _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | TEXT _v ->
+          _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | SERVICE ->
+          _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | RECORD ->
+          _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | PRINCIPAL ->
+          _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | OPT ->
+          _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | NAT _v ->
+          _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | MINUS ->
+          _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | ID _v ->
+          _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | FUNC ->
+          _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | BLOB ->
+          _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_020 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | PERIOD ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_021 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | COMMA | RCURLY | RPAR | SEMICOLON ->
+          let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_050 n in
+          _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_021 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | NAT _v ->
+          let _menhir_stack = MenhirCell0_PERIOD (_menhir_stack, _endpos) in
+          _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState021
+      | COMMA | RCURLY | RPAR | SEMICOLON ->
+          let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _) = _menhir_stack in
+          let _endpos__2_ = _endpos in
+          let _v = _menhir_action_049 n in
+          _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__2_ _startpos_n_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_num : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState072 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState001 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState003 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState063 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState058 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState055 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState007 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState051 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState013 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState045 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState042 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState015 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState019 ->
+          _menhir_run_039 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState023 ->
+          _menhir_run_024 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState021 ->
+          _menhir_run_022 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_039 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_097 n in
+      _menhir_goto_signed_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+  
+  and _menhir_goto_signed_num : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_099 _endpos_n_ _startpos_n_ n in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+  
+  and _menhir_run_024 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_MINUS -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_MINUS (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_n_, n) = (_endpos, _v) in
+      let _v = _menhir_action_096 n in
+      _menhir_goto_signed_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_022 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT _menhir_cell0_PERIOD -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_PERIOD (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _) = _menhir_stack in
+      let (_endpos_n2_, n2) = (_endpos, _v) in
+      let _v = _menhir_action_048 n n2 in
+      _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n2_ _startpos_n_ _v _menhir_s _tok
+  
+  and _menhir_run_023 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_MINUS (_menhir_stack, _menhir_s, _startpos) in
+      let _menhir_s = MenhirState023 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | NAT _v ->
+          _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_025 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+  
+  and _menhir_run_026 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | PERIOD ->
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | TEXT _v_2 ->
+                  let _startpos_3 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_4 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_s_, _startpos_s_, s, _startpos__1_, _endpos_s_inlined1_, _startpos_s_inlined1_, s_inlined1) = (_endpos, _startpos_0, _v, _startpos, _endpos_4, _startpos_3, _v_2) in
+                  let _v = _menhir_action_111 _endpos_s_ _endpos_s_inlined1_ _startpos__1_ _startpos_s_ _startpos_s_inlined1_ s s_inlined1 in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_inlined1_ _startpos__1_ _v _menhir_s _tok
+              | ID _v_5 ->
+                  let _startpos_6 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_7 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_id_, _startpos_id_, id, _endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos_7, _startpos_6, _v_5, _endpos, _startpos_0, _v, _startpos) in
+                  let _v = _menhir_action_110 _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos__1_ _v _menhir_s _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | ID _v ->
+          let _startpos_8 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | PERIOD ->
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | TEXT _v_10 ->
+                  let _startpos_11 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_12 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_id_, _startpos_id_, id, _endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos, _startpos_8, _v, _endpos_12, _startpos_11, _v_10, _startpos) in
+                  let _v = _menhir_action_109 _endpos_id_ _endpos_s_ _startpos__1_ _startpos_id_ _startpos_s_ id s in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+              | ID _v_13 ->
+                  let _startpos_14 = _menhir_lexbuf.Lexing.lex_start_p in
+                  let _endpos_15 = _menhir_lexbuf.Lexing.lex_curr_p in
+                  let _tok = _menhir_lexer _menhir_lexbuf in
+                  let (_endpos_id_, _startpos_id_, id, _startpos__1_, _endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) = (_endpos, _startpos_8, _v, _startpos, _endpos_15, _startpos_14, _v_13) in
+                  let _v = _menhir_action_108 _endpos_id_ _endpos_id_inlined1_ _startpos__1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 in
+                  _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_inlined1_ _startpos__1_ _v _menhir_s _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_035 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_text_, text, _startpos__1_) = (_endpos_1, _v, _startpos) in
+          let _v = _menhir_action_102 _endpos_text_ _startpos__1_ text in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_text_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_041 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | PERIOD ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_021 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | EQ ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _menhir_s = MenhirState042 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | TEXT _v ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | ID _v ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | RCURLY | SEMICOLON ->
+          let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_050 n in
+          _menhir_goto_num _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_n_ _startpos_n_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_044 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | EQ ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _menhir_s = MenhirState045 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | TEXT _v ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | ID _v ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | RCURLY | SEMICOLON ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_114 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_048 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos__4_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_104 _endpos__4_ _startpos__1_ fs in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__4_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_062 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_value (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _endpos_0 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | TEXT _v_1 ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState063
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | NAT _v_2 ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2 MenhirState063
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | ID _v_3 ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v_3 MenhirState063
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState063
+          | RCURLY ->
+              let _v_4 = _menhir_action_090 () in
+              _menhir_run_064 _menhir_stack _menhir_lexbuf _menhir_lexer _v_4
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_091 x in
+          _menhir_goto_seplist_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_064 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_value (_menhir_stack, _menhir_s, x, _, _) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_092 x xs in
+      _menhir_goto_seplist_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_value_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState003 ->
+          _menhir_run_065 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState063 ->
+          _menhir_run_064 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_065 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VEC _menhir_cell0_LCURLY -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos__4_, vs) = (_endpos, _v) in
+      let _v = _menhir_action_101 _endpos__4_ _startpos__1_ vs in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__4_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_059 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_ID -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_ID (_menhir_stack, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_121 _endpos_id_ _endpos_v_ _startpos_id_ id v in
+      _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_goto_variant_value : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | RCURLY ->
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+          let MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+          let (_endpos__4_, f) = (_endpos, _v) in
+          let _v = _menhir_action_105 _endpos__4_ _startpos__1_ f in
+          _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__4_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_056 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_NAT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_NAT (_menhir_stack, n, _startpos_n_, _endpos_n_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_120 _endpos_n_ _endpos_v_ _startpos_n_ n v in
+      _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_run_053 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_VARIANT _menhir_cell0_LCURLY _menhir_cell0_TEXT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_TEXT (_menhir_stack, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_122 _endpos_s_ _endpos_v_ _startpos_s_ s v in
+      _menhir_goto_variant_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+  
+  and _menhir_run_047 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_v_, _startpos_v_, v) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_033 _endpos_v_ _startpos_v_ v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_field_value : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_field_value (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | TEXT _v_0 ->
+              _menhir_run_014 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState051
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | NAT _v_1 ->
+              _menhir_run_041 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState051
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | ID _v_2 ->
+              _menhir_run_044 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2 MenhirState051
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState051
+          | RCURLY ->
+              let _v_3 = _menhir_action_075 () in
+              _menhir_run_052 _menhir_stack _menhir_lexbuf _menhir_lexer _v_3
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_076 x in
+          _menhir_goto_seplist_field_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_052 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_field_value _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_field_value (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_077 x xs in
+      _menhir_goto_seplist_field_value_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_field_value_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_args) _menhir_state -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState051 ->
+          _menhir_run_052 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState013 ->
+          _menhir_run_048 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_046 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_031 _endpos_id_ _endpos_v_ _startpos_id_ id v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_043 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_NAT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _endpos_n_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_030 _endpos_n_ _endpos_v_ _startpos_n_ n v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_040 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_032 _endpos_s_ _endpos_v_ _startpos_s_ s v in
+      _menhir_goto_field_value _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_037 : type  ttv_stack. (ttv_stack, _menhir_box_parse_args) _menhir_cell1_OPT -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_v_, v) = (_endpos, _v) in
+      let _v = _menhir_action_100 _endpos_v_ _startpos__1_ v in
+      _menhir_goto_value _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_v_ _startpos__1_ _v _menhir_s _tok
+  
+  let _menhir_run_000 : type  ttv_stack. ttv_stack -> _ -> _ -> _menhir_box_parse_args =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LPAR ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LPAR (_menhir_stack, _startpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_002 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | VARIANT ->
+              _menhir_run_004 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | TEXT _v ->
+              _menhir_run_008 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState001
+          | SERVICE ->
+              _menhir_run_009 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | RECORD ->
+              _menhir_run_012 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | PRINCIPAL ->
+              _menhir_run_016 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | OPT ->
+              _menhir_run_019 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | NAT _v ->
+              _menhir_run_020 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState001
+          | MINUS ->
+              _menhir_run_023 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | ID _v ->
+              _menhir_run_025 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState001
+          | FUNC ->
+              _menhir_run_026 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | BLOB ->
+              _menhir_run_035 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState001
+          | RPAR ->
+              let _v = _menhir_action_069 () in
+              _menhir_run_068 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  let _menhir_run_208 : type  ttv_stack. (ttv_stack, _menhir_box_parse_tests) _menhir_cell1_endlist_def_SEMICOLON_ -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _endpos _startpos _v ->
+      let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+      let MenhirCell1_endlist_def_SEMICOLON_ (_menhir_stack, _, tdecs, _startpos_tdecs_, _endpos_tdecs_) = _menhir_stack in
+      let (_endpos__3_, _startpos__3_, _endpos_tests_, _startpos_tests_, tests) = (_endpos_1, _startpos_0, _endpos, _startpos, _v) in
+      let _v = _menhir_action_061 _endpos__3_ _endpos_tdecs_ _endpos_tests_ _startpos__3_ _startpos_tdecs_ _startpos_tests_ tdecs tests in
+      MenhirBox_parse_tests _v
+  
+  let _menhir_goto_actor : type  ttv_stack. (ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _startpos _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | EOF ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos_1 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let MenhirCell1_seplist_def_SEMICOLON_ (_menhir_stack, _, ds, _startpos_ds_, _endpos_ds_) = _menhir_stack in
+          let (_endpos__3_, _startpos__3_, _endpos_actor_, _startpos_actor_, actor) = (_endpos_1, _startpos_0, _endpos, _startpos, _v) in
+          let _v = _menhir_action_060 _endpos__3_ _endpos_actor_ _endpos_ds_ _startpos__3_ _startpos_actor_ _startpos_ds_ actor ds in
+          MenhirBox_parse_prog _v
+      | _ ->
+          _eRR ()
+  
+  let _menhir_run_178 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_class_typ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _tok ->
+      let MenhirCell1_actor_class_typ (_menhir_stack, _, t) = _menhir_stack in
+      let MenhirCell0_id_opt (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell0_SERVICE (_menhir_stack, _startpos__1_) = _menhir_stack in
+      let _endpos__5_ = _endpos in
+      let _v = _menhir_action_006 t in
+      _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos__5_ _startpos__1_ _v _tok
+  
+  let _menhir_run_176 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_actor_typ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _tok ->
+      let MenhirCell1_actor_typ (_menhir_stack, _, tys, _startpos_tys_, _endpos_tys_) = _menhir_stack in
+      let MenhirCell0_id_opt (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell0_SERVICE (_menhir_stack, _startpos__1_) = _menhir_stack in
+      let _endpos__5_ = _endpos in
+      let _v = _menhir_action_004 _endpos_tys_ _startpos_tys_ tys in
+      _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos__5_ _startpos__1_ _v _tok
+  
+  let _menhir_run_170 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_ID -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _tok ->
+      let MenhirCell1_ID (_menhir_stack, _, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let MenhirCell0_id_opt (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell0_SERVICE (_menhir_stack, _startpos__1_) = _menhir_stack in
+      let _endpos__5_ = _endpos in
+      let _v = _menhir_action_005 _endpos_id_ _startpos_id_ id in
+      _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos__5_ _startpos__1_ _v _tok
+  
+  let _menhir_goto_option_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _endpos _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState177 ->
+          _menhir_run_178 _menhir_stack _menhir_lexbuf _endpos _tok
+      | MenhirState175 ->
+          _menhir_run_176 _menhir_stack _menhir_lexbuf _endpos _tok
+      | MenhirState168 ->
+          _menhir_run_170 _menhir_stack _menhir_lexbuf _endpos _tok
+      | _ ->
+          _menhir_fail ()
+  
+  let _menhir_run_169 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_prog) _menhir_state -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos_x_, x) = (_endpos, ()) in
+      let _ = _menhir_action_052 x in
+      _menhir_goto_option_SEMICOLON_ _menhir_stack _menhir_lexbuf _endpos_x_ _menhir_s _tok
+  
+  let rec _menhir_run_207 : type  ttv_stack. (ttv_stack, _menhir_box_parse_tests) _menhir_cell1_test _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _endpos _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_test (_menhir_stack, _menhir_s, x, _startpos_x_, _) = _menhir_stack in
+      let (_endpos_xs_, xs) = (_endpos, _v) in
+      let _v = _menhir_action_089 x xs in
+      _menhir_goto_seplist_test_SEMICOLON_ _menhir_stack _menhir_lexbuf _endpos_xs_ _startpos_x_ _v _menhir_s
+  
+  and _menhir_goto_seplist_test_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _endpos _startpos _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState187 ->
+          _menhir_run_208 _menhir_stack _menhir_lexbuf _endpos _startpos _v
+      | MenhirState206 ->
+          _menhir_run_207 _menhir_stack _menhir_lexbuf _endpos _v
+      | _ ->
+          _menhir_fail ()
+  
+  let _menhir_goto_actor_class_typ : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt as 'stack) -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_actor_class_typ (_menhir_stack, _menhir_s, _v) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          _menhir_run_169 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState177
+      | EOF ->
+          let _ = _menhir_action_051 () in
+          _menhir_run_178 _menhir_stack _menhir_lexbuf _endpos _tok
+      | _ ->
+          _eRR ()
+  
+  let _menhir_run_175 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt as 'stack) -> _ -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_actor_typ (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          _menhir_run_169 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState175
+      | EOF ->
+          let _ = _menhir_action_051 () in
+          _menhir_run_176 _menhir_stack _menhir_lexbuf _endpos _tok
+      | _ ->
+          _eRR ()
+  
+  let _menhir_run_174 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt, _menhir_box_parse_prog) _menhir_cell1_param_typs -> _ -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok ->
+      let MenhirCell1_param_typs (_menhir_stack, _menhir_s, args, _startpos_args_) = _menhir_stack in
+      let (_endpos_tys_, _startpos_tys_, tys) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_007 _endpos_tys_ _startpos_args_ _startpos_tys_ args tys in
+      _menhir_goto_actor_class_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+  
+  let rec _menhir_run_076 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_TYPE (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | ID _v ->
+          let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_ID (_menhir_stack, _v, _startpos, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | EQ ->
+              let _menhir_s = MenhirState078 in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | VEC ->
+                  _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | VARIANT ->
+                  _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | SERVICE ->
+                  _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | RECORD ->
+                  _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | PRINCIPAL ->
+                  _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | OPT ->
+                  _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | ID _v ->
+                  _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+              | FUNC ->
+                  _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | BLOB ->
+                  _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_079 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos) in
+      let _menhir_s = MenhirState079 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | PRINCIPAL ->
+          _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | ID _v ->
+          _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | BLOB ->
+          _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_080 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              _menhir_run_082 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081
+          | NAT _v ->
+              _menhir_run_150 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081
+          | ID _v ->
+              _menhir_run_151 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState081
+          | RCURLY ->
+              let _v = _menhir_action_093 () in
+              _menhir_run_156 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_082 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_083 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_117 _endpos_s_ _startpos_s_ s in
+          _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_083 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _menhir_s = MenhirState083 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | PRINCIPAL ->
+          _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | ID _v ->
+          _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | BLOB ->
+          _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_084 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_SERVICE (_menhir_stack, _menhir_s, _startpos) in
+      let _menhir_s = MenhirState084 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          _menhir_run_085 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_085 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_LCURLY (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          _menhir_run_086 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState085
+      | ID _v ->
+          _menhir_run_139 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState085
+      | RCURLY ->
+          let _v = _menhir_action_078 () in
+          _menhir_run_143 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_086 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState087
+          | ID _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id, _endpos_s_, _startpos_s_, s) = (_endpos_2, _startpos_1, _v_0, _endpos, _startpos, _v) in
+              let _v = _menhir_action_047 _endpos_id_ _endpos_s_ _startpos_id_ _startpos_s_ id s in
+              _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_088 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_LPAR (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | TEXT _v ->
+          _menhir_run_089 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState088
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | PRINCIPAL ->
+          _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | ID _v ->
+          _menhir_run_128 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState088
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | BLOB ->
+          _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState088
+      | RPAR ->
+          let _v = _menhir_action_081 () in
+          _menhir_run_131 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_089 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_s = MenhirState090 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | PRINCIPAL ->
+              _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | ID _v ->
+              _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | BLOB ->
+              _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_091 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LCURLY ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_LCURLY (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | TEXT _v ->
+              _menhir_run_093 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | PRINCIPAL ->
+              _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | NAT _v ->
+              _menhir_run_113 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092
+          | ID _v ->
+              _menhir_run_116 _menhir_stack _menhir_lexbuf _menhir_lexer _v MenhirState092
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | BLOB ->
+              _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState092
+          | RCURLY ->
+              let _v = _menhir_action_084 () in
+              _menhir_run_119 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_093 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_TEXT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          _menhir_run_083 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_094 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+      let _v = _menhir_action_068 _endpos__1_ _startpos__1_ in
+      _menhir_goto_ref_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__1_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_ref_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_021 t in
+      _menhir_goto_data_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _menhir_s _tok
+  
+  and _menhir_goto_data_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState078 ->
+          _menhir_run_160 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState079 ->
+          _menhir_run_159 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState083 ->
+          _menhir_run_149 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState088 ->
+          _menhir_run_136 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState134 ->
+          _menhir_run_136 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState129 ->
+          _menhir_run_130 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState090 ->
+          _menhir_run_127 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState092 ->
+          _menhir_run_125 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState122 ->
+          _menhir_run_125 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState117 ->
+          _menhir_run_118 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState114 ->
+          _menhir_run_115 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState095 ->
+          _menhir_run_111 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_160 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TYPE _menhir_cell0_ID -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_ID (_menhir_stack, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let MenhirCell1_TYPE (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_023 _endpos_id_ _endpos_t_ _startpos__1_ _startpos_id_ id t in
+      _menhir_goto_def _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_def : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState185 ->
+          _menhir_run_210 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState211 ->
+          _menhir_run_182 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState183 ->
+          _menhir_run_182 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState075 ->
+          _menhir_run_182 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_210 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_def (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _endpos_0 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TYPE ->
+              _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState211
+          | IMPORT ->
+              _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState211
+          | EOF | ID _ ->
+              let _v_1 = _menhir_action_072 () in
+              _menhir_run_212 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_0 _v_1 _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_161 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s, _startpos__1_) = (_endpos, _startpos_0, _v, _startpos) in
+          let _v = _menhir_action_024 _endpos_s_ _startpos__1_ _startpos_s_ s in
+          _menhir_goto_def _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _startpos__1_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_212 : type  ttv_stack. (ttv_stack, _menhir_box_parse_tests) _menhir_cell1_def _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_def (_menhir_stack, _menhir_s, x, _startpos_x_, _) = _menhir_stack in
+      let (_endpos_xs_, xs) = (_endpos, _v) in
+      let _v = _menhir_action_026 x xs in
+      _menhir_goto_endlist_def_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_xs_ _startpos_x_ _v _menhir_s _tok
+  
+  and _menhir_goto_endlist_def_SEMICOLON_ : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_endlist_def_SEMICOLON_ (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | ID _v_0 ->
+          _menhir_run_188 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState187
+      | EOF ->
+          let _v_1 = _menhir_action_087 () in
+          _menhir_run_208 _menhir_stack _menhir_lexbuf _endpos _endpos _v_1
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_188 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _menhir_s = MenhirState188 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          _menhir_run_189 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | BLOB ->
+          _menhir_run_190 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_189 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_042 _endpos_s_ _startpos_s_ s in
+      _menhir_goto_input _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_input : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState197 ->
+          _menhir_run_198 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState193 ->
+          _menhir_run_194 _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+      | MenhirState188 ->
+          _menhir_run_192 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_198 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let MenhirCell1_input (_menhir_stack, _menhir_s, i1) = _menhir_stack in
+          let i2 = _v in
+          let _v = _menhir_action_013 i1 i2 in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_assertion : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID as 'stack) -> _ -> _ -> _ -> ('stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_assertion (_menhir_stack, _menhir_s, _v) in
+      match (_tok : MenhirBasics.token) with
+      | LPAR ->
+          _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState201
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_194 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_input -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let MenhirCell1_input (_menhir_stack, _menhir_s, i1) = _menhir_stack in
+          let i2 = _v in
+          let _v = _menhir_action_014 i1 i2 in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_192 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID as 'stack) -> _ -> _ -> _ -> ('stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | NOTEQ ->
+          let _menhir_stack = MenhirCell1_input (_menhir_stack, _menhir_s, _v) in
+          let _menhir_s = MenhirState193 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              _menhir_run_189 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | BLOB ->
+              _menhir_run_190 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | NOTCOLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let input = _v in
+          let _v = _menhir_action_012 input in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | EQQ ->
+          let _menhir_stack = MenhirCell1_input (_menhir_stack, _menhir_s, _v) in
+          let _menhir_s = MenhirState197 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v ->
+              _menhir_run_189 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | BLOB ->
+              _menhir_run_190 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let input = _v in
+          let _v = _menhir_action_011 input in
+          _menhir_goto_assertion _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_190 : type  ttv_stack. ttv_stack -> _ -> _ -> (ttv_stack, _menhir_box_parse_tests) _menhir_state -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let text = _v in
+          let _v = _menhir_action_043 text in
+          _menhir_goto_input _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_182 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_def (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _endpos_0 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TYPE ->
+              _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState183
+          | IMPORT ->
+              _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState183
+          | EOF | ID _ | SERVICE ->
+              let _v_1 = _menhir_action_072 () in
+              _menhir_run_184 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_0 _v_1 _tok
+          | _ ->
+              _eRR ())
+      | EOF | ID _ | SERVICE ->
+          let (_endpos_x_, _startpos_x_, x) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_073 x in
+          _menhir_goto_seplist_def_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_x_ _startpos_x_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_184 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_def _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_def (_menhir_stack, _menhir_s, x, _startpos_x_, _) = _menhir_stack in
+      let (_endpos_xs_, xs) = (_endpos, _v) in
+      let _v = _menhir_action_074 x xs in
+      _menhir_goto_seplist_def_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_xs_ _startpos_x_ _v _menhir_s _tok
+  
+  and _menhir_goto_seplist_def_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState211 ->
+          _menhir_run_212 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState183 ->
+          _menhir_run_184 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState075 ->
+          _menhir_run_163 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_163 : type  ttv_stack. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_seplist_def_SEMICOLON_ (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      match (_tok : MenhirBasics.token) with
+      | SERVICE ->
+          let _startpos_0 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _menhir_stack = MenhirCell0_SERVICE (_menhir_stack, _startpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | ID _v_1 ->
+              let _startpos_2 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_3 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id) = (_endpos_3, _startpos_2, _v_1) in
+              let _v = _menhir_action_041 _endpos_id_ _startpos_id_ id in
+              _menhir_goto_id_opt _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | COLON ->
+              let _v = _menhir_action_040 () in
+              _menhir_goto_id_opt _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok
+          | _ ->
+              _eRR ())
+      | EOF ->
+          let _v = _menhir_action_003 () in
+          _menhir_goto_actor _menhir_stack _menhir_lexbuf _endpos _endpos _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_id_opt : type  ttv_stack. (ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE -> _ -> _ -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let _menhir_stack = MenhirCell0_id_opt (_menhir_stack, _v) in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState167
+          | LCURLY ->
+              _menhir_run_085 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState167
+          | ID _v_0 ->
+              let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _menhir_stack = MenhirCell1_ID (_menhir_stack, MenhirState167, _v_0, _startpos, _endpos) in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              (match (_tok : MenhirBasics.token) with
+              | SEMICOLON ->
+                  _menhir_run_169 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState168
+              | EOF ->
+                  let _ = _menhir_action_051 () in
+                  _menhir_run_170 _menhir_stack _menhir_lexbuf _endpos _tok
+              | _ ->
+                  _eRR ())
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_159 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_VEC -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_VEC (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_016 _endpos_t_ _startpos__1_ t in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_cons_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_020 t in
+      _menhir_goto_data_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _menhir_s _tok
+  
+  and _menhir_run_149 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_029 _endpos_s_ _endpos_t_ _startpos_s_ s t in
+      _menhir_goto_field_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_field_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState081 ->
+          _menhir_run_155 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState153 ->
+          _menhir_run_155 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState092 ->
+          _menhir_run_124 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | MenhirState122 ->
+          _menhir_run_124 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_155 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      let f = _v in
+      let _v = _menhir_action_115 f in
+      _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_variant_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_variant_typ (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v_0 ->
+              _menhir_run_082 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState153
+          | NAT _v_1 ->
+              _menhir_run_150 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState153
+          | ID _v_2 ->
+              _menhir_run_151 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2 MenhirState153
+          | RCURLY ->
+              let _v_3 = _menhir_action_093 () in
+              _menhir_run_154 _menhir_stack _menhir_lexbuf _menhir_lexer _v_3
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_094 x in
+          _menhir_goto_seplist_variant_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_150 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_114 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_n_, _startpos_n_, n) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_118 _endpos_n_ _startpos_n_ n in
+          _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_114 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_NAT -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _menhir_s = MenhirState114 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | PRINCIPAL ->
+          _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | ID _v ->
+          _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | BLOB ->
+          _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_095 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos) in
+      let _menhir_s = MenhirState095 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | PRINCIPAL ->
+          _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | ID _v ->
+          _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | BLOB ->
+          _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_096 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_062 _endpos_id_ _startpos_id_ id in
+      _menhir_goto_prim_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+  
+  and _menhir_goto_prim_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_022 t in
+      _menhir_goto_data_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos_t_ _v _menhir_s _tok
+  
+  and _menhir_run_097 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _menhir_stack = MenhirCell1_FUNC (_menhir_stack, _menhir_s, _startpos) in
+      let _menhir_s = MenhirState097 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | LPAR ->
+          _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_108 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+      let _v = _menhir_action_019 _endpos__1_ _startpos__1_ in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__1_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_151 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_117 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_116 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_variant_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_117 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _menhir_s = MenhirState117 in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | VEC ->
+          _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | VARIANT ->
+          _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | SERVICE ->
+          _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | RECORD ->
+          _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | PRINCIPAL ->
+          _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | OPT ->
+          _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | ID _v ->
+          _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | FUNC ->
+          _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | BLOB ->
+          _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_154 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_variant_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_variant_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_095 x xs in
+      _menhir_goto_seplist_variant_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_variant_typ_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState081 ->
+          _menhir_run_156 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState153 ->
+          _menhir_run_154 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_156 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_VARIANT _menhir_cell0_LCURLY -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let (_endpos__3_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_119 fs in
+      let _endpos = _endpos__3_ in
+      let MenhirCell1_VARIANT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_fs_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_018 _endpos_fs_ _startpos__1_ fs in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_fs_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_124 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      let f = _v in
+      let _v = _menhir_action_063 f in
+      _menhir_goto_record_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_record_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_record_typ (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | TEXT _v_0 ->
+              _menhir_run_093 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState122
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | PRINCIPAL ->
+              _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | NAT _v_1 ->
+              _menhir_run_113 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState122
+          | ID _v_2 ->
+              _menhir_run_116 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2 MenhirState122
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | BLOB ->
+              _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState122
+          | RCURLY ->
+              let _v_3 = _menhir_action_084 () in
+              _menhir_run_123 _menhir_stack _menhir_lexbuf _menhir_lexer _v_3
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_085 x in
+          _menhir_goto_seplist_record_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_113 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _menhir_stack = MenhirCell1_NAT (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          _menhir_run_114 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_116 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          _menhir_run_117 _menhir_stack _menhir_lexbuf _menhir_lexer
+      | RCURLY | SEMICOLON ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_062 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_prim_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_123 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_record_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_record_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_086 x xs in
+      _menhir_goto_seplist_record_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_record_typ_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState122 ->
+          _menhir_run_123 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState092 ->
+          _menhir_run_119 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_119 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_RECORD _menhir_cell0_LCURLY -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell0_LCURLY (_menhir_stack, _) = _menhir_stack in
+      let (_endpos__3_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_065 fs in
+      let _endpos = _endpos__3_ in
+      let MenhirCell1_RECORD (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_fs_, fs) = (_endpos, _v) in
+      let _v = _menhir_action_017 _endpos_fs_ _startpos__1_ fs in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_fs_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_136 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      let t = _v in
+      let _v = _menhir_action_055 t in
+      _menhir_goto_param_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_param_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | COMMA ->
+          let _menhir_stack = MenhirCell1_param_typ (_menhir_stack, _menhir_s, _v) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | TEXT _v_0 ->
+              _menhir_run_089 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState134
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | PRINCIPAL ->
+              _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | ID _v_1 ->
+              _menhir_run_128 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState134
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | BLOB ->
+              _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState134
+          | RPAR ->
+              let _v_2 = _menhir_action_081 () in
+              _menhir_run_135 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2
+          | _ ->
+              _eRR ())
+      | RPAR ->
+          let x = _v in
+          let _v = _menhir_action_082 x in
+          _menhir_goto_seplist_param_typ_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_128 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _menhir_s = MenhirState129 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | VEC ->
+              _menhir_run_079 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | VARIANT ->
+              _menhir_run_080 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | SERVICE ->
+              _menhir_run_084 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | RECORD ->
+              _menhir_run_091 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | PRINCIPAL ->
+              _menhir_run_094 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | OPT ->
+              _menhir_run_095 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | ID _v ->
+              _menhir_run_096 _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+          | FUNC ->
+              _menhir_run_097 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | BLOB ->
+              _menhir_run_108 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | COMMA | RPAR ->
+          let (_endpos_id_, _startpos_id_, id) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_062 _endpos_id_ _startpos_id_ id in
+          _menhir_goto_prim_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_id_ _startpos_id_ _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_135 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_param_typ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell1_param_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_083 x xs in
+      _menhir_goto_seplist_param_typ_COMMA_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_param_typ_COMMA_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState134 ->
+          _menhir_run_135 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState088 ->
+          _menhir_run_131 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_131 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_LPAR -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell1_LPAR (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let fs = _v in
+      let _v = _menhir_action_058 fs in
+      _menhir_goto_param_typs _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_param_typs : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState201 ->
+          _menhir_run_202 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState167 ->
+          _menhir_run_171 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | MenhirState099 ->
+          _menhir_run_100 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState140 ->
+          _menhir_run_098 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | MenhirState087 ->
+          _menhir_run_098 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | MenhirState097 ->
+          _menhir_run_098 _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_202 : type  ttv_stack. (((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_assertion as 'stack) -> _ -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_tests) _menhir_state -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+      match (_tok : MenhirBasics.token) with
+      | TEXT _v_0 ->
+          let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          let (_endpos_s_, _startpos_s_, s) = (_endpos, _startpos_1, _v_0) in
+          let _v = _menhir_action_054 _endpos_s_ _startpos_s_ s in
+          _menhir_goto_option_text_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_s_ _v _tok
+      | EOF | SEMICOLON ->
+          let _v = _menhir_action_053 () in
+          _menhir_goto_option_text_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_goto_option_text_ : type  ttv_stack. (((ttv_stack, _menhir_box_parse_tests) _menhir_cell1_ID, _menhir_box_parse_tests) _menhir_cell1_assertion, _menhir_box_parse_tests) _menhir_cell1_param_typs -> _ -> _ -> _ -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_param_typs (_menhir_stack, _, tys, _) = _menhir_stack in
+      let MenhirCell1_assertion (_menhir_stack, _, assertion) = _menhir_stack in
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_desc_, desc) = (_endpos, _v) in
+      let _v = _menhir_action_098 _endpos_desc_ _endpos_id_ _startpos_id_ assertion desc id tys in
+      let (_endpos, _startpos) = (_endpos_desc_, _startpos_id_) in
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_test (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+          let _endpos_0 = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos_0) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | ID _v_1 ->
+              _menhir_run_188 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState206
+          | EOF ->
+              let _v_2 = _menhir_action_087 () in
+              _menhir_run_207 _menhir_stack _menhir_lexbuf _endpos_0 _v_2
+          | _ ->
+              _eRR ())
+      | EOF ->
+          let (_endpos_x_, _startpos_x_, x) = (_endpos, _startpos, _v) in
+          let _v = _menhir_action_088 x in
+          _menhir_goto_seplist_test_SEMICOLON_ _menhir_stack _menhir_lexbuf _endpos_x_ _startpos_x_ _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_171 : type  ttv_stack. ((ttv_stack, _menhir_box_parse_prog) _menhir_cell1_seplist_def_SEMICOLON_ _menhir_cell0_SERVICE _menhir_cell0_id_opt as 'stack) -> _ -> _ -> _ -> _ -> ('stack, _menhir_box_parse_prog) _menhir_state -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | ARROW ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LCURLY ->
+              let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+              _menhir_run_085 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState172
+          | ID _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id, _startpos_args_, args) = (_endpos, _startpos_1, _v_0, _startpos, _v) in
+              let _v = _menhir_action_008 _endpos_id_ _startpos_args_ _startpos_id_ args id in
+              _menhir_goto_actor_class_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_100 : type  ttv_stack ttv_result. ((ttv_stack, ttv_result) _menhir_cell1_param_typs as 'stack) -> _ -> _ -> _ -> _ -> _ -> ('stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+      match (_tok : MenhirBasics.token) with
+      | QUERY ->
+          _menhir_run_101 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState100
+      | ONEWAY ->
+          _menhir_run_102 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState100
+      | COMPOSITE_QUERY ->
+          _menhir_run_103 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState100
+      | COMMA | EOF | ID _ | RCURLY | RPAR | SEMICOLON | SERVICE ->
+          let _v_0 = _menhir_action_037 () in
+          _menhir_run_104 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v_0 _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_101 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+      let _v = _menhir_action_035 _endpos__1_ _startpos__1_ in
+      _menhir_goto_func_mode _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+  
+  and _menhir_goto_func_mode : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_func_mode (_menhir_stack, _menhir_s, _v) in
+      match (_tok : MenhirBasics.token) with
+      | QUERY ->
+          _menhir_run_101 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState105
+      | ONEWAY ->
+          _menhir_run_102 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState105
+      | COMPOSITE_QUERY ->
+          _menhir_run_103 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState105
+      | COMMA | EOF | ID _ | RCURLY | RPAR | SEMICOLON | SERVICE ->
+          let _v_0 = _menhir_action_037 () in
+          _menhir_run_106 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v_0 _tok
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_102 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+      let _v = _menhir_action_034 _endpos__1_ _startpos__1_ in
+      _menhir_goto_func_mode _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+  
+  and _menhir_run_103 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let (_endpos__1_, _startpos__1_) = (_endpos, _startpos) in
+      let _v = _menhir_action_036 _endpos__1_ _startpos__1_ in
+      _menhir_goto_func_mode _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok
+  
+  and _menhir_run_106 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_func_mode -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_func_mode (_menhir_stack, _menhir_s, m) = _menhir_stack in
+      let (_endpos_ms_, ms) = (_endpos, _v) in
+      let _v = _menhir_action_038 m ms in
+      _menhir_goto_func_modes_opt _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_ms_ _v _menhir_s _tok
+  
+  and _menhir_goto_func_modes_opt : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState105 ->
+          _menhir_run_106 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState100 ->
+          _menhir_run_104 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_104 : type  ttv_stack ttv_result. ((ttv_stack, ttv_result) _menhir_cell1_param_typs, ttv_result) _menhir_cell1_param_typs -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_param_typs (_menhir_stack, _, t2, _) = _menhir_stack in
+      let MenhirCell1_param_typs (_menhir_stack, _menhir_s, t1, _startpos_t1_) = _menhir_stack in
+      let (_endpos_ms_, ms) = (_endpos, _v) in
+      let _v = _menhir_action_039 _endpos_ms_ _startpos_t1_ ms t1 t2 in
+      _menhir_goto_func_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_ms_ _v _menhir_s _tok
+  
+  and _menhir_goto_func_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState140 ->
+          _menhir_run_142 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState087 ->
+          _menhir_run_138 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | MenhirState097 ->
+          _menhir_run_107 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_142 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_044 _endpos_id_ _endpos_t_ _startpos_id_ id t in
+      _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_goto_meth_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok ->
+      match (_tok : MenhirBasics.token) with
+      | SEMICOLON ->
+          let _menhir_stack = MenhirCell1_meth_typ (_menhir_stack, _menhir_s, _v) in
+          let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+          let _menhir_stack = MenhirCell0_SEMICOLON (_menhir_stack, _endpos) in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | TEXT _v_0 ->
+              _menhir_run_086 _menhir_stack _menhir_lexbuf _menhir_lexer _v_0 MenhirState146
+          | ID _v_1 ->
+              _menhir_run_139 _menhir_stack _menhir_lexbuf _menhir_lexer _v_1 MenhirState146
+          | RCURLY ->
+              let _v_2 = _menhir_action_078 () in
+              _menhir_run_147 _menhir_stack _menhir_lexbuf _menhir_lexer _v_2
+          | _ ->
+              _eRR ())
+      | RCURLY ->
+          let x = _v in
+          let _v = _menhir_action_079 x in
+          _menhir_goto_seplist_meth_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_139 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      let _startpos = _menhir_lexbuf.Lexing.lex_start_p in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | COLON ->
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              let _menhir_stack = MenhirCell1_ID (_menhir_stack, _menhir_s, _v, _startpos, _endpos) in
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState140
+          | ID _v_0 ->
+              let _startpos_1 = _menhir_lexbuf.Lexing.lex_start_p in
+              let _endpos_2 = _menhir_lexbuf.Lexing.lex_curr_p in
+              let _tok = _menhir_lexer _menhir_lexbuf in
+              let (_endpos_id_, _startpos_id_, id, _endpos_id_inlined1_, _startpos_id_inlined1_, id_inlined1) = (_endpos_2, _startpos_1, _v_0, _endpos, _startpos, _v) in
+              let _v = _menhir_action_046 _endpos_id_ _endpos_id_inlined1_ _startpos_id_ _startpos_id_inlined1_ id id_inlined1 in
+              _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_147 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_meth_typ _menhir_cell0_SEMICOLON -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let MenhirCell0_SEMICOLON (_menhir_stack, _) = _menhir_stack in
+      let MenhirCell1_meth_typ (_menhir_stack, _menhir_s, x) = _menhir_stack in
+      let xs = _v in
+      let _v = _menhir_action_080 x xs in
+      _menhir_goto_seplist_meth_typ_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s
+  
+  and _menhir_goto_seplist_meth_typ_SEMICOLON_ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s ->
+      match _menhir_s with
+      | MenhirState146 ->
+          _menhir_run_147 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | MenhirState085 ->
+          _menhir_run_143 _menhir_stack _menhir_lexbuf _menhir_lexer _v
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_143 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_LCURLY -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      let MenhirCell1_LCURLY (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos__3_, ds) = (_endpos, _v) in
+      let _v = _menhir_action_009 ds in
+      _menhir_goto_actor_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos__3_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_goto_actor_typ : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      match _menhir_s with
+      | MenhirState167 ->
+          _menhir_run_175 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok
+      | MenhirState172 ->
+          _menhir_run_174 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _tok
+      | MenhirState084 ->
+          _menhir_run_148 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok
+      | _ ->
+          _menhir_fail ()
+  
+  and _menhir_run_148 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_SERVICE -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_SERVICE (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_ts_, ts) = (_endpos, _v) in
+      let _v = _menhir_action_067 _endpos_ts_ _startpos__1_ ts in
+      _menhir_goto_ref_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_ts_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_138 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_045 _endpos_s_ _endpos_t_ _startpos_s_ s t in
+      _menhir_goto_meth_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_107 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_FUNC -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_FUNC (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_066 t in
+      _menhir_goto_ref_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  and _menhir_run_098 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _startpos _v _menhir_s _tok ->
+      let _menhir_stack = MenhirCell1_param_typs (_menhir_stack, _menhir_s, _v, _startpos) in
+      match (_tok : MenhirBasics.token) with
+      | ARROW ->
+          let _menhir_s = MenhirState099 in
+          let _tok = _menhir_lexer _menhir_lexbuf in
+          (match (_tok : MenhirBasics.token) with
+          | LPAR ->
+              _menhir_run_088 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+          | _ ->
+              _eRR ())
+      | _ ->
+          _eRR ()
+  
+  and _menhir_run_130 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let t = _v in
+      let _v = _menhir_action_056 _endpos_id_ _startpos_id_ id t in
+      _menhir_goto_param_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_127 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_TEXT -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _v _tok ->
+      let MenhirCell1_TEXT (_menhir_stack, _menhir_s, s, _startpos_s_, _endpos_s_) = _menhir_stack in
+      let t = _v in
+      let _v = _menhir_action_057 _endpos_s_ _startpos_s_ s t in
+      _menhir_goto_param_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_125 : type  ttv_stack ttv_result. ttv_stack -> _ -> _ -> _ -> _ -> _ -> (ttv_stack, ttv_result) _menhir_state -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _startpos _v _menhir_s _tok ->
+      let (_endpos_t_, _startpos_t_, t) = (_endpos, _startpos, _v) in
+      let _v = _menhir_action_064 _endpos_t_ _startpos_t_ t in
+      _menhir_goto_record_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_118 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_ID -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_ID (_menhir_stack, _menhir_s, id, _startpos_id_, _endpos_id_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_028 _endpos_id_ _endpos_t_ _startpos_id_ id t in
+      _menhir_goto_field_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_115 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_NAT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_NAT (_menhir_stack, _menhir_s, n, _startpos_n_, _endpos_n_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_027 _endpos_n_ _endpos_t_ _startpos_n_ n t in
+      _menhir_goto_field_typ _menhir_stack _menhir_lexbuf _menhir_lexer _v _menhir_s _tok
+  
+  and _menhir_run_111 : type  ttv_stack ttv_result. (ttv_stack, ttv_result) _menhir_cell1_OPT -> _ -> _ -> _ -> _ -> _ -> ttv_result =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _v _tok ->
+      let MenhirCell1_OPT (_menhir_stack, _menhir_s, _startpos__1_) = _menhir_stack in
+      let (_endpos_t_, t) = (_endpos, _v) in
+      let _v = _menhir_action_015 _endpos_t_ _startpos__1_ t in
+      _menhir_goto_cons_typ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos_t_ _startpos__1_ _v _menhir_s _tok
+  
+  let _menhir_run_075 : type  ttv_stack. ttv_stack -> _ -> _ -> _menhir_box_parse_prog =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TYPE ->
+          _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState075
+      | IMPORT ->
+          _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer MenhirState075
+      | EOF | SERVICE ->
+          let _v = _menhir_action_072 () in
+          _menhir_run_163 _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _endpos _v MenhirState075 _tok
+      | _ ->
+          _eRR ()
+  
+  let _menhir_run_185 : type  ttv_stack. ttv_stack -> _ -> _ -> _menhir_box_parse_tests =
+    fun _menhir_stack _menhir_lexbuf _menhir_lexer ->
+      let _menhir_s = MenhirState185 in
+      let _endpos = _menhir_lexbuf.Lexing.lex_curr_p in
+      let _tok = _menhir_lexer _menhir_lexbuf in
+      match (_tok : MenhirBasics.token) with
+      | TYPE ->
+          _menhir_run_076 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | IMPORT ->
+          _menhir_run_161 _menhir_stack _menhir_lexbuf _menhir_lexer _menhir_s
+      | EOF | ID _ ->
+          let _v = _menhir_action_025 () in
+          _menhir_goto_endlist_def_SEMICOLON_ _menhir_stack _menhir_lexbuf _menhir_lexer _endpos _endpos _v _menhir_s _tok
+      | _ ->
+          _eRR ()
+  
+end
+
+let parse_tests =
+  fun _menhir_lexer _menhir_lexbuf ->
+    let _menhir_stack = () in
+    let MenhirBox_parse_tests v = _menhir_run_185 _menhir_stack _menhir_lexbuf _menhir_lexer in
+    v
+
+let parse_prog =
+  fun _menhir_lexer _menhir_lexbuf ->
+    let _menhir_stack = () in
+    let MenhirBox_parse_prog v = _menhir_run_075 _menhir_stack _menhir_lexbuf _menhir_lexer in
+    v
+
+let parse_args =
+  fun _menhir_lexer _menhir_lexbuf ->
+    let _menhir_stack = () in
+    let MenhirBox_parse_args v = _menhir_run_000 _menhir_stack _menhir_lexbuf _menhir_lexer in
+    v
+
+# 292 "idllib/parser.mly"
+  
+
+# 5055 "idllib/parser.ml"
+
+
+
+ + + diff --git a/coverage/idllib/pipeline.ml.html b/coverage/idllib/pipeline.ml.html new file mode 100644 index 00000000000..b84517915a1 --- /dev/null +++ b/coverage/idllib/pipeline.ml.html @@ -0,0 +1,613 @@ + + + + + pipeline.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+
+
open Printf
+
+(* Diagnostics *)
+
+let phase heading name =
+  if !Flags.verbose then printf "-- %s %s:\n%!" heading name
+
+let error at cat text =
+  Error [Diag.error_message at "" cat text]
+
+let print_stat_te =
+  Typing.Env.iter (fun x t ->
+    printf "%s %s = %s\n"
+      "type" x (Arrange_idl.string_of_typ t)
+  )
+
+let dump_prog flag prog =
+    if flag then
+      Wasm.Sexpr.print 80 (Arrange_idl.prog prog)
+
+(* Parsing *)
+
+type rel_path = string
+
+type parse_result = (Syntax.prog * rel_path) Diag.result
+
+let parse_with lexer parser name =
+  try
+    phase "Parsing" name;
+    lexer.Lexing.lex_curr_p <-
+      {lexer.Lexing.lex_curr_p with Lexing.pos_fname = name};
+    let prog = parser Lexer.token lexer name in
+    Ok prog
+  with
+    | Source.ParseError (at, msg) ->
+      error at "syntax" msg
+    | Parser.Error ->
+      error (Lexer.region lexer) "syntax" "unexpected token"
+
+let parse_file filename : parse_result =
+  let ic = open_in filename in
+  let lexer = Lexing.from_channel ic in
+  let parser = Parser.parse_prog in
+  let name = Filename.basename filename in
+  let result = parse_with lexer parser name in
+  close_in ic;
+  match result with
+  | Ok prog ->
+     dump_prog !Flags.dump_parse prog;
+     Diag.return (prog, filename)
+  | Error e -> Error e
+
+let parse_string s : parse_result =
+  let lexer = Lexing.from_string s in
+  let parser = Parser.parse_prog in
+  let result = parse_with lexer parser "source1" in
+  match result with
+  | Ok prog -> Diag.return (prog, "source2")
+  | Error e -> Error e
+
+let parse_file filename : parse_result =
+  try parse_file filename
+  with Sys_error s ->
+    error Source.no_region "file" (sprintf "cannot open \"%s\"" filename)
+
+(* Type checking *)
+
+let check_prog senv prog
+  : (Typing.scope * Syntax.typ option) Diag.result =
+  phase "Checking" prog.Source.note.Syntax.filename;
+  let r = Typing.check_prog senv prog in
+  (match r with
+   | Ok ((scope, _), _) ->
+      if !Flags.verbose then print_stat_te scope;
+   | Error _ -> ());
+  r
+
+(* Imported file loading *)
+
+type load_result = (Syntax.prog * Typing.scope * Syntax.typ option) Diag.result
+
+module LibEnv = Env.Make(String)
+
+let merge_env imports init_env lib_env =
+  let disjoint_union env1 env2 : Typing.typ_env Diag.result =
+    try Diag.return (Typing.Env.union (fun k v1 v2 ->
+        (* TODO Add proper type equivalence check for env *)
+        if v1 = v2 then Some v1 else raise (Typing.Env.Clash k)
+      ) env1 env2)
+    with Typing.Env.Clash k ->
+      error Source.no_region "import" (sprintf "conflict type definition for %s" k) in
+  let env_list = List.map (fun import -> LibEnv.find import lib_env) imports in
+  Diag.fold disjoint_union init_env env_list
+
+let chase_imports senv imports =
+  let module S = Resolve_import.Set in
+  let pending = ref S.empty in
+  let lib_env = ref LibEnv.empty in
+  let rec go file =
+    if S.mem file !pending then
+      error Source.no_region "import" (sprintf "file %s must not depend on itself" file)
+    else if LibEnv.mem file !lib_env then
+      Diag.return ()
+    else begin
+        pending := S.add file !pending;
+        let open Diag.Syntax in
+        let* prog, base = parse_file file in
+        let* imports = Resolve_import.resolve prog base in
+        let* () = go_set imports in
+        let* base_env = merge_env imports senv !lib_env in
+        let* scope, _ = check_prog base_env prog in
+        lib_env := LibEnv.add file scope !lib_env;
+        pending := S.remove file !pending;
+        Diag.return ()
+      end
+  and go_set todo = Diag.traverse_ go todo
+  in Diag.map (fun () -> !lib_env) (go_set imports)
+
+let load_prog parse senv =
+  let open Diag.Syntax in
+  let* prog, base = parse in
+  let* imports = Resolve_import.resolve prog base in
+  let* lib_env = chase_imports senv imports in
+  let* base_env = merge_env imports senv lib_env in
+  let* scope, actor = check_prog base_env prog in
+  Diag.return (prog, scope, actor)
+
+(* Only type checking *)
+
+let initial_stat_env = Typing.empty_scope
+
+let check_string source : load_result = load_prog (parse_string source) initial_stat_env
+let check_file file : load_result = load_prog (parse_file file) initial_stat_env
+let check_prog prog : Typing.scope Diag.result =
+  let open Diag.Syntax in
+  let* scope, _ = check_prog initial_stat_env prog in
+  Diag.return scope
+
+(* JS Compilation *)
+
+type compile_result = Buffer.t Diag.result
+
+let compile_js_file file : compile_result =
+  let open Diag.Syntax in
+  let* prog, senv, _ = check_file file in
+  phase "JS Compiling" file;
+  Diag.return (Compile_js.compile senv prog)
+
+let compile_js_string source : compile_result =
+  let open Diag.Syntax in
+  let* prog, senv, _ = check_string source in
+  phase "JS Compiling" "source3";
+  Diag.return (Compile_js.compile senv prog)
+
+(* Test file *)
+
+type parse_test_file_result = Syntax.tests Diag.result
+
+let parse_test_file filename : parse_test_file_result =
+  let ic = open_in filename in
+  let lexer = Lexing.from_channel ic in
+  let parser = Parser.parse_tests in
+  let name = Filename.basename filename in
+  let result = parse_with lexer parser name in
+  close_in ic;
+  match result with
+  | Ok prog -> Diag.return prog
+  | Error e -> Error e
+
+(* Values *)
+
+let parse_values s =
+  let lexer = Lexing.from_string s in
+  lexer.Lexing.lex_curr_p <-
+      {lexer.Lexing.lex_curr_p with Lexing.pos_fname = "(string)"};
+  try
+    Diag.return (Parser.parse_args Lexer.token lexer)
+  with
+    | Source.ParseError (at, msg) ->
+      error at "syntax" msg
+    | Parser.Error ->
+      error (Lexer.region lexer) "syntax" "unexpected token"
+
+
+
+ + + diff --git a/coverage/idllib/resolve_import.ml.html b/coverage/idllib/resolve_import.ml.html new file mode 100644 index 00000000000..5a5584d51f3 --- /dev/null +++ b/coverage/idllib/resolve_import.ml.html @@ -0,0 +1,139 @@ + + + + + resolve_import.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+
+
type filepath = string
+
+module Set = Set.Make(String)
+
+type env = {
+  msgs : Diag.msg_store;
+  base : filepath Lazy.t;
+  imported : Set.t ref;
+}
+
+open Syntax
+open Source
+
+let rec decs env = List.iter (dec env)
+and dec env d = match d.it with
+  | TypD _ -> ()
+  | ImportD (f, fp) ->
+     let f = if Filename.is_relative f
+             then Filename.concat (Lazy.force env.base) f
+             else f in
+     fp := f;
+     env.imported := Set.add f !(env.imported)
+         
+let prog env p = decs env p.it.decs
+   
+let resolve : Syntax.prog -> filepath -> filepath list Diag.result = fun p base ->
+  Diag.with_message_store (fun msgs ->
+      let base = lazy (if Sys.is_directory base then base else Filename.dirname base) in
+      let env = { msgs; base; imported = ref Set.empty } in
+      prog env p;
+      Some (Set.elements !(env.imported))
+    )
+    
+       
+
+
+
+ + + diff --git a/coverage/idllib/typing.ml.html b/coverage/idllib/typing.ml.html new file mode 100644 index 00000000000..b7c85af9b92 --- /dev/null +++ b/coverage/idllib/typing.ml.html @@ -0,0 +1,802 @@ + + + + + typing.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+
+
open Syntax
+open Source
+open Arrange_idl
+
+(* Environments *)
+module FieldEnv = Env.Make(Lib.Uint32)
+module Env = Env.Make(String)
+module TS = Set.Make(String)           
+           
+(* Error recovery *)
+
+exception Recover
+
+let recover_with (x : 'a) (f : 'b -> 'a) (y : 'b) = try f y with Recover -> x
+let recover_opt f y = recover_with None (fun y -> Some (f y)) y
+let _recover f y = recover_with () f y
+
+(* Scopes *)
+
+type typ_env = typ Env.t
+
+type scope = typ_env
+
+let empty_scope : scope = Env.empty;
+
+(* Contexts (internal) *)
+
+type env =
+  { typs : typ_env;
+    msgs : Diag.msg_store;
+    pre: bool;
+  }
+
+let env_of_scope msgs scope =
+  { typs = scope;
+    msgs;
+    pre = false;
+  }
+
+(* Error bookkeeping *)
+
+let type_error at : string -> Diag.message = Diag.error_message at "" "type"
+let type_warning at : string -> Diag.message = Diag.warning_message at "" "type"
+
+let _local_error env at fmt =
+  Printf.ksprintf (fun s -> Diag.add_msg env.msgs (type_error at s)) fmt
+let error env at fmt =
+  Printf.ksprintf (fun s -> Diag.add_msg env.msgs (type_error at s); raise Recover) fmt
+let _warn env at fmt =
+  Printf.ksprintf (fun s -> Diag.add_msg env.msgs (type_warning at s)) fmt
+
+(* Context extension *)
+
+let adjoin env scope =
+  { env with
+    typs = Env.adjoin env.typs scope;
+  }
+
+let disjoint_union env at fmt env1 env2 =
+  try Env.disjoint_union env1 env2
+  with Env.Clash k -> error env at fmt k
+
+(* Types *)
+let hash = IdlHash.idl_hash
+
+let field_id (f: typ_field) =
+  match f.it.label.it with
+  | Id n -> n
+  | Named name -> hash name
+  | Unnamed n -> n
+let field_name (f: typ_field) =
+  match f.it.label.it with
+  | Id n -> Lib.Uint32.to_string n
+  | Named name -> name
+  | Unnamed n -> "Unnamed " ^ (Lib.Uint32.to_string n)
+
+let compare_field (f1: typ_field) (f2: typ_field) = Lib.Uint32.compare (field_id f1) (field_id f2)
+let compare_meth (m1: typ_meth) (m2: typ_meth) = compare m1.it.var m2.it.var
+let find_type env id =
+  match Env.find_opt id.it env.typs with
+  | None -> error env id.at "unbound type identifier %s" id.it
+  | Some t -> t
+let rec as_func env t =
+  match t.it with
+  | FuncT _ -> Some t
+  | VarT id -> as_func env (find_type env id)
+  | _ -> None
+
+let rec as_serv env t =
+  match t.it with
+  | ServT _ -> Some t
+  | VarT id -> as_serv env (find_type env id)
+  | _ -> None
+
+let check_cycle env =
+  Env.iter (fun x t ->
+      let rec has_cycle seen t =
+        match t.it with
+        | VarT id ->
+           TS.mem id.it seen ||
+             begin
+               let seen = TS.add id.it seen in
+               let t' = find_type env id in
+               has_cycle seen t'
+             end
+        | _ -> false
+      in
+      if has_cycle TS.empty t then error env t.at "%s has a cyclic type definition" x
+    ) env.typs
+
+let rec check_typ env t =
+  match t.it with
+  | PrimT prim -> t
+  | PrincipalT -> t
+  | VarT id -> ignore (find_type env id); t
+  | FuncT (ms, t1, t2) ->
+     let t1' = List.map (fun t -> check_typ env t) t1 in
+     let t2' = List.map (fun t -> check_typ env t) t2 in
+     if List.length ms > 1 then
+       error env t.at "cannot have more than one mode"
+     else if List.length ms = 1 && (List.hd ms).it = Oneway && List.length t2 > 0 then
+       error env t.at "oneway function has non-unit return type";
+     FuncT (ms, t1', t2') @@ t.at
+  | OptT t -> OptT (check_typ env t) @@ t.at
+  | VecT t -> VecT (check_typ env t) @@ t.at
+  | BlobT -> BlobT @@ t.at
+  | RecordT fs ->
+     let fs' = check_fields env fs in
+     RecordT (List.sort compare_field fs') @@ t.at
+  | VariantT fs ->
+     let fs' = check_fields env fs in
+     VariantT (List.sort compare_field fs') @@ t.at
+  | ServT meths ->
+     let ms' = check_meths env meths in
+     ServT (List.sort compare_meth ms') @@ t.at
+  | ClassT _ ->
+     error env t.at "service constructor not supported"
+  | PreT -> assert false
+
+and check_fields env fs =
+  let _, fields =
+    List.fold_left (fun (fenv, fields) f ->
+        let f_id = field_id f in
+        let f_name = field_name f in
+        match FieldEnv.find_opt f_id fenv with
+        | Some name' ->
+           error env f.it.label.at "field name %s hash collision with field %s" f_name name'
+        | None ->
+           let t' = check_typ env f.it.typ in
+           let f' = {label=f.it.label; typ=t'} @@ f.at in
+           FieldEnv.disjoint_add f_id f_name fenv, f'::fields
+      ) (FieldEnv.empty, []) fs
+  in fields
+
+and check_meth env meth =
+  let t' = check_typ env meth.it.meth in
+  if env.pre then {var=meth.it.var; meth=t'} @@ meth.at
+  else
+    match as_func env t' with
+    | None ->
+       error env meth.it.meth.at "%s is a non-function type\n %s" meth.it.var.it (string_of_typ t');
+    | Some _ -> {var=meth.it.var; meth=t'} @@ meth.at
+
+and check_meths env meths =
+  let _, meths =
+    List.fold_left (fun (name_env, meths) meth ->
+        if TS.mem meth.it.var.it name_env then
+          error env meth.it.var.at "duplicate binding for %s in service" meth.it.var.it
+        else
+          let meth' = check_meth env meth in
+          (TS.add meth.it.var.it name_env, meth'::meths)
+      ) (TS.empty, []) meths
+  in meths
+  
+(* Declarations *)
+                    
+and check_def env dec =
+  match dec.it with
+  | TypD (id, t) ->
+     let t' = check_typ env t in
+     Env.singleton id.it t'
+  | ImportD _ -> Env.empty
+
+and check_defs env decs =
+  let env' =
+    List.fold_left (fun env dec ->
+        let te' = check_def env dec in
+        adjoin env te'
+      ) env decs
+  in env'.typs
+
+and check_decs env decs =
+  let pre_env = adjoin env (gather_decs env decs) in
+  let te = check_defs {pre_env with pre = true} decs in
+  let env = env_of_scope env.msgs te in
+  check_cycle env;
+  check_defs {env with pre = false} decs
+    
+and gather_decs env decs =
+  List.fold_left (fun te dec ->
+      match dec.it with
+      | TypD (id, _) ->
+         let te' = Env.singleton id.it (PreT @@ id.at) in
+         disjoint_union env id.at "duplicate binding for %s in type definitions" te te'
+      | ImportD _ -> te
+    ) env.typs decs
+
+(* Actor *)
+
+let check_service env t =
+  match as_serv env t with
+  | None ->
+     error env t.at "%s is a non-service type\n %s" (string_of_typ t) (string_of_typ t)
+  | Some {it=ServT meths; _} ->
+     let meths' = check_meths env meths in
+     ServT (List.sort compare_meth meths') @@ t.at
+  | Some _ -> assert false
+
+let check_main_service env actor_opt =
+  match actor_opt with
+  | None -> None
+  | Some {it=ClassT (args, t); at; _} ->
+     let args = List.map (check_typ env) args in
+     let t = check_service env t in
+     Some (ClassT (args, t) @@ at)
+  | Some t -> Some (check_service env t)
+
+(* Programs *)
+
+let check_prog scope prog : (scope * typ option) Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun prog ->
+          let env = env_of_scope msgs scope in
+          let te = check_decs env prog.it.decs in
+          let actor = check_main_service (env_of_scope msgs te) prog.it.actor in
+          (te, actor)
+        )
+        prog
+    )
+
+(* Test declarations *)
+
+let check_tdecs scope decs : scope Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun prog -> check_decs (env_of_scope msgs scope) decs)
+        prog
+    )
+
+
+
+ + + diff --git a/coverage/index.html b/coverage/index.html new file mode 100644 index 00000000000..034da9c5221 --- /dev/null +++ b/coverage/index.html @@ -0,0 +1,1016 @@ + + + + + Coverage report + + + + + +
+
+ + + + 93% (10754 / 11542) + + codegen/compile.ml + +
+
+ + + + 0% (3 / 311) + + codegen/die.ml + +
+
+ + + + 77% (125 / 161) + + codegen/instrList.ml + +
+
+ + + + 31% (166 / 528) + + exes/deser.ml + +
+
+ + + + 60% (30 / 50) + + exes/didc.ml + +
+
+ + + + 61% (24 / 39) + + exes/mo_ld.ml + +
+
+ + + + 58% (79 / 135) + + exes/moc.ml + +
+
+ + + + 81% (62 / 76) + + ic/url.ml + +
+
+ + + + 76% (204 / 267) + + idllib/arrange_idl.ml + +
+
+ + + + 95% (223 / 233) + + idllib/compile_js.ml + +
+
+ + + + 49% (73 / 147) + + idllib/escape.ml + +
+
+ + + + 100% (0 / 0) + + idllib/exception.ml + +
+
+ + + + 100% (0 / 0) + + idllib/flags.ml + +
+
+ + + + 100% (7 / 7) + + idllib/idlHash.ml + +
+
+ + + + 83% (118 / 142) + + idllib/lexer.ml + +
+
+ + + + 37% (585 / 1563) + + idllib/parser.ml + +
+
+ + + + 68% (80 / 117) + + idllib/pipeline.ml + +
+
+ + + + 88% (16 / 18) + + idllib/resolve_import.ml + +
+
+ + + + 87% (149 / 170) + + idllib/typing.ml + +
+
+ + + + 1% (3 / 286) + + ir_def/arrange_ir.ml + +
+
+ + + + 81% (896 / 1099) + + ir_def/check_ir.ml + +
+
+ + + + 92% (365 / 396) + + ir_def/construct.ml + +
+
+ + + + 96% (141 / 146) + + ir_def/freevars.ml + +
+
+ + + + 74% (76 / 102) + + ir_def/ir.ml + +
+
+ + + + 98% (63 / 64) + + ir_def/ir_effect.ml + +
+
+ + + + 100% (14 / 14) + + ir_def/ir_utils.ml + +
+
+ + + + 100% (0 / 0) + + ir_def/note.ml + +
+
+ + + + 82% (156 / 190) + + ir_def/rename.ml + +
+
+ + + + 0% (6 / 658) + + ir_interpreter/interpret_ir.ml + +
+
+ + + + 96% (447 / 463) + + ir_passes/async.ml + +
+
+ + + + 87% (444 / 510) + + ir_passes/await.ml + +
+
+ + + + 92% (142 / 154) + + ir_passes/const.ml + +
+
+ + + + 89% (228 / 255) + + ir_passes/eq.ml + +
+
+ + + + 91% (170 / 186) + + ir_passes/erase_typ_field.ml + +
+
+ + + + 92% (289 / 314) + + ir_passes/show.ml + +
+
+ + + + 91% (180 / 197) + + ir_passes/tailcall.ml + +
+
+ + + + 94% (70 / 74) + + lang_utils/diag.ml + +
+
+ + + + 80% (4 / 5) + + lang_utils/dom.ml + +
+
+ + + + 68% (11 / 16) + + lang_utils/env.ml + +
+
+ + + + 100% (0 / 0) + + lang_utils/error_codes.ml + +
+
+ + + + 100% (85 / 85) + + lang_utils/expGraph.ml + +
+
+ + + + 95% (20 / 21) + + lang_utils/lbool.ml + +
+
+ + + + 69% (36 / 52) + + lang_utils/nameRel.ml + +
+
+ + + + 100% (37 / 37) + + lang_utils/scc.ml + +
+
+ + + + 93% (14 / 15) + + lang_utils/source.ml + +
+
+ + + + 44% (26 / 58) + + lang_utils/trivia.ml + +
+
+ + + + 47% (328 / 696) + + lib/lib.ml + +
+
+ + + + 93% (539 / 574) + + linking/linkModule.ml + +
+
+ + + + 90% (975 / 1080) + + lowering/desugar.ml + +
+
+ + + + 77% (7 / 9) + + mo_config/args.ml + +
+
+ + + + 100% (0 / 0) + + mo_config/flags.ml + +
+
+ + + + 40% (2 / 5) + + mo_config/internal_error.ml + +
+
+ + + + 0% (0 / 502) + + mo_def/arrange.ml + +
+
+ + + + 98% (49 / 50) + + mo_def/compUnit.ml + +
+
+ + + + 54% (28 / 51) + + mo_def/syntax.ml + +
+
+ + + + 82% (219 / 266) + + mo_frontend/bi_match.ml + +
+
+ + + + 91% (294 / 321) + + mo_frontend/coverage.ml + +
+
+ + + + 99% (210 / 212) + + mo_frontend/definedness.ml + +
+
+ + + + 97% (98 / 101) + + mo_frontend/effect.ml + +
+
+ + + + 100% (125 / 125) + + mo_frontend/error_reporting.ml + +
+
+ + + + 100% (69 / 69) + + mo_frontend/lexer.ml + +
+
+ + + + 100% (5 / 5) + + mo_frontend/lexer_lib.ml + +
+ +
+ + + + 46% (2550 / 5538) + + mo_frontend/parser.ml + +
+
+ + + + 100% (0 / 0) + + mo_frontend/parser_lib.ml + +
+
+ + + + 57% (36 / 63) + + mo_frontend/parsing.ml + +
+
+ + + + 37% (85 / 228) + + mo_frontend/printers.ml + +
+
+ + + + 90% (254 / 281) + + mo_frontend/source_lexer.ml + +
+
+ + + + 46% (122 / 264) + + mo_frontend/source_token.ml + +
+
+ + + + 100% (40 / 40) + + mo_frontend/stability.ml + +
+
+ + + + 65% (57 / 87) + + mo_frontend/static.ml + +
+
+ + + + 98% (136 / 138) + + mo_frontend/traversals.ml + +
+
+ + + + 91% (2174 / 2383) + + mo_frontend/typing.ml + +
+
+ + + + 80% (50 / 62) + + mo_frontend/variance.ml + +
+
+ + + + 84% (86 / 102) + + mo_idl/idl_to_mo.ml + +
+
+ + + + 94% (162 / 171) + + mo_idl/mo_to_idl.ml + +
+
+ + + + 42% (333 / 776) + + mo_interpreter/interpret.ml + +
+
+ + + + 0% (0 / 76) + + mo_types/arrange_type.ml + +
+
+ + + + 100% (3 / 3) + + mo_types/async_cap.ml + +
+
+ + + + 87% (21 / 24) + + mo_types/cons.ml + +
+
+ + + + 80% (99 / 123) + + mo_types/expansive.ml + +
+
+ + + + 100% (9 / 9) + + mo_types/hash.ml + +
+
+ + + + 96% (24 / 25) + + mo_types/productive.ml + +
+
+ + + + 100% (10 / 10) + + mo_types/scope.ml + +
+
+ + + + 84% (80 / 95) + + mo_types/typ_hash.ml + +
+
+ + + + 84% (1279 / 1518) + + mo_types/type.ml + +
+
+ + + + 0% (0 / 30) + + mo_values/arrange_ops.ml + +
+
+ + + + 37% (6 / 16) + + mo_values/call_conv.ml + +
+
+ + + + 56% (146 / 258) + + mo_values/numerics.ml + +
+
+ + + + 37% (125 / 333) + + mo_values/operator.ml + +
+
+ + + + 14% (100 / 677) + + mo_values/prim.ml + +
+
+ + + + 30% (40 / 130) + + mo_values/show.ml + +
+
+ + + + 55% (149 / 267) + + mo_values/value.ml + +
+
+ + + + 83% (378 / 453) + + pipeline/pipeline.ml + +
+
+ + + + 93% (123 / 132) + + pipeline/resolve_import.ml + +
+
+ + + + 100% (3 / 3) + + prelude/prelude.ml + +
+
+ + + + 5% (4 / 69) + + profiler/counters.ml + +
+
+ + + + 23% (3 / 13) + + profiler/profiler.ml + +
+
+ + + + 100% (0 / 0) + + profiler/profilerFlags.ml + +
+
+ + + + 100% (0 / 0) + + rts/rts.ml + +
+
+ + + + 100% (0 / 0) + + source_id/generated.ml + +
+
+ + + + 50% (1 / 2) + + source_id/source_id.ml + +
+
+ + + + 59% (94 / 159) + + viper/pretty.ml + +
+
+ + + + 71% (325 / 456) + + viper/trans.ml + +
+
+ + + + 100% (13 / 13) + + wasm-exts/abbreviation.ml + +
+
+ + + + 14% (8 / 56) + + wasm-exts/ast.ml + +
+
+ + + + 100% (0 / 0) + + wasm-exts/customModule.ml + +
+
+ + + + 74% (600 / 807) + + wasm-exts/customModuleDecode.ml + +
+
+ + + + 67% (687 / 1020) + + wasm-exts/customModuleEncode.ml + +
+
+ + + + 86% (76 / 88) + + wasm-exts/dwarf5.ml + +
+
+ + + + 84% (37 / 44) + + wasm-exts/operators.ml + +
+
+ + diff --git a/coverage/ir_def/arrange_ir.ml.html b/coverage/ir_def/arrange_ir.ml.html new file mode 100644 index 00000000000..657c4faed77 --- /dev/null +++ b/coverage/ir_def/arrange_ir.ml.html @@ -0,0 +1,695 @@ + + + + + arrange_ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+
+
open Mo_types
+open Mo_values
+open Source
+open Ir
+open Wasm.Sexpr
+
+let ($$) head inner = Node (head, inner)
+
+let id i = Atom i
+
+let typ t = Atom (Type.string_of_typ t)
+let prim_ty p = typ (Type.Prim p)
+let kind k = Atom (Type.string_of_kind k)
+
+let rec exp e = match e.it with
+  | VarE i              -> "VarE"    $$ [id i]
+  | LitE l              -> "LitE"    $$ [lit l]
+  | PrimE (p, es)       -> "PrimE"   $$ [prim p] @ List.map exp es
+  | AssignE (le1, e2)   -> "AssignE" $$ [lexp le1; exp e2]
+  | BlockE (ds, e1)     -> "BlockE"  $$ List.map dec ds @ [exp e1]
+  | IfE (e1, e2, e3)    -> "IfE"     $$ [exp e1; exp e2; exp e3]
+  | SwitchE (e, cs)     -> "SwitchE" $$ [exp e] @ List.map case cs
+  | LoopE e1            -> "LoopE"   $$ [exp e1]
+  | LabelE (i, t, e)    -> "LabelE"  $$ [id i; typ t; exp e]
+  | AsyncE (Type.Fut, tb, e, t) -> "AsyncE"  $$ [typ_bind tb; exp e; typ t]
+  | AsyncE (Type.Cmp, tb, e, t) -> "AsyncE*"  $$ [typ_bind tb; exp e; typ t]
+  | DeclareE (i, t, e1) -> "DeclareE" $$ [id i; exp e1]
+  | DefineE (i, m, e1)  -> "DefineE" $$ [id i; mut m; exp e1]
+  | FuncE (x, s, c, tp, as_, ts, e) ->
+    "FuncE" $$ [Atom x; func_sort s; control c] @ List.map typ_bind tp @ args as_ @ [ typ (Type.seq ts); exp e]
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    "SelfCallE" $$ [typ (Type.seq ts); exp exp_f; exp exp_k; exp exp_r]
+  | ActorE (ds, fs, u, t) -> "ActorE"  $$ List.map dec ds @ fields fs @ [system u; typ t]
+  | NewObjE (s, fs, t)  -> "NewObjE" $$ (Arrange_type.obj_sort s :: fields fs @ [typ t])
+  | TryE (e, cs)        -> "TryE" $$ [exp e] @ List.map case cs
+
+and system { meta; preupgrade; postupgrade; heartbeat; timer; inspect} = (* TODO: show meta? *)
+  "System" $$ [
+      "Pre" $$ [exp preupgrade];
+      "Post" $$ [exp postupgrade];
+      "Heartbeat" $$ [exp heartbeat];
+      "Timer" $$ [exp timer];
+      "Inspect" $$ [exp inspect];
+    ]
+
+and lexp le = match le.it with
+  | VarLE i             -> "VarLE" $$ [id i]
+  | IdxLE (e1, e2)      -> "IdxLE" $$ [exp e1; exp e2]
+  | DotLE (e1, n)       -> "DotLE" $$ [exp e1; Atom n]
+
+and fields fs = List.fold_left (fun flds (f : field) -> (f.it.name $$ [ id f.it.var ]):: flds) [] fs
+
+and args = function
+ | [] -> []
+ | as_ -> ["params" $$ List.map arg as_]
+
+and arg a = Atom a.it
+
+and prim = function
+  | CallPrim ts       -> "CallPrim" $$ List.map typ ts
+  | UnPrim (t, uo)    -> "UnPrim"     $$ [typ t; Arrange_ops.unop uo]
+  | BinPrim (t, bo)   -> "BinPrim"    $$ [typ t; Arrange_ops.binop bo]
+  | RelPrim (t, ro)   -> "RelPrim"    $$ [typ t; Arrange_ops.relop ro]
+  | TupPrim           -> Atom "TupPrim"
+  | ProjPrim i        -> "ProjPrim"   $$ [Atom (string_of_int i)]
+  | OptPrim           -> Atom "OptPrim"
+  | TagPrim i         -> "TagE" $$ [id i]
+  | DotPrim n         -> "DotPrim" $$ [Atom n]
+  | ActorDotPrim n    -> "ActorDotPrim" $$ [Atom n]
+  | ArrayPrim (m, t)  -> "ArrayPrim"  $$ [mut m; typ t]
+  | IdxPrim           -> Atom "IdxPrim"
+  | NextArrayOffset   -> Atom "NextArrayOffset"
+  | EqArrayOffset     -> Atom "EqArrayOffset"
+  | DerefArrayOffset  -> Atom "DerefArrayOffset"
+  | GetLastArrayOffset -> Atom "GetLastArrayOffset"
+  | BreakPrim i       -> "BreakPrim"  $$ [id i]
+  | RetPrim           -> Atom "RetPrim"
+  | AwaitPrim Type.Fut -> Atom "AwaitPrim"
+  | AwaitPrim Type.Cmp -> Atom "AwaitPrim*"
+  | AssertPrim        -> Atom "AssertPrim"
+  | ThrowPrim         -> Atom "ThrowPrim"
+  | ShowPrim t        -> "ShowPrim" $$ [typ t]
+  | SerializePrim t   -> "SerializePrim" $$ List.map typ t
+  | DeserializePrim t -> "DeserializePrim" $$ List.map typ t
+  | DeserializeOptPrim t -> "DeserializeOptPrim" $$ List.map typ t
+  | NumConvWrapPrim (t1, t2) -> "NumConvWrapPrim" $$ [prim_ty t1; prim_ty t2]
+  | NumConvTrapPrim (t1, t2) -> "NumConvTrapPrim" $$ [prim_ty t1; prim_ty t2]
+  | CastPrim (t1, t2) -> "CastPrim" $$ [typ t1; typ t2]
+  | DecodeUtf8        -> Atom "DecodeUtf8"
+  | EncodeUtf8        -> Atom "EncodeUtf8"
+  | ActorOfIdBlob t   -> "ActorOfIdBlob" $$ [typ t]
+  | BlobOfIcUrl       -> Atom "BlobOfIcUrl"
+  | IcUrlOfBlob       -> Atom "IcUrlOfBlob"
+  | SelfRef t         -> "SelfRef"    $$ [typ t]
+  | SystemTimePrim    -> Atom "SystemTimePrim"
+  | SystemCyclesAddPrim -> Atom "SystemCyclesAcceptPrim"
+  | SystemCyclesAcceptPrim -> Atom "SystemCyclesAcceptPrim"
+  | SystemCyclesAvailablePrim -> Atom "SystemCyclesAvailablePrim"
+  | SystemCyclesBalancePrim -> Atom "SystemCyclesBalancePrim"
+  | SystemCyclesRefundedPrim -> Atom "SystemCyclesRefundedPrim"
+  | SetCertifiedData  -> Atom "SetCertifiedData"
+  | GetCertificate    -> Atom "GetCertificate"
+  | OtherPrim s       -> Atom s
+  | CPSAwait (Type.Fut, t) -> "CPSAwait" $$ [typ t]
+  | CPSAwait (Type.Cmp, t) -> "CPSAwait*" $$ [typ t]
+  | CPSAsync (Type.Fut, t) -> "CPSAsync" $$ [typ t]
+  | CPSAsync (Type.Cmp, t) -> "CPSAsync*" $$ [typ t]
+  | ICArgDataPrim     -> Atom "ICArgDataPrim"
+  | ICStableSize t    -> "ICStableSize" $$ [typ t]
+  | ICPerformGC       -> Atom "ICPerformGC"
+  | ICReplyPrim ts    -> "ICReplyPrim" $$ List.map typ ts
+  | ICRejectPrim      -> Atom "ICRejectPrim"
+  | ICCallerPrim      -> Atom "ICCallerPrim"
+  | ICCallPrim        -> Atom "ICCallPrim"
+  | ICCallRawPrim     -> Atom "ICCallRawPrim"
+  | ICMethodNamePrim  -> Atom "ICMethodNamePrim"
+  | ICStableWrite t   -> "ICStableWrite" $$ [typ t]
+  | ICStableRead t    -> "ICStableRead" $$ [typ t]
+
+and mut = function
+  | Const -> Atom "Const"
+  | Var   -> Atom "Var"
+
+and pat p = match p.it with
+  | WildP           -> Atom "WildP"
+  | VarP i          -> "VarP"       $$ [ id i ]
+  | TupP ps         -> "TupP"       $$ List.map pat ps
+  | ObjP pfs        -> "ObjP"       $$ List.map pat_field pfs
+  | LitP l          -> "LitP"       $$ [ lit l ]
+  | OptP p          -> "OptP"       $$ [ pat p ]
+  | TagP (i, p)     -> "TagP"       $$ [ id i; pat p ]
+  | AltP (p1,p2)    -> "AltP"       $$ [ pat p1; pat p2 ]
+
+and lit = function
+  | NullLit       -> Atom "NullLit"
+  | BoolLit b     -> "BoolLit"   $$ [ Atom (if b then "true" else "false") ]
+  | NatLit n      -> "NatLit"    $$ [ Atom (Numerics.Nat.to_pretty_string n) ]
+  | Nat8Lit w     -> "Nat8Lit"   $$ [ Atom (Numerics.Nat8.to_pretty_string w) ]
+  | Nat16Lit w    -> "Nat16Lit"  $$ [ Atom (Numerics.Nat16.to_pretty_string w) ]
+  | Nat32Lit w    -> "Nat32Lit"  $$ [ Atom (Numerics.Nat32.to_pretty_string w) ]
+  | Nat64Lit w    -> "Nat64Lit"  $$ [ Atom (Numerics.Nat64.to_pretty_string w) ]
+  | IntLit i      -> "IntLit"    $$ [ Atom (Numerics.Int.to_pretty_string i) ]
+  | Int8Lit w     -> "Int8Lit"   $$ [ Atom (Numerics.Int_8.to_pretty_string w) ]
+  | Int16Lit w    -> "Int16Lit"  $$ [ Atom (Numerics.Int_16.to_pretty_string w) ]
+  | Int32Lit w    -> "Int32Lit"  $$ [ Atom (Numerics.Int_32.to_pretty_string w) ]
+  | Int64Lit w    -> "Int64Lit"  $$ [ Atom (Numerics.Int_64.to_pretty_string w) ]
+  | FloatLit f    -> "FloatLit"  $$ [ Atom (Numerics.Float.to_pretty_string f) ]
+  | CharLit c     -> "CharLit"   $$ [ Atom (string_of_int c) ]
+  | TextLit t     -> "TextLit"   $$ [ Atom t ]
+  | BlobLit b     -> "BlobLit"   $$ [ Atom (Printf.sprintf "%S" b) ] (* hex might be nicer *)
+
+and pat_field pf = pf.it.name $$ [pat pf.it.pat]
+
+and case c = "case" $$ [pat c.it.pat; exp c.it.exp]
+
+and func_sort s = Atom (Arrange_type.func_sort s)
+
+and control s = Atom (Arrange_type.control s)
+
+and dec d = match d.it with
+  | LetD (p, e) -> "LetD" $$ [pat p; exp e]
+  | VarD (i, t, e) -> "VarD" $$ [id i; typ t; exp e]
+  | RefD (i, t, e) -> "RefD" $$ [id i; typ t; lexp e]
+
+and typ_bind (tb : typ_bind) =
+  Type.string_of_con tb.it.con $$ [typ tb.it.bound]
+
+and comp_unit = function
+  | LibU (ds, e) -> "LibU" $$ List.map dec ds @ [ exp e ]
+  | ProgU ds -> "ProgU" $$ List.map dec ds
+  | ActorU (None, ds, fs, u, t) -> "ActorU"  $$ List.map dec ds @ fields fs @ [system u; typ t]
+  | ActorU (Some as_, ds, fs, u, t) -> "ActorU"  $$ List.map arg as_ @ List.map dec ds @ fields fs @ [system u; typ t]
+
+and prog (cu, _flavor) = comp_unit cu
+
+
+
+ + + diff --git a/coverage/ir_def/check_ir.ml.html b/coverage/ir_def/check_ir.ml.html new file mode 100644 index 00000000000..8ea0f6d064f --- /dev/null +++ b/coverage/ir_def/check_ir.ml.html @@ -0,0 +1,3746 @@ + + + + + check_ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+
+
open Mo_types
+open Mo_values
+
+open Source
+module T = Type
+module E = Ir_effect
+
+(* TODO: make note immutable, perhaps just using type abstraction *)
+
+(* TODO:
+   dereferencing is still implicit in the IR (see immut_typ below);
+   consider making it explicit as part of desugaring.
+*)
+
+(* TODO: check escape of free mutables via actors *)
+
+(* Helpers *)
+
+let (==>) p q = not p || q
+
+let typ = E.typ
+
+let immute_typ p =
+  assert (not (T.is_mut (typ p)));
+  (typ p)
+
+(* Scope *)
+
+type val_info = {
+  typ : T.typ;
+  (* see ir_passes/const.ml for the next two *)
+  loc_known : bool;
+  const : bool;
+}
+type val_env = val_info T.Env.t
+
+type scope =
+  { val_env : val_env;
+  }
+
+let empty_scope : scope =
+  { val_env = T.Env.empty;
+  }
+
+(* Contexts (internal) *)
+
+type lab_env = T.typ T.Env.t
+type ret_env = T.typ option
+(* the con_env tracks
+   - which abstract types (type parameters) are in scope
+   - which type aliases we are currently unfolding (to break recursion)
+*)
+type con_env = T.ConSet.t
+
+type lvl = TopLvl | NotTopLvl
+
+type env =
+  { flavor : Ir.flavor;
+    lvl  : lvl;
+    vals : val_env;
+    cons : con_env;
+    labs : lab_env;
+    rets : ret_env;
+    async : T.con option;
+    seen : con_env ref;
+    check_run : int;
+  }
+
+let last_run : int ref = ref 0
+
+let initial_env flavor : env =
+  let check_run = !last_run + 1 in
+  last_run := check_run;
+  { flavor;
+    lvl = TopLvl;
+    vals = T.Env.empty;
+    cons = T.ConSet.empty;
+    labs = T.Env.empty;
+    rets = None;
+    async = Async_cap.(match initial_cap() with
+                       | NullCap | ErrorCap -> None
+                       | QueryCap c | AwaitCap c | AsyncCap c | CompositeCap c | CompositeAwaitCap c | SystemCap c -> Some c);
+    seen = ref T.ConSet.empty;
+    check_run;
+  }
+
+
+(* More error bookkeeping *)
+
+exception CheckFailed of string
+
+let type_error at : string -> Diag.message = Diag.error_message at "M0000" "IR type"
+
+let error env at fmt =
+    Printf.ksprintf (fun s -> raise (CheckFailed (Diag.string_of_message (type_error at s)))) fmt
+
+let check env at p s =
+  if not p then
+    error env at "%s" s
+
+let add_lab c x t = {c with labs = T.Env.add x t c.labs}
+
+let add_typs c cs =
+  { c with
+    cons = List.fold_right (fun c -> T.ConSet.disjoint_add c) cs c.cons;
+  }
+
+let adjoin c scope =
+  { c with
+    vals = T.Env.adjoin c.vals scope.val_env;
+  }
+
+let adjoin_vals c ve = {c with vals = T.Env.adjoin c.vals ve}
+
+let adjoin_cons c ce =
+  { c with
+    cons = T.ConSet.disjoint_union c.cons ce;
+  }
+
+let disjoint_union env at fmt env1 env2 =
+  try T.Env.disjoint_union env1 env2
+  with T.Env.Clash k -> error env at fmt k
+
+(* Types *)
+
+(* FIX ME: these error reporting functions are eager and will construct unnecessary type strings !*)
+let check_sub env at t1 t2 =
+  if not (T.sub t1 t2) then
+    error env at "subtype violation:\n  %s\n  %s\n"
+      (T.string_of_typ_expand t1) (T.string_of_typ_expand t2)
+
+let check_shared env at t =
+  if not (T.shared t) then
+    error env at "message argument is not sharable:\n  %s" (T.string_of_typ_expand t)
+
+let check_concrete env at t =
+  if not (T.concrete t) then
+    error env at "message argument is not concrete:\n  %s" (T.string_of_typ_expand t)
+
+let has_prim_eq t =
+  (* Which types have primitive equality implemented in the backend? *)
+  (* Keep in sync with Compile.compileq_eq *)
+  let open T in
+  match normalize t with
+  | Prim Null -> false (* Ir_passes.Eq handles singleton types *)
+  | Prim Error -> false (* should be desugared away *)
+  | Prim _ -> true (* all other prims are fine *)
+  | Non -> true
+  (* references are handled in the back-end: *)
+  | Obj (Actor, _) | Func (Shared _, _, _, _, _) -> true
+  | _ -> false
+
+let check_field_hashes env what at =
+  Lib.List.iter_pairs
+    (fun x y ->
+      if not (T.is_typ x.T.typ) && not (T.is_typ y.T.typ) &&
+         Hash.hash x.T.lab = Hash.hash y.T.lab
+      then error env at "field names %s and %s in %s type have colliding hashes"
+        x.T.lab y.T.lab what;
+    )
+
+
+let rec check_typ env typ : unit =
+  match typ with
+  | T.Pre ->
+    error env no_region "illegal T.Pre type"
+  | T.Var (s, i) ->
+    error env no_region "free type variable %s, index %i" s  i
+  | T.Con (c, typs) ->
+    List.iter (check_typ env) typs;
+    begin
+      match Cons.kind c with
+      | T.Def (tbs,_) ->
+        check_con env c;
+        check_typ_bounds env tbs typs no_region
+      | T.Abs (tbs, _) ->
+        if not (T.ConSet.mem c env.cons) then
+          error env no_region "free type constructor %s " (T.string_of_typ typ);
+        check_typ_bounds env tbs typs no_region
+    end
+  | T.Any -> ()
+  | T.Non -> ()
+  | T.Prim _ -> ()
+  | T.Array typ ->
+    check_mut_typ env typ
+  | T.Tup typs ->
+    List.iter (check_typ env) typs
+  | T.Func (sort, control, binds, ts1, ts2) ->
+    let cs, ce = check_typ_binds env binds in
+    let env = adjoin_cons env ce in
+    let ts = List.map (fun c -> T.Con (c, [])) cs in
+    let ts1 = List.map (T.open_ ts) ts1 in
+    let ts2 = List.map (T.open_ ts) ts2 in
+    List.iter (check_typ env) ts1;
+    List.iter (check_typ env) ts2;
+    if T.is_shared_sort sort then begin
+      List.iter (fun t -> check_shared env no_region t) ts1;
+      match control with
+      | T.Returns ->
+        check env no_region (sort = T.Shared T.Write)
+          "one-shot query function pointless";
+        if not (ts2 = []) then
+          error env no_region "one-shot function cannot have non-unit return types:\n  %s"
+            (T.string_of_typ_expand (T.seq ts2));
+      | T.Promises ->
+        check env no_region (binds <> [])
+          "promising function has no scope type argument";
+        check env no_region env.flavor.Ir.has_async_typ
+          "promising function in post-async flavor";
+        if not (sort <> T.Local) then
+          error env no_region "promising function cannot be local:\n  %s" (T.string_of_typ typ);
+        if not (List.for_all T.shared ts2) then
+          error env no_region "message result is not sharable:\n  %s" (T.string_of_typ typ)
+      | T.Replies ->
+        check env no_region (not env.flavor.Ir.has_async_typ)
+          "replying function in pre-async flavor";
+        if not (sort <> T.Local) then
+          error env no_region"replying function cannot be local:\n  %s" (T.string_of_typ typ);
+        if not (List.for_all T.shared ts2) then
+          error env no_region "message result is not sharable:\n  %s" (T.string_of_typ typ)
+      end else
+     if not (control = T.Returns) then
+       error env no_region "promising function cannot be local:\n  %s" (T.string_of_typ_expand typ);
+  | T.Opt typ ->
+    check_typ env typ
+  | T.Async (s, typ1, typ2) ->
+    check_typ env typ1;
+    check_typ env typ2;
+    check env no_region env.flavor.Ir.has_async_typ "async in non-async flavor";
+    let t' = T.promote typ2 in
+    check_shared env no_region t'
+  | T.Obj (sort, fields) ->
+    List.iter (check_typ_field env (Some sort)) fields;
+    check_field_hashes env "object" no_region fields;
+    (* fields strictly sorted (and) distinct *)
+    if not (Lib.List.is_strictly_ordered T.compare_field fields) then
+      error env no_region "object type's fields are not distinct and sorted %s" (T.string_of_typ typ)
+  | T.Variant fields ->
+    List.iter (check_typ_field env None) fields;
+    check_field_hashes env "variant" no_region fields;
+    if not (Lib.List.is_strictly_ordered T.compare_field fields) then
+      error env no_region "variant type's fields are not distinct and sorted %s" (T.string_of_typ typ)
+  | T.Mut typ ->
+    error env no_region "unexpected T.Mut"
+  | T.Typ c ->
+    error env no_region "unexpected T.Typ"
+
+and check_mut_typ env = function
+  | T.Mut t -> check_typ env t
+  | t -> check_typ env t
+
+and check_con env c =
+  if T.ConSet.mem c !(env.seen) then ()
+  else
+  begin
+    env.seen := T.ConSet.add c !(env.seen);
+    let T.Abs (binds,typ) | T.Def (binds, typ) = Cons.kind c in
+    check env no_region (not (T.is_mut typ)) "type constructor RHS is_mut";
+    check env no_region (not (T.is_typ typ)) "type constructor RHS is_typ";
+    let cs, ce = check_typ_binds env binds in
+    let ts = List.map (fun c -> T.Con (c, [])) cs in
+    let env' = adjoin_cons env ce in
+    check_typ env' (T.open_ ts typ)
+  end
+
+and check_typ_field env s tf : unit =
+  match tf.T.typ, s with
+  | T.Mut t, Some (T.Object | T.Memory) -> check_typ env t
+  | T.Typ c, Some _ ->
+    check env no_region env.flavor.Ir.has_typ_field
+     "typ field in non-typ_field flavor";
+    check_con env c
+  | t, Some T.Actor when not (T.is_shared_func t) ->
+    error env no_region "actor field %s must have shared function type, found %s" tf.T.lab (T.string_of_typ t)
+  | t, _ -> check_typ env t
+
+and check_typ_binds_acyclic env cs ts  =
+  let n = List.length cs in
+  let ce = List.fold_right2 T.ConEnv.add cs ts T.ConEnv.empty in
+  let chase c =
+    let rec chase i ts c' =
+      if i > n then
+        error env no_region "type parameter %s has cyclic bounds %s"
+          (T.string_of_con c)
+          (String.concat " <: " (List.map T.string_of_typ ts)) (List.rev ts)
+      else
+        match T.ConEnv.find_opt c' ce with
+        | None -> ()
+        | Some t ->
+          (match T.normalize t with
+           | T.Con (c'', []) as t' ->
+             chase (i+1) (t'::ts) c''
+           | _ -> ())
+    in chase 0 [] c
+  in List.iter chase cs
+
+and check_typ_binds env typ_binds : T.con list * con_env =
+  let ts = Type.open_binds typ_binds in
+  let cs = List.map (function T.Con (c, []) -> c | _ -> assert false) ts in
+  let env' = add_typs env cs in
+  let bds = List.map (fun typ_bind -> T.open_ ts typ_bind.T.bound) typ_binds in
+  check_typ_binds_acyclic env' cs bds;
+  List.iter (check_typ env') bds;
+  cs, T.ConSet.of_list cs
+
+and check_typ_bounds env (tbs : T.bind list) typs at : unit =
+  let pars = List.length tbs in
+  let args = List.length typs in
+  if pars < args then
+    error env at "too many type arguments";
+  if pars > args then
+    error env at "too few type arguments";
+  List.iter2
+    (fun tb typ ->
+      check env at (T.sub typ (T.open_ typs tb.T.bound))
+        "type argument does not match parameter bound")
+    tbs typs
+
+
+and check_inst_bounds env tbs typs at =
+  List.iter (check_typ env) typs;
+  check_typ_bounds env tbs typs at
+
+(* Literals *)
+
+open Ir
+
+let type_lit env lit at : T.prim =
+  match lit with
+  | NullLit -> T.Null
+  | BoolLit _ -> T.Bool
+  | NatLit _ -> T.Nat
+  | Nat8Lit _ -> T.Nat8
+  | Nat16Lit _ -> T.Nat16
+  | Nat32Lit _ -> T.Nat32
+  | Nat64Lit _ -> T.Nat64
+  | IntLit _ -> T.Int
+  | Int8Lit _ -> T.Int8
+  | Int16Lit _ -> T.Int16
+  | Int32Lit _ -> T.Int32
+  | Int64Lit _ -> T.Int64
+  | FloatLit _ -> T.Float
+  | CharLit _ -> T.Char
+  | TextLit _ -> T.Text
+  | BlobLit _ -> T.Blob
+
+
+(* Expressions *)
+
+let isAsyncE exp =
+  match exp.it with
+  | AsyncE _ (* pre await transformation *)
+  | PrimE (CPSAsync _, [_]) (* post await transformation *)
+    -> true
+  | _ -> false
+
+let store_typ t  =
+  T.stable t &&
+  match t with
+  | T.Obj(T.Memory, fts) ->
+    List.for_all (fun f -> T.is_opt f.T.typ) fts
+  | _ -> false
+
+let rec check_exp env (exp:Ir.exp) : unit =
+  (* helpers *)
+  let check p = check env exp.at p in
+  let (<:) t1 t2 =
+(*  try *)
+      check_sub env exp.at t1 t2
+(*  with e ->
+     (Printf.eprintf "(in here):\n%s"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp));
+      raise e)
+*)
+  in
+  (* check for aliasing *)
+  if exp.note.Note.check_run = env.check_run
+  then
+    Printf.eprintf "IR has aliasing (or Check_ir visits nodes twice):\n%s"
+      (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp));
+  exp.note <- { exp.note with Note.check_run = env.check_run };
+  (* check type annotation *)
+  let t = E.typ exp in
+  check_typ env t;
+  (* check effect annotation *)
+  check (E.infer_effect_exp exp <= E.eff exp)
+    "inferred effect not a subtype of expected effect";
+  (* check typing *)
+  begin match exp.it with
+  | VarE id ->
+    let { typ; loc_known; const } =
+      try T.Env.find id env.vals
+      with Not_found -> error env exp.at "unbound variable %s" id
+    in
+    T.as_immut typ <: t
+  | LitE lit ->
+    T.Prim (type_lit env lit exp.at) <: t
+  | PrimE (p, es) ->
+    List.iter (check_exp env) es;
+    begin match p, es with
+    | CallPrim insts, [exp1; exp2] ->
+      begin match T.promote (typ exp1) with
+        | T.Func (sort, control, tbs, arg_tys, ret_tys) ->
+          check_inst_bounds env tbs insts exp.at;
+          let t_arg = T.open_ insts (T.seq arg_tys) in
+          let t_ret = T.codom control (fun () -> List.hd insts) (List.map (T.open_ insts) ret_tys) in
+          if T.is_shared_sort sort then begin
+            check_concrete env exp.at t_arg;
+            check_concrete env exp.at t_ret;
+          end;
+          typ exp2 <: t_arg;
+          t_ret <: t
+        | T.Non -> () (* dead code, not much to check here *)
+        | t1 -> error env exp1.at "expected function type, but expression produces type\n  %s"
+             (T.string_of_typ_expand t1)
+      end
+    | UnPrim (ot, op), [exp1] ->
+      check (Operator.has_unop op ot) "unary operator is not defined for operand type";
+      typ exp1 <: ot;
+      ot <: t
+    | BinPrim (ot, op), [exp1; exp2] ->
+      check (Operator.has_binop op ot) "binary operator is not defined for operand type";
+      typ exp1 <: ot;
+      typ exp2 <: ot;
+      ot <: t
+    | RelPrim (ot,  Operator.NeqOp), _ ->
+      check false "negation operator should be desugared away in IR"
+    | RelPrim (ot,  Operator.EqOp), [exp1; exp2] when (not env.flavor.has_poly_eq) ->
+      check (has_prim_eq ot) "primitive equality is not defined for operand type";
+      typ exp1 <: ot;
+      typ exp2 <: ot;
+      T.bool <: t
+    | RelPrim (ot, op), [exp1; exp2] ->
+      check (Operator.has_relop op ot) "relational operator is not defined for operand type";
+      typ exp1 <: ot;
+      typ exp2 <: ot;
+      T.bool <: t
+    | TupPrim, exps ->
+      T.Tup (List.map typ exps) <: t
+    | ProjPrim n, [exp1] ->
+      let t1 = T.promote (immute_typ exp1) in
+      let ts = try T.as_tup_sub n t1
+               with Invalid_argument _ ->
+                 error env exp1.at "expected tuple type, but expression produces type\n  %s"
+                   (T.string_of_typ_expand t1) in
+      let tn = try List.nth ts n with
+               | Invalid_argument _ ->
+                 error env exp.at "tuple projection %n is out of bounds for type\n  %s"
+                   n (T.string_of_typ_expand t1) in
+      tn <: t
+    | OptPrim, [exp1] ->
+      T.Opt (typ exp1) <: t
+    | TagPrim i, [exp1] ->
+      T.Variant [{T.lab = i; typ = typ exp1; src = T.empty_src}] <: t
+    | ActorDotPrim n, [exp1]
+    | DotPrim n, [exp1] ->
+      begin
+        let t1 = typ exp1 in
+        let sort, tfs =
+          try T.as_obj_sub [n] t1 with Invalid_argument _ ->
+            error env exp1.at "expected object type, but expression produces type\n  %s"
+              (T.string_of_typ_expand t1)
+        in
+        check (match p with
+               | ActorDotPrim _ -> sort = T.Actor
+               | DotPrim _ -> sort <> T.Actor
+               | _ -> false) "sort mismatch";
+        try T.as_immut (T.lookup_val_field n tfs) <: t with Invalid_argument _ ->
+          error env exp1.at "field name %s does not exist in type\n  %s"
+            n (T.string_of_typ_expand t1)
+      end
+    | ArrayPrim (mut, t0), exps ->
+      List.iter (fun e -> typ e <: t0) exps;
+      let t1 = T.Array (match mut with Const -> t0 | Var -> T.Mut t0) in
+      t1 <: t
+    | (IdxPrim | DerefArrayOffset), [exp1; exp2] ->
+      let t1 = T.promote (typ exp1) in
+      let t2 = try T.as_array_sub t1 with
+               | Invalid_argument _ ->
+                 error env exp1.at "expected array type, but expression produces type\n  %s"
+                                         (T.string_of_typ_expand t1)
+      in
+      typ exp2 <: T.nat;
+      T.as_immut t2 <: t
+    | GetLastArrayOffset, [exp1] ->
+      let t1 = T.promote (typ exp1) in
+      ignore
+        (try T.as_array_sub t1 with
+         | Invalid_argument _ ->
+           error env exp1.at "expected array type, but expression produces type\n  %s"
+             (T.string_of_typ_expand t1));
+      T.int <: t
+    | NextArrayOffset, [exp1] ->
+      typ exp1 <: T.nat;
+      T.nat <: t
+    | EqArrayOffset, [exp1; exp2] ->
+      typ exp1 <: T.int;
+      typ exp2 <: T.int;
+      T.bool <: t
+    | BreakPrim id, [exp1] ->
+      begin
+        match T.Env.find_opt id env.labs with
+        | None -> error env exp.at "unbound label %s" id
+        | Some t1 -> typ exp1 <: t1;
+      end;
+      T.Non <: t (* vacuously true *)
+    | RetPrim, [exp1] ->
+      begin
+        match env.rets with
+        | None -> error env exp.at "misplaced return"
+        | Some t0 -> assert (t0 <> T.Pre); typ exp1 <: t0;
+      end;
+      T.Non <: t (* vacuously true *)
+    | ThrowPrim, [exp1] ->
+      check env.flavor.has_await "throw in non-await flavor";
+      check (env.async <> None) "misplaced throw";
+      typ exp1 <: T.throw;
+      T.Non <: t (* vacuously true *)
+    | AwaitPrim s, [exp1] ->
+      check env.flavor.has_await "await in non-await flavor";
+      let t0 = match env.async with
+      | Some c -> T.Con(c, [])
+      | None -> error env exp.at "misplaced await" in
+      let t1 = T.promote (typ exp1) in
+      let (t2, t3) = try T.as_async_sub s t0 t1
+             with Invalid_argument _ ->
+               error env exp1.at "expected async type, but expression has type\n  %s"
+                 (T.string_of_typ_expand t1)
+      in
+      check (T.eq t0 t2) "ill-scoped async";
+      t3 <: t
+    | AssertPrim, [exp1] ->
+      typ exp1 <: T.bool;
+      T.unit <: t
+    | ShowPrim ot, [exp1] ->
+      check env.flavor.has_show "show expression in non-show flavor";
+      check (Show.can_show ot) "show is not defined for operand type";
+      typ exp1 <: ot;
+      T.text <: t
+    | SerializePrim ots, [exp1] ->
+      check (T.shared (T.seq ots)) "Serialize is not defined for operand type";
+      typ exp1 <: T.seq ots;
+      T.blob <: t
+    | DeserializePrim ots, [exp1] ->
+      check (T.shared (T.seq ots)) "Deserialize is not defined for operand type";
+      typ exp1 <: T.blob;
+      T.seq ots <: t
+    | DeserializeOptPrim ots, [exp1] ->
+      check (T.shared (T.seq ots)) "DeserializeOpt is not defined for operand type";
+      typ exp1 <: T.blob;
+      T.Opt (T.seq ots) <: t
+    | CPSAwait (s, cont_typ), [a; kr] ->
+      let (_, t1) =
+        try T.as_async_sub s T.Non (T.normalize (typ a))
+        with _ -> error env exp.at "CPSAwait expect async arg, found %s" (T.string_of_typ (typ a))
+      in
+      (match cont_typ with
+       | T.Func(T.Local, T.Returns, [], ts1, ts2) ->
+         begin
+           (match ts2 with
+            | [] -> ()
+            | _ -> error env exp.at "CPSAwait answer type error");
+           typ kr <: T.Tup [cont_typ; T.Func(T.Local, T.Returns, [], [T.catch], ts2)];
+           t1 <: T.seq ts1;
+           T.seq ts2 <: t;
+         end;
+       | _ -> error env exp.at "CPSAwait bad cont");
+      check (not (env.flavor.has_await)) "CPSAwait await flavor";
+      check (env.flavor.has_async_typ) "CPSAwait in post-async flavor";
+    | CPSAsync (s, t0), [exp] ->
+      (match typ exp with
+        T.Func(T.Local,T.Returns, [tb],
+          [T.Func(T.Local, T.Returns, [], ts1, []);
+           T.Func(T.Local, T.Returns, [], [t_error], [])],
+          []) ->
+         T.catch <: t_error;
+         T.Async(s, t0, Type.open_ [t0] (T.seq ts1)) <: t
+       | _ -> error env exp.at "CPSAsync unexpected typ");
+      check (not (env.flavor.has_await)) "CPSAsync await flavor";
+      check (env.flavor.has_async_typ) "CPSAsync in post-async flavor";
+      check_typ env t;
+    | ICArgDataPrim, [] ->
+      T.blob <: t
+    | ICReplyPrim ts, [exp1] ->
+      check (not (env.flavor.has_async_typ)) "ICReplyPrim in async flavor";
+      check (T.shared t) "ICReplyPrim is not defined for non-shared operand type";
+      (* TODO: check against expected reply typ; note this may not be env.ret_tys. *)
+      typ exp1 <: (T.seq ts);
+      T.Non <: t
+    | ICRejectPrim, [exp1] ->
+      check (not (env.flavor.has_async_typ)) "ICRejectPrim in async flavor";
+      typ exp1 <: T.text;
+      T.Non <: t
+    | ICCallerPrim, [] ->
+      T.caller <: t
+    | ICCallPrim, [exp1; exp2; k; r] ->
+      let t1 = T.promote (typ exp1) in
+      begin match t1 with
+      | T.Func (sort, T.Replies, _ (*TBR*), arg_tys, ret_tys) ->
+        let t_arg = T.seq arg_tys in
+        typ exp2 <: t_arg;
+        check_concrete env exp.at t_arg;
+        typ k <: T.Func (T.Local, T.Returns, [], ret_tys, []);
+        typ r <: T.Func (T.Local, T.Returns, [], [T.error], []);
+      | T.Non -> () (* dead code, not much to check here *)
+      | _ ->
+         error env exp1.at "expected function type, but expression produces type\n  %s"
+           (T.string_of_typ_expand t1)
+      end
+      (* TODO: T.unit <: t ? *)
+    | ICCallRawPrim, [exp1; exp2; exp3; k; r] ->
+      typ exp1 <: T.principal;
+      typ exp2 <: T.text;
+      typ exp3 <: T.blob;
+      typ k <: T.Func (T.Local, T.Returns, [], [T.blob], []);
+      typ r <: T.Func (T.Local, T.Returns, [], [T.error], []);
+      T.unit <: t
+    | ICMethodNamePrim, [] ->
+      T.text <: t
+    | ICStableRead t1, [] ->
+      check_typ env t1;
+      check (store_typ t1) "Invalid type argument to ICStableRead";
+      t1 <: t
+    | ICStableWrite t1, [exp1] ->
+      check_typ env t1;
+      check (store_typ t1) "Invalid type argument to ICStableWrite";
+      typ exp1 <: t1;
+      T.unit <: t
+    | NumConvWrapPrim (p1, p2), [e] ->
+      (* we should check if this conversion is supported *)
+      typ e <: T.Prim p1;
+      T.Prim p2 <: t
+    | NumConvTrapPrim (p1, p2), [e] ->
+      (* we should check if this conversion is supported *)
+      typ e <: T.Prim p1;
+      T.Prim p2 <: t
+    | CastPrim (t1, t2), [e] ->
+      typ e <: t1;
+      t2 <: t
+    | EncodeUtf8, [e] ->
+      typ e <: T.text;
+      T.blob <: t
+    | DecodeUtf8, [e] ->
+      typ e <: T.blob;
+      T.(Opt text) <: t
+    | BlobOfIcUrl, [e] ->
+      typ e <: T.text;
+      T.blob <: t
+    | IcUrlOfBlob, [e] ->
+      typ e <: T.blob;
+      T.text <: t
+    | ActorOfIdBlob actor_typ, [e] ->
+      typ e <: T.blob;
+      check_typ env actor_typ;
+      begin match T.normalize actor_typ with
+      | T.Obj (T.Actor, _) -> ()
+      | _ -> error env exp.at "ActorOfIdBlob cast to actor object type, not\n   %s"
+           (T.string_of_typ_expand actor_typ)
+      end;
+      actor_typ <: t;
+    | SelfRef t1, [] ->
+      (* We could additionally keep track of the type of the current actor in
+         the environment and see if this lines up. *)
+      t1 <: t;
+    | SystemTimePrim, [] ->
+      T.nat64 <: t;
+    (* Cycles *)
+    | (SystemCyclesBalancePrim | SystemCyclesAvailablePrim | SystemCyclesRefundedPrim), [] ->
+      T.nat <: t
+    | SystemCyclesAcceptPrim, [e1] ->
+      typ e1 <: T.nat;
+      T.nat <: t
+    | SystemCyclesAddPrim, [e1] ->
+      typ e1 <: T.nat;
+      T.unit <: t
+    (* Certified Data *)
+    | SetCertifiedData, [e1] ->
+      typ e1 <: T.blob;
+      T.unit <: t
+    | GetCertificate, [] ->
+      T.Opt T.blob <: t
+    | ICPerformGC, [] ->
+      T.unit <: t
+    | ICStableSize t1, [e1] ->
+      typ e1 <: t1;
+      T.nat64 <: t
+    | OtherPrim _, _ -> ()
+    | p, args ->
+      error env exp.at "PrimE %s does not work with %d arguments"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.prim p)) (List.length args);
+    end
+  | AssignE (lexp1, exp2) ->
+    check_lexp env lexp1;
+    check_exp env exp2;
+    let t2 = try T.as_mut lexp1.note with
+       Invalid_argument _ -> error env exp.at "expected mutable assignment target"
+    in
+    typ exp2 <: t2;
+    T.unit <: t
+  | BlockE (ds, exp1) ->
+    let scope = gather_block_decs env ds in
+    let env' = adjoin env scope in
+    check_decs env' ds;
+    check_exp env' exp1;
+    typ exp1 <: t
+  | IfE (exp1, exp2, exp3) ->
+    check_exp env exp1;
+    typ exp1 <: T.bool;
+    check_exp env exp2;
+    typ exp2 <: t;
+    check_exp env exp3;
+    typ exp3 <: t
+  | SwitchE (exp1, cases) ->
+    check_exp env exp1;
+    let t1 = T.promote (typ exp1) in
+(*    if not env.pre then
+      if not (Coverage.check_cases env.cons cases t1) then
+        warn env exp.at "the cases in this switch do not cover all possible values";
+ *)
+    check_cases env t1 t cases
+  | TryE (exp1, cases) ->
+    check env.flavor.has_await "try in non-await flavor";
+    check (env.async <> None) "misplaced try";
+    check_exp env exp1;
+    typ exp1 <: t;
+    check_cases env T.catch t cases;
+  | LoopE exp1 ->
+    check_exp { env with lvl = NotTopLvl } exp1;
+    typ exp1 <: T.unit;
+    T.Non <: t (* vacuously true *)
+  | LabelE (id, t0, exp1) ->
+    assert (t0 <> T.Pre);
+    check_typ env t0;
+    check_exp (add_lab env id t0) exp1;
+    typ exp1 <: t0;
+    t0 <: t
+  | AsyncE (s, tb, exp1, t0) ->
+    check env.flavor.has_await "async expression in non-await flavor";
+    check_typ env t0;
+    let c, tb, ce = check_open_typ_bind env tb in
+    let t1 = typ exp1 in
+    let env' =
+      {(adjoin_cons env ce)
+       with labs = T.Env.empty; rets = Some t1; async = Some c; lvl = NotTopLvl} in
+    check_exp env' exp1;
+    let t1' = T.open_ [t0] (T.close [c] t1)  in
+    t1' <: T.Any; (* vacuous *)
+    (* check t1' shared when Fut? *)
+    T.Async (s, t0, t1') <: t
+  | DeclareE (id, t0, exp1) ->
+    check_mut_typ env t0;
+    let val_info = { typ = t0; loc_known = false; const = false } in
+    let env' = adjoin_vals env (T.Env.singleton id val_info) in
+    check_exp env' exp1;
+    typ exp1 <: t
+  | DefineE (id, mut, exp1) ->
+    check_exp env exp1;
+    begin
+      match T.Env.find_opt id env.vals with
+      | None -> error env exp.at "unbound variable %s" id
+      | Some { typ = t0; const; loc_known } ->
+        check (not const) "cannot use DefineE on const variable";
+        match mut with
+        | Const ->
+          typ exp1 <: t0
+        | Var ->
+          let t0 = try T.as_mut t0 with
+                   | Invalid_argument _ ->
+                     error env exp.at "expected mutable %s" (T.string_of_typ t0)
+          in
+          typ exp1 <: t0
+    end;
+    T.unit <: t
+  | FuncE (x, sort, control, typ_binds, args, ret_tys, exp) ->
+    let cs, tbs, ce = check_open_typ_binds env typ_binds in
+    let ts = List.map (fun c -> T.Con(c, [])) cs in
+    let env' = adjoin_cons env ce in
+    let ve = check_args env' args in
+    List.iter (check_typ env') ret_tys;
+    check ((T.is_shared_sort sort && control = T.Promises) ==> isAsyncE exp)
+      "shared function with async type has non-async body";
+    if T.is_shared_sort sort then List.iter (check_concrete env exp.at) ret_tys;
+    let codom = T.codom control (fun () -> List.hd ts) ret_tys in
+    let env'' =
+      {env' with labs = T.Env.empty; rets = Some codom; async = None; lvl = NotTopLvl} in
+    check_exp (adjoin_vals env'' ve) exp;
+    check_sub env' exp.at (typ exp) codom;
+    (* Now construct the function type and compare with the annotation *)
+    let ts1 = List.map (fun a -> a.note) args in
+    if T.is_shared_sort sort then List.iter (check_concrete env exp.at) ts1;
+    let fun_ty = T.Func
+      ( sort, control
+      , tbs, List.map (T.close cs) ts1, List.map (T.close cs) ret_tys
+      ) in
+    fun_ty <: t
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    check (not env.flavor.Ir.has_async_typ) "SelfCallE in async flavor";
+    List.iter (check_typ env) ts;
+    check_exp { env with lvl = NotTopLvl } exp_f;
+    check_exp env exp_k;
+    check_exp env exp_r;
+    typ exp_f <: T.unit;
+    typ exp_k <: T.Func (T.Local, T.Returns, [], ts, []);
+    typ exp_r <: T.Func (T.Local, T.Returns, [], [T.error], []);
+  | ActorE (ds, fs,
+      { preupgrade; postupgrade; meta; heartbeat; timer; inspect }, t0) ->
+    (* TODO: check meta *)
+    let env' = { env with async = None } in
+    let scope1 = gather_block_decs env' ds in
+    let env'' = adjoin env' scope1 in
+    check_decs env'' ds;
+    check_exp env'' preupgrade;
+    check_exp env'' postupgrade;
+    check_exp env'' heartbeat;
+    check_exp env'' timer;
+    check_exp env'' inspect;
+    typ preupgrade <: T.unit;
+    typ postupgrade <: T.unit;
+    typ heartbeat <: T.unit;
+    typ timer <: T.unit;
+    typ inspect <: T.unit;
+    check (T.is_obj t0) "bad annotation (object type expected)";
+    let (s0, tfs0) = T.as_obj t0 in
+    let val_tfs0 = List.filter (fun tf -> not (T.is_typ tf.T.typ)) tfs0 in
+    (type_obj env'' T.Actor fs) <: (T.Obj (s0, val_tfs0));
+    t0 <: t;
+  | NewObjE (s, fs, t0) ->
+    (* check object *)
+    let t1 = type_obj env s fs in
+    check_typ env t1;
+
+    (* check annotation *)
+    check (T.is_obj t0) "bad annotation (object type expected)";
+    let (s0, tfs0) = T.as_obj t0 in
+    let val_tfs0 = List.filter (fun tf -> not (T.is_typ tf.T.typ)) tfs0 in
+    t1 <: T.Obj (s0, val_tfs0);
+
+    t0 <: t
+  end;
+  (* check const annotation *)
+  (* see ir_passes/const.ml for an explanation *)
+  let check_var ctxt v =
+    if not (T.Env.find v env.vals).const then
+      error env exp.at "const %s with non-const variable %s" ctxt v in
+  if exp.note.Note.const
+  then begin
+    match exp.it with
+    | VarE id -> check_var "VarE" id
+    | FuncE (x, s, c, tp, as_ , ts, body) ->
+      check (s = T.Local) "constant FuncE cannot be of shared sort";
+      if env.lvl = NotTopLvl then
+      Freevars.M.iter (fun v _ ->
+        if (T.Env.find v env.vals).loc_known then () else
+        check_var "FuncE" v
+      ) (Freevars.exp exp)
+    | NewObjE (Type.(Object | Module), fs, t) when T.is_immutable_obj t ->
+      List.iter (fun f -> check_var "NewObjE" f.it.var) fs
+    | PrimE (ArrayPrim (Const, _), es) ->
+      List.iter (fun e1 ->
+        check e1.note.Note.const "constant array with non-constant subexpression"
+      ) es
+    | PrimE (TupPrim, es) ->
+      List.iter (fun e1 ->
+        check e1.note.Note.const "constant tuple with non-constant subexpression"
+      ) es
+    | PrimE (DotPrim _, [e1]) ->
+      check e1.note.Note.const "constant DotPrim on non-constant subexpression"
+    | PrimE (ProjPrim _, [e1]) ->
+      check e1.note.Note.const "constant ProjPrim on non-constant subexpression"
+    | PrimE (OptPrim, [e1]) ->
+      check e1.note.Note.const "constant OptPrim with non-constant subexpression"
+    | PrimE (TagPrim _, [e1]) ->
+      check e1.note.Note.const "constant TagPrim with non-constant subexpression"
+    | BlockE (ds, e) ->
+      List.iter (fun d -> match d.it with
+        | VarD _ | RefD _ -> check false "VarD/RefD in constant BlockE"
+        | LetD (p, e1) ->
+          check (Ir_utils.is_irrefutable p) "refutable pattern in constant BlockE";
+          check e1.note.Note.const "non-constant RHS in constant BlockE"
+      ) ds;
+      check e.note.Note.const "non-constant body in constant BlockE"
+    | LitE _ -> ()
+    | _ -> check false "unexpected constant expression"
+  end;
+
+
+and check_lexp env (lexp:Ir.lexp) : unit =
+  (* helpers *)
+  let check p = check env lexp.at p in
+  let (<:) t1 t2 = check_sub env lexp.at t1 t2 in
+  (* check type annotation *)
+  let t = lexp.note in
+  (match t with
+  | T.Mut t -> check_typ env t
+  | t -> error env lexp.at "lexp with non-mutable type");
+  (* check typing *)
+  match lexp.it with
+  | VarLE id ->
+    let { typ = t0; const; loc_known } =
+      try T.Env.find id env.vals
+      with Not_found -> error env lexp.at "unbound variable %s" id
+    in
+    check (not const) "cannot assign to constant variable";
+    t0 <: t
+  | DotLE (exp1, n) ->
+    begin
+      check_exp env exp1;
+      let t1 = typ exp1 in
+      let sort, tfs =
+        try T.as_obj_sub [n] t1 with Invalid_argument _ ->
+          error env exp1.at "expected object type, but expression produces type\n  %s"
+            (T.string_of_typ_expand t1)
+      in
+      check (sort <> T.Actor) "sort mismatch";
+      try T.lookup_val_field n tfs <: t with Invalid_argument _ ->
+        error env exp1.at "field name %s does not exist in type\n  %s"
+          n (T.string_of_typ_expand t1)
+    end
+  | IdxLE (exp1, exp2) ->
+    check_exp env exp1;
+    check_exp env exp2;
+    let t1 = T.promote (typ exp1) in
+    let t2 = try T.as_array_sub t1 with
+             | Invalid_argument _ ->
+               error env exp1.at "expected array type, but expression produces type\n  %s"
+                                       (T.string_of_typ_expand t1)
+    in
+    typ exp2 <: T.nat;
+    t2 <: t
+
+(* Cases *)
+
+and check_cases env t_pat t cases =
+  List.iter (check_case env t_pat t) cases
+
+and check_case env t_pat t {it = {pat; exp}; _} =
+  let ve = check_pat env pat in
+  check_sub env pat.at t_pat pat.note;
+  check_exp (adjoin_vals env ve) exp;
+  check env pat.at (T.sub (typ exp) t) "bad case"
+
+(* Arguments *)
+
+and check_args env args =
+  let rec go ve = function
+    | [] -> ve
+    | a::as_ ->
+      if (T.Env.mem a.it ve) then
+        error env a.at "duplicate binding for %s in argument list" a.it;
+      check_typ env a.note;
+      let val_info = {typ = a.note; const = false; loc_known = env.lvl = TopLvl } in
+      let env' = T.Env.add a.it val_info ve in
+      go env' as_
+  in go T.Env.empty args
+
+(* Patterns *)
+
+and gather_pat env const ve0 pat : val_env =
+  let rec go ve pat =
+    match pat.it with
+    | WildP
+    | LitP _ ->
+      ve
+    | VarP id ->
+      if T.Env.mem id ve0 then
+        error env pat.at "duplicate binding for %s in block" id;
+      let val_info = {typ = pat.note; const; loc_known = env.lvl = TopLvl} in
+      T.Env.add id val_info ve (*TBR*)
+    | TupP pats ->
+      List.fold_left go ve pats
+    | ObjP pfs ->
+      List.fold_left go ve (pats_of_obj_pat pfs)
+    | AltP (pat1, pat2) ->
+      let ve1, ve2 = go ve pat1, go ve pat2 in
+      let common i1 i2 = { typ = T.lub i1.typ i2.typ; loc_known = i1.loc_known && i2.loc_known; const = i1.const && i2.const } in
+      T.Env.merge (fun _ -> Lib.Option.map2 common) ve1 ve2
+    | OptP pat1
+    | TagP (_, pat1) ->
+      go ve pat1
+  in T.Env.adjoin ve0 (go T.Env.empty pat)
+
+and check_pat_exhaustive env pat : val_env =
+  let  ve = check_pat env pat in
+  (* TODO: actually check exhaustiveness *)
+  ve
+
+and check_pat env pat : val_env =
+  assert (pat.note <> T.Pre);
+  let (<:) = check_sub env pat.at in
+  let t = pat.note in
+  match pat.it with
+  | WildP -> T.Env.empty
+  | VarP id -> T.Env.singleton id { typ = pat.note; const = false; loc_known = env.lvl = TopLvl }
+  | LitP NullLit ->
+    t <: T.Opt T.Any;
+    T.Env.empty
+  | LitP lit ->
+    let t1 = T.Prim (type_lit env lit pat.at) in
+    let t1' = if T.eq t1 T.nat then T.int else t1 in  (* account for subtyping *)
+    t <: t1';
+    T.Env.empty
+  | TupP pats ->
+    let ve = check_pats pat.at env pats T.Env.empty in
+    let ts = List.map (fun pat -> pat.note) pats in
+    t <: T.Tup ts;
+    ve
+  | ObjP pfs ->
+    let ve = check_pats pat.at env (pats_of_obj_pat pfs) T.Env.empty in
+    check_pat_fields env t pfs;
+    ve
+  | OptP pat1 ->
+    let ve = check_pat env pat1 in
+    t <: T.Opt pat1.note;
+    ve
+  | TagP (l, pat1) ->
+    let ve = check_pat env pat1 in
+    check_pat_tag env t l pat1;
+    ve
+  | AltP (pat1, pat2) ->
+    let ve1, ve2 = check_pat env pat1, check_pat env pat2 in
+    t <: pat1.note;
+    t <: pat2.note;
+    if T.Env.(keys ve1 <> keys ve2) then
+        error env pat.at "set of bindings differ for alternative pattern";
+    let common i1 i2 = { typ = T.lub i1.typ i2.typ; loc_known = i1.loc_known && i2.loc_known; const = i1.const && i2.const } in
+    T.Env.merge (fun _ -> Lib.Option.map2 common) ve1 ve2
+
+and check_pats at env pats ve : val_env =
+  match pats with
+  | [] -> ve
+  | pat::pats' ->
+    let ve1 = check_pat env pat in
+    let ve' = disjoint_union env at "duplicate binding for %s in pattern" ve ve1 in
+    check_pats at env pats' ve'
+
+and check_pat_fields env t = List.iter (check_pat_field env t)
+
+and check_pat_field env t (pf : pat_field) =
+  let lab = pf.it.name in
+  let tf = T.{lab; typ = pf.it.pat.note; src = empty_src} in
+  let s, tfs = T.as_obj_sub [lab] t in
+  let (<:) = check_sub env pf.it.pat.at in
+  t <: T.Obj (s, [tf]);
+  if T.is_mut (T.lookup_val_field lab tfs) then
+    error env pf.it.pat.at "cannot match mutable field %s" lab
+
+and check_pat_tag env t l pat =
+  let (<:) = check_sub env pat.at in
+  match T.lookup_val_field_opt l (T.as_variant_sub l t) with
+  | Some t -> t <: pat.note
+  | None -> ()
+
+(* Objects *)
+
+and type_obj env s fs : T.typ =
+  let tfs = type_exp_fields env s fs in
+  T.Obj (s, tfs)
+
+and type_exp_fields env s fs : T.field list =
+  let tfs = List.map (type_exp_field env s) fs in
+  List.sort T.compare_field tfs
+
+and type_exp_field env s f : T.field =
+  let {name; var} = f.it in
+  let { typ = t; const; loc_known } =
+    try T.Env.find var env.vals
+    with Not_found -> error env f.at "field typing for %s not found" name
+  in
+  assert (t <> T.Pre);
+  check_sub env f.at t f.note;
+  if not (T.is_typ t) then begin
+    check env f.at ((s = T.Actor) ==> T.is_shared_func t)
+      "public actor field must have shared function type";
+  end;
+  T.{lab = name; typ = t; src = empty_src}
+
+(* Declarations *)
+
+and check_open_typ_binds env typ_binds =
+  let cs = List.map (fun tp -> tp.it.con) typ_binds in
+  let ce = List.fold_right (fun c ce -> T.ConSet.disjoint_add c ce) cs T.ConSet.empty in
+  let tbs = close_typ_binds cs (List.map (fun tb -> tb.it) typ_binds) in
+  let _ = check_typ_binds env tbs in
+  cs, tbs, ce
+
+and check_open_typ_bind env typ_bind =
+  match check_open_typ_binds env [typ_bind] with
+  | [c], [tb], ce -> c, tb, ce
+  | _ -> assert false
+
+and close_typ_binds cs tbs =
+  List.map (fun {con; sort; bound} -> {Type.var = Cons.name con; sort = sort; bound = Type.close cs bound}) tbs
+
+and check_dec env dec  =
+  (* helpers *)
+  let (<:) t1 t2 = check_sub env dec.at t1 t2 in
+  match dec.it with
+  | LetD (pat, exp) ->
+    ignore (check_pat_exhaustive env pat);
+    check_exp env exp;
+    typ exp <: pat.note
+  | VarD (id, t, exp) ->
+    check_exp env exp;
+    typ exp <: t
+  | RefD (id, t, lexp) ->
+    check_lexp env lexp;
+    lexp.note <: t
+
+and check_decs env decs  =
+  List.iter (check_dec env) decs;
+
+and gather_block_decs env decs =
+  List.fold_left (gather_dec env) empty_scope decs
+
+and gather_dec env scope dec : scope =
+  match dec.it with
+  | LetD (pat, exp) ->
+    { val_env = gather_pat env exp.note.Note.const scope.val_env pat }
+  | VarD (id, t, exp) ->
+    check_typ env t;
+    check env dec.at
+      (not (T.Env.mem id scope.val_env))
+      "duplicate variable definition in block";
+    let val_info = {typ = T.Mut t; const = false; loc_known = env.lvl = TopLvl} in
+    { val_env = T.Env.add id val_info scope.val_env }
+  | RefD (id, t, lexp) ->
+    check_mut_typ env t;
+    check env dec.at
+      (not (T.Env.mem id scope.val_env))
+      "duplicate variable definition in block";
+    let val_info = {typ = t; const = false; loc_known = false} in
+    { val_env = T.Env.add id val_info scope.val_env }
+
+(* Programs *)
+
+let check_comp_unit env = function
+  | LibU (ds, e) ->
+    let scope = gather_block_decs env ds in
+    let env' = adjoin env scope in
+    check_decs env' ds;
+    check_exp env' e;
+  | ProgU ds ->
+    let scope = gather_block_decs env ds in
+    let env' = adjoin env scope in
+    check_decs env' ds
+  | ActorU (as_opt, ds, fs,
+      { preupgrade; postupgrade; meta; heartbeat; timer; inspect }, t0) ->
+    let check p = check env no_region p in
+    let (<:) t1 t2 = check_sub env no_region t1 t2 in
+    let env' = match as_opt with
+      | None -> { env with async = None }
+      | Some as_ ->
+        let ve = check_args env as_ in
+        List.iter (fun a -> check_shared env no_region a.note) as_;
+        adjoin_vals { env with async = None } ve
+    in
+    let scope1 = gather_block_decs env' ds in
+    let env'' = adjoin env' scope1 in
+    check_decs env'' ds;
+    check_exp env'' preupgrade;
+    check_exp env'' postupgrade;
+    check_exp env'' heartbeat;
+    check_exp env'' timer;
+    check_exp env'' inspect;
+    typ preupgrade <: T.unit;
+    typ postupgrade <: T.unit;
+    typ heartbeat <: T.unit;
+    typ timer <: T.unit;
+    typ inspect <: T.unit;
+    check (T.is_obj t0) "bad annotation (object type expected)";
+    let (s0, tfs0) = T.as_obj t0 in
+    let val_tfs0 = List.filter (fun tf -> not (T.is_typ tf.T.typ)) tfs0 in
+    type_obj env'' T.Actor fs <: T.Obj (s0, val_tfs0);
+    () (* t0 <: t *)
+
+let check_prog verbose phase ((cu, flavor) as prog) : unit =
+  let env = initial_env flavor in
+  try check_comp_unit env cu
+  with CheckFailed s ->
+    let bt = Printexc.get_backtrace () in
+    if verbose
+    then begin
+      Printf.eprintf "Ill-typed intermediate code after %s:\n" phase;
+      Printf.eprintf "%s" (Wasm.Sexpr.to_string 80 (Arrange_ir.prog prog));
+      Printf.eprintf "%s" s;
+      Printf.eprintf "%s" bt;
+    end else begin
+      Printf.eprintf "Ill-typed intermediate code after %s (use -v to see dumped IR):\n" phase;
+      Printf.eprintf "%s" s;
+      Printf.eprintf "%s" bt;
+    end;
+    exit 1
+
+
+
+ + + diff --git a/coverage/ir_def/construct.ml.html b/coverage/ir_def/construct.ml.html new file mode 100644 index 00000000000..fb3885cfde0 --- /dev/null +++ b/coverage/ir_def/construct.ml.html @@ -0,0 +1,2415 @@ + + + + + construct.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+
+

+(* WIP translation of syntaxops to use IR in place of Source *)
+open Source
+open Ir
+open Ir_effect
+open Mo_values
+module Cons = Mo_types.Cons
+module T = Mo_types.Type
+
+(* Field names *)
+
+let nameN s = s
+
+let nextN = "next"
+
+(* Identifiers *)
+
+type var = (string * T.typ)
+
+let var id typ = (id, typ)
+
+let id_of_var (id, _) = id
+let typ_of_var (_, typ) = typ
+
+(* Fresh id generation *)
+
+module Stamps = Map.Make(String)
+let id_stamps = ref Stamps.empty
+
+let fresh name_base () : string =
+  let n = Lib.Option.get (Stamps.find_opt name_base !id_stamps) 0 in
+  id_stamps := Stamps.add name_base (n + 1) !id_stamps;
+  Printf.sprintf "$%s/%i" name_base n
+
+let fresh_id name_base () : id =
+  fresh name_base ()
+
+let fresh_var name_base typ : var =
+  let name = fresh name_base () in
+  var name typ
+
+let fresh_vars name_base ts =
+  List.mapi (fun i t -> fresh_var (Printf.sprintf "%s%i" name_base i) t) ts
+
+(* type arguments *)
+
+let typ_arg c sort typ =
+  { it = { Ir.con = c; Ir.sort = sort; Ir.bound = typ };
+    at = no_region;
+    note = () }
+
+(* Patterns *)
+
+let varP (n, typ) =
+  { it = VarP n;
+    at = no_region;
+    note = typ
+  }
+
+let tupP pats =
+  { it = TupP pats;
+    note = T.Tup (List.map (fun p -> p.note) pats);
+    at = no_region }
+
+let seqP ps =
+  match ps with
+  | [p] -> p
+  | ps -> tupP ps
+
+let wildP =
+  { it = WildP;
+    at = no_region;
+    note = T.Any
+  }
+
+(* Primitives *)
+
+let varE (id, typ) =
+  { it = VarE id; at = no_region; note = Note.{ def with typ = T.as_immut typ } }
+
+let varLE (id, typ) =
+  { it = VarLE id; at = no_region; note = typ }
+
+let primE prim es =
+  let typ = match prim with
+    | ShowPrim _ -> T.text
+    | ICArgDataPrim -> T.blob
+    | ICReplyPrim _
+    | ICRejectPrim -> T.Non
+    | ICCallerPrim -> T.caller
+    | ICStableRead t -> t
+    | ICMethodNamePrim -> T.text
+    | ICPerformGC
+    | ICStableWrite _ -> T.unit
+    | ICStableSize _ -> T.nat64
+    | IdxPrim
+    | DerefArrayOffset -> T.(as_immut (as_array_sub (List.hd es).note.Note.typ))
+    | EqArrayOffset -> T.bool
+    | NextArrayOffset -> T.nat
+    | GetLastArrayOffset -> T.int
+    | IcUrlOfBlob -> T.text
+    | ActorOfIdBlob t -> t
+    | BinPrim (t, _) -> t
+    | CastPrim (t1, t2) -> t2
+    | RelPrim _ -> T.bool
+    | SerializePrim _ -> T.blob
+    | SystemCyclesAvailablePrim
+    | SystemCyclesAcceptPrim -> T.nat
+    | DeserializePrim ts -> T.seq ts
+    | DeserializeOptPrim ts -> T.Opt (T.seq ts)
+    | OtherPrim "trap" -> T.Non
+    | OtherPrim "call_perform_status" -> T.(Prim Nat32)
+    | OtherPrim "call_perform_message" -> T.text
+    | OtherPrim "array_len"
+    | OtherPrim "blob_size"
+    | OtherPrim "text_len" -> T.nat
+    | OtherPrim "is_controller" -> T.bool
+    | _ -> assert false (* implement more as needed *)
+  in
+  let effs = List.map eff es in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (prim, es);
+    at = no_region;
+    note = Note.{ def with typ; eff }
+  }
+
+let selfRefE typ =
+  { it = PrimE (SelfRef typ, []);
+    at = no_region;
+    note = Note.{ def with typ }
+  }
+
+
+let assertE e =
+  { it = PrimE (AssertPrim, [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff e }
+  }
+
+
+let asyncE s typ_bind e typ1 =
+  { it = AsyncE (s, typ_bind, e, typ1);
+    at = no_region;
+    note =
+      Note.{ def with typ = T.Async (s, typ1, typ e);
+                      eff = T.(if s = Fut then Await else Triv) }
+  }
+
+let awaitE s e =
+  let (s, _ , typ) = T.as_async (T.normalize (typ e)) in
+  { it = PrimE (AwaitPrim s, [e]);
+    at = no_region;
+    note = Note.{ def with typ; eff = T.Await }
+  }
+
+let cps_asyncE s typ1 typ2 e =
+  { it = PrimE (CPSAsync (s, typ1), [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.Async (s, typ1, typ2); eff = eff e }
+  }
+
+let cps_awaitE s cont_typ e1 e2 =
+  match cont_typ with
+  | T.Func(T.Local, T.Returns, [], _, ts2) ->
+    { it = PrimE (CPSAwait (s, cont_typ), [e1; e2]);
+      at = no_region;
+      note = Note.{ def with typ = T.seq ts2; eff = max_eff (eff e1) (eff e2) }
+    }
+  | _ -> assert false
+
+let ic_replyE ts e =
+  (match ts with
+  | [t] -> assert (T.sub (e.note.Note.typ) t)
+  | _ -> assert (T.sub (T.Tup ts) (e.note.Note.typ)));
+  { it = PrimE (ICReplyPrim ts, [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff e }
+  }
+
+let ic_rejectE e =
+  { it = PrimE (ICRejectPrim, [e]);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff e }
+  }
+
+let ic_callE f e k r =
+  let es = [f; e; k; r] in
+  let effs = List.map eff es in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (ICCallPrim, es);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff }
+  }
+
+let ic_call_rawE p m a k r =
+  let es = [p; m; a; k; r] in
+  let effs = List.map eff es in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (ICCallRawPrim, es);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff }
+  }
+
+(* tuples *)
+
+let projE e n =
+  match T.promote (typ e) with
+  | T.Tup ts ->
+     { it = PrimE (ProjPrim n, [e]);
+       note = Note.{ def with typ = List.nth ts n; eff = eff e };
+       at = no_region;
+     }
+  | _ -> failwith "projE"
+
+let optE e =
+ { it = PrimE (OptPrim, [e]);
+   note = Note.{ def with typ = T.Opt (typ e); eff = eff e };
+   at = no_region;
+ }
+
+let tagE i e =
+ { it = PrimE (TagPrim i, [e]);
+   note = Note.{ def with typ = T.Variant [{T.lab = i; typ = typ e; src = T.empty_src}]; eff = eff e };
+   at = no_region;
+ }
+
+let dec_eff dec = match dec.it with
+  | LetD (_, e) | VarD (_, _, e) -> eff e
+  | RefD (_, _, le) ->
+    match le.it with
+    | DotLE (e, _) -> eff e
+    | _ -> assert false (*FIXME*)
+
+let rec simpl_decs decs = List.concat_map simpl_dec decs
+and simpl_dec dec = match dec.it with
+  | LetD ({it = WildP;_}, {it = PrimE (TupPrim, []);_}) ->
+    []
+  | LetD ({it = TupP ps;_}, {it = PrimE (TupPrim, es);_}) when List.length ps = List.length es ->
+    simpl_decs (List.map2 (fun p e -> LetD (p, e) @@ p.at) ps es)
+  | _ ->
+    [ dec ]
+
+let blockE decs exp =
+  let decs' = simpl_decs decs in
+  match decs' with
+  | [] -> exp
+  | _ ->
+    let es = List.map dec_eff decs' in
+    let typ = typ exp in
+    let eff =  List.fold_left max_eff (eff exp) es in
+    { it = BlockE (decs', exp);
+      at = no_region;
+      note = Note.{ def with typ; eff }
+    }
+
+let nat32E n =
+  { it = LitE (Nat32Lit n);
+    at = no_region;
+    note = Note.{ def with typ = T.(Prim Nat32) }
+  }
+
+let natE n =
+  { it = LitE (NatLit n);
+    at = no_region;
+    note = Note.{ def with typ = T.nat }
+  }
+
+let intE n =
+  { it = LitE (IntLit n);
+    at = no_region;
+    note = Note.{ def with typ = T.int }
+  }
+
+let textE s =
+  { it = LitE (TextLit s);
+    at = no_region;
+    note = Note.{ def with typ = T.text }
+  }
+
+let blobE s =
+  { it = LitE (BlobLit s);
+    at = no_region;
+    note = Note.{ def with typ = T.blob }
+  }
+
+let boolE b =
+  { it = LitE (BoolLit b);
+    at = no_region;
+    note = Note.{ def with typ = T.bool }
+  }
+
+let nullE () =
+  { it = LitE NullLit;
+    at = no_region;
+    note = Note.{ def with typ = T.Prim T.Null }
+  }
+
+
+(* Functions *)
+
+let funcE name sort ctrl typ_binds args typs exp =
+  let cs = List.map (function { it = {con;_ }; _ } -> con) typ_binds in
+  let tbs = List.map (function { it = { sort; bound; con}; _ } ->
+    {T.var = Cons.name con; T.sort; T.bound = T.close cs bound})
+    typ_binds
+  in
+  let ts1 = List.map (function arg -> T.close cs arg.note) args in
+  let ts2 = List.map (T.close cs) typs in
+  let typ = T.Func(sort, ctrl, tbs, ts1, ts2) in
+  { it = FuncE(name, sort, ctrl, typ_binds, args, typs, exp);
+    at = no_region;
+    note = Note.{ def with typ; eff = T.Triv };
+  }
+
+let callE exp1 typs exp2 =
+  let typ =  match T.promote (typ exp1) with
+    | T.Func (_sort, control, _, _, ret_tys) ->
+      T.codom control (fun () -> List.hd typs) (List.map (T.open_ typs) ret_tys)
+    | T.Non -> T.Non
+    | _ -> raise (Invalid_argument "callE expect a function")
+  in
+  let p = CallPrim typs in
+  let es = [exp1; exp2] in
+  { it = PrimE (p, es);
+    at = no_region;
+    note = Note.{ def with
+     typ;
+     eff = Ir_effect.infer_effect_prim p es
+    }
+  }
+
+
+let ifE exp1 exp2 exp3 =
+  { it = IfE (exp1, exp2, exp3);
+    at = no_region;
+    note = Note.{ def with
+      typ = T.lub (typ exp2) (typ exp3);
+      eff = max_eff (eff exp1) (max_eff (eff exp2) (eff exp3))
+    }
+  }
+
+let falseE () = boolE false
+let trueE () = boolE true
+let notE : Ir.exp -> Ir.exp = fun e ->
+  primE (RelPrim (T.bool, Operator.EqOp)) [e; falseE ()]
+
+let andE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  ifE e1 e2 (falseE ())
+let orE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  ifE e1 (trueE ()) e2
+let impliesE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  orE (notE e1) e2
+let oldE : Ir.exp -> Ir.exp = fun e ->
+  { it = (primE (CallPrim [typ e]) [e]).it;
+    at = no_region;
+    note = Note.{ def with
+      typ = typ e;
+    }
+  }
+
+let rec conjE : Ir.exp list -> Ir.exp = function
+  | [] -> trueE ()
+  | [x] -> x
+  | (x::xs) -> andE x (conjE xs)
+
+let dotE exp name typ =
+  { it = PrimE (DotPrim name, [exp]);
+    at = no_region;
+    note = Note.{ def with
+      typ = typ;
+      eff = eff exp
+    }
+  }
+
+let switch_optE exp1 exp2 pat exp3 typ1  =
+  { it =
+      SwitchE
+        (exp1,
+         [{ it = {pat = {it = LitP NullLit;
+                         at = no_region;
+                         note = typ exp1};
+                  exp = exp2};
+            at = no_region;
+           note = () };
+          { it = {pat = {it = OptP pat;
+                        at = no_region;
+                        note = typ exp1};
+                  exp = exp3};
+            at = no_region;
+            note = () }]
+        );
+    at = no_region;
+    note = Note.{ def with
+      typ = typ1;
+      eff = max_eff (eff exp1) (max_eff (eff exp2) (eff exp3))
+    }
+  }
+
+let switch_variantE exp1 cases typ1 =
+  { it =
+      SwitchE (exp1,
+        List.map (fun (l,p,e) ->
+          { it = {pat = {it = TagP (l, p);
+                         at = no_region;
+                         note = typ exp1};
+                  exp = e};
+            at = no_region;
+            note = ()
+          })
+          cases
+      );
+    at = no_region;
+    note = Note.{ def with
+      typ = typ1;
+      eff = List.fold_left max_eff (eff exp1) (List.map (fun (l,p,e) -> eff e) cases)
+    }
+  }
+
+let switch_textE exp1 cases (pat, exp2) typ1 =
+  let cs =
+    (List.map (fun (t, e) ->
+      {it = {pat =
+        {it = LitP (TextLit t);
+         at = no_region;
+         note = typ exp1};
+         exp = e};
+         at = no_region;
+         note = ()})
+      cases) @
+    [{it = {pat = pat; exp = exp2};
+      at = no_region;
+      note = ()}]
+  in
+  { it = SwitchE (exp1, cs);
+    at = no_region;
+    note = Note.{
+      def with
+      typ = typ1;
+      eff = List.fold_left max_eff (eff exp1) (List.map (fun c -> eff c.it.exp) cs)
+    }
+  }
+
+
+let tupE exps =
+  let effs = List.map eff exps in
+  let eff = List.fold_left max_eff T.Triv effs in
+  { it = PrimE (TupPrim, exps);
+    at = no_region;
+    note = Note.{ def with typ = T.Tup (List.map typ exps); eff };
+  }
+
+let unitE () = tupE []
+
+let breakE l exp =
+  { it = PrimE (BreakPrim l, [exp]);
+    at = no_region;
+    note = Note.{ def with typ = T.Non; eff = eff exp };
+  }
+
+let retE exp =
+  { it = PrimE (RetPrim, [exp]);
+    at = no_region;
+    note = Note.{ def with typ = T.Non; eff = eff exp };
+  }
+
+let immuteE e =
+  { e with
+    note = Note.{ def with typ = T.as_immut (typ e); eff = eff e };
+  }
+
+let assignE v exp2 =
+  assert (T.is_mut (typ_of_var v));
+  { it = AssignE (varLE v, exp2);
+    at = no_region;
+    note = Note.{ def with typ = T.unit; eff = eff exp2 };
+  }
+
+let labelE l typ exp =
+  { it = LabelE (l, typ, exp);
+    at = no_region;
+    note = Note.{ def with typ; eff = eff exp }
+  }
+
+(* Used to desugar for loops, while loops and loop-while loops. *)
+let loopE exp =
+  { it = LoopE exp;
+    at = no_region;
+    note = Note.{ def with typ = T.Non; eff = eff exp }
+  }
+
+let declare_idE x typ exp1 =
+  { it = DeclareE (x, typ, exp1);
+    at = no_region;
+    note = exp1.note;
+  }
+
+let define_idE x mut exp1 =
+  { it = DefineE (x, mut, exp1);
+    at = no_region;
+    note = Note.{ def with typ = T.unit }
+  }
+
+let newObjE sort ids typ =
+  { it = NewObjE (sort, ids, typ);
+    at = no_region;
+    note = Note.{ def with typ }
+  }
+
+
+(* Declarations *)
+
+let letP pat exp = LetD (pat, exp) @@ no_region
+
+let letD x exp = letP (varP x) exp
+
+let varD x exp =
+  let t = typ_of_var x in
+  assert (T.is_mut t);
+  VarD (id_of_var x, T.as_immut t, exp) @@ no_region
+
+let refD x lexp =
+  let t = typ_of_var x in
+  assert (T.is_mut t);
+  RefD (id_of_var x, t, lexp) @@ no_region
+
+let expD exp =
+  let pat = { it = WildP; at = exp.at; note = exp.note.Note.typ } in
+  LetD (pat, exp) @@ exp.at
+
+let let_no_shadow (id, typ) exp decs =
+  (* could be replaced by a more simple “defined by this decs” function *)
+  let (_,f) = Freevars.decs decs in
+  if Freevars.M.mem id f
+  then decs
+  else [ letD (id, typ) exp ] @ decs
+
+(* Derived expressions *)
+
+let letE x exp1 exp2 = blockE [letD x exp1] exp2
+
+let thenE exp1 exp2 = blockE [expD exp1] exp2
+
+let ignoreE exp =
+  if typ exp = T.unit
+  then exp
+  else thenE exp (unitE ())
+
+and let_else_switch p e f =
+  let v = fresh_var "v" (e.note.Note.typ) in
+  (* Evaluate e once, assign it to variable v, and pattern match on v. If v
+     matches p, expression evaluates to v. Otherwise evaluate f. *)
+  blockE
+    [letD v e]
+    {
+      e with
+      it = SwitchE(
+        varE v,
+        [
+          { it = { pat = p; exp = varE v }; at = e.at; note = () };
+          { it = { pat = wildP; exp = f }; at = f.at ; note = () }
+        ]
+      );
+      note = Note.{ def with
+        typ = e.note.Note.typ;
+        eff = max_eff (eff e) (eff f)
+      }
+    }
+
+(* Mono-morphic function expression *)
+
+let arg_of_var (id, typ) =
+  { it = id; at = no_region; note = typ }
+
+let var_of_arg { it = id; note = typ; _} = (id, typ)
+
+let unary_funcE name typ x exp =
+  let sort, control, arg_tys, ret_tys = match typ with
+    | T.Func(s, c, _, ts1, ts2) -> s, c, ts1, ts2
+    | _ -> assert false in
+  let args, exp' =
+    if List.length arg_tys = 1;
+    then
+      [ arg_of_var x ], exp
+    else
+      let vs = fresh_vars "param" arg_tys in
+      List.map arg_of_var vs,
+      blockE [letD x (tupE (List.map varE vs))] exp
+  in
+  ({it = FuncE
+     ( name,
+       sort,
+       control,
+       [],
+       args,
+       (* TODO: Assert invariant: retty has no free (unbound) DeBruijn indices -- Claudio *)
+       ret_tys,
+       exp'
+     );
+    at = no_region;
+    note = Note.{ def with typ }
+   })
+
+let nary_funcE name typ xs exp =
+  let sort, control, arg_tys, ret_tys = match typ with
+    | T.Func(s, c, _, ts1, ts2) -> s, c, ts1, ts2
+    | _ -> assert false in
+  assert (List.length arg_tys = List.length xs);
+  ({it = FuncE
+      ( name,
+        sort,
+        control,
+        [],
+        List.map arg_of_var xs,
+        ret_tys,
+        exp
+      );
+    at = no_region;
+    note = Note.{ def with typ }
+  })
+
+(* Mono-morphic function declaration, sharing inferred from f's type *)
+let funcD ((id, typ) as f) x exp =
+  letD f (unary_funcE id typ x exp)
+
+(* Mono-morphic, n-ary function declaration *)
+let nary_funcD ((id, typ) as f) xs exp =
+  letD f (nary_funcE id typ xs exp)
+
+(* Continuation types with explicit answer typ *)
+
+let contT typ ans_typ = T.(Func (Local, Returns, [], as_seq typ, as_seq ans_typ))
+
+let err_contT ans_typ =  T.(Func (Local, Returns, [], [catch], as_seq ans_typ))
+
+let answerT typ : T.typ =
+  match typ with
+  | T.Func (T.Local, T.Returns, [], ts1, ts2) -> T.seq ts2
+  | _ -> assert false
+
+let cpsT typ ans_typ = T.(Func (Local, Returns, [], [contT typ ans_typ; err_contT ans_typ], as_seq ans_typ))
+
+(* Sequence expressions *)
+
+let seqE es =
+  match es with
+  | [e] -> e
+  | es -> tupE es
+
+(* Lambdas & continuations *)
+
+(* Lambda abstraction *)
+
+(* local lambda *)
+let (-->) x exp =
+  let fun_ty = T.Func (T.Local, T.Returns, [], T.as_seq (typ_of_var x), T.as_seq (typ exp)) in
+  unary_funcE "$lambda" fun_ty x exp
+
+(* n-ary local lambda *)
+let (-->*) xs exp =
+  let fun_ty = T.Func (T.Local, T.Returns, [], List.map typ_of_var xs, T.as_seq (typ exp)) in
+  nary_funcE "$lambda" fun_ty xs exp
+
+let close_typ_binds cs tbs =
+  List.map (fun {it = {con; sort; bound}; _} -> {T.var = Cons.name con; sort=sort; bound = T.close cs bound}) tbs
+
+(* polymorphic, n-ary local lambda *)
+let forall tbs e =
+ let cs = List.map (fun tb -> tb.it.con) tbs in
+ match e.it, e.note.Note.typ with
+ | FuncE (n, s, c1, [], xs, ts, exp),
+   T.Func ( _, c2, [], ts1, ts2) ->
+   { e with
+     it = FuncE(n, s, c1, tbs, xs, ts, exp);
+     note = Note.{ e.note with
+       typ = T.Func(s, c2, close_typ_binds cs tbs,
+         List.map (T.close cs) ts1,
+         List.map (T.close cs) ts2)
+     }
+   }
+ | _ -> assert false
+
+(* Lambda application (monomorphic) *)
+
+let ( -*- ) exp1 exp2 = callE exp1 [] exp2
+
+
+(* derived loop forms; each can be expressed as an unconditional loop *)
+
+let whileE exp1 exp2 =
+  (* while e1 e2
+     ~~> label l loop {
+           if e1 then { e2 } else { break l }
+         }
+  *)
+  let lab = fresh_id "done" () in
+  labelE lab T.unit (
+    loopE (
+      ifE exp1
+        exp2
+        (breakE lab (tupE []))
+    )
+  )
+
+let loopWhileE exp1 exp2 =
+  (* loop e1 while e2
+    ~~> label l loop {
+          let () = e1 ;
+          if e2 { } else { break l }
+        }
+   *)
+  let lab = fresh_id "done" () in
+  labelE lab T.unit (
+    loopE (
+      thenE exp1 (
+        ifE exp2
+          (tupE [])
+          (breakE lab (tupE []))
+      )
+    )
+  )
+
+let forE pat exp1 exp2 =
+  (* for (p in e1) e2
+     ~~>
+     let nxt = e1.next ;
+     label l loop {
+       switch nxt () {
+         case null { break l };
+         case ?p    { e2 };
+       }
+     } *)
+  let lab = fresh_id "done" () in
+  let ty1 = exp1.note.Note.typ in
+  let _, tfs = T.as_obj_sub [nextN] ty1 in
+  let tnxt = T.lookup_val_field nextN tfs in
+  let nxt = fresh_var "nxt" tnxt in
+  letE nxt (dotE exp1 nextN tnxt) (
+    labelE lab T.unit (
+      loopE (
+        switch_optE (callE (varE nxt) [] (unitE ()))
+          (breakE lab (unitE ()))
+          pat exp2 T.unit
+      )
+    )
+  )
+
+let unreachableE () =
+  (* Do we want a dedicated UnreachableE in the AST? *)
+  loopE (unitE ())
+
+let objE sort typ_flds flds =
+  let rec go ds fields fld_tys flds =
+    match flds with
+    | [] ->
+      blockE
+        (List.rev ds)
+        (newObjE sort fields
+           (T.obj sort
+              ((List.map (fun (id,c) -> (id, T.Typ c)) typ_flds)
+               @ fld_tys)))
+    | (lab, exp)::flds ->
+      let v = fresh_var lab (typ exp) in
+      let field = {
+        it = {name = lab; var = id_of_var v};
+        at = no_region;
+        note = typ exp
+      } in
+      go ((letD v exp)::ds) (field::fields) ((lab, typ exp)::fld_tys) flds
+  in
+  go [] [] [] flds
+
+let recordE flds = objE T.Object [] flds
+
+let check_call_perform_status success mk_failure =
+  ifE
+    (callE
+      (varE (var "@call_succeeded"
+        T.(Func (Local, Returns, [], [], [bool]))))
+      [] (unitE ()))
+    success
+    (mk_failure
+      (callE
+        (varE (var "@call_error"
+          T.(Func (Local, Returns, [], [], [error]))))
+        [] (unitE ())))
+
+
+
+ + + diff --git a/coverage/ir_def/freevars.ml.html b/coverage/ir_def/freevars.ml.html new file mode 100644 index 00000000000..a7daff6f246 --- /dev/null +++ b/coverage/ir_def/freevars.ml.html @@ -0,0 +1,497 @@ + + + + + freevars.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+
+
open Source
+open Ir
+open Mo_types
+
+(* We collect a few things along the way *)
+
+(* We want to know:
+   Is this variable used (potentially) captured?
+   Is this variable used eagerly.
+
+   capture = true; eager = false means it is _only_ used under lambdas
+*)
+type usage_info = { captured : bool; eager : bool }
+
+let join u1 u2 = {
+  captured = u1.captured || u2.captured;
+  eager = u1.eager || u2.eager
+}
+
+module M = Env.Make(String)
+module S = Set.Make(String)
+
+
+(* A set of free variables *)
+type f = usage_info M.t
+
+(* Operations: Union and removal *)
+let (++) : f -> f -> f = M.union (fun _ u1 u2 -> Some (join u1 u2))
+let unions f xs = List.fold_left (++) M.empty (List.map f xs)
+let (//) x y = M.remove y x
+
+(* Operations: left-biased Map union *)
+let (+-) = M.union (fun _ u1 _ -> Some u1)
+
+(* A set of defined variables (with type information) *)
+type td = Mo_types.Type.typ M.t
+
+(* A combined set of free variables and defined variables,
+   (in declarations) *)
+type fd = f * td
+
+let fd_of_defs m = (M.empty, m)
+
+(* Operations: *)
+
+(* This adds a set of free variables to a combined set *)
+let (+++) ((f,d) : fd) x = ((++) f x, d)
+(* This takes the union of two combined sets *)
+let (++++) (f1, d1) (f2,d2) =
+  (++) f1 f2,
+  M.union (fun _ t _ -> Some t) d1 d2 (* any type is fine *)
+let union_binders f xs = List.fold_left (++++) (M.empty, M.empty) (List.map f xs)
+
+let diff (m1 : 'a M.t) (m2 : 'b M.t) : 'a M.t =
+  M.merge (fun k v1 -> function None -> v1 | Some _ -> None) m1 m2
+
+let map_of_set x s = S.fold (fun v m -> M.add v x m) s M.empty
+let set_of_map m = M.fold (fun v _ m -> S.add v m) m S.empty
+
+(* The bound variables from the second argument scope over the first *)
+let (///) (x : f) ((f,d) : fd) = f ++ diff x d
+
+(* Usage tracking:
+
+   We track which variables may be captured.
+   Initially, variables are not captured.
+   All variables under a lambda become captured.
+*)
+let under_lambda : f -> f = M.map (fun _ -> { captured = true; eager = false })
+
+(* Projections *)
+let captured_vars : f -> S.t =
+  fun f -> set_of_map (M.filter (fun _ u -> u.captured) f)
+let eager_vars : f -> S.t =
+  fun f -> set_of_map (M.filter (fun _ u -> u.eager) f)
+
+(* This closes a combined set over itself (recursion or mutual recursion) *)
+let close (f,d) = diff f d
+
+(* One traversal for each syntactic category, named by that category *)
+
+let rec pat p : td = match p.it with
+  | WildP | LitP _  -> M.empty
+  | VarP i          -> M.singleton i p.note
+  | TupP ps         -> pats ps
+  | ObjP pfs        -> pats (pats_of_obj_pat pfs)
+  | OptP p
+  | TagP (_, p)     -> pat p
+  | AltP (p1, p2)   -> pat p1 +- pat p2
+
+and pats ps : td = List.(fold_left (+-) M.empty (map pat ps))
+
+let arg a : fd = (M.empty, M.singleton a.it a.note)
+
+let args as_ : fd = union_binders arg as_
+
+let id i = M.singleton i {captured = false; eager = true}
+
+(* The mutable fields of an IR object behave a bit like a lambda, in that they capture mutable
+boxes by reference. So set captured = true for them. *)
+let fields fs = unions (fun f ->
+  M.singleton f.it.var {captured = Type.is_mut f.note; eager = true}
+) fs
+
+let rec exp e : f = match e.it with
+  | VarE i              -> id i
+  | LitE l              -> M.empty
+  | PrimE (_, es)       -> exps es
+  | AssignE (e1, e2)    -> lexp e1 ++ exp e2
+  | BlockE (ds, e1)     -> close (decs ds +++ exp e1)
+  | IfE (e1, e2, e3)    -> exps [e1; e2; e3]
+  | SwitchE (e, cs)     -> exp e ++ cases cs
+  | LoopE e1            -> exp e1
+  | LabelE (i, t, e)    -> exp e
+  | AsyncE (_, _, e, _) -> exp e
+  | DeclareE (i, t, e)  -> exp e  // i
+  | DefineE (i, m, e)   -> id i ++ exp e
+  | FuncE (x, s, c, tp, as_, t, e) -> under_lambda (exp e /// args as_)
+  | ActorE (ds, fs, u, _)  -> actor ds fs u
+  | NewObjE (_, fs, _)  -> fields fs
+  | TryE (e, cs)        -> exp e ++ cases cs
+  | SelfCallE (_, e1, e2, e3) -> under_lambda (exp e1) ++ exp e2 ++ exp e3
+
+and actor ds fs u = close (decs ds +++ fields fs +++ system u)
+
+and system {meta; preupgrade; postupgrade; heartbeat; timer; inspect} =
+  under_lambda (exp preupgrade) ++
+  under_lambda (exp postupgrade) ++
+  under_lambda (exp heartbeat) ++
+  under_lambda (exp timer) ++
+  under_lambda (exp inspect)
+
+and exps es : f = unions exp es
+
+and lexp le : f = match le.it with
+  | VarLE i              -> id i
+  | DotLE (e1, _)        -> exp e1
+  | IdxLE (e1, e2)       -> exps [e1; e2]
+
+and case (c : case) = exp c.it.exp /// fd_of_defs (pat c.it.pat)
+
+and cases cs : f = unions case cs
+
+and dec d = match d.it with
+  | LetD (p, e) -> fd_of_defs (pat p) +++ exp e
+  | VarD (i, t, e) -> fd_of_defs (M.singleton i t) +++ exp e
+  | RefD (i, t, e) -> fd_of_defs (M.singleton i t) +++ lexp e
+
+(* The variables captured by a function. May include the function itself! *)
+and captured e =
+  List.map fst (M.bindings (exp e))
+
+and decs ps : fd = union_binders dec ps
+
+
+
+ + + diff --git a/coverage/ir_def/ir.ml.html b/coverage/ir_def/ir.ml.html new file mode 100644 index 00000000000..e2fa52b198e --- /dev/null +++ b/coverage/ir_def/ir.ml.html @@ -0,0 +1,1006 @@ + + + + + ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+
+
open Mo_types
+open Mo_values
+
+type id = string
+
+(* Literals *)
+
+type lit =
+  | NullLit
+  | BoolLit of bool
+  | NatLit of Numerics.Nat.t
+  | Nat8Lit of Numerics.Nat8.t
+  | Nat16Lit of Numerics.Nat16.t
+  | Nat32Lit of Numerics.Nat32.t
+  | Nat64Lit of Numerics.Nat64.t
+  | IntLit of Numerics.Int.t
+  | Int8Lit of Numerics.Int_8.t
+  | Int16Lit of Numerics.Int_16.t
+  | Int32Lit of Numerics.Int_32.t
+  | Int64Lit of Numerics.Int_64.t
+  | FloatLit of Numerics.Float.t
+  | CharLit of Value.unicode
+  | TextLit of string
+  | BlobLit of string
+
+(* Patterns *)
+
+type 'a phrase = ('a, Note.t) Source.annotated_phrase
+
+type typ_bind' = {con : Type.con; sort : Type.bind_sort; bound : Type.typ}
+type typ_bind = typ_bind' Source.phrase
+
+type unop = Operator.unop
+type binop = Operator.binop
+type relop = Operator.relop
+
+type mut = Const | Var
+
+type pat = (pat', Type.typ) Source.annotated_phrase
+and pat' =
+  | WildP                                      (* wildcard *)
+  | VarP of id                                 (* variable *)
+  | LitP of lit                                (* literal *)
+  | TupP of pat list                           (* tuple *)
+  | ObjP of pat_field list                     (* object *)
+  | OptP of pat                                (* option *)
+  | TagP of Type.lab * pat                     (* variant *)
+  | AltP of pat * pat                          (* disjunctive *)
+
+and pat_field = pat_field' Source.phrase
+and pat_field' = {name : Type.lab; pat : pat}
+
+(* Like id, but with a type attached *)
+type arg = (string, Type.typ) Source.annotated_phrase
+
+(* Expressions *)
+
+type exp = exp' phrase
+and exp' =
+  | PrimE of (prim * exp list)                 (* primitive *)
+  | VarE of id                                 (* variable *)
+  | LitE of lit                                (* literal *)
+  | AssignE of lexp * exp                      (* assignment *)
+  | BlockE of (dec list * exp)                 (* block *)
+  | IfE of exp * exp * exp                     (* conditional *)
+  | SwitchE of exp * case list                 (* switch *)
+  | LoopE of exp                               (* do-while loop *)
+  | LabelE of id * Type.typ * exp              (* label *)
+  | AsyncE of Type.async_sort * typ_bind * exp * Type.typ        (* async/async* *)
+  | DeclareE of id * Type.typ * exp            (* local promise *)
+  | DefineE of id * mut * exp                  (* promise fulfillment *)
+  | FuncE of                                   (* function *)
+      string * Type.func_sort * Type.control * typ_bind list * arg list * Type.typ list * exp
+  | SelfCallE of Type.typ list * exp * exp * exp (* essentially ICCallPrim (FuncE shared…) *)
+  | ActorE of dec list * field list * system * Type.typ (* actor *)
+  | NewObjE of Type.obj_sort * field list * Type.typ  (* make an object *)
+  | TryE of exp * case list                    (* try/catch *)
+
+and system = {
+  meta : meta;
+  (* TODO: use option expressions for (some or all of) these *)
+  preupgrade : exp;
+  postupgrade : exp;
+  heartbeat : exp;
+  timer : exp; (* TODO: use an option type: (Default of exp | UserDefined of exp) option *)
+  inspect : exp
+}
+
+and candid = {
+    args : string;
+    service : string;
+  }
+
+and meta = {
+    candid : candid;  (* Candid (of service, never actor class) *)
+    sig_ : string  (* Motoko stable signature *)
+  }
+
+and field = (field', Type.typ) Source.annotated_phrase
+and field' = {name : Type.lab; var : id} (* the var is by reference, not by value *)
+
+and case = case' Source.phrase
+and case' = {pat : pat; exp : exp}
+
+and lexp = (lexp', Type.typ) Source.annotated_phrase
+and lexp' =
+  | VarLE of id                                (* variable *)
+  | IdxLE of exp * exp                         (* array indexing *)
+  | DotLE of exp * Type.lab                    (* object projection *)
+
+
+(* In the IR, a prim is any AST node that has expr subexpressions, but they are
+all call-by-value. Many passes can treat them uniformly, so they are unified
+using the PrimE node. *)
+and prim =
+  | CallPrim of Type.typ list         (* function call *)
+  | UnPrim of Type.typ * unop         (* unary operator *)
+  | BinPrim of Type.typ * binop       (* binary operator *)
+  | RelPrim of Type.typ * relop       (* relational operator *)
+  | TupPrim                           (* the tuple constructor *)
+  | ProjPrim of int                   (* tuple projection *)
+  | OptPrim                           (* option injection *)
+  | TagPrim of id                     (* variant injection *)
+  | DotPrim of Type.lab               (* object projection *)
+  | ActorDotPrim of Type.lab          (* actor field access *)
+  | ArrayPrim of mut * Type.typ       (* array constructor *)
+  | IdxPrim                           (* array indexing *)
+  | BreakPrim of id                   (* break *)
+  | RetPrim                           (* return *)
+  | AwaitPrim of Type.async_sort       (* await/await* *)
+  | AssertPrim                        (* assertion *)
+  | ThrowPrim                         (* throw *)
+  | ShowPrim of Type.typ              (* debug_show *)
+  | SerializePrim of Type.typ list    (* Candid serialization prim *)
+  | DeserializePrim of Type.typ list  (* Candid deserialization prim *)
+  | DeserializeOptPrim of Type.typ list
+     (* Candid deserialization prim (returning Opt) *)
+  | NumConvTrapPrim of Type.prim * Type.prim
+  | NumConvWrapPrim of Type.prim * Type.prim
+  | DecodeUtf8
+  | EncodeUtf8
+  | CastPrim of Type.typ * Type.typ   (* representationally a noop *)
+  | ActorOfIdBlob of Type.typ
+  | BlobOfIcUrl                       (* traps on syntax or checksum failure *)
+  | IcUrlOfBlob
+  | SelfRef of Type.typ               (* returns the self actor ref *)
+  | SystemTimePrim
+  (* Array field iteration/access *)
+  | NextArrayOffset                   (* advance compact array offset, as Nat *)
+  | EqArrayOffset                     (* equate compact array offset at type Int *)
+  | DerefArrayOffset                  (* compact array offset indexing (unchecked) *)
+  | GetLastArrayOffset                (* compact array offset of the last element, or -1, as Int *)
+  (* Funds *)
+  | SystemCyclesAddPrim
+  | SystemCyclesAcceptPrim
+  | SystemCyclesAvailablePrim
+  | SystemCyclesBalancePrim
+  | SystemCyclesRefundedPrim
+  | SetCertifiedData
+  | GetCertificate
+
+  | OtherPrim of string               (* Other primitive operation, no custom typing rule *)
+  (* backend stuff *)
+  | CPSAwait of Type.async_sort * Type.typ
+                                      (* typ is the current continuation type of cps translation *)
+  | CPSAsync of Type.async_sort * Type.typ
+  | ICPerformGC
+  | ICReplyPrim of Type.typ list
+  | ICRejectPrim
+  | ICCallerPrim
+  | ICCallPrim
+  | ICCallRawPrim
+  | ICMethodNamePrim
+  | ICArgDataPrim
+  | ICStableWrite of Type.typ          (* serialize value of stable type to stable memory *)
+  | ICStableRead of Type.typ           (* deserialize value of stable type from stable memory *)
+  | ICStableSize of Type.typ
+
+(* Declarations *)
+
+and dec = dec' Source.phrase
+and dec' =
+  | LetD of pat * exp                          (* immutable *)
+  | VarD of id * Type.typ * exp                (* mutable *)
+  | RefD of id * Type.typ * lexp               (* reference - only required for flag --experimental_field_aliasing *)
+
+(* Literals *)
+
+(* NB: This function is currently unused *)
+let string_of_lit = function
+  | BoolLit false -> "false"
+  | BoolLit true  ->  "true"
+  | IntLit n
+  | NatLit n      -> Numerics.Int.to_pretty_string n
+  | Int8Lit n     -> Numerics.Int_8.to_pretty_string n
+  | Int16Lit n    -> Numerics.Int_16.to_pretty_string n
+  | Int32Lit n    -> Numerics.Int_32.to_pretty_string n
+  | Int64Lit n    -> Numerics.Int_64.to_pretty_string n
+  | Nat8Lit n     -> Numerics.Nat8.to_pretty_string n
+  | Nat16Lit n    -> Numerics.Nat16.to_pretty_string n
+  | Nat32Lit n    -> Numerics.Nat32.to_pretty_string n
+  | Nat64Lit n    -> Numerics.Nat64.to_pretty_string n
+  | CharLit c     -> string_of_int c
+  | NullLit       -> "null"
+  | TextLit t     -> t
+  | BlobLit b     -> Printf.sprintf "%s" b
+  | FloatLit f    -> Numerics.Float.to_pretty_string f
+
+(* Flavor *)
+
+(*
+We have a bunch of flavors of the IR, where some constructors are not
+allowed in some flavors. In an ideal world, we would have different IRs for
+that (or maybe GADTs). But for now we simply track that on the value level. The
+main purpose of tracking that is to inform `Check_ir` about the invariants that
+should hold.
+*)
+
+type flavor = {
+  has_typ_field : bool; (* Typ(e) fields *)
+  has_async_typ : bool; (* AsyncT *)
+  has_await : bool; (* AwaitE and AsyncE *)
+  has_show : bool; (* ShowE *)
+  has_poly_eq : bool; (* Polymorphic equality *)
+}
+
+let full_flavor () : flavor = {
+  has_typ_field = true;
+  has_await = true;
+  has_async_typ = true;
+  has_show = true;
+  has_poly_eq = true;
+}
+
+
+(* Program *)
+
+type comp_unit =
+  | LibU of dec list * exp
+  | ProgU of dec list
+  | ActorU of arg list option * dec list * field list * system * Type.typ (* actor (class) *)
+
+type prog = comp_unit * flavor
+
+
+(* object pattern helpers *)
+
+let pats_of_obj_pat pfs = List.map (fun {Source.it={name; pat}; _} -> pat) pfs
+
+let map_obj_pat f pfs =
+  List.map (fun ({Source.it={name; pat}; _} as pf) -> {pf with Source.it={name; pat=f pat}}) pfs
+
+let replace_obj_pat pfs pats =
+  List.map2 (fun ({Source.it={name; pat=_}; _} as pf) pat -> {pf with Source.it={name; pat}}) pfs pats
+
+(* Helper for transforming prims, without missing embedded typs and ids *)
+
+let map_prim t_typ t_id p =
+  match p with
+  | CallPrim ts -> CallPrim (List.map t_typ ts)
+  | UnPrim (ot, op) -> UnPrim (t_typ ot, op)
+  | BinPrim (ot, op) -> BinPrim (t_typ ot, op)
+  | RelPrim (ot, op) -> RelPrim (t_typ ot, op)
+  | TupPrim
+  | ProjPrim _
+  | OptPrim
+  | TagPrim _
+  | DotPrim _
+  | ActorDotPrim _ -> p
+  | ArrayPrim (m, t) -> ArrayPrim (m, t_typ t)
+  | IdxPrim
+  | NextArrayOffset
+  | EqArrayOffset
+  | DerefArrayOffset
+  | GetLastArrayOffset -> p
+  | BreakPrim id -> BreakPrim (t_id id)
+  | RetPrim
+  | AwaitPrim _
+  | AssertPrim
+  | ThrowPrim -> p
+  | ShowPrim t -> ShowPrim (t_typ t)
+  | SerializePrim ts -> SerializePrim (List.map t_typ ts)
+  | DeserializePrim ts -> DeserializePrim (List.map t_typ ts)
+  | DeserializeOptPrim ts -> DeserializeOptPrim (List.map t_typ ts)
+  | NumConvTrapPrim _
+  | NumConvWrapPrim _
+  | DecodeUtf8
+  | EncodeUtf8 -> p
+  | CastPrim (t1, t2) -> CastPrim (t_typ t1, t_typ t2)
+  | ActorOfIdBlob t -> ActorOfIdBlob (t_typ t)
+  | BlobOfIcUrl
+  | IcUrlOfBlob -> p
+  | SelfRef t -> SelfRef (t_typ t)
+  | SystemTimePrim
+  | SystemCyclesAddPrim
+  | SystemCyclesAcceptPrim
+  | SystemCyclesAvailablePrim
+  | SystemCyclesBalancePrim
+  | SystemCyclesRefundedPrim
+  | SetCertifiedData
+  | GetCertificate
+  | OtherPrim _ -> p
+  | CPSAwait (s, t) -> CPSAwait (s, t_typ t)
+  | CPSAsync (s, t) -> CPSAsync (s, t_typ t)
+  | ICReplyPrim ts -> ICReplyPrim (List.map t_typ ts)
+  | ICArgDataPrim
+  | ICPerformGC
+  | ICRejectPrim
+  | ICCallerPrim
+  | ICCallPrim
+  | ICCallRawPrim
+  | ICMethodNamePrim -> p
+  | ICStableWrite t -> ICStableWrite (t_typ t)
+  | ICStableRead t -> ICStableRead (t_typ t)
+  | ICStableSize t -> ICStableSize (t_typ t)
+
+
+
+
+ + + diff --git a/coverage/ir_def/ir_effect.ml.html b/coverage/ir_def/ir_effect.ml.html new file mode 100644 index 00000000000..6ea9c9509ab --- /dev/null +++ b/coverage/ir_def/ir_effect.ml.html @@ -0,0 +1,354 @@ + + + + + ir_effect.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+
+
open Ir
+open Source
+module T = Mo_types.Type
+
+(* a simple effect analysis to annote expressions as Triv(ial) (await-free) or Await (containing unprotected awaits) *)
+
+(* in future we could merge this with the type-checker
+   but I prefer to keep it mostly separate for now *)
+
+let max_eff e1 e2 =
+  match e1,e2 with
+  | T.Triv, T.Triv -> T.Triv
+  | _ , T.Await -> T.Await
+  | T.Await, _ -> T.Await
+
+let typ phrase = phrase.note.Note.typ
+let eff phrase = phrase.note.Note.eff
+
+let is_triv phrase = eff phrase = T.Triv
+
+let effect_exp (exp: exp) : T.eff = eff exp
+
+let is_async_call p exps =
+  match (p, exps) with
+  | CallPrim _, [exp1; _] ->
+    T.is_shared_func (typ exp1) ||
+    T.is_local_async_func (typ exp1)
+  | OtherPrim "call_raw", _ ->
+    true
+  | _ -> false
+
+(* infer the effect of an expression, assuming all sub-expressions are correctly effect-annotated es*)
+
+let rec infer_effect_prim p exps =
+  match p, exps with
+  | ThrowPrim, _
+  | AwaitPrim _, _ ->
+    T.Await
+  | _ ->
+    if is_async_call p exps then
+      T.Await
+    else
+      List.fold_left max_eff T.Triv (List.map eff exps)
+
+and infer_effect_exp (exp: exp) : T.eff =
+  match exp.it with
+  | VarE _
+  | LitE _ ->
+    T.Triv
+  | LabelE (_, _, exp1)
+  | LoopE exp1
+  | AssignE (_, exp1) ->
+    effect_exp exp1
+  | PrimE (p, exps) ->
+    infer_effect_prim p exps
+  | BlockE (ds, exp) ->
+    let es = List.map effect_dec ds in
+    List.fold_left max_eff (effect_exp exp) es
+  | IfE (exp1, exp2, exp3) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_exp exp2 in
+    let e3 = effect_exp exp3 in
+    max_eff e1 (max_eff e2 e3)
+  | SwitchE (exp1, cases) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_cases cases in
+    max_eff e1 e2
+  | AsyncE (T.Fut, _, _, _) ->
+    T.Await
+  | AsyncE (T.Cmp, _, _, _) ->
+    T.Triv
+  | TryE _ ->
+    T.Await
+  | DeclareE (_, _, exp1) ->
+    effect_exp exp1
+  | DefineE (_, _, exp1) ->
+    effect_exp exp1
+  | FuncE _ ->
+    T.Triv
+  | SelfCallE (_, _, exp1, exp2) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_exp exp2 in
+    max_eff e1 e2
+  | ActorE _ ->
+    T.Triv
+  | NewObjE _ ->
+    T.Triv
+
+and effect_cases cases =
+  match cases with
+  | [] ->
+    T.Triv
+  | {it = {pat; exp}; _}::cases' ->
+    let e = effect_exp exp in
+    max_eff e (effect_cases cases')
+
+and effect_dec dec = match dec.it with
+  | LetD (_, e) | VarD (_, _, e) -> effect_exp e
+  | RefD (_, _, { it = DotLE (e, _); _ }) -> effect_exp e
+  | RefD (_, _, _) -> assert false
+
+let infer_effect_dec = effect_dec
+
+let infer_effect_decs ds =
+  let es = List.map effect_dec ds in
+  List.fold_left max_eff T.Triv es
+
+
+
+ + + diff --git a/coverage/ir_def/ir_utils.ml.html b/coverage/ir_def/ir_utils.ml.html new file mode 100644 index 00000000000..57c4febbc9b --- /dev/null +++ b/coverage/ir_def/ir_utils.ml.html @@ -0,0 +1,68 @@ + + + + + ir_utils.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+
+
open Ir
+open Source
+let rec is_irrefutable p = match p.it with
+  | TupP pats -> List.for_all is_irrefutable pats
+  | ObjP pfs -> List.for_all (fun (pf : pat_field) -> is_irrefutable pf.it.pat) pfs
+  | AltP (pat1, _) -> is_irrefutable pat1
+  | WildP | VarP _ -> true
+  | TagP _ | LitP _ | OptP _ -> false
+
+let is_irrefutable_nonbinding p =
+  is_irrefutable p && Freevars.(M.is_empty (pat p))
+
+
+
+ + + diff --git a/coverage/ir_def/note.ml.html b/coverage/ir_def/note.ml.html new file mode 100644 index 00000000000..fd0371e44e1 --- /dev/null +++ b/coverage/ir_def/note.ml.html @@ -0,0 +1,83 @@ + + + + + note.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+
+
open Mo_types
+
+type t = {
+  typ : Type.typ;
+  eff : Type.eff;
+  const : bool;
+  check_run : int;
+}
+
+let def : t = {
+  typ = Type.Pre;
+  eff = Type.Triv;
+  const = false;
+  check_run = 0;
+}
+
+
+
+
+ + + diff --git a/coverage/ir_def/rename.ml.html b/coverage/ir_def/rename.ml.html new file mode 100644 index 00000000000..9e3b887c99a --- /dev/null +++ b/coverage/ir_def/rename.ml.html @@ -0,0 +1,702 @@ + + + + + rename.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+
+
open Source
+open Ir
+
+module Renaming = Map.Make(String)
+
+(* One traversal for each syntactic category, named by that category *)
+
+let fresh_id id = Construct.fresh_id id ()
+
+let id rho i =
+  try Renaming.find i rho
+  with Not_found -> i
+
+let id_bind rho i =
+  let i' = fresh_id i in
+  (i', Renaming.add i i' rho)
+
+let rec ids_bind rho = function
+  | [] -> rho
+  | i::is' ->
+    let (i', rho') = id_bind rho i in
+    ids_bind rho' is'
+
+let arg_bind rho a =
+  let i' = fresh_id a.it in
+  ({a with it = i'}, Renaming.add a.it i' rho)
+
+let rec prim rho p =
+  Ir.map_prim (fun t -> t) (id rho) p (* rename BreakPrim id etc *)
+
+and exp rho e  =  {e with it = exp' rho e.it}
+and exp' rho = function
+  | VarE i              -> VarE (id rho i)
+  | LitE _ as e         -> e
+  | PrimE (p, es)       -> PrimE (prim rho p, List.map (exp rho) es)
+  | ActorE (ds, fs, { meta; preupgrade; postupgrade; heartbeat; timer; inspect }, t) ->
+    let ds', rho' = decs rho ds in
+    ActorE
+      (ds',
+       fields rho' fs,
+       {meta;
+        preupgrade = exp rho' preupgrade;
+        postupgrade = exp rho' postupgrade;
+        heartbeat = exp rho' heartbeat;
+        timer = exp rho' timer;
+        inspect = exp rho' inspect;
+       },
+       t)
+  | AssignE (e1, e2)    -> AssignE (lexp rho e1, exp rho e2)
+  | BlockE (ds, e1)     -> let ds', rho' = decs rho ds
+                           in BlockE (ds', exp rho' e1)
+  | IfE (e1, e2, e3)    -> IfE (exp rho e1, exp rho e2, exp rho e3)
+  | SwitchE (e, cs)     -> SwitchE (exp rho e, cases rho cs)
+  | LoopE e1            -> LoopE (exp rho e1)
+  | LabelE (i, t, e)    -> let i',rho' = id_bind rho i in
+                           LabelE(i', t, exp rho' e)
+  | AsyncE (s, tb, e, t) -> AsyncE (s, tb, exp rho e, t)
+  | DeclareE (i, t, e)  -> let i',rho' = id_bind rho i in
+                           DeclareE (i', t, exp rho' e)
+  | DefineE (i, m, e)   -> DefineE (id rho i, m, exp rho e)
+  | FuncE (x, s, c, tp, p, ts, e) ->
+     let p', rho' = args rho p in
+     let e' = exp rho' e in
+     FuncE (x, s, c, tp, p', ts, e')
+  | NewObjE (s, fs, t)  -> NewObjE (s, fields rho fs, t)
+  | TryE (e, cs)        -> TryE (exp rho e, cases rho cs)
+  | SelfCallE (ts, e1, e2, e3) ->
+     SelfCallE (ts, exp rho e1, exp rho e2, exp rho e3)
+
+and lexp rho le = {le with it = lexp' rho le.it}
+and lexp' rho = function
+  | VarLE i  -> VarLE (id rho i)
+  | DotLE (e, i) -> DotLE (exp rho e, i)
+  | IdxLE (e1, e2) -> IdxLE (exp rho e1, exp rho e2)
+
+and exps rho es  = List.map (exp rho) es
+
+and fields rho fs =
+  List.map (fun f -> { f with it = { f.it with var = id rho f.it.var } }) fs
+
+and args rho as_ =
+  match as_ with
+  | [] -> ([],rho)
+  | a::as_ ->
+     let (a', rho') = arg_bind rho a in
+     let (as_', rho'') = args rho' as_ in
+     (a'::as_', rho'')
+
+and pat rho p =
+  let p', rho = pat' rho p.it in
+  {p with it = p'}, rho
+
+and pat' rho = function
+  | WildP as p    -> (p, rho)
+  | VarP i ->
+    let i, rho' = id_bind rho i in
+    (VarP i, rho')
+  | TupP ps ->
+    let (ps, rho') = pats rho ps in
+    (TupP ps, rho')
+  | ObjP pfs ->
+    let (pats, rho') = pats rho (pats_of_obj_pat pfs) in
+    (ObjP (replace_obj_pat pfs pats), rho')
+  | LitP _ as p ->
+    (p, rho)
+  | OptP p ->
+    let (p', rho') = pat rho p in
+    (OptP p', rho')
+  | TagP (i, p) ->
+    let (p', rho') = pat rho p in
+    (TagP (i, p'), rho')
+  | AltP (p1, p2) ->
+    let is1 = Freevars.M.keys (Freevars.pat p1) in
+    assert begin
+      let is2 = Freevars.M.keys (Freevars.pat p1) in
+      List.compare String.compare is1 is2 = 0
+    end;
+    let rho' = ids_bind rho is1 in
+    (AltP (pat_subst rho' p1, pat_subst rho' p2), rho')
+
+and pats rho ps  =
+  match ps with
+  | [] -> ([], rho)
+  | p::ps ->
+    let (p', rho') = pat rho p in
+    let (ps', rho'') = pats rho' ps in
+    (p'::ps', rho'')
+
+and pat_subst rho p =
+    let p'  = pat_subst' rho p.it in
+    {p with it = p'}
+
+and pat_subst' rho = function
+  | WildP as p -> p
+  | VarP i ->
+    VarP (id rho i)
+  | TupP ps ->
+    TupP (pats_subst rho ps)
+  | ObjP pfs ->
+    let pats = pats_subst rho (pats_of_obj_pat pfs) in
+    ObjP (replace_obj_pat pfs pats)
+  | LitP _ as p -> p
+  | OptP p ->
+    OptP (pat_subst rho p)
+  | TagP (i, p) ->
+    TagP (i, pat_subst rho p)
+  | AltP (p1, p2) ->
+    AltP (pat_subst rho p1, pat_subst rho p2)
+
+and pats_subst rho ps =
+  List.map (pat_subst rho) ps
+
+and case rho (c : case) =
+  {c with it = case' rho c.it}
+and case' rho { pat = p; exp = e} =
+  let (p', rho') = pat rho p in
+  let e' = exp rho' e in
+  {pat=p'; exp=e'}
+
+and cases rho cs = List.map (case rho) cs
+
+and dec rho d =
+  let (mk_d, rho') = dec' rho d.it in
+  ({d with it = mk_d}, rho')
+
+and dec' rho = function
+  | LetD (p, e) ->
+     let p', rho = pat rho p in
+     (fun rho' -> LetD (p',exp rho' e)),
+     rho
+  | VarD (i, t, e) ->
+     let i', rho = id_bind rho i in
+     (fun rho' -> VarD (i', t, exp rho' e)),
+     rho
+  | RefD (i, t, le) ->
+     let i', rho = id_bind rho i in
+     (fun rho' -> RefD (i', t, lexp rho' le)),
+     rho
+
+and decs rho ds =
+  let rec decs_aux rho ds =
+    match ds with
+    | [] -> ([], rho)
+    | d::ds ->
+       let (mk_d, rho') = dec rho d in
+       let (mk_ds, rho'') = decs_aux rho' ds in
+       (mk_d::mk_ds, rho'')
+  in
+  let mk_ds, rho' = decs_aux rho ds in
+  let ds' = List.map (fun mk_d -> { mk_d with it = mk_d.it rho' } ) mk_ds in
+  (ds', rho')
+
+let comp_unit rho cu = match cu with
+  | ProgU ds ->
+    let ds', _ = decs rho ds in
+    ProgU ds'
+  | LibU (ds, e) ->
+    let ds', rho' = decs rho ds
+    in LibU (ds', exp rho' e)
+  | ActorU (as_opt, ds, fs, { meta; preupgrade; postupgrade; heartbeat; timer; inspect }, t) ->
+    let as_opt', rho' = match as_opt with
+      | None -> None, rho
+      | Some as_ ->
+        let as_', rho' = args rho as_ in
+        Some as_', rho'
+    in
+    let ds', rho'' = decs rho' ds in
+    ActorU (as_opt', ds', fields rho'' fs,
+      { meta;
+        preupgrade = exp rho'' preupgrade;
+        postupgrade = exp rho'' postupgrade;
+        heartbeat = exp rho'' heartbeat;
+        timer = exp rho'' timer;
+        inspect = exp rho'' inspect;
+      }, t)
+
+
+
+ + + diff --git a/coverage/ir_interpreter/interpret_ir.ml.html b/coverage/ir_interpreter/interpret_ir.ml.html new file mode 100644 index 00000000000..7ab39ee345d --- /dev/null +++ b/coverage/ir_interpreter/interpret_ir.ml.html @@ -0,0 +1,3248 @@ + + + + + interpret_ir.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+
+
open Mo_types
+open Mo_values
+open Ir_def
+
+open Ir
+open Source
+
+module V = Value
+module T = Type
+module CC = Call_conv
+
+(* Context *)
+
+type val_env = V.def V.Env.t
+type lab_env = V.value V.cont V.Env.t
+type ret_env = V.value V.cont option
+type throw_env = V.value V.cont option
+type reply_env = V.value V.cont option
+type reject_env = V.value V.cont option
+type actor_env = V.value V.Env.t ref (* indexed by actor ids *)
+
+let initial_state () = ref V.Env.empty
+
+type flags = {
+  trace : bool;
+  print_depth : int;
+}
+
+type env =
+  { flags : flags;
+    flavor : Ir.flavor;
+    vals : val_env;
+    labs : lab_env;
+    rets : ret_env;
+    throws : throw_env;
+    replies : reply_env;
+    rejects : reject_env;
+    caller : V.value;
+    self : V.actor_id;
+    actor_env : actor_env;
+  }
+
+let adjoin_vals c ve = {c with vals = V.Env.adjoin c.vals ve}
+
+let empty_scope = V.Env.empty
+
+let env_of_scope flags flavor ae ve =
+  { flags;
+    flavor;
+    vals = ve;
+    labs = V.Env.empty;
+    rets = None;
+    throws = None;
+    replies = None;
+    rejects = None;
+    caller = V.Text V.top_id;
+    self = V.top_id;
+    actor_env = ae;
+  }
+
+let context env = V.Blob env.self
+
+(* Error handling *)
+
+exception Trap of Source.region * string
+
+let trap at fmt = Printf.ksprintf (fun s -> raise (Trap (at, s))) fmt
+
+let find id env =
+  try V.Env.find id env
+  with Not_found ->
+    trap no_region "unbound identifier %s" id
+
+(* Tracing *)
+
+let trace_depth = ref 0
+
+let trace fmt =
+  Printf.ksprintf (fun s ->
+    Printf.printf "%s%s\n%!" (String.make (2 * !trace_depth) ' ') s
+  ) fmt
+
+let string_of_val env = V.string_of_val env.flags.print_depth T.Non
+let string_of_def flags = V.string_of_def flags.print_depth T.Non
+let string_of_arg env = function
+  | V.Tup _ as v -> string_of_val env v
+  | v -> "(" ^ string_of_val env v ^ ")"
+
+
+(* Debugging aids *)
+
+let last_env = ref (env_of_scope { trace = false; print_depth = 2} (Ir.full_flavor ()) (initial_state ()) empty_scope)
+let last_region = ref Source.no_region
+
+let print_exn flags exn =
+  let trace = Printexc.get_backtrace () in
+  Printf.printf "%!";
+  let at = Source.string_of_region !last_region in
+  Printf.eprintf "%s: internal error, %s\n" at (Printexc.to_string exn);
+  Printf.eprintf "\nLast environment:\n";
+  Value.Env.iter
+    (fun x d -> Printf.eprintf "%s = %s\n" x (string_of_def flags d))
+    !last_env.vals;
+  Printf.eprintf "\n";
+  Printf.eprintf "%s" trace;
+  Printf.eprintf "%!"
+
+(* Scheduling *)
+
+module Scheduler =
+struct
+  let q : (unit -> unit) Queue.t = Queue.create ()
+
+  let queue work = Queue.add work q
+  let yield () =
+    trace_depth := 0;
+    try Queue.take q () with Trap (at, msg) ->
+      Printf.eprintf "%s: execution error, %s\n" (Source.string_of_region at) msg
+
+  let rec run () =
+    if not (Queue.is_empty q) then (yield (); run ())
+end
+
+(* Async auxiliary functions *)
+
+(* Are these just duplicates of the corresponding functions in interpret.ml? If so, refactor *)
+
+let make_async () : V.async =
+  {V.result = Lib.Promise.make (); waiters = []}
+
+let get_async async (k : V.value V.cont) (r : V.value V.cont) =
+  match Lib.Promise.value_opt async.V.result with
+  | Some (V.Ok v) -> k v
+  | Some (V.Error v) -> r v
+  | None -> async.V.waiters <- (k,r)::async.V.waiters
+
+let set_async async v =
+  List.iter (fun (k,_) -> Scheduler.queue (fun () -> k v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Ok v);
+  async.V.waiters <- []
+
+let reject_async async v =
+  List.iter (fun (_,r) -> Scheduler.queue (fun () -> r v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Error v);
+  async.V.waiters <- []
+
+let reply async v =
+  Scheduler.queue (fun () -> set_async async v)
+
+let reject async v =
+  match v with
+  | V.Tup [ _code; message ] ->
+    (* mask the error code before rejecting *)
+    Scheduler.queue
+      (fun () -> reject_async async (V.Tup [V.Variant("canister_reject", V.unit); message]))
+  | _ -> assert false
+
+let async env at (f: (V.value V.cont) -> (V.value V.cont) -> unit) (k : V.value V.cont) =
+  let async = make_async () in
+  let k' = reply async in
+  let r = reject async in
+  if env.flags.trace then trace "-> async %s" (string_of_region at);
+  Scheduler.queue (fun () ->
+    if env.flags.trace then trace "<- async %s" (string_of_region at);
+    incr trace_depth;
+    f (fun v ->
+      if env.flags.trace then trace "<= %s" (string_of_val env v);
+      decr trace_depth;
+      k' v) r
+    );
+  k (V.Async async)
+
+let await env at async k =
+  if env.flags.trace then trace "=> await %s" (string_of_region at);
+  decr trace_depth;
+  get_async async (fun v ->
+    Scheduler.queue (fun () ->
+      if env.flags.trace then
+        trace "<- await %s%s" (string_of_region at) (string_of_arg env v);
+      incr trace_depth;
+      k v)
+    )
+
+
+(* queue a lowered oneway or replying function that no longer does AsyncE on entry *)
+let queue f = fun c v k -> Scheduler.queue (fun () -> f c v k)
+
+let make_unit_message env id call_conv f =
+  assert env.flavor.has_async_typ;
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; n_res = 0; _} ->
+    (* message scheduled by AsyncE in f *)
+    Value.message_func s call_conv.n_args f
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_async_message env id call_conv f =
+  assert env.flavor.has_async_typ;
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; control = T.Promises; _} ->
+    (* message scheduled by AsyncE in f *)
+    Value.async_func s call_conv.n_args call_conv.n_res f
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_lowered_unit_message env id call_conv f =
+  assert (not env.flavor.has_async_typ);
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; n_res = 0; _} ->
+    (* message scheduled here (not by f) *)
+    Value.message_func s call_conv.n_args (fun c v k ->
+      (queue f) c v (fun _ -> ());
+      k (V.unit);
+    );
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_replying_message env id call_conv f =
+  assert (not env.flavor.has_async_typ);
+  let open CC in
+  match call_conv with
+  | {sort = T.Shared s; control = T.Replies; _} ->
+    Value.replies_func s call_conv.n_args call_conv.n_res (fun c v k ->
+      (* message scheduled here (not by f) *)
+      (queue f) c v (fun _ -> ());
+      k (V.unit)
+    )
+  | _ ->
+    failwith ("unexpected call_conv " ^ string_of_call_conv call_conv)
+
+let make_message env x cc f : V.value =
+  match cc.CC.control with
+  | T.Returns ->
+    if env.flavor.has_async_typ then
+      make_unit_message env x cc f
+    else
+      make_lowered_unit_message env x cc f
+  | T.Promises -> make_async_message env x cc f
+  | T.Replies -> make_replying_message env x cc f
+
+
+(* Literals *)
+
+let interpret_lit env lit : V.value =
+  match lit with
+  | NullLit -> V.Null
+  | BoolLit b -> V.Bool b
+  | NatLit n -> V.Int n
+  | Nat8Lit n -> V.Nat8 n
+  | Nat16Lit n -> V.Nat16 n
+  | Nat32Lit n -> V.Nat32 n
+  | Nat64Lit n -> V.Nat64 n
+  | IntLit i -> V.Int i
+  | Int8Lit i -> V.Int8 i
+  | Int16Lit i -> V.Int16 i
+  | Int32Lit i -> V.Int32 i
+  | Int64Lit i -> V.Int64 i
+  | FloatLit f -> V.Float f
+  | CharLit c -> V.Char c
+  | TextLit s -> V.Text s
+  | BlobLit b -> V.Blob b
+
+(* Expressions *)
+
+let check_call_conv exp call_conv =
+  let open Call_conv in
+  let exp_call_conv = call_conv_of_typ exp.note.Note.typ in
+  if not (exp_call_conv = call_conv) then
+    failwith (Printf.sprintf "call_conv mismatch: function %s of type %s expecting %s, found %s"
+      (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp))
+      (T.string_of_typ exp.note.Note.typ)
+      (string_of_call_conv exp_call_conv)
+      (string_of_call_conv call_conv))
+
+let check_call_conv_arg env exp v call_conv =
+  let open CC in
+  if call_conv.n_args <> 1 then
+  let es = try V.as_tup v
+    with Invalid_argument _ ->
+      failwith (Printf.sprintf "call %s: calling convention %s cannot handle non-tuple value %s"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp))
+        (string_of_call_conv call_conv)
+        (string_of_val env v)) in
+  if List.length es <> call_conv.n_args then
+    failwith (Printf.sprintf "call %s: calling convention %s got tuple of wrong length %s"
+        (Wasm.Sexpr.to_string 80 (Arrange_ir.exp exp))
+        (string_of_call_conv call_conv)
+        (string_of_val env v))
+
+
+let rec interpret_exp env exp (k : V.value V.cont) =
+  interpret_exp_mut env exp (function V.Mut r -> k !r | v -> k v)
+
+and interpret_exp_mut env exp (k : V.value V.cont) =
+  let open Call_conv in
+  last_region := exp.at;
+  last_env := env;
+  Profiler.bump_region exp.at ;
+  match exp.it with
+  | VarE id ->
+    (match Lib.Promise.value_opt (find id env.vals) with
+    | Some v -> k v
+    | None -> trap exp.at "accessing identifier before its definition"
+    )
+  | LitE lit ->
+    k (interpret_lit env lit)
+  | PrimE (p, es) ->
+    interpret_exps env es [] (fun vs ->
+      match p, vs with
+      | CallPrim typs, [v1; v2] ->
+        let call_conv, f = V.as_func v1 in
+        check_call_conv (List.hd es) call_conv;
+        check_call_conv_arg env exp v2 call_conv;
+        last_region := exp.at; (* in case the following throws *)
+        f (context env) v2 k
+      | UnPrim (ot, op), [v1] ->
+        k (try Operator.unop op ot v1 with Invalid_argument s -> trap exp.at "%s" s)
+      | BinPrim (ot, op), [v1; v2] ->
+        k (try Operator.binop op ot v1 v2 with _ ->
+          trap exp.at "arithmetic overflow")
+      | RelPrim (ot, op), [v1; v2] ->
+        k (Operator.relop op ot v1 v2)
+      | TupPrim, exps ->
+        k (V.Tup vs)
+      | ProjPrim n, [v1] ->
+        k (List.nth (V.as_tup v1) n)
+      | OptPrim, [v1] ->
+        k (V.Opt v1)
+      | TagPrim i, [v1] ->
+        k (V.Variant (i, v1))
+      | DotPrim n, [v1] ->
+        let fs = V.as_obj v1 in
+        k (try find n fs with _ -> assert false)
+      | ActorDotPrim n, [v1] ->
+        let id = V.as_blob v1 in
+        begin match V.Env.find_opt id !(env.actor_env) with
+        (* not quite correct: On the platform, you can invoke and get a reject *)
+        | None -> trap exp.at "Unkown actor \"%s\"" id
+        | Some actor_value ->
+          let fs = V.as_obj actor_value in
+          match V.Env.find_opt n fs with
+          | None -> trap exp.at "Actor \"%s\" has no method \"%s\"" id n
+          | Some field_value -> k field_value
+        end
+      | ArrayPrim (mut, _), vs ->
+        let vs' =
+          match mut with
+          | Var -> List.map (fun v -> V.Mut (ref v)) vs
+          | Const -> vs
+        in k (V.Array (Array.of_list vs'))
+      | (IdxPrim | DerefArrayOffset), [v1; v2] ->
+        k (try (V.as_array v1).(Numerics.Int.to_int (V.as_int v2))
+           with Invalid_argument s -> trap exp.at "%s" s)
+      | NextArrayOffset , [v1] ->
+        k (V.Int Numerics.Nat.(of_int ((to_int (V.as_int v1)) + 1)))
+      | EqArrayOffset, [v1; v2] ->
+        k (V.Bool Numerics.Int.(to_int (V.as_int v1) = to_int (V.as_int v2)))
+      | GetLastArrayOffset,  [v1] ->
+        k (V.Int Numerics.Int.(of_int (Array.length (V.as_array v1) - 1)))
+      | BreakPrim id, [v1] -> find id env.labs v1
+      | RetPrim, [v1] -> Option.get env.rets v1
+      | ThrowPrim, [v1] -> Option.get env.throws v1
+      | AwaitPrim Type.Fut, [v1] ->
+        assert env.flavor.has_await;
+        await env exp.at (V.as_async v1) k (Option.get env.throws)
+      | AwaitPrim Type.Cmp, [v1] ->
+        assert env.flavor.has_await;
+        (V.as_comp v1) k (Option.get env.throws)
+      | AssertPrim, [v1] ->
+        if V.as_bool v1
+        then k V.unit
+        else trap exp.at "assertion failure"
+      | ShowPrim ot, [v1] ->
+        if Show.can_show ot
+        then k (Value.Text (Show.show_val ot v1))
+        else raise (Invalid_argument "debug_show")
+      | CPSAsync _, [v1] ->
+        assert (not env.flavor.has_await && env.flavor.has_async_typ);
+        let (_, f) = V.as_func v1 in
+        let typ = (List.hd es).note.Note.typ in
+        begin match typ with
+        | T.Func(_, _, _, [f_typ; r_typ], _) ->
+          let call_conv_f = CC.call_conv_of_typ f_typ in
+          let call_conv_r = CC.call_conv_of_typ r_typ in
+          async env exp.at
+            (fun k' r ->
+              let vk' = Value.Func (call_conv_f, fun c v _ -> k' v) in
+              let vr = Value.Func (call_conv_r, fun c v _ -> r v) in
+              let vc = context env in
+              f vc (V.Tup [vk'; vr]) V.as_unit
+            )
+            k
+        | _ -> assert false
+        end
+      | CPSAwait _, [v1; v2] ->
+        assert (not env.flavor.has_await && env.flavor.has_async_typ);
+        begin match V.as_tup v2 with
+         | [vf; vr] ->
+           let (_, f) = V.as_func vf in
+           let (_, r) = V.as_func vr in
+           await env exp.at (V.as_async v1)
+             (fun v -> f (context env) v k)
+             (fun e -> r (context env) e k) (* TBR *)
+        | _ -> assert false
+        end
+      | OtherPrim s, vs ->
+        let arg = match vs with [v] -> v | _ -> V.Tup vs in
+        Prim.prim { Prim.trap = trap exp.at "%s" } s (context env) arg k
+      | CastPrim _, [v1] ->
+        k v1
+      | ActorOfIdBlob t, [v1] ->
+        if String.length (V.as_blob v1) > 29 then
+          trap exp.at "blob too long for actor principal"
+        else
+          k v1
+      | DecodeUtf8, [v1] ->
+        let s = V.as_blob v1 in
+        begin match Lib.Utf8.decode s with
+          | _ -> k (V.Opt (V.Text s))
+          | exception Lib.Utf8.Utf8 -> k V.Null
+        end
+      | EncodeUtf8, [v1] ->
+        k (V.Blob (V.as_text v1))
+      | BlobOfIcUrl, [v1] ->
+        begin match Ic.Url.decode_principal (V.as_text v1) with
+          | Ok bytes -> k (V.Blob bytes)
+          | Error e -> trap exp.at "could not parse %S as an actor reference: %s"  (V.as_text v1) e
+        end
+      | IcUrlOfBlob, [v1] ->
+        k (V.Text (Ic.Url.encode_principal (V.as_blob v1)))
+      | NumConvTrapPrim (t1, t2), vs ->
+        let arg = match vs with [v] -> v | _ -> V.Tup vs in
+        k (Prim.num_conv_trap_prim { Prim.trap = trap exp.at "%s" } t1 t2 arg)
+      | NumConvWrapPrim (t1, t2), vs ->
+        let arg = match vs with [v] -> v | _ -> V.Tup vs in
+        k (Prim.num_conv_wrap_prim { Prim.trap = trap exp.at "%s" } t1 t2 arg)
+      | ICReplyPrim ts, [v1] ->
+        assert (not env.flavor.has_async_typ);
+        let reply = Option.get env.replies in
+        Scheduler.queue (fun () -> reply v1)
+      | ICRejectPrim, [v1] ->
+        assert (not env.flavor.has_async_typ);
+        let reject = Option.get env.rejects in
+        let e = V.Tup [V.Variant ("canister_reject", V.unit); v1] in
+        Scheduler.queue (fun () -> reject e)
+      | ICCallPrim, [v1; v2; kv; rv] ->
+        let call_conv, f = V.as_func v1 in
+        check_call_conv (List.hd es) call_conv;
+        check_call_conv_arg env exp v2 call_conv;
+        last_region := exp.at; (* in case the following throws *)
+        let vc = context env in
+        f (V.Tup[vc; kv; rv]) v2 k
+      | ICCallerPrim, [] ->
+        k env.caller
+      | ICStableRead t, [] ->
+        let (_, tfs) = T.as_obj t in
+        let ve = List.fold_left
+          (fun ve' tf -> V.Env.add tf.T.lab V.Null ve')
+          V.Env.empty tfs
+        in
+        k (V.Obj ve)
+      | ICStableWrite _, [v1] ->
+        k V.unit (* faking it *)
+      | SelfRef _, [] ->
+        k (V.Blob env.self)
+      | SystemTimePrim, [] ->
+        k (V.Nat64 (Numerics.Nat64.of_int 42))
+      | SystemCyclesRefundedPrim, [] -> (* faking it *)
+        k (V.Nat64 (Numerics.Nat64.of_int 0))
+      | _ ->
+        trap exp.at "Unknown prim or wrong number of arguments (%d given):\n  %s"
+          (List.length es) (Wasm.Sexpr.to_string 80 (Arrange_ir.prim p))
+    )
+  | AssignE (lexp1, exp2) ->
+    interpret_lexp env lexp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        v1 := v2; k V.unit
+      )
+    )
+  | BlockE (decs, exp1) ->
+     interpret_block env None decs exp1 k
+  | IfE (exp1, exp2, exp3) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k
+      else interpret_exp env exp3 k
+    )
+  | SwitchE (exp1, cases) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_cases env cases exp.at v1 k
+    )
+  | TryE (exp1, cases) ->
+    let k' = fun v1 -> interpret_catches env cases exp.at v1 k in
+    let env' = { env with throws = Some k' } in
+    interpret_exp env' exp1 k
+  | LoopE exp1 ->
+    interpret_exp env exp1 (fun v -> V.as_unit v; interpret_exp env exp k)
+  | LabelE (id, _typ, exp1) ->
+    let env' = {env with labs = V.Env.add id k env.labs} in
+    interpret_exp env' exp1 k
+  | AsyncE (Type.Fut, _, exp1, _) ->
+    assert env.flavor.has_await;
+    async env
+      exp.at
+      (fun k' r ->
+        let env' = { env with labs = V.Env.empty; rets = Some k'; throws = Some r }
+        in interpret_exp env' exp1 k')
+      k
+  | AsyncE (Type.Cmp, _, exp1, _) ->
+    assert env.flavor.has_await;
+    k (V.Comp (fun k' r ->
+      let env' = { env with labs = V.Env.empty; rets = Some k'; throws = Some r }
+      in interpret_exp env' exp1 k'))
+  | DeclareE (id, typ, exp1) ->
+    let env = adjoin_vals env (declare_id id) in
+    interpret_exp env exp1 k
+  | DefineE (id, mut, exp1) ->
+    interpret_exp env exp1 (fun v ->
+      let v' =
+        match mut with
+        | Const -> v
+        | Var -> V.Mut (ref v)
+      in
+      define_id env id v';
+      k V.unit
+      )
+  | SelfCallE (ts, exp_f, exp_k, exp_r) ->
+    assert (not env.flavor.has_async_typ);
+    (* see code for FuncE *)
+    let cc = { sort = T.Shared T.Write; control = T.Replies; n_args = 0; n_res = List.length ts } in
+    let f = interpret_message env exp.at "anon" []
+      (fun env' -> interpret_exp env' exp_f) in
+    let v = make_message env "anon" cc f in
+    (* see code for ICCallPrim *)
+    interpret_exp env exp_k (fun kv ->
+    interpret_exp env exp_r (fun rv ->
+        let _call_conv, f = V.as_func v in
+        last_region := exp.at; (* in case the following throws *)
+        let vc = context env in
+        f (V.Tup[vc; kv; rv]) (V.Tup []) k))
+  | FuncE (x, (T.Shared _ as sort), (T.Replies as control), _typbinds, args, ret_typs, e) ->
+    assert (not env.flavor.has_async_typ);
+    let cc = { sort; control; n_args = List.length args; n_res = List.length ret_typs } in
+    let f = interpret_message env exp.at x args
+      (fun env' -> interpret_exp env' e) in
+    let v = make_message env x cc f in
+    k v
+  | FuncE (x, sort, control, _typbinds, args, ret_typs, e) ->
+    let cc = { sort; control; n_args = List.length args; n_res = List.length ret_typs } in
+    let f = interpret_func env exp.at sort x args
+      (fun env' -> interpret_exp env' e) in
+    let v = match cc.sort with
+      | T.Shared _ -> make_message env x cc f
+      | _ -> V.Func (cc, f)
+    in
+    k v
+  | ActorE (ds, fs, _, _) ->
+    interpret_actor env ds fs k
+  | NewObjE (sort, fs, _) ->
+    k (interpret_fields env fs)
+
+and interpret_actor env ds fs k =
+    let self = V.fresh_id () in
+    let env0 = {env with self = self} in
+    let ve = declare_decs ds V.Env.empty in
+    let env' = adjoin_vals env0 ve in
+    interpret_decs env' ds (fun _ ->
+      let obj = interpret_fields env' fs in
+      env.actor_env := V.Env.add self obj !(env.actor_env);
+      k (V.Blob self)
+    )
+
+and interpret_lexp env lexp (k : (V.value ref) V.cont) =
+  last_region := lexp.at;
+  last_env := env;
+  match lexp.it with
+  | VarLE id ->
+    (match Lib.Promise.value_opt (find id env.vals) with
+    | Some v -> k (V.as_mut v)
+    | None -> trap lexp.at "accessing identifier before its definition"
+    )
+  | DotLE (exp1, n) ->
+    interpret_exp env exp1 (fun v1 ->
+      let fs = V.as_obj v1 in
+      k (V.as_mut (try find n fs with _ -> assert false))
+    )
+  | IdxLE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (V.as_mut
+          (try (V.as_array v1).(Numerics.Int.to_int (V.as_int v2))
+           with Invalid_argument s -> trap lexp.at "%s" s))
+      )
+    )
+
+and interpret_fields env fs =
+    let ve =
+      List.fold_left
+        (fun ve (f : field) ->
+          V.Env.disjoint_add f.it.name (Lib.Promise.value (find f.it.var env.vals)) ve
+        ) V.Env.empty fs in
+    V.Obj ve
+
+and interpret_exps env exps vs (k : V.value list V.cont) =
+  match exps with
+  | [] -> k (List.rev vs)
+  | exp::exps' ->
+    interpret_exp env exp (fun v -> interpret_exps env exps' (v::vs) k)
+
+
+(* Cases *)
+
+and interpret_cases env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    trap at "switch value %s does not match any case" (string_of_val env v)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_cases env cases' at v k
+
+(* Catches *)
+
+and interpret_catches env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    Option.get env.throws v (* re-throw v *)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_catches env cases' at v k
+
+(* Argument lists *)
+
+and match_arg a v : val_env = V.Env.singleton a.it (Lib.Promise.make_fulfilled v)
+
+and match_args at args v : val_env =
+  match args with
+  | [a] -> match_arg a v
+  | _ ->
+    let vs = V.as_tup v in
+    if (List.length vs <> List.length args) then
+      failwith (Printf.sprintf "%s %s" (Source.string_of_region at) (V.string_of_val 0 T.Non v));
+    List.fold_left V.Env.adjoin V.Env.empty (List.map2 match_arg args vs)
+
+(* Patterns *)
+
+and declare_id id =
+  V.Env.singleton id (Lib.Promise.make ())
+
+and declare_pat pat : val_env =
+  match pat.it with
+  | WildP | LitP _ ->  V.Env.empty
+  | VarP id -> declare_id id
+  | TupP pats -> declare_pats pats V.Env.empty
+  | ObjP pfs -> declare_pats (pats_of_obj_pat pfs) V.Env.empty
+  | OptP pat1
+  | TagP (_, pat1) -> declare_pat pat1
+  | AltP (pat1, _pat2) -> declare_pat pat1 (* pat2 has the same bindings *)
+
+and declare_pats pats ve : val_env =
+  match pats with
+  | [] -> ve
+  | pat::pats' ->
+    let ve' = declare_pat pat in
+    declare_pats pats' (V.Env.adjoin ve ve')
+
+
+and define_id env id v =
+  Lib.Promise.fulfill (find id env.vals) v
+
+and define_pat env pat v =
+  match match_pat pat v with
+  | Some ve ->
+     V.Env.iter (fun id d  -> define_id env id (Lib.Promise.value d)) ve;
+     true
+  | None ->
+     false
+
+and match_lit lit v : bool =
+  match lit, v with
+  | NullLit, V.Null -> true
+  | BoolLit b, V.Bool b' -> b = b'
+  | NatLit n, V.Int n' -> Numerics.Int.eq n n'
+  | Nat8Lit n, V.Nat8 n' -> Numerics.Nat8.eq n n'
+  | Nat16Lit n, V.Nat16 n' -> Numerics.Nat16.eq n n'
+  | Nat32Lit n, V.Nat32 n' -> Numerics.Nat32.eq n n'
+  | Nat64Lit n, V.Nat64 n' -> Numerics.Nat64.eq n n'
+  | IntLit i, V.Int i' -> Numerics.Int.eq i i'
+  | Int8Lit i, V.Int8 i' -> Numerics.Int_8.eq i i'
+  | Int16Lit i, V.Int16 i' -> Numerics.Int_16.eq i i'
+  | Int32Lit i, V.Int32 i' -> Numerics.Int_32.eq i i'
+  | Int64Lit i, V.Int64 i' -> Numerics.Int_64.eq i i'
+  | FloatLit z, V.Float z' -> z = z'
+  | CharLit c, V.Char c' -> c = c'
+  | TextLit u, V.Text u' -> u = u'
+  | BlobLit b, V.Blob b' -> b = b'
+  | _ -> false
+
+and match_id id v : val_env =
+  V.Env.singleton id (Lib.Promise.make_fulfilled v)
+
+and match_pat pat v : val_env option =
+  match pat.it with
+  | WildP -> Some V.Env.empty
+  | VarP id -> Some (match_id id v)
+  | LitP lit ->
+    if match_lit lit v
+    then Some V.Env.empty
+    else None
+  | TupP pats ->
+    match_pats pats (V.as_tup v) V.Env.empty
+  | ObjP pfs ->
+    match_pat_fields pfs (V.as_obj v) V.Env.empty
+  | OptP pat1 ->
+    (match v with
+    | V.Opt v1 -> match_pat pat1 v1
+    | V.Null -> None
+    | _ -> assert false
+    )
+  | TagP (i, pat1) ->
+    let tag, v1 = V.as_variant v in
+    if i = tag
+    then match_pat pat1 v1
+    else None
+  | AltP (pat1, pat2) ->
+    (match match_pat pat1 v with
+    | None -> match_pat pat2 v
+    | some -> some
+    )
+
+and match_pats pats vs ve : val_env option =
+  match pats, vs with
+  | [], [] -> Some ve
+  | pat::pats', v::vs' ->
+    (match match_pat pat v with
+    | Some ve' -> match_pats pats' vs' (V.Env.adjoin ve ve')
+    | None -> None
+    )
+  | _ -> assert false
+
+and match_pat_fields pfs vs ve : val_env option =
+  match pfs with
+  | [] -> Some ve
+  | pf::pfs' ->
+    begin
+      match match_pat pf.it.pat (V.Env.find pf.it.name vs) with
+      | Some ve' -> match_pat_fields pfs' vs (V.Env.adjoin ve ve')
+      | None -> None
+    end
+
+(* Blocks and Declarations *)
+
+and interpret_block env ro decs exp k =
+  let ve = declare_decs decs V.Env.empty in
+  Option.iter (fun r -> r := ve) ro;
+  let env' = adjoin_vals env ve in
+  interpret_decs env' decs (fun _ -> interpret_exp env' exp k)
+
+and declare_dec dec : val_env =
+  match dec.it with
+  | LetD (pat, _) -> declare_pat pat
+  | VarD (id, _,  _) | RefD (id, _,  _) -> declare_id id
+
+and declare_decs decs ve : val_env =
+  match decs with
+  | [] -> ve
+  | dec::decs' ->
+    let ve' = declare_dec dec in
+    declare_decs decs' (V.Env.adjoin ve ve')
+
+
+and interpret_dec env dec k =
+  match dec.it with
+  | LetD (pat, exp) ->
+    interpret_exp env exp (fun v ->
+      if define_pat env pat v
+      then k ()
+      else trap pat.at "value %s does not match pattern" (string_of_val env v)
+    )
+  | VarD (id, _, exp) ->
+    interpret_exp env exp (fun v ->
+      define_id env id (V.Mut (ref v));
+      k ()
+    )
+  | RefD (id, _, lexp) ->
+    interpret_lexp env lexp (fun v ->
+      define_id env id (V.Mut v);
+      k ()
+    )
+
+and interpret_decs env decs (k : unit V.cont) =
+  match decs with
+  | [] -> k ()
+  | d::ds -> interpret_dec env d (fun () -> interpret_decs env ds k)
+
+and interpret_func env at sort x args f c v (k : V.value V.cont) =
+  if env.flags.trace then trace "%s%s" x (string_of_arg env v);
+  let caller =
+    if T.is_shared_sort sort
+    then c
+    else env.caller
+  in
+  let ve = match_args at args v in
+  incr trace_depth;
+  let k' = fun v' ->
+    if env.flags.trace then trace "<= %s" (string_of_val env v');
+    decr trace_depth;
+    k v'
+  in
+  let env' =
+    { env with
+      vals = V.Env.adjoin env.vals ve;
+      labs = V.Env.empty;
+      rets = Some k';
+      caller = caller;
+    }
+  in f env' k'
+
+and interpret_message env at x args f c v (k : V.value V.cont) =
+  let v_caller, v_reply, v_reject = match V.as_tup c with
+    | [v_caller; v_reply; v_reject] -> v_caller, v_reply, v_reject
+    | _ -> assert false
+  in
+  if env.flags.trace then trace "%s%s" x (string_of_arg env v);
+  let _, reply = V.as_func v_reply in
+  let _, reject = V.as_func v_reject in
+  let ve = match_args at args v in
+  incr trace_depth;
+  let k' = fun v' ->
+    if env.flags.trace then trace "<= %s" (string_of_val env v');
+    decr trace_depth;
+    k v'
+  in
+  let env' =
+    { env with
+      vals = V.Env.adjoin env.vals ve;
+      labs = V.Env.empty;
+      rets = Some k';
+      replies = Some (fun v -> reply (context env) v V.as_unit);
+      rejects = Some (fun v -> reject (context env) v V.as_unit);
+      caller = v_caller;
+    }
+  in f env' k'
+
+(* Programs *)
+
+and interpret_comp_unit env cu k = match cu with
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    let ve = declare_decs ds V.Env.empty in
+    let env' = adjoin_vals env ve in
+    interpret_decs env' ds k
+  | ActorU (None, ds, fs, _, _)
+  | ActorU (Some [], ds, fs, _, _) ->
+    (* to match semantics of installation with empty argument *)
+    interpret_actor env ds fs (fun _ -> k ())
+  | ActorU (Some as_, ds, fs, up, t) ->
+    (* create the closure *)
+    let sort = T.Local in
+    let cc = CC.({ sort; control = T.Returns; n_args = List.length as_; n_res = 1 }) in
+    let f = interpret_func env no_region sort "" as_
+      (fun env' -> interpret_actor env ds fs) in
+    let _v = match cc.CC.sort with
+      | T.Shared _ -> make_message env "" cc f
+      | _ -> V.Func (cc, f)
+    in
+    (* but discard it, since this the last expression in the unit *)
+    k ()
+
+let interpret_prog flags (cu, flavor) =
+  let state = initial_state () in
+  let scope = empty_scope in
+  let env =
+    { (env_of_scope flags flavor state scope)
+      with throws = Some (fun v -> trap !last_region "uncaught throw") }
+  in
+  env.actor_env :=
+    (* ManagementCanister with raw_rand (only) *)
+    V.Env.singleton "" (V.Obj
+       (V.Env.singleton "raw_rand"
+         (make_message env "rand" CC.{
+             sort = T.Shared T.Write;
+             control = if env.flavor.has_async_typ then T.Promises else T.Replies;
+             n_args = 0;
+             n_res = 1
+           }
+           (fun c v k ->
+              async env
+                Source.no_region
+                  (fun k' r ->
+                    k' (V.Blob (V.Blob.rand32 ())))
+                    k))));
+  trace_depth := 0;
+  try
+    Scheduler.queue (fun () ->
+      try interpret_comp_unit env cu  (fun v -> ())
+      with Invalid_argument s -> trap !last_region "%s" s
+    );
+    Scheduler.run ()
+  with exn -> print_exn flags exn
+
+
+
+ + + diff --git a/coverage/ir_passes/async.ml.html b/coverage/ir_passes/async.ml.html new file mode 100644 index 00000000000..967a6a4258c --- /dev/null +++ b/coverage/ir_passes/async.ml.html @@ -0,0 +1,1625 @@ + + + + + async.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+
+
open Mo_types
+open Ir_def
+
+module E = Env
+open Source
+module Ir = Ir
+open Ir
+open Ir_effect
+module T = Type
+open T
+open Construct
+
+(* lower the async type itself
+   - adds a final reply argument to every awaitable shared function, replace
+     the result by unit
+   - declares a trapping reject callback in every awaitable shared function
+   - transforms types, introductions and eliminations of awaitable shared
+     functions only, leaving non-awaitable shared functions unchanged.
+   - ensures every call to an awaitable shared function that takes a tuple has
+     a manifest tuple argument extended with a final reply continuation.
+ *)
+
+module ConRenaming = E.Make(struct type t = T.con let compare = Cons.compare end)
+
+(* Helpers *)
+
+let selfcallE ts e1 e2 e3 =
+  { it = SelfCallE (ts, e1, e2, e3);
+    at = no_region;
+    note = Note.{ def with typ = T.unit } }
+
+let error_rep_ty = T.(Tup [Variant T.catchErrorCodes; text])
+
+let errorMessageE e =
+  projE (primE (CastPrim (T.error, error_rep_ty)) [e]) 1
+
+let unary typ = [typ]
+
+let nary typ = T.as_seq typ
+
+let fulfillT as_seq typ = T.Func(T.Local, T.Returns, [], as_seq typ, [])
+
+let failT = T.Func(T.Local, T.Returns, [], [T.catch], [])
+
+let t_async_fut as_seq t =
+  T.Func (T.Local, T.Returns, [], [fulfillT as_seq t; failT],
+    [T.sum [
+      ("suspend", T.unit);
+      ("schedule", T.Func(T.Local, T.Returns, [], [], []))]])
+
+let t_async_cmp as_seq t =
+  T.Func (T.Local, T.Returns, [], [fulfillT as_seq t; failT], [])
+
+let new_async_ret as_seq t = [t_async_fut as_seq t; fulfillT as_seq t; failT]
+
+let new_asyncT =
+  T.Func (
+    T.Local,
+    T.Returns,
+    [ { var = "T"; sort = T.Type; bound = T.Any } ],
+    [],
+    new_async_ret unary (T.Var ("T", 0)))
+
+let new_asyncE () =
+  varE (var "@new_async" new_asyncT)
+
+let new_async t =
+  let call_new_async = callE (new_asyncE ()) [t] (unitE()) in
+  let async = fresh_var "async" (typ (projE call_new_async 0)) in
+  let fulfill = fresh_var "fulfill" (typ (projE call_new_async 1)) in
+  let fail = fresh_var "fail" (typ (projE call_new_async 2)) in
+  (async, fulfill, fail), call_new_async
+
+let new_nary_async_reply ts =
+  (* The async implementation isn't n-ary *)
+  let t = T.seq ts in
+  let (unary_async, unary_fulfill, fail), call_new_async = new_async t in
+  (* construct the n-ary async value, coercing the continuation, if necessary *)
+  let nary_async =
+    let coerce u =
+      let v = fresh_var "v" u in
+      let k = fresh_var "k" (contT u T.unit) in
+      let r = fresh_var "r" (err_contT T.unit) in
+      [k; r] -->* (
+        varE unary_async -*-
+          (tupE [
+             [v] -->* (varE k -*- varE v);
+             varE r
+          ])
+      )
+    in
+    match ts with
+    | [t1] ->
+      begin
+      match T.normalize t1 with
+      | T.Tup _ ->
+        (* TODO(#3740): find a better fix than PR #3741 *)
+        (* HACK *)
+        coerce t1
+      | _ ->
+        varE unary_async
+      end
+    | ts1 ->
+      coerce t
+  in
+  (* construct the n-ary reply callback that take a *sequence* of values to fulfill the async *)
+  let nary_reply =
+    let vs, seq_of_vs =
+      let vs = fresh_vars "rep" ts in
+      vs, seqE (List.map varE vs)
+    in
+    vs -->* (varE unary_fulfill -*- seq_of_vs)
+  in
+  let async,reply,reject =
+    fresh_var "async" (typ nary_async),
+    fresh_var "reply" (typ nary_reply),
+    fresh_var "reject" (typ_of_var fail)
+  in
+    (async, reply, reject),
+      blockE [letP (tupP [varP unary_async; varP unary_fulfill; varP fail])  call_new_async]
+        (tupE [nary_async; nary_reply; varE fail])
+
+
+let let_eta e scope =
+  match e.it with
+  | VarE _ -> scope e (* pure, so reduce *)
+  | _  ->
+    let f = fresh_var "x" (typ e) in
+    letD f e :: (scope (varE f)) (* maybe impure; sequence *)
+
+let is_awaitable_func exp =
+  match typ exp with
+  | T.Func (T.Shared _, T.Promises, _, _, _) -> true
+  | _ -> false
+
+(* Given sequence type ts, bind e of type (seq ts) to a
+ sequence of expressions supplied to decs d_of_es,
+ preserving effects of e when the sequence type is empty.
+ d_of_es must not duplicate or discard the evaluation of es.
+ *)
+
+let let_seq ts e d_of_vs =
+  match ts with
+  | [] ->
+    (expD e)::d_of_vs []
+  | [t] ->
+    let x = fresh_var "x" t in
+    let p = varP x in
+    (letP p e)::d_of_vs [x]
+  | ts ->
+    let xs = fresh_vars "x" ts in
+    let p = tupP (List.map varP xs) in
+    (letP p e)::d_of_vs (xs)
+
+(* name e in f unless named already *)
+let ensureNamed e f =
+  match e.it with
+  | VarE v -> f (var v (typ e))
+  | _ ->
+    let v = fresh_var "v" (typ e) in
+    blockE [letD v e] (f v)
+
+(* The actual transformation *)
+
+let transform prog =
+
+  (* the state *)
+  let con_renaming = ref ConRenaming.empty
+
+  (* maps constructors to new constructors (name name, new stamp, new kind)
+     it is initialized with the type constructors defined outside here, which are
+     not rewritten.
+
+     If we run this translation on two program fragments (e.g. prelude and program)
+     we would have to pass down the `con_renaming`. But this is simply the right thing
+     to do for a pass that changes the context.
+
+     Eventually, pipeline will allow us to pass the con_renaming to downstream program
+     fragments, then we would simply start with an empty con_renaming and the prelude.
+  *)
+  in
+
+  let rec t_typ (t:T.typ) =
+    match t with
+    | T.Prim _
+      | Var _ -> t
+    | Con (c, ts) ->
+      Con (t_con c, List.map t_typ ts)
+    | Array t -> Array (t_typ t)
+    | Tup ts -> Tup (List.map t_typ ts)
+    | Func (s, c, tbs, ts1, ts2) ->
+      let c' = match c with T.Promises -> T.Replies | _ -> c in
+      Func (s, c', List.map t_bind tbs, List.map t_typ ts1, List.map t_typ ts2)
+    | Opt t -> Opt (t_typ t)
+    | Variant fs -> Variant (List.map t_field fs)
+    | Async (Fut, _, t) -> t_async_fut nary (t_typ t) (* TBR exploit the index _ *)
+    | Async (Cmp, _, t) -> t_async_cmp nary (t_typ t) (* TBR exploit the index _ *)
+    | Obj (s, fs) -> Obj (s, List.map t_field fs)
+    | Mut t -> Mut (t_typ t)
+    | Any -> Any
+    | Non -> Non
+    | Pre -> Pre
+    | Typ c -> Typ (t_con c)
+
+  and t_bind tb =
+    { tb with bound = t_typ tb.bound }
+
+  and t_binds typbinds = List.map t_bind typbinds
+
+  and t_kind k =
+    match k with
+    | T.Abs (typ_binds,typ) ->
+      T.Abs (t_binds typ_binds, t_typ typ)
+    | T.Def (typ_binds,typ) ->
+      T.Def (t_binds typ_binds, t_typ typ)
+
+  and t_con c =
+    match Cons.kind c with
+    | T.Def ([], T.Prim _) -> c
+    | _ ->
+      match  ConRenaming.find_opt c (!con_renaming) with
+      | Some c' -> c'
+      | None ->
+        let clone = Cons.clone c (Abs ([], Pre)) in
+        con_renaming := ConRenaming.add c clone (!con_renaming);
+        (* Need to extend con_renaming before traversing the kind *)
+        Type.set_kind clone (t_kind (Cons.kind c));
+        clone
+
+  and t_prim p = Ir.map_prim t_typ (fun id -> id) p
+
+  and t_field {lab; typ; src} =
+    { lab; typ = t_typ typ; src }
+  in
+
+  let rec t_exp (exp: exp) =
+    { it = t_exp' exp;
+      note = Note.{ def with
+        typ = t_typ exp.note.typ;
+        eff = exp.note.eff
+      };
+      at = exp.at;
+    }
+  and t_exp' (exp:exp) =
+    let exp' = exp.it in
+    match exp' with
+    | LitE _ -> exp'
+    | VarE id -> exp'
+    | AssignE (exp1, exp2) ->
+      AssignE (t_lexp exp1, t_exp exp2)
+    | PrimE (CPSAwait (Fut, cont_typ), [a; kr]) ->
+      begin match cont_typ with
+        | Func(_, _, [], _, []) ->
+          (* unit answer type, from await in `async {}` *)
+          (ensureNamed (t_exp kr) (fun vkr ->
+            let schedule = fresh_var "schedule" (T.Func(T.Local, T.Returns, [], [], [])) in
+            switch_variantE ((t_exp a) -*- varE vkr)
+              [ ("suspend", wildP,
+                  unitE()); (* suspend *)
+                ("schedule", varP schedule, (* resume later *)
+                  (* try await async (); schedule() catch e -> r(e) *)
+                 (let v = fresh_var "call" T.unit in
+                  letE v
+                    (selfcallE [] (ic_replyE [] (unitE())) (varE schedule) (projE (varE vkr) 1))
+                    (check_call_perform_status (varE v) (fun e -> projE (varE vkr) 1 -*- e))))
+              ]
+              T.unit
+          )).it
+        | _ -> assert false
+      end
+    | PrimE (CPSAwait (Cmp, cont_typ), [a; kr]) ->
+      begin match cont_typ with
+      | Func(_, _, [], _, []) ->
+         ((t_exp a) -*- (t_exp kr)).it
+      | _ -> assert false
+      end
+    | PrimE (CPSAsync (Fut, t), [exp1]) ->
+      let t0 = t_typ t in
+      let tb, ts1 = match typ exp1 with
+        | Func(_,_, [tb], [Func(_, _, [], ts1, []); _], []) ->
+          tb, List.map t_typ (List.map (T.open_ [t]) ts1)
+        | t -> assert false in
+      let ((nary_async, nary_reply, reject), def) =
+        new_nary_async_reply ts1
+      in
+      ( blockE [
+          letP (tupP [varP nary_async; varP nary_reply; varP reject]) def;
+          let ic_reply = (* flatten v, here and below? *)
+            let v = fresh_var "v" (T.seq ts1) in
+            v --> (ic_replyE ts1 (varE v)) in
+          let ic_reject =
+            let e = fresh_var "e" T.catch in
+            [e] -->* (ic_rejectE (errorMessageE (varE e))) in
+          let exp' = callE (t_exp exp1) [t0] (tupE [ic_reply; ic_reject]) in
+          expD (selfcallE ts1 exp' (varE nary_reply) (varE reject))
+        ]
+        (varE nary_async)
+      ).it
+    | PrimE (CPSAsync (Cmp, t), [exp1]) ->
+      let t0 = t_typ t in
+      let tb, t_ret, t_fail = match typ exp1 with
+        | Func(_,_, [tb], [t_ret; t_fail], _ ) ->
+          tb,
+          t_typ (T.open_ [t] t_ret),
+          t_typ (T.open_ [t] t_fail)
+        | t -> assert false
+      in
+      let v_ret = fresh_var "v" t_ret in
+      let v_fail = fresh_var "e" t_fail in
+      ([v_ret; v_fail] -->* (callE (t_exp exp1) [t0] (tupE [varE v_ret; varE v_fail]))).it
+    | PrimE (CallPrim typs, [exp1; exp2]) when is_awaitable_func exp1 ->
+      let ts1,ts2 =
+        match typ exp1 with
+        | T.Func (T.Shared _, T.Promises, tbs, ts1, ts2) ->
+          List.map (fun t -> t_typ (T.open_ typs t)) ts1,
+          List.map (fun t -> t_typ (T.open_ typs t)) ts2
+        | _ -> assert(false)
+      in
+      let exp1' = t_exp exp1 in
+      let exp2' = t_exp exp2 in
+      let ((nary_async, nary_reply, reject), def) =
+        new_nary_async_reply ts2
+      in
+      (blockE (
+        letP (tupP [varP nary_async; varP nary_reply; varP reject]) def ::
+        let_eta exp1' (fun v1 ->
+          let_seq ts1 exp2' (fun vs ->
+            [ expD (ic_callE v1 (seqE (List.map varE vs)) (varE nary_reply) (varE reject)) ]
+           )
+          )
+         )
+         (varE nary_async))
+        .it
+    | PrimE (OtherPrim "call_raw", [exp1; exp2; exp3]) ->
+      let exp1' = t_exp exp1 in
+      let exp2' = t_exp exp2 in
+      let exp3' = t_exp exp3 in
+      let ((nary_async, nary_reply, reject), def) = new_nary_async_reply [T.blob] in
+      (blockE (
+        letP (tupP [varP nary_async; varP nary_reply; varP reject]) def ::
+          let_eta exp1' (fun v1 ->
+          let_eta exp2' (fun v2 ->
+          let_eta exp3' (fun v3 ->
+            [ expD (ic_call_rawE v1 v2 v3 (varE nary_reply) (varE reject)) ]
+            )
+          ))
+         )
+         (varE nary_async))
+        .it
+    | PrimE (p, exps) ->
+      PrimE (t_prim p, List.map t_exp exps)
+    | BlockE b ->
+      BlockE (t_block b)
+    | IfE (exp1, exp2, exp3) ->
+      IfE (t_exp exp1, t_exp exp2, t_exp exp3)
+    | SwitchE (exp1, cases) ->
+      let cases' = List.map (fun {it = {pat; exp}; at; note} ->
+        { it = {pat = t_pat pat ; exp = t_exp exp}; at; note })
+        cases
+      in
+      SwitchE (t_exp exp1, cases')
+    | LoopE exp1 ->
+      LoopE (t_exp exp1)
+    | LabelE (id, typ, exp1) ->
+      LabelE (id, t_typ typ, t_exp exp1)
+    | AsyncE _
+    | TryE _ -> assert false
+    | DeclareE (id, typ, exp1) ->
+      DeclareE (id, t_typ typ, t_exp exp1)
+    | DefineE (id, mut ,exp1) ->
+      DefineE (id, mut, t_exp exp1)
+    | FuncE (x, s, c, typbinds, args, ret_tys, exp) ->
+      begin
+        match s with
+        | T.Local  ->
+          FuncE (x, s, c, t_typ_binds typbinds, t_args args, List.map t_typ ret_tys, t_exp exp)
+        | T.Shared s' ->
+          begin
+            match c, exp with
+            | Promises, exp ->
+              let ret_tys = List.map t_typ ret_tys in
+              let args' = t_args args in
+              let typbinds' = t_typ_binds typbinds in
+              let t0, cps = match exp.it with
+                | PrimE (CPSAsync (Type.Fut, t0), [cps]) -> t_typ t0, cps
+                | _ -> assert false in
+              let t1, contT = match typ cps with
+                | Func (_,_,
+                    [tb],
+                    [Func(_, _, [], ts1, []) as contT; _],
+                    []) ->
+                  (t_typ (T.seq (List.map (T.open_ [t0]) ts1)),t_typ (T.open_ [t0] contT))
+                | t -> assert false in
+              let k =
+                let v = fresh_var "v" t1 in
+                v --> (ic_replyE ret_tys (varE v)) in
+              let r =
+                let e = fresh_var "e" T.catch in
+                [e] -->* (ic_rejectE (errorMessageE (varE e))) in
+              let exp' = callE (t_exp cps) [t0] (tupE [k;r]) in
+              FuncE (x, T.Shared s', Replies, typbinds', args', ret_tys, exp')
+            (* oneway, always with `ignore(async _)` body *)
+            | Returns,
+              { it = BlockE (
+                  [ { it = LetD (
+                      { it = WildP; _},
+                      ({ it = PrimE (CPSAsync _, _); _} as exp)); _ }],
+                  { it = PrimE (TupPrim, []); _ } );
+                _ } ->
+              let ret_tys = List.map t_typ ret_tys in
+              let args' = t_args args in
+              let typbinds' = t_typ_binds typbinds in
+              let t0, cps = match exp.it with
+                | PrimE (CPSAsync (Type.Fut, t0), [cps]) -> t_typ t0, cps (* TBR *)
+                | _ -> assert false in
+              let t1, contT = match typ cps with
+                | Func (_, _,
+                    [tb],
+                    [Func(_, _, [], ts1, []) as contT; _],
+                    []) ->
+                  (t_typ (T.seq (List.map (T.open_ [t0]) ts1)),t_typ (T.open_ [t0] contT))
+                | t -> assert false in
+              let k =
+                let v = fresh_var "v" t1 in
+                v --> tupE [] in (* discard return *)
+              let r =
+                let e = fresh_var "e" T.catch in
+                [e] -->* tupE [] in (* discard error *)
+              let exp' = callE (t_exp cps) [t0] (tupE [k;r]) in
+              FuncE (x, T.Shared s', Returns, typbinds', args', ret_tys, exp')
+            | Returns, _ ->
+              assert false
+            | Replies,_ -> assert false
+          end
+      end
+    | ActorE (ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+      ActorE (t_decs ds, t_fields fs,
+        {meta;
+         preupgrade = t_exp preupgrade;
+         postupgrade = t_exp postupgrade;
+         heartbeat = t_exp heartbeat;
+         timer = t_exp timer;
+         inspect = t_exp inspect
+        }, t_typ typ)
+    | NewObjE (sort, ids, t) ->
+      NewObjE (sort, t_fields ids, t_typ t)
+    | SelfCallE _ -> assert false
+
+  and t_lexp lexp =
+    { it = t_lexp' lexp.it;
+      note = t_typ lexp.note;
+      at = lexp.at;
+    }
+  and t_lexp' (lexp':lexp') =
+    match lexp' with
+    | VarLE _ -> lexp'
+    | DotLE (exp1, id) ->
+      DotLE (t_exp exp1, id)
+    | IdxLE (exp1, exp2) ->
+      IdxLE (t_exp exp1, t_exp exp2)
+
+  and t_dec dec = { dec with it = t_dec' dec.it }
+
+  and t_dec' dec' =
+    match dec' with
+    | LetD (pat,exp) -> LetD (t_pat pat,t_exp exp)
+    | VarD (id, t, exp) -> VarD (id, t_typ t, t_exp exp)
+    | RefD (id, t, lexp) -> RefD (id, t_typ t, t_lexp lexp)
+
+  and t_decs decs = List.map t_dec decs
+
+  and t_block (ds, exp) = (t_decs ds, t_exp exp)
+
+  and t_fields fs =
+    List.map (fun f -> { f with note = t_typ f.note }) fs
+
+  and t_args as_ = List.map t_arg as_
+
+  and t_arg a = { a with note = t_typ a.note }
+
+  and t_pat pat =
+    { pat with
+      it = t_pat' pat.it;
+      note = t_typ pat.note }
+
+  and t_pat' pat =
+    match pat with
+    | WildP
+    | LitP _
+    | VarP _ ->
+      pat
+    | TupP pats ->
+      TupP (List.map t_pat pats)
+    | ObjP pfs ->
+      ObjP (map_obj_pat t_pat pfs)
+    | OptP pat1 ->
+      OptP (t_pat pat1)
+    | TagP (i, pat1) ->
+      TagP (i, t_pat pat1)
+    | AltP (pat1, pat2) ->
+      AltP (t_pat pat1, t_pat pat2)
+
+  and t_typ_bind' tb =
+    { tb with con = t_con tb.con; bound = t_typ tb.bound }
+
+  and t_typ_bind typ_bind =
+    { typ_bind with it = t_typ_bind' typ_bind.it }
+
+  and t_typ_binds typbinds = List.map t_typ_bind typbinds
+
+  and t_comp_unit = function
+    | LibU _ -> raise (Invalid_argument "cannot compile library")
+    | ProgU ds -> ProgU (t_decs ds)
+    | ActorU (args_opt, ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+      ActorU (Option.map t_args args_opt, t_decs ds, t_fields fs,
+        { meta;
+          preupgrade = t_exp preupgrade;
+          postupgrade = t_exp postupgrade;
+          heartbeat = t_exp heartbeat;
+          timer = t_exp timer;
+          inspect = t_exp inspect
+        }, t_typ t)
+
+  and t_prog (cu, flavor) = (t_comp_unit cu, { flavor with has_async_typ = false } )
+in
+  t_prog prog
+
+
+
+ + + diff --git a/coverage/ir_passes/await.ml.html b/coverage/ir_passes/await.ml.html new file mode 100644 index 00000000000..b03059ebb19 --- /dev/null +++ b/coverage/ir_passes/await.ml.html @@ -0,0 +1,1971 @@ + + + + + await.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+
+
open Ir_def
+open Mo_types
+
+open Source
+open Ir
+open Ir_effect
+module R = Rename
+module T = Type
+open Construct
+
+let fresh_cont typ ans_typ = fresh_var "k" (contT typ ans_typ)
+
+let fresh_err_cont ans_typ  = fresh_var "r" (err_contT ans_typ)
+
+(* continuations, syntactic and meta-level *)
+
+type kont = ContVar of var
+          | MetaCont of T.typ * (var -> exp)
+
+let meta typ exp =
+  let expanded = ref false in
+  let exp v =
+    assert (not(!expanded));
+    expanded := true;
+    exp v
+  in
+  MetaCont (typ, exp)
+
+(* reify a continuation as syntax *)
+let letcont k scope =
+  match k with
+  | ContVar k' -> scope k' (* letcont eta-contraction *)
+  | MetaCont (typ0, cont) ->
+    let v = fresh_var "v" typ0 in
+    let e = cont v in
+    let k' = fresh_cont typ0 (typ e) in
+    blockE [funcD k' v e] (* at this point, I'm really worried about variable capture *)
+            (scope k')
+
+(* Named labels for break, special labels for return and throw *)
+type label = Return | Throw | Named of string
+
+let ( -@- ) k exp2 =
+  match k with
+  | ContVar v ->
+     varE v -*- exp2
+  | MetaCont (typ0, k) ->
+     match exp2.it with
+     | VarE v -> k (var v (typ exp2))
+     | _ ->
+        let u = fresh_var "u" typ0 in
+        letE u exp2 (k u)
+
+(* Label environments *)
+
+module LabelEnv = Env.Make(struct type t = label let compare = compare end)
+
+module PatEnv = Env.Make(String)
+
+type label_sort = Cont of kont | Label
+
+let typ_cases cases = List.fold_left (fun t case -> T.lub t (typ case.it.exp)) T.Non cases
+
+let rec t_async context exp =
+  match exp.it with
+  | AsyncE (s, tb, exp1, typ1) ->
+   let exp1 = R.exp R.Renaming.empty exp1 in (* rename all bound vars apart *) (*Why?*)
+   (* add the implicit return label *)
+   let k_ret = fresh_cont (typ exp1) T.unit in
+   let k_fail = fresh_err_cont T.unit in
+   let context' =
+     LabelEnv.add Return (Cont (ContVar k_ret))
+       (LabelEnv.add Throw (Cont (ContVar k_fail)) LabelEnv.empty)
+   in
+     cps_asyncE s typ1 (typ exp1)
+       (forall [tb] ([k_ret; k_fail] -->*
+          (c_exp context' exp1 (ContVar k_ret))))
+ |  _ -> assert false
+
+(* Trivial translation of pure terms (eff = T.Triv) *)
+and t_exp context exp =
+  assert (eff exp = T.Triv);
+  { exp with it = t_exp' context exp }
+and t_exp' context exp =
+  match exp.it with
+  | VarE _
+  | LitE _ -> exp.it
+  | AssignE (exp1, exp2) ->
+    AssignE (t_lexp context exp1, t_exp context exp2)
+  | BlockE b ->
+    BlockE (t_block context b)
+  | IfE (exp1, exp2, exp3) ->
+    IfE (t_exp context exp1, t_exp context exp2, t_exp context exp3)
+  | SwitchE (exp1, cases) ->
+    let cases' = List.map
+      (fun {it = {pat;exp}; at; note} ->
+        {it = {pat;exp = t_exp context exp}; at; note})
+      cases
+    in
+    SwitchE (t_exp context exp1, cases')
+  | LoopE exp1 ->
+    LoopE (t_exp context exp1)
+  | LabelE (id, _typ, exp1) ->
+    let context' = LabelEnv.add (Named id) Label context in
+    LabelE (id, _typ, t_exp context' exp1)
+  | PrimE (BreakPrim id, [exp1]) ->
+    begin
+      match LabelEnv.find_opt (Named id) context with
+      | Some (Cont k) -> (retE (k -@- t_exp context exp1)).it
+      | Some Label -> (breakE id (t_exp context exp1)).it
+      | None -> assert false
+    end
+  | PrimE (RetPrim, [exp1]) ->
+    begin
+      match LabelEnv.find_opt Return context with
+      | Some (Cont k) -> (retE (k -@- t_exp context exp1)).it
+      | Some Label -> (retE (t_exp context exp1)).it
+      | None -> assert false
+    end
+  | AsyncE (T.Cmp, _, _, _) ->
+     (t_async context exp).it
+  | AsyncE (T.Fut, _, _, _) ->
+     assert false  (* must have effect T.Await *)
+  | TryE _ -> assert false (* these never have effect T.Triv *)
+  | DeclareE (id, typ, exp1) ->
+    DeclareE (id, typ, t_exp context exp1)
+  | DefineE (id, mut ,exp1) ->
+    DefineE (id, mut, t_exp context exp1)
+  | FuncE (x, T.Local, c, typbinds, pat, typs,
+      ({ it = AsyncE _; _} as async)) ->
+    FuncE (x, T.Local, c, typbinds, pat, typs,
+      t_async context async)
+  | FuncE (x, T.Local, c, typbinds, pat, typs,
+      ({it = BlockE (ds, ({ it = AsyncE _; _} as async)); _} as wrapper)) ->
+    (* GH issue #3910 *)
+    FuncE (x, T.Local, c, typbinds, pat, typs,
+      { wrapper with it = BlockE (ds, t_async context async) })
+  | FuncE (x, (T.Shared _ as s), c, typbinds, pat, typs,
+      ({ it = AsyncE _;_ } as body)) ->
+    FuncE (x, s, c, typbinds, pat, typs,
+      t_async context body)
+  | FuncE (x, (T.Shared _ as s), c, typbinds, pat, typs,
+      { it = BlockE ([
+         { it = LetD (
+            { it = WildP; _} as wild_pat,
+            ({ it = AsyncE _; _} as body)); _ }],
+         ({ it = PrimE (TupPrim, []); _ } as unitE));
+        _
+      }) ->
+    FuncE (x, s, c, typbinds, pat, typs,
+      blockE [letP wild_pat (t_async context body)] unitE)
+  | FuncE (x, s, c, typbinds, pat, typs, exp1) ->
+    assert (not (T.is_local_async_func (typ exp)));
+    assert (not (T.is_shared_func (typ exp)));
+    let context' = LabelEnv.add Return Label LabelEnv.empty in
+    FuncE (x, s, c, typbinds, pat, typs, t_exp context' exp1)
+  | ActorE (ds, ids, { meta; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+    ActorE (t_decs context ds, ids,
+      { meta;
+        preupgrade = t_exp LabelEnv.empty preupgrade;
+        postupgrade = t_exp LabelEnv.empty postupgrade;
+        heartbeat = t_ignore_throw LabelEnv.empty heartbeat;
+        timer = t_ignore_throw LabelEnv.empty timer;
+        inspect = t_exp LabelEnv.empty inspect
+      },
+      t)
+  | NewObjE (sort, ids, typ) -> exp.it
+  | SelfCallE _ -> assert false
+  | PrimE (p, exps) ->
+    (* async calls have effect T.Await, not T.Triv *)
+    assert (not (is_async_call p exps));
+    PrimE (p, List.map (t_exp context) exps)
+
+and t_lexp context lexp =
+  { lexp with it = t_lexp' context lexp.it }
+and t_lexp' context lexp' =
+  match lexp' with
+  | VarLE i -> VarLE i
+  | DotLE (exp1, id) -> DotLE (t_exp context exp1, id)
+  | IdxLE (exp1, exp2) -> IdxLE (t_exp context exp1, t_exp context exp2)
+
+and t_dec context dec =
+  {dec with it = t_dec' context dec.it}
+and t_dec' context dec' =
+  match dec' with
+  | LetD (pat, exp) -> LetD (pat, t_exp context exp)
+  | VarD (id, t, exp) -> VarD (id, t, t_exp context exp)
+  | RefD (id, t, lexp) -> RefD (id, t, t_lexp context lexp)
+
+and t_decs context decs = List.map (t_dec context) decs
+
+and t_block context (ds, exp) = (t_decs context ds, t_exp context exp)
+
+(* non-trivial translation of possibly impure terms (eff = T.Await) *)
+
+and unary context k unE e1 =
+  match eff e1 with
+  | T.Await ->
+    c_exp context e1 (meta (typ e1) (fun v1 -> k -@- unE v1))
+  | T.Triv ->
+    assert false
+
+and binary context k binE e1 e2 =
+  match eff e1, eff e2 with
+  | T.Triv, T.Await ->
+    let v1 = fresh_var "v" (typ e1) in (* TBR *)
+    letE v1 (t_exp context e1)
+      (c_exp context e2 (meta (typ e2) (fun v2 -> k -@- binE (varE v1) (varE v2))))
+  | T.Await, T.Await ->
+    c_exp context e1
+      (meta (typ e1) (fun v1 ->
+           c_exp context e2
+             (meta (typ e2) (fun v2 ->
+                  k -@- binE (varE v1) (varE v2)))))
+  | T.Await, T.Triv ->
+    c_exp context e1 (meta (typ e1) (fun v1 -> k -@- binE (varE v1) (t_exp context e2)))
+  | T.Triv, T.Triv ->
+    assert false
+
+and nary context k naryE es =
+  let rec nary_aux vs es  =
+    match es with
+    | [] -> k -@- naryE (List.rev vs)
+    | [e1] when eff e1 = T.Triv ->
+      (* TBR: optimization - no need to name the last trivial argument *)
+      k -@- naryE (List.rev (t_exp context e1 :: vs))
+    | e1 :: es ->
+      match eff e1 with
+      | T.Triv ->
+        let v1 = fresh_var "v" (typ e1) in
+        letE v1 (t_exp context e1)
+          (nary_aux (varE v1 :: vs) es)
+      | T.Await ->
+        c_exp context e1
+          (meta (typ e1) (fun v1 -> nary_aux (varE v1 :: vs) es))
+  in
+  nary_aux [] es
+
+
+and c_if context k e1 e2 e3 =
+  letcont k (fun k ->
+  let trans_branch exp = match eff exp with
+    | T.Triv -> varE k -*- t_exp context exp
+    | T.Await -> c_exp context exp (ContVar k)
+  in
+  let e2 = trans_branch e2 in
+  let e3 = trans_branch e3 in
+  match eff e1 with
+  | T.Triv ->
+    ifE (t_exp context e1) e2 e3
+  | T.Await ->
+    c_exp context e1 (meta (typ e1) (fun v1 -> ifE (varE v1) e2 e3))
+  )
+
+and c_loop context k e1 =
+  match eff e1 with
+  | T.Triv ->
+    assert false
+  | T.Await ->
+    let loop = fresh_var "loop" (contT T.unit T.unit) in
+    let v1 = fresh_var "v" T.unit in
+    blockE
+      [funcD loop v1 (c_exp context e1 (ContVar loop))]
+      (varE loop -*- unitE ())
+
+and c_assign context k e lexp1 exp2 =
+ match lexp1.it with
+ | VarLE _ ->
+   unary context k (fun v2 -> e (AssignE(lexp1, varE v2))) exp2
+ | DotLE (exp11, id) ->
+   binary context k (fun v11 v2 ->
+     e (AssignE ({lexp1 with it = DotLE (v11, id)}, v2))) exp11 exp2
+ | IdxLE (exp11, exp12) ->
+   nary context k
+     (fun vs -> match vs with
+       | [v11; v12; v2] ->
+         e (AssignE ({lexp1 with it = IdxLE (v11, v12)}, v2))
+       | _ -> assert false)
+     [exp11; exp12; exp2]
+
+and c_exp context exp =
+  c_exp' context exp
+
+and c_exp' context exp k =
+  let e exp' = {exp with it = exp'} in
+  match exp.it with
+  | _ when is_triv exp ->
+    k -@- (t_exp context exp)
+  | VarE _
+  | LitE _
+  | FuncE _ ->
+    assert false
+  | ActorE _ ->
+    assert false; (* ActorE fields cannot await *)
+  | AssignE (exp1, exp2) ->
+    c_assign context k e exp1 exp2
+  | BlockE (decs, exp) ->
+    c_block context decs exp k
+  | IfE (exp1, exp2, exp3) ->
+    c_if context k exp1 exp2 exp3
+  | SwitchE (exp1, cases) ->
+    letcont k (fun k ->
+    let cases' = List.map
+      (fun {it = {pat;exp}; at; note} ->
+        let exp' = match eff exp with
+          | T.Triv -> varE k -*- (t_exp context exp)
+          | T.Await -> c_exp context exp (ContVar k)
+        in
+        {it = { pat; exp = exp' }; at; note})
+      cases
+    in
+    let typ' = typ_cases cases' in
+    begin
+    match eff exp1 with
+    | T.Triv ->
+      { it = SwitchE(t_exp context exp1, cases');
+        at = exp.at;
+        note = Note.{ exp.note with typ = typ' } }
+    | T.Await ->
+       c_exp context exp1
+         (meta (typ exp1)
+           (fun v1 ->
+             { it = SwitchE(varE v1, cases');
+               at = exp.at;
+               note = Note.{ exp.note with typ = typ' } }))
+    end)
+  | TryE (exp1, cases) ->
+    (* TODO: do we need to reify f? *)
+    let f = match LabelEnv.find Throw context with Cont f -> f | _ -> assert false in
+    letcont f (fun f ->
+    letcont k (fun k ->
+    match eff exp1 with
+    | T.Triv ->
+      varE k -*- (t_exp context exp1)
+    | T.Await ->
+      let error = fresh_var "v" T.catch  in
+      let cases' =
+        List.map
+          (fun {it = {pat;exp}; at; note} ->
+            let exp' = match eff exp with
+              | T.Triv -> varE k -*- (t_exp context exp)
+              | T.Await -> c_exp context exp (ContVar k)
+            in
+            { it = {pat;exp = exp' }; at; note })
+          cases
+        @ [{ it = {pat = varP error; exp = varE f -*- varE error};
+             at = no_region;
+             note = ()
+        }] in
+      let throw = fresh_err_cont (answerT (typ_of_var k)) in
+      let context' = LabelEnv.add Throw (Cont (ContVar throw)) context in
+      blockE
+        [ let e = fresh_var "e" T.catch in
+          funcD throw e {
+            it = SwitchE (varE e, cases');
+            at = exp.at;
+            note = Note.{ def with typ = typ_cases cases'; eff = T.Await; (* shouldn't matter *) }
+          }
+        ]
+        (c_exp context' exp1 (ContVar k))
+    ))
+  | LoopE exp1 ->
+    c_loop context k exp1
+  | LabelE (id, _typ, exp1) ->
+    letcont k
+      (fun k ->
+        let context' = LabelEnv.add (Named id) (Cont (ContVar k)) context in
+        c_exp context' exp1 (ContVar k)) (* TODO optimize me, if possible *)
+  | PrimE (BreakPrim id, [exp1]) ->
+    begin
+      match LabelEnv.find_opt (Named id) context with
+      | Some (Cont k') -> c_exp context exp1 k'
+      | Some Label -> assert false
+      | None -> assert false
+    end
+  | PrimE (RetPrim, [exp1]) ->
+    begin
+      match LabelEnv.find_opt Return context with
+      | Some (Cont k') -> c_exp context exp1 k'
+      | Some Label -> assert false
+      | None -> assert false
+    end
+  | PrimE (ThrowPrim, [exp1]) ->
+    begin
+      match LabelEnv.find_opt Throw context with
+      | Some (Cont k') -> c_exp context exp1 k'
+      | Some Label
+      | None -> assert false
+    end
+  | AsyncE (T.Cmp, tb, exp1, typ1) ->
+    assert false (* must have effect T.Triv, handled by first case *)
+  | AsyncE (T.Fut, tb, exp1, typ1) ->
+    (* add the implicit return label *)
+    let k_ret = fresh_cont (typ exp1) T.unit in
+    let k_fail = fresh_err_cont T.unit in
+    let context' =
+      LabelEnv.add Return (Cont (ContVar k_ret))
+        (LabelEnv.add Throw (Cont (ContVar k_fail)) LabelEnv.empty)
+    in
+    let r = match LabelEnv.find_opt Throw context with
+      | Some (Cont r) -> r
+      | Some Label
+      | None -> assert false
+    in
+    let cps_async =
+      cps_asyncE T.Fut typ1 (typ exp1)
+        (forall [tb] ([k_ret; k_fail] -->*
+          (c_exp context' exp1 (ContVar k_ret)))) in
+    let k' = meta (typ cps_async)
+      (fun v ->
+        check_call_perform_status
+          (k -@- varE v)
+          (fun e -> r -@- e))
+    in
+    k' -@- cps_async
+  | PrimE (AwaitPrim s, [exp1]) ->
+    let r = match LabelEnv.find_opt Throw context with
+      | Some (Cont r) -> r
+      | Some Label
+      | None -> assert false
+    in
+    letcont r (fun r ->
+    letcont k (fun k ->
+      let kr = tupE [varE k; varE r] in
+      match eff exp1 with
+      | T.Triv ->
+        cps_awaitE s (typ_of_var k) (t_exp context exp1) kr
+      | T.Await ->
+        c_exp context exp1
+          (meta (typ exp1) (fun v1 -> (cps_awaitE s (typ_of_var k) (varE v1) kr)))
+    ))
+  | DeclareE (id, typ, exp1) ->
+    unary context k (fun v1 -> e (DeclareE (id, typ, varE v1))) exp1
+  | DefineE (id, mut, exp1) ->
+    unary context k (fun v1 -> e (DefineE (id, mut, varE v1))) exp1
+  | NewObjE _ -> exp
+  | SelfCallE _ -> assert false
+  | PrimE (p, exps) when is_async_call p exps ->
+    let r = match LabelEnv.find_opt Throw context with
+      | Some (Cont r) -> r
+      | Some Label
+      | None -> assert false
+    in
+    let k' = meta (typ exp)
+      (fun v ->
+        check_call_perform_status
+          (k -@- varE v)
+          (fun e -> r -@- e))
+    in
+    nary context k' (fun vs -> e (PrimE (p, vs))) exps
+  | PrimE (p, exps) ->
+    nary context k (fun vs -> e (PrimE (p, vs))) exps
+
+and c_block context decs exp k =
+  declare_decs decs (c_decs context decs (meta T.unit (fun _ -> c_exp context exp k)))
+
+and c_dec context dec (k:kont) =
+  match dec.it with
+  | LetD (pat,exp) ->
+    let patenv,pat' = rename_pat pat in
+    let block exp =
+      let dec_pat' = {dec with it = LetD(pat',exp)} in
+      blockE (dec_pat' :: define_pat patenv pat)
+        (k -@- tupE[])
+    in
+     begin
+       match eff exp with
+       | T.Triv ->
+         block (t_exp context exp)
+       | T.Await ->
+         c_exp context exp (meta (typ exp) (fun v -> block (varE v)))
+     end
+  | VarD (id, _typ, exp) ->
+    begin
+      match eff exp with
+      | T.Triv ->
+        k -@- define_idE id Var (t_exp context exp)
+      | T.Await ->
+        c_exp context exp
+          (meta (typ exp)
+            (fun v -> k -@- define_idE id Var (varE v)))
+    end
+  | RefD (id, _typ, _lexp) -> assert false
+    (* TODO: unclear if this can arise at all, and if so, how to translate it with existing tools *)
+
+and c_decs context decs k =
+  match decs with
+  | [] ->
+    k -@- unitE ()
+  | dec :: decs ->
+    c_dec context dec (meta T.unit (fun v -> c_decs context decs k))
+
+(* Blocks and Declarations *)
+
+and declare_dec dec exp : exp =
+  match dec.it with
+  | LetD (pat, _) -> declare_pat pat exp
+  | VarD (id, typ, _exp1) -> declare_id id (T.Mut typ) exp
+  | RefD (id, typ, _exp1) -> declare_id id typ exp
+
+and declare_decs decs exp : exp =
+  match decs with
+  | [] -> exp
+  | dec :: decs' ->
+    declare_dec dec (declare_decs decs' exp)
+
+(* Patterns *)
+
+and declare_id id typ exp =
+  declare_idE id typ exp
+
+and declare_pat pat exp : exp =
+  match pat.it with
+  | WildP | LitP  _ ->  exp
+  | VarP id -> declare_id id pat.note exp
+  | TupP pats -> declare_pats pats exp
+  | ObjP pfs -> declare_pats (pats_of_obj_pat pfs) exp
+  | OptP pat1
+  | TagP (_, pat1) -> declare_pat pat1 exp
+  | AltP (pat1, pat2) -> declare_pat pat1 exp
+
+and declare_pats pats exp : exp =
+  match pats with
+  | [] -> exp
+  | pat :: pats' ->
+    declare_pat pat (declare_pats pats' exp)
+
+and rename_pat pat =
+  let (patenv,pat') = rename_pat' pat in
+  (patenv, { pat with it = pat' })
+
+and rename_pat' pat =
+  match pat.it with
+  | WildP
+  | LitP _ -> (PatEnv.empty, pat.it)
+  | VarP id ->
+    let v = fresh_var "v" pat.note in
+    (PatEnv.singleton id v, VarP (id_of_var v))
+  | TupP pats ->
+    let (patenv,pats') = rename_pats pats in
+    (patenv,TupP pats')
+  | ObjP pfs ->
+    let (patenv, pats') = rename_pats (pats_of_obj_pat pfs) in
+    let pfs' = replace_obj_pat pfs pats' in
+    (patenv, ObjP pfs')
+  | OptP pat1 ->
+    let (patenv,pat1) = rename_pat pat1 in
+    (patenv, OptP pat1)
+  | TagP (i, pat1) ->
+    let (patenv,pat1) = rename_pat pat1 in
+    (patenv, TagP (i, pat1))
+  | AltP (pat1,pat2) ->
+    assert(Freevars.(M.is_empty (pat pat1)));
+    assert(Freevars.(M.is_empty (pat pat2)));
+    (PatEnv.empty,pat.it)
+
+and rename_pats pats =
+  match pats with
+  | [] -> (PatEnv.empty,[])
+  | (pat :: pats) ->
+    let (patenv1, pat') = rename_pat pat in
+    let (patenv2, pats') = rename_pats pats in
+    (PatEnv.disjoint_union patenv1 patenv2, pat' :: pats')
+
+and define_pat patenv pat : dec list =
+  match pat.it with
+  | WildP
+  | LitP _ ->
+    []
+  | VarP id ->
+    [ expD (define_idE id Const (varE (PatEnv.find id patenv))) ]
+  | TupP pats -> define_pats patenv pats
+  | ObjP pfs -> define_pats patenv (pats_of_obj_pat pfs)
+  | OptP pat1
+  | TagP (_, pat1) -> define_pat patenv pat1
+  | AltP (pat1, pat2) ->
+    assert(Freevars.(M.is_empty (pat pat1)));
+    assert(Freevars.(M.is_empty (pat pat2)));
+    []
+
+and define_pats patenv (pats : pat list) : dec list =
+  List.concat_map (define_pat patenv) pats
+
+and t_comp_unit context = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    begin
+      match infer_effect_decs ds with
+      | T.Triv ->
+        ProgU (t_decs context ds)
+      | T.Await ->
+        let throw = fresh_err_cont T.unit in
+        let context' = LabelEnv.add Throw (Cont (ContVar throw)) context in
+        let e = fresh_var "e" T.catch in
+        ProgU [
+          funcD throw e (assertE (falseE ()));
+          expD (c_block context' ds (tupE []) (meta (T.unit) (fun v1 -> tupE [])))
+        ]
+    end
+  | ActorU (as_opt, ds, ids, { meta = m; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+    ActorU (as_opt, t_decs context ds, ids,
+      { meta = m;
+        preupgrade = t_exp LabelEnv.empty preupgrade;
+        postupgrade = t_exp LabelEnv.empty postupgrade;
+        heartbeat = t_ignore_throw LabelEnv.empty heartbeat;
+        timer = t_ignore_throw LabelEnv.empty timer;
+        inspect = t_exp LabelEnv.empty inspect;
+      },
+      t)
+
+and t_ignore_throw context exp =
+  match exp.it with
+  | Ir.PrimE (Ir.TupPrim, []) ->
+     exp
+  | _ ->
+     let throw = fresh_err_cont T.unit in
+     let context' = LabelEnv.add Throw (Cont (ContVar throw)) context in
+     let e = fresh_var "e" T.catch in
+     { (blockE [
+          funcD throw e (tupE[]);
+        ]
+        (c_exp context' exp (meta (T.unit) (fun v1 -> tupE []))))
+       (* timer logic requires us to preserve any source location,
+          or timer won't be initialized in compile.ml *)
+       with at = exp.at
+     }
+
+
+and t_prog (prog, flavor) =
+  (t_comp_unit LabelEnv.empty prog, { flavor with has_await = false })
+
+let transform prog = t_prog prog
+
+
+
+ + + diff --git a/coverage/ir_passes/const.ml.html b/coverage/ir_passes/const.ml.html new file mode 100644 index 00000000000..52877dd6432 --- /dev/null +++ b/coverage/ir_passes/const.ml.html @@ -0,0 +1,757 @@ + + + + + const.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+
+
open Mo_types
+open Ir_def
+open Source
+open Ir
+open Lbool
+
+(*
+  This module identifies subexpressions that can be compiled statically. This
+  means each subexpression must be a constant, immutable value for which the
+  backend can create the memory representation statically.
+
+  This module should stay in sync with the
+   * the `compile_const_exp` function in `codegen/compile.ml`
+   * the `Const.t` type in `codegen/compile.ml.
+   * the checks in Check_ir.
+
+  ## What is const?
+
+  The high-level idea is
+
+  * Variables can be const if their definition is const (beware, recursion!)
+  * Blocks can be const if
+    - all RHSs are const, and
+    - no mutable variable are defined, and
+    - pattern matching is side-effect free, i.e. irrefutable
+  * Functions can be const if they do not require a closure.
+    This is the case if every free variable is
+    - const or
+    - bound at the top level (`loc_known = true` below)
+  * Literals can be const
+  * Data structures can be const if they are immutable and all components are
+    const
+  * Projections can be const if they cannot fail (so no array index) and
+    their argument is const
+
+  I say “can be const” because the analysis does not have to be complete, just
+  conservative.
+
+  ## How does the analysis work?
+
+  If we didn't have recursion, this would be simple: We'd pass down an environment
+  mapping all free variables to whether they are constant or not (bool E.t), use this
+  in the VarE case, and otherwise const-able expressions are constant when their
+  subexpressions are.
+
+  As always, recursion makes things harder. But not too much, thanks to a trick:
+  we pass down a custom type called `Lbool.t`. It denotes a boolean value,
+  just we do not know which one yet.  But we can still register implications on
+  these values. Internally, these lazy_bool values keep track of their
+  dependencies, and propagate additional information automatically. When one of them
+  knows it is going to be surely false, then it updates the corresponding
+  `note.const` field. See lbool.mli for more on that.
+
+  This analysis relies on the fact that AST notes are mutable. So sharing AST
+  nodes would be bad.  Check_ir checks for the absence of sharing.
+*)
+
+(* The environment *)
+
+type lvl = TopLvl | NotTopLvl
+
+module M = Env.Make(String)
+
+type info = {
+  loc_known : bool;
+  const : Lbool.t;
+}
+type env = info M.t
+
+
+let no_info = { loc_known = false; const = surely_false }
+let arg lvl env a = M.add a.it { no_info with loc_known = lvl = TopLvl } env
+let args lvl env as_ = List.fold_left (arg lvl) env as_
+
+let rec pat env p = match p.it with
+  | WildP
+  | LitP _ -> env
+  | VarP id -> M.add id no_info env
+  | TupP pats -> List.fold_left pat env pats
+  | ObjP pfs -> List.fold_left pat env (pats_of_obj_pat pfs)
+  | AltP (pat1, _) | OptP pat1 | TagP (_, pat1) -> pat env pat1
+
+let find v env = match M.find_opt v env with
+  | None -> raise (Invalid_argument (Printf.sprintf "Unbound var: %s\n" v))
+  | Some lb -> lb
+
+
+(* Setting the notes *)
+
+let set_const e b =
+  if e.note.Note.const != b
+  then e.note <- Note.{ e.note with const = b }
+
+let set_lazy_const e lb =
+  set_const e true;
+  when_false lb (lazy (set_const e false))
+
+(* Traversals *)
+
+let rec exp lvl (env : env) e : Lbool.t =
+  let lb =
+    match e.it with
+    | VarE v -> (find v env).const
+    | FuncE (x, s, c, tp, as_ , ts, body) ->
+      exp_ NotTopLvl (args NotTopLvl env as_) body;
+      begin match s, lvl with
+      (* shared functions are not const for now *)
+      | Type.Shared _, _ -> surely_false
+      (* top-level functions can always be const (all free variables are top-level) *)
+      | _, TopLvl -> surely_true
+      | _, NotTopLvl ->
+        let lb = maybe_false () in
+        Freevars.M.iter (fun v _ ->
+          let {loc_known; const} = find v env in
+          if loc_known then () else (* static definitions are ok *)
+          required_for const lb
+        ) (Freevars.exp e);
+        lb
+      end
+    | NewObjE (Type.(Object | Module), fs, t) when Type.is_immutable_obj t ->
+      all (List.map (fun f -> (find f.it.var env).const) fs)
+    | BlockE (ds, body) ->
+      block lvl env (ds, body)
+    | PrimE (TupPrim, es)
+    | PrimE (ArrayPrim (Const, _), es) ->
+      all (List.map (fun e -> exp lvl env e) es)
+    | PrimE (DotPrim _, [e1] | ProjPrim _, [e1] | OptPrim, [e1] | TagPrim _, [e1]) ->
+      exp lvl env e1
+    | LitE _ ->
+      surely_true
+
+    (* All the following expressions cannot be const, but we still need to descend *)
+    | PrimE (_, es) ->
+      List.iter (exp_ lvl env) es;
+      surely_false
+    | DeclareE (id, _, e1) ->
+      exp_ lvl (M.add id no_info env) e1;
+      surely_false
+    | LoopE e1 | AsyncE (_, _, e1, _) ->
+      exp_ NotTopLvl env e1;
+      surely_false
+    | AssignE (_, e1) | LabelE (_, _, e1) | DefineE (_, _, e1) ->
+      exp_ lvl env e1;
+      surely_false
+    | IfE (e1, e2, e3) ->
+      exp_ lvl env e1;
+      exp_ lvl env e2;
+      exp_ lvl env e3;
+      surely_false
+    | SelfCallE (_, e1, e2, e3) ->
+      exp_ NotTopLvl env e1;
+      exp_ lvl env e2;
+      exp_ lvl env e3;
+      surely_false
+    | SwitchE (e1, cs) | TryE (e1, cs) ->
+      exp_ lvl env e1;
+      List.iter (case_ lvl env) cs;
+      surely_false
+    | NewObjE _ -> (* mutable objects *)
+      surely_false
+    | ActorE (ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, _typ) ->
+      (* this may well be “the” top-level actor, so don’t update lvl here *)
+      let (env', _) = decs lvl env ds in
+      exp_ lvl env' preupgrade;
+      exp_ lvl env' postupgrade;
+      exp_ lvl env' heartbeat;
+      exp_ lvl env' timer;
+      exp_ lvl env' inspect;
+      surely_false
+  in
+  set_lazy_const e lb;
+  lb
+
+and exp_ lvl env e : unit = ignore (exp lvl env e)
+and case_ lvl env c : unit =
+  exp_ lvl (pat env c.it.pat) c.it.exp
+
+and gather_dec lvl scope dec : env =
+  let mk_info const = { loc_known = lvl = TopLvl; const } in
+  let ok = match dec.it with
+  | LetD (p, _) -> Ir_utils.is_irrefutable p
+  | VarD _ | RefD _ -> false
+  in
+  M.fold (fun v _ scope ->
+    if ok
+    then M.add v (mk_info (maybe_false ())) scope
+    else M.add v (mk_info surely_false) scope
+  ) (snd (Freevars.dec dec)) scope (* TODO: implement gather_dec more directly *)
+
+and gather_decs lvl ds : env =
+  List.fold_left (gather_dec lvl) M.empty ds
+
+and check_dec lvl env dec : Lbool.t = match dec.it with
+  | LetD (p, e) when Ir_utils.is_irrefutable p ->
+    let vs = snd (Freevars.dec dec) in (* TODO: implement gather_dec more directly *)
+    let lb = exp lvl env e in
+    M.iter (fun v _ -> required_for lb (M.find v env).const) vs;
+    lb
+  | VarD (_, _, e) | LetD (_, e) ->
+    exp_ lvl env e;
+    surely_false
+  | RefD (_, _, _) ->
+    surely_false
+
+and check_decs lvl env ds : Lbool.t =
+  all (List.map (check_dec lvl env) ds)
+
+and decs lvl env ds : (env * Lbool.t) =
+  let scope = gather_decs lvl ds in
+  let env' = M.adjoin env scope in
+  let could_be = check_decs lvl env' ds in
+  (env', could_be)
+
+and decs_ lvl env ds = ignore (decs lvl env ds)
+
+and block lvl env (ds, body) =
+  let (env', decs_const) = decs lvl env ds in
+  let exp_const = exp lvl env' body in
+  all [decs_const; exp_const]
+
+and comp_unit = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds -> decs_ TopLvl M.empty ds
+  | ActorU (as_opt, ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    let env = match as_opt with
+      | None -> M.empty
+      | Some as_ -> args TopLvl M.empty as_
+    in
+    let (env', _) = decs TopLvl env ds in
+    exp_ TopLvl env' preupgrade;
+    exp_ TopLvl env' postupgrade;
+    exp_ TopLvl env' heartbeat;
+    exp_ TopLvl env' timer;
+    exp_ TopLvl env' inspect
+
+let analyze ((cu, _flavor) : prog) =
+  ignore (comp_unit cu)
+
+
+
+ + + diff --git a/coverage/ir_passes/eq.ml.html b/coverage/ir_passes/eq.ml.html new file mode 100644 index 00000000000..1345da83fc3 --- /dev/null +++ b/coverage/ir_passes/eq.ml.html @@ -0,0 +1,1024 @@ + + + + + eq.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+
+
(* Translates away equality on structured types. *)
+
+open Ir_def
+open Mo_types
+open Mo_values
+open Source
+open Ir
+module T = Type
+open Construct
+open Typ_hash
+
+(* Environment *)
+
+(* We go through the file and collect all structured type arguments to `OpEq`.
+   We store them in `params`, indexed by their `type_id`
+*)
+
+module M = Map.Make(String)
+type env =
+  { params : T.typ M.t ref
+  }
+
+let empty_env () : env = {
+  params = ref M.empty;
+  }
+
+let add_type env t : unit =
+  env.params := M.add (typ_hash t) t !(env.params)
+
+(* Function names *)
+
+(* For a concrete type `t` we want to create a function name for `eq`.
+   This name needs to be disjoint from all user-generated names.
+   Luckily, we are not limited in the characters to use at this point.
+*)
+
+let eq_name_for t =
+  "@eq<" ^ typ_hash t ^ ">"
+
+let eq_fun_typ_for t =
+  T.Func (T.Local, T.Returns, [], [t; t], [T.bool])
+
+let eq_var_for t : Construct.var =
+  var (eq_name_for t) (eq_fun_typ_for t)
+
+
+(* Smart equality constructor. *)
+
+(* This handles singletons directly, leaves primitives as Prims,
+   and calls the right eq_var_for otherwise
+*)
+
+let eq_func_body : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t e1 e2 ->
+  (* This is used when constructing equality functions, so e1 e2
+     are pure (variables, projections) and can be dropped *)
+  if T.singleton t
+  then blockE [expD (ignoreE e1); expD (ignoreE e2)] (trueE ())
+  else if Check_ir.has_prim_eq t
+  then primE (RelPrim (t, Operator.EqOp)) [e1; e2]
+  else varE (eq_var_for t) -*- (tupE [e1; e2])
+
+(* Construction helpers *)
+
+let arg1Var t = var "x1" t
+let arg2Var t = var "x2" t
+let arg1E t = varE (arg1Var t)
+let arg2E t = varE (arg2Var t)
+
+let define_eq : T.typ -> Ir.exp -> Ir.dec = fun t e ->
+  Construct.nary_funcD (eq_var_for t) [arg1Var t; arg2Var t] e
+
+let array_eq_func_body : T.typ -> Ir.exp -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e1 e2 ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [eq_fun_typ_for (T.Var ("T",0)); T.Array (T.Var ("T",0)); T.Array (T.Var ("T",0))], [T.bool]) in
+  callE (varE (var "@equal_array" fun_typ)) [t] (tupE [f; e1; e2])
+
+(* Synthesizing a single show function *)
+
+(* Returns the new declarations, as well as a list of further types it needs *)
+
+let eq_for : T.typ -> Ir.dec * T.typ list = fun t ->
+  match t with
+  (* Function wrappers around primitive types *)
+  (* These are needed when one of these types appears in an array, as we
+     need a function to pass to @equal_array *)
+  | t when T.singleton t || Check_ir.has_prim_eq t ->
+    define_eq t (eq_func_body t (arg1E t) (arg2E t)),
+    []
+  (* Error cases *)
+  | T.Con (c,_) ->
+    (* t is normalized, so this is a type parameter *)
+    raise (Invalid_argument ("eq_for: cannot handle type parameter " ^ T.string_of_typ t))
+  (* Structured types *)
+  | T.Tup ts' ->
+    let ts' = List.map T.normalize ts' in
+    define_eq t (
+      conjE (List.mapi (fun i t' ->
+        eq_func_body t' (projE (arg1E t) i) (projE (arg2E t) i)
+      ) ts')
+    ),
+    ts'
+  | T.Opt t' ->
+    let t' = T.normalize t' in
+    let y1 = var "y1" t' in
+    let y2 = var "y2" t' in
+    define_eq t (switch_optE (arg1E t)
+      (* x1 is null *)
+      ( switch_optE (arg2E t)
+        (* x2 is null *)
+        (trueE ())
+        (* x2 is ?_ *)
+        wildP (falseE ())
+        (* ret type *)
+        T.bool
+      ) (* x1 is ?y1 *)
+      ( varP y1 )
+      ( switch_optE (arg2E t)
+        (* x2 is null *)
+        (falseE ())
+        (* x2 is ?_ *)
+        ( varP y2 )
+        ( eq_func_body t' (varE y1) (varE y2) )
+        (* ret type *)
+        T.bool
+      )
+      (* ret type *)
+      T.bool
+    ),
+    [t']
+  | T.Array t' ->
+    begin match T.normalize t' with
+    | T.Mut _ -> assert false (* mutable arrays not equatable *)
+    | t' ->
+      define_eq t (array_eq_func_body t' (varE (eq_var_for t')) (arg1E t) (arg2E t)),
+      [t']
+    end
+  | T.Obj ((T.Object | T.Memory | T.Module), fs) ->
+    define_eq t (
+      conjE (List.map (fun f ->
+        let t' = T.as_immut (T.normalize f.Type.typ) in
+        eq_func_body t' (dotE (arg1E t) f.Type.lab t') (dotE (arg2E t) f.Type.lab t')
+      ) fs)
+    ),
+    List.map (fun f -> T.as_immut (T.normalize (f.Type.typ))) fs
+  | T.Variant fs ->
+    define_eq t (
+      (* switching on the diagonal *)
+      { it = SwitchE
+        ( tupE [arg1E t; arg2E t],
+          List.map (fun f ->
+            let t' = T.normalize f.Type.typ in
+            let y1 = var "y1" t' in
+            let y2 = var "y2" t' in
+            { it = {
+                pat = { it = TupP
+                  [ { it = TagP (f.Type.lab, varP y1); at = no_region; note = t }
+                  ; { it = TagP (f.Type.lab, varP y2); at = no_region; note = t }
+                  ]; at = no_region; note = T.Tup [t;t] };
+                exp = eq_func_body t' (varE y1) (varE y2);
+              }; at = no_region; note = ()
+            }) fs @
+            [ { it = { pat = wildP; exp = falseE () };
+                at = no_region; note = () } ]
+        );
+      at = no_region;
+      note = Note.{ def with typ = T.bool }
+      }
+    ),
+    List.map (fun (f : T.field) -> T.normalize f.T.typ) fs
+  | T.Non ->
+    define_eq t (unreachableE ()),
+    []
+  | t ->
+    raise (Invalid_argument ("Ir_passes.Eq.eq_on: Unexpected type " ^ T.string_of_typ t))
+
+(* Synthesizing the types recursively. Hopefully well-founded. *)
+
+let eq_decls : T.typ M.t -> Ir.dec list = fun roots ->
+  let seen = ref M.empty in
+
+  let rec go = function
+    | [] -> []
+    | t::todo when M.mem (typ_hash t) !seen ->
+      go todo
+    | t::todo ->
+      seen := M.add (typ_hash t) () !seen;
+      let (decl, deps) = eq_for t in
+      decl :: go (deps @ todo)
+  in go (List.map snd (M.bindings roots))
+
+(* The AST traversal *)
+
+(* Does two things:
+ - collects all structured uses of `OpEq` in the `env`
+ - for each actor, resets the environment, recurses,
+   and adds the equality functions (this keeps closed actors closed)
+*)
+
+let rec t_exps env = List.map (t_exp env)
+
+and t_exp env (e : Ir.exp) =
+  { e with it = t_exp' env e.it }
+
+and t_exp' env = function
+  | LitE l -> LitE l
+  | VarE id -> VarE id
+  | PrimE (RelPrim (ot, Operator.EqOp), [exp1; exp2]) when T.singleton ot ->
+    (* Handle singletons here, but beware of side-effects *)
+    let e1 = t_exp env exp1 in
+    let e2 = t_exp env exp2 in
+    (blockE [expD (ignoreE e1); expD (ignoreE e2)] (trueE ())).it
+  | PrimE (RelPrim (ot, Operator.EqOp), [exp1; exp2]) when not (Check_ir.has_prim_eq ot) ->
+    let t' = T.normalize ot in
+    add_type env t';
+    (varE (eq_var_for t') -*- (tupE [t_exp env exp1; t_exp env exp2])).it
+  | PrimE (p, es) -> PrimE (p, t_exps env es)
+  | AssignE (lexp1, exp2) ->
+    AssignE (t_lexp env lexp1, t_exp env exp2)
+  | FuncE (s, c, id, typbinds, pat, typT, exp) ->
+    FuncE (s, c, id, typbinds, pat, typT, t_exp env exp)
+  | BlockE block -> BlockE (t_block env block)
+  | IfE (exp1, exp2, exp3) ->
+    IfE (t_exp env exp1, t_exp env exp2, t_exp env exp3)
+  | SwitchE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    SwitchE (t_exp env exp1, cases')
+  | TryE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    TryE (t_exp env exp1, cases')
+  | LoopE exp1 ->
+    LoopE (t_exp env exp1)
+  | LabelE (id, typ, exp1) ->
+    LabelE (id, typ, t_exp env exp1)
+  | AsyncE (s, tb, e, typ) -> AsyncE (s, tb, t_exp env e, typ)
+  | DeclareE (id, typ, exp1) ->
+    DeclareE (id, typ, t_exp env exp1)
+  | DefineE (id, mut ,exp1) ->
+    DefineE (id, mut, t_exp env exp1)
+  | NewObjE (sort, ids, t) ->
+    NewObjE (sort, ids, t)
+  | SelfCallE (ts, e1, e2, e3) ->
+    SelfCallE (ts, t_exp env e1, t_exp env e2, t_exp env e3)
+  | ActorE (ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    (* Until Actor expressions become their own units,
+       we repeat what we do in `comp_unit` below *)
+    let env1 = empty_env () in
+    let ds' = t_decs env1 ds in
+    let preupgrade' = t_exp env1 preupgrade in
+    let postupgrade' = t_exp env1 postupgrade in
+    let heartbeat' = t_exp env1 heartbeat in
+    let timer' = t_exp env1 timer in
+    let inspect' = t_exp env1 inspect in
+    let decls = eq_decls !(env1.params) in
+    ActorE (decls @ ds', fields,
+      {meta;
+       preupgrade = preupgrade';
+       postupgrade = postupgrade';
+       heartbeat = heartbeat';
+       timer = timer';
+       inspect = inspect'
+      }, typ)
+
+and t_lexp env (e : Ir.lexp) = { e with it = t_lexp' env e.it }
+and t_lexp' env = function
+  | VarLE id -> VarLE id
+  | IdxLE (exp1, exp2) ->
+    IdxLE (t_exp env exp1, t_exp env exp2)
+  | DotLE (exp1, n) ->
+    DotLE (t_exp env exp1, n)
+
+and t_dec env dec = { dec with it = t_dec' env dec.it }
+
+and t_dec' env dec' =
+  match dec' with
+  | LetD (pat,exp) -> LetD (pat,t_exp env exp)
+  | VarD (id, typ, exp) -> VarD (id, typ, t_exp env exp)
+  | RefD (id, typ, lexp) -> RefD (id, typ, t_lexp env lexp)
+
+and t_decs env decs = List.map (t_dec env) decs
+
+and t_block env (ds, exp) = (t_decs env ds, t_exp env exp)
+
+and t_comp_unit = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let decls = eq_decls !(env.params) in
+    ProgU (decls @ ds')
+  | ActorU (as_opt, ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let preupgrade' = t_exp env preupgrade in
+    let postupgrade' = t_exp env postupgrade in
+    let heartbeat' = t_exp env heartbeat in
+    let timer' = t_exp env timer in
+    let inspect' = t_exp env inspect in
+    let decls = eq_decls !(env.params) in
+    ActorU (as_opt, decls @ ds', fields,
+      {meta;
+       preupgrade = preupgrade';
+       postupgrade = postupgrade';
+       heartbeat = heartbeat';
+       timer = timer';
+       inspect = inspect'
+      }, typ)
+
+(* Entry point for the program transformation *)
+
+let transform (cu, flavor) =
+  assert (not flavor.has_typ_field); (* required for hash_typ *)
+  (t_comp_unit cu, {flavor with has_poly_eq = false})
+
+
+
+ + + diff --git a/coverage/ir_passes/erase_typ_field.ml.html b/coverage/ir_passes/erase_typ_field.ml.html new file mode 100644 index 00000000000..b9faf04e094 --- /dev/null +++ b/coverage/ir_passes/erase_typ_field.ml.html @@ -0,0 +1,712 @@ + + + + + erase_typ_field.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+
+
open Mo_types
+open Ir_def
+
+module E = Env
+open Source
+module Ir = Ir
+open Ir
+module T = Type
+open T
+
+(* Erase type fields from object types *)
+
+module ConRenaming = E.Make(struct type t = T.con let compare = Cons.compare end)
+
+let transform prog =
+
+  (* the state *)
+  let con_renaming = ref ConRenaming.empty
+
+  (* maps constructors to new constructors (name name, new stamp, new kind)
+     it is initialized with the type constructors defined outside here, which are
+     not rewritten.
+
+     If we run this translation on two program fragments (e.g. prelude and program)
+     we would have to pass down the `con_renaming`. But this is simply the right thing
+     to do for a pass that changes the context.
+
+     Eventually, pipeline will allow us to pass the con_renaming to downstream program
+     fragments, then we would simply start with an empty con_renaming and the prelude.
+
+     (c.f. async.ml.)
+  *)
+  in
+
+  (* Mostly boiler-plate homomorphic translation *)
+  let rec t_typ t =
+    match t with
+    (* The only interesting case *)
+    | Obj (s, fs) ->
+      Obj (s,
+        List.filter_map (fun f ->
+          if is_typ f.typ then None else Some (t_field f))
+        fs)
+    | T.Prim _
+    | Var _ -> t
+    | Con (c, ts) ->
+      Con (t_con c, List.map t_typ ts)
+    | Array t -> Array (t_typ t)
+    | Tup ts -> Tup (List.map t_typ ts)
+    | Func (s, c, tbs, ts1, ts2) ->
+      Func (s, c, List.map t_bind tbs, List.map t_typ ts1, List.map t_typ ts2)
+    | Opt t -> Opt (t_typ t)
+    | Variant fs -> Variant (List.map t_field fs)
+    | Async (s, t1, t2) -> Async (s, t_typ t1, t_typ t2)
+    | Mut t -> Mut (t_typ t)
+    | Any -> Any
+    | Non -> Non
+    | Pre -> Pre
+    | Typ c -> assert false (* second class *)
+
+  and t_bind tb =
+    { tb with bound = t_typ tb.bound }
+
+  and t_binds typbinds = List.map t_bind typbinds
+
+  and t_kind k =
+    match k with
+    | T.Abs (typ_binds,typ) ->
+      T.Abs (t_binds typ_binds, t_typ typ)
+    | T.Def (typ_binds,typ) ->
+      T.Def (t_binds typ_binds, t_typ typ)
+
+  and t_con c =
+    match Cons.kind c with
+    | T.Def ([], T.Prim _) -> c
+    | _ ->
+      match  ConRenaming.find_opt c (!con_renaming) with
+      | Some c' -> c'
+      | None ->
+        let clone = Cons.clone c (Abs ([], Pre)) in
+        con_renaming := ConRenaming.add c clone (!con_renaming);
+        (* Need to extend con_renaming before traversing the kind *)
+        Type.set_kind clone (t_kind (Cons.kind c));
+        clone
+
+  and t_prim p = Ir.map_prim t_typ (fun id -> id) p
+
+  and t_field {lab; typ; src} =
+    { lab; typ = t_typ typ; src }
+  in
+
+  let rec t_exp (exp : exp) =
+    { it = t_exp' exp;
+      note = Note.{ def with
+        typ = t_typ exp.note.typ;
+        eff = exp.note.eff
+      };
+      at = exp.at;
+    }
+  and t_exp' (exp : exp) =
+    let exp' = exp.it in
+    match exp' with
+    | LitE _ -> exp'
+    | VarE id -> exp'
+    | AssignE (exp1, exp2) ->
+      AssignE (t_lexp exp1, t_exp exp2)
+    | PrimE (p, exps) ->
+      PrimE (t_prim p, List.map t_exp exps)
+    | BlockE b ->
+      BlockE (t_block b)
+    | IfE (exp1, exp2, exp3) ->
+      IfE (t_exp exp1, t_exp exp2, t_exp exp3)
+    | SwitchE (exp1, cases) ->
+      SwitchE (t_exp exp1, List.map t_case cases)
+    | LoopE exp1 ->
+      LoopE (t_exp exp1)
+    | LabelE (id, typ, exp1) ->
+      LabelE (id, t_typ typ, t_exp exp1)
+    | AsyncE (s, tb, exp1, typ) ->
+      AsyncE (s, t_typ_bind tb, t_exp exp1, t_typ typ)
+    | TryE (exp1, cases) ->
+      TryE (t_exp exp1, List.map t_case cases)
+    | DeclareE (id, typ, exp1) ->
+      DeclareE (id, t_typ typ, t_exp exp1)
+    | DefineE (id, mut ,exp1) ->
+      DefineE (id, mut, t_exp exp1)
+    | FuncE (x, s, c, typbinds, args, ret_tys, exp) ->
+      FuncE (x, s, c, t_typ_binds typbinds, t_args args, List.map t_typ ret_tys, t_exp exp)
+    | ActorE (ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+      ActorE (t_decs ds, t_fields fs,
+       {meta;
+        preupgrade = t_exp preupgrade;
+        postupgrade = t_exp postupgrade;
+        heartbeat = t_exp heartbeat;
+        timer = t_exp timer;
+        inspect = t_exp inspect;
+       }, t_typ typ)
+    | NewObjE (sort, ids, t) ->
+      NewObjE (sort, t_fields ids, t_typ t)
+    | SelfCallE _ -> assert false
+
+  and t_case {it = {pat; exp}; at; note} =
+    { it = {pat = t_pat pat; exp = t_exp exp}; at; note}
+
+  and t_lexp lexp =
+    { it = t_lexp' lexp.it;
+      note = t_typ lexp.note;
+      at = lexp.at;
+    }
+  and t_lexp' (lexp' : lexp') =
+    match lexp' with
+    | VarLE _ -> lexp'
+    | DotLE (exp1, id) ->
+      DotLE (t_exp exp1, id)
+    | IdxLE (exp1, exp2) ->
+      IdxLE (t_exp exp1, t_exp exp2)
+
+  and t_dec dec = { dec with it = t_dec' dec.it }
+
+  and t_dec' dec' =
+    match dec' with
+    | LetD (pat,exp) -> LetD (t_pat pat,t_exp exp)
+    | VarD (id, t, exp) -> VarD (id, t_typ t, t_exp exp)
+    | RefD (id, t, lexp) -> RefD (id, t_typ t, t_lexp lexp)
+
+  and t_decs decs = List.map t_dec decs
+
+  and t_block (ds, exp) = (t_decs ds, t_exp exp)
+
+  and t_fields fs =
+    List.map (fun f -> { f with note = t_typ f.note }) fs
+
+  and t_args as_ = List.map t_arg as_
+
+  and t_arg a = { a with note = t_typ a.note }
+
+  and t_pat pat =
+    { pat with
+      it = t_pat' pat.it;
+      note = t_typ pat.note }
+
+  and t_pat' pat =
+    match pat with
+    | WildP
+    | LitP _
+    | VarP _ ->
+      pat
+    | TupP pats ->
+      TupP (List.map t_pat pats)
+    | ObjP pfs ->
+      ObjP (map_obj_pat t_pat pfs)
+    | OptP pat1 ->
+      OptP (t_pat pat1)
+    | TagP (i, pat1) ->
+      TagP (i, t_pat pat1)
+    | AltP (pat1, pat2) ->
+      AltP (t_pat pat1, t_pat pat2)
+
+  and t_typ_bind' tb =
+    { tb with con = t_con tb.con; bound = t_typ tb.bound }
+
+  and t_typ_bind typ_bind =
+    { typ_bind with it = t_typ_bind' typ_bind.it }
+
+  and t_typ_binds typbinds = List.map t_typ_bind typbinds
+
+  and t_comp_unit = function
+    | LibU _ -> raise (Invalid_argument "cannot compile library")
+    | ProgU ds -> ProgU (t_decs ds)
+    | ActorU (args_opt, ds, fs, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, t) ->
+      ActorU (Option.map t_args args_opt, t_decs ds, t_fields fs,
+        { meta;
+          preupgrade = t_exp preupgrade;
+          postupgrade = t_exp postupgrade;
+          heartbeat = t_exp heartbeat;
+          timer = t_exp timer;
+          inspect = t_exp inspect;
+        }, t_typ t)
+  and t_prog (cu, flavor) = (t_comp_unit cu, { flavor with has_typ_field = false } )
+in
+  t_prog prog
+
+
+
+ + + diff --git a/coverage/ir_passes/show.ml.html b/coverage/ir_passes/show.ml.html new file mode 100644 index 00000000000..ec4f0b4cbb7 --- /dev/null +++ b/coverage/ir_passes/show.ml.html @@ -0,0 +1,1147 @@ + + + + + show.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+
+
open Ir_def
+open Mo_types
+open Mo_values
+(* Translates away calls to `show`. *)
+open Source
+open Ir
+module T = Type
+open Construct
+open Typ_hash
+
+(* Environment *)
+
+(* We go through the file and collect all type arguments to `show`.
+   We store them in `params`, indexed by their `type_id`
+*)
+
+module M = Map.Make(String)
+type env =
+  { params : T.typ M.t ref
+  }
+
+let empty_env () : env = {
+  params = ref M.empty;
+  }
+
+let add_type env t : unit =
+  env.params := M.add (typ_hash t) t !(env.params)
+
+(* Function names *)
+
+(* For a concrete type `t` we want to create a function name for `show`.
+   This name needs to be disjoint from all user-generated names.
+   Luckily, we are not limited in the characters to use at this point.
+*)
+
+let show_name_for t =
+  "@show<" ^ typ_hash t ^ ">"
+
+let show_fun_typ_for t =
+  T.Func (T.Local, T.Returns, [], [t], [T.text])
+
+let show_var_for t : Construct.var =
+  var (show_name_for t) (show_fun_typ_for t)
+
+
+(* Construction helpers *)
+
+(* Many of these are simply the entry points for helper functions defined in
+   the prelude. *)
+
+let argVar t = var "x" t
+let argE t = varE (argVar t)
+
+let define_show : T.typ -> Ir.exp -> Ir.dec = fun t e ->
+  Construct.funcD (show_var_for t) (argVar t) e
+
+let invoke_generated_show : T.typ -> Ir.exp -> Ir.exp = fun t e ->
+  varE (show_var_for t) -*- e
+
+let invoke_prelude_show : string -> T.typ -> Ir.exp -> Ir.exp = fun n t e ->
+  let fun_typ = T.Func (T.Local, T.Returns, [], [t], [T.text]) in
+  varE (var n fun_typ) -*- argE t
+
+let invoke_text_of_option : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [show_fun_typ_for (T.Var ("T",0)); T.Opt (T.Var ("T",0))], [T.text]) in
+  callE (varE (var "@text_of_option" fun_typ)) [t] (tupE [f; e])
+
+let invoke_text_of_variant : T.typ -> Ir.exp -> T.lab -> Ir.exp -> Ir.exp = fun t f l e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [T.text; show_fun_typ_for (T.Var ("T",0)); T.Var ("T",0)], [T.text]) in
+  callE (varE (var "@text_of_variant" fun_typ)) [t] (tupE [textE l; f; e])
+
+let invoke_text_of_array : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [show_fun_typ_for (T.Var ("T",0)); T.Array (T.Var ("T",0))], [T.text]) in
+  callE (varE (var "@text_of_array" fun_typ)) [t] (tupE [f; e])
+
+let invoke_text_of_array_mut : T.typ -> Ir.exp -> Ir.exp -> Ir.exp = fun t f e ->
+  let fun_typ =
+    T.Func (T.Local, T.Returns, [{T.var="T";T.sort=T.Type;T.bound=T.Any}], [show_fun_typ_for (T.Var ("T",0)); T.Array (T.Mut (T.Var ("T",0)))], [T.text]) in
+  callE (varE (var "@text_of_array_mut" fun_typ)) [t] (tupE [f; e])
+
+let list_build : 'a -> (unit -> 'a) -> 'a -> 'a list -> 'a list = fun pre sep post xs ->
+  let rec go = function
+    | [] -> [ post ]
+    | [x] -> [ x; post ]
+    | x::xs -> [ x; sep () ] @ go xs
+  in [ pre ] @ go xs
+
+let catE : Ir.exp -> Ir.exp -> Ir.exp = fun e1 e2 ->
+  { it = PrimE (BinPrim (T.text, Operator.CatOp), [e1; e2])
+  ; at = no_region
+  ; note = { Note.def with Note.typ = T.text }
+  }
+
+let cat_list : Ir.exp list -> Ir.exp = fun es ->
+  List.fold_right catE es (textE "")
+
+(* Synthesizing a single show function *)
+
+(* Returns the new declarations, as well as a list of further types it needs *)
+
+
+let show_for : T.typ -> Ir.dec * T.typ list = fun t ->
+  match t with
+  | T.(Prim Bool) ->
+    define_show t (invoke_prelude_show "@text_of_Bool" t (argE t)),
+    []
+  | T.(Prim Nat) ->
+    define_show t (invoke_prelude_show "@text_of_Nat" t (argE t)),
+    []
+  | T.(Prim Int) ->
+    define_show t (invoke_prelude_show "@text_of_Int" t (argE t)),
+    []
+  | T.(Prim Nat8) ->
+    define_show t (invoke_prelude_show "@text_of_Nat8" t (argE t)),
+    []
+  | T.(Prim Nat16) ->
+    define_show t (invoke_prelude_show "@text_of_Nat16" t (argE t)),
+    []
+  | T.(Prim Nat32) ->
+    define_show t (invoke_prelude_show "@text_of_Nat32" t (argE t)),
+    []
+  | T.(Prim Nat64) ->
+    define_show t (invoke_prelude_show "@text_of_Nat64" t (argE t)),
+    []
+  | T.(Prim Int8) ->
+    define_show t (invoke_prelude_show "@text_of_Int8" t (argE t)),
+    []
+  | T.(Prim Int16) ->
+    define_show t (invoke_prelude_show "@text_of_Int16" t (argE t)),
+    []
+  | T.(Prim Int32) ->
+    define_show t (invoke_prelude_show "@text_of_Int32" t (argE t)),
+    []
+  | T.(Prim Int64) ->
+    define_show t (invoke_prelude_show "@text_of_Int64" t (argE t)),
+    []
+  | T.(Prim Float) ->
+    define_show t (invoke_prelude_show "@text_of_Float" t (argE t)),
+    []
+  | T.(Prim Text) ->
+    define_show t (invoke_prelude_show "@text_of_Text" t (argE t)),
+    []
+  | T.(Prim Char) ->
+    define_show t (invoke_prelude_show "@text_of_Char" t (argE t)),
+    []
+  | T.(Prim Blob) ->
+    define_show t (invoke_prelude_show "@text_of_Blob" t (argE t)),
+    []
+  | T.(Prim Principal) ->
+    define_show t (primE IcUrlOfBlob [primE T.(CastPrim (Prim Principal, Prim Blob)) [argE t]]),
+    []
+  | T.(Prim Null) ->
+    define_show t (textE "null"),
+    []
+  | T.Func _ ->
+    define_show t (textE "func"),
+    []
+  | T.Con (c,_) ->
+    (* t is normalized, so this is a type parameter *)
+    define_show t (textE ("show_for: cannot handle type parameter " ^ T.string_of_typ t)),
+    []
+  | T.Tup [] ->
+    define_show t (textE "()"),
+    []
+  | T.Tup ts' ->
+    let ts' = List.map T.normalize ts' in
+    define_show t (
+      cat_list (list_build
+        (textE "(") (fun () -> textE ", ") (textE ")")
+        (List.mapi (fun i t' -> invoke_generated_show t' (projE (argE t) i)) ts')
+      )
+    ),
+    ts'
+  | T.Opt t' ->
+    let t' = T.normalize t' in
+    define_show t (invoke_text_of_option t' (varE (show_var_for t')) (argE t)),
+    [t']
+  | T.Array t' ->
+    let t' = T.normalize t' in
+    begin match t' with
+    | T.Mut t' ->
+      define_show t (invoke_text_of_array_mut t' (varE (show_var_for t')) (argE t)),
+      [t']
+    | _ ->
+      define_show t (invoke_text_of_array t' (varE (show_var_for t')) (argE t)),
+      [t']
+    end
+  | T.Obj (T.Object, fs) ->
+    define_show t (
+      cat_list (list_build
+        (textE "{") (fun () -> textE "; ") (textE "}")
+        (List.map (fun f ->
+          let t' = T.as_immut (T.normalize f.Type.typ) in
+          catE
+            (textE (f.Type.lab ^ " = "))
+            (invoke_generated_show t' (dotE (argE t) f.Type.lab t'))
+          ) fs
+        )
+      )
+    ),
+    List.map (fun f -> T.as_immut (T.normalize (f.Type.typ))) fs
+  | T.Variant fs ->
+    define_show t (
+      switch_variantE
+        (argE t)
+        (List.map (fun {T.lab = l; typ = t'; _} ->
+          let t' = T.normalize t' in
+          l,
+          (varP (argVar t')), (* Shadowing, but that's fine *)
+          (invoke_text_of_variant t' (varE (show_var_for t')) l (argE t'))
+        ) fs)
+        (T.text)
+    ),
+    List.map (fun (f : T.field) -> T.normalize f.T.typ) fs
+  | T.Non ->
+    define_show t (unreachableE ()),
+    []
+  | _ -> assert false (* Should be prevented by can_show *)
+
+(* Synthesizing the types recursively. Hopefully well-founded. *)
+
+let show_decls : T.typ M.t -> Ir.dec list = fun roots ->
+  let seen = ref M.empty in
+
+  let rec go = function
+    | [] -> []
+    | t::todo when M.mem (typ_hash t) !seen ->
+      go todo
+    | t::todo ->
+      seen := M.add (typ_hash t) () !seen;
+      let (decl, deps) = show_for t in
+      decl :: go (deps @ todo)
+  in go (List.map snd (M.bindings roots))
+
+(* The AST traversal *)
+
+(* Does two things:
+ - collects all uses of `debug_show` in the `env`
+ - for each actor, resets the environment, recurses,
+   and adds the show functions (this keeps closed actors closed)
+*)
+
+let rec t_exps env decs = List.map (t_exp env) decs
+
+and t_exp env (e : Ir.exp) =
+  { e with it = t_exp' env e.it }
+
+and t_exp' env = function
+  | LitE l -> LitE l
+  | VarE id -> VarE id
+  | PrimE (ShowPrim ot, [exp1]) ->
+    let t' = T.normalize ot in
+    add_type env t';
+    (varE (show_var_for t') -*- t_exp env exp1).it
+  | PrimE (p, es) -> PrimE (p, t_exps env es)
+  | AssignE (lexp1, exp2) ->
+    AssignE (t_lexp env lexp1, t_exp env exp2)
+  | FuncE (s, c, id, typbinds, pat, typT, exp) ->
+    FuncE (s, c, id, typbinds, pat, typT, t_exp env exp)
+  | BlockE block -> BlockE (t_block env block)
+  | IfE (exp1, exp2, exp3) ->
+    IfE (t_exp env exp1, t_exp env exp2, t_exp env exp3)
+  | SwitchE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    SwitchE (t_exp env exp1, cases')
+  | TryE (exp1, cases) ->
+    let cases' =
+      List.map
+        (fun {it = {pat;exp}; at; note} ->
+          {it = {pat = pat; exp = t_exp env exp}; at; note})
+        cases
+    in
+    TryE (t_exp env exp1, cases')
+  | LoopE exp1 ->
+    LoopE (t_exp env exp1)
+  | LabelE (id, typ, exp1) ->
+    LabelE (id, typ, t_exp env exp1)
+  | AsyncE (s, tb, e, typ) -> AsyncE (s, tb, t_exp env e, typ)
+  | DeclareE (id, typ, exp1) ->
+    DeclareE (id, typ, t_exp env exp1)
+  | DefineE (id, mut ,exp1) ->
+    DefineE (id, mut, t_exp env exp1)
+  | NewObjE (sort, ids, t) ->
+    NewObjE (sort, ids, t)
+  | SelfCallE (ts, e1, e2, e3) ->
+    SelfCallE (ts, t_exp env e1, t_exp env e2, t_exp env e3)
+  | ActorE (ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    (* Until Actor expressions become their own units,
+       we repeat what we do in `comp_unit` below *)
+    let env1 = empty_env () in
+    let ds' = t_decs env1 ds in
+    let preupgrade' = t_exp env1 preupgrade in
+    let postupgrade' = t_exp env1 postupgrade in
+    let heartbeat' = t_exp env1 heartbeat in
+    let timer' = t_exp env1 timer in
+    let inspect' = t_exp env1 inspect in
+    let decls = show_decls !(env1.params) in
+    ActorE (decls @ ds', fields,
+      { meta;
+        preupgrade = preupgrade';
+        postupgrade = postupgrade';
+        heartbeat = heartbeat';
+        timer = timer';
+        inspect = inspect'
+      }, typ)
+
+and t_lexp env (e : Ir.lexp) = { e with it = t_lexp' env e.it }
+and t_lexp' env = function
+  | VarLE id -> VarLE id
+  | IdxLE (exp1, exp2) ->
+    IdxLE (t_exp env exp1, t_exp env exp2)
+  | DotLE (exp1, n) ->
+    DotLE (t_exp env exp1, n)
+
+and t_dec env dec = { dec with it = t_dec' env dec.it }
+
+and t_dec' env dec' =
+  match dec' with
+  | LetD (pat,exp) -> LetD (pat,t_exp env exp)
+  | VarD (id, typ, exp) -> VarD (id, typ, t_exp env exp)
+  | RefD (id, typ, lexp) -> RefD (id, typ, t_lexp env lexp)
+
+and t_decs env decs = List.map (t_dec env) decs
+
+and t_block env (ds, exp) = (t_decs env ds, t_exp env exp)
+
+and t_comp_unit = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let decls = show_decls !(env.params) in
+    ProgU (decls @ ds')
+  | ActorU (as_opt, ds, fields, {meta; preupgrade; postupgrade; heartbeat; timer; inspect}, typ) ->
+    let env = empty_env () in
+    let ds' = t_decs env ds in
+    let preupgrade' = t_exp env preupgrade in
+    let postupgrade' = t_exp env postupgrade in
+    let heartbeat' = t_exp env heartbeat in
+    let timer' = t_exp env timer in
+    let inspect' = t_exp env inspect in
+    let decls = show_decls !(env.params) in
+    ActorU (as_opt, decls @ ds', fields,
+      { meta;
+        preupgrade = preupgrade';
+        postupgrade = postupgrade';
+        heartbeat = heartbeat';
+        timer = timer';
+        inspect = inspect';
+      }, typ)
+
+(* Entry point for the program transformation *)
+
+let transform (cu, flavor) =
+  assert (not flavor.has_typ_field); (* required for hash_typ *)
+  (t_comp_unit cu, {flavor with has_show = false})
+
+
+
+ + + diff --git a/coverage/ir_passes/tailcall.ml.html b/coverage/ir_passes/tailcall.ml.html new file mode 100644 index 00000000000..95c7f36ece8 --- /dev/null +++ b/coverage/ir_passes/tailcall.ml.html @@ -0,0 +1,851 @@ + + + + + tailcall.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+
+
open Ir_def
+open Mo_types
+
+open Source
+open Ir
+open Ir_effect
+open Type
+open Construct
+
+(* Optimize (self) tail calls to jumps, avoiding stack overflow
+   in a single linear pass *)
+
+(*
+This is simple tail call optimizer that replaces tail calls to the current function by jumps.
+It can  easily be extended to non-self tail calls, once supported by wasm.
+
+For each function `f` whose `body[...]` has at least one self tailcall to `f<Ts>(es)`, apply the transformation:
+```
+    func f<Ts>(pat) = body[f<Ts>(es)+]
+    ~~>
+    func f<Ts>(args) = {
+       var temp = args;
+       loop {
+         label l {
+           let pat = temp;
+           return body[{temp := es;break l;}+]
+        }
+      }
+    }
+```
+
+
+It's implemented by a recursive traversal that maintains an environment recording whether the current term is in tail position,
+and what its enclosing function (if any) is.
+
+The enclosing function is forgotten when shadowed by a local binding (we don't assume all variables are distinct) and when
+entering a function, class or actor constructor.
+
+On little gotcha for functional programmers: the argument `e` to an early `return e` is *always* in tail position,
+regardless of `return e`s own tail position.
+
+TODO: optimize for multiple arguments using multiple temps (not a tuple).
+
+*)
+
+type func_info = { func: id;
+                   typ_binds: typ_bind list;
+                   temps: var list;
+                   label: id;
+                   tail_called: bool ref;
+                 }
+
+type env = { tail_pos:bool;          (* is the expression in tail position *)
+             info: func_info option; (* the innermost enclosing func, if any *)
+           }
+
+
+let bind env i (info:func_info option) : env =
+  match info with
+  | Some _ ->
+    { env with info = info; }
+  | None ->
+    match env.info with
+    | Some { func; _} when i = func ->
+      { env with info = None } (* remove shadowed func info *)
+    | _ -> env (* preserve existing, non-shadowed info *)
+
+let bind_arg env a info = bind env a.it info
+
+
+let are_generic_insts (tbs : typ_bind list) insts =
+  List.for_all2 (fun (tb : typ_bind) inst ->
+      match inst with
+      | Con(c2,[]) -> Cons.eq tb.it.con c2 (* conservative, but safe *)
+      |  _ -> false
+      ) tbs insts
+
+let rec tailexp env e =
+  {e with it = exp' env e}
+
+and exp env e  : exp =
+  {e with it = exp' {env with tail_pos = false}  e}
+
+and assignEs vars exp : dec list =
+  match vars, exp.it with
+  | [v], _ -> [ expD (assignE v exp) ]
+  | _, PrimE (TupPrim, es) when List.length es = List.length vars ->
+       List.map expD (List.map2 assignE vars es)
+  | _, _ ->
+    let tup = fresh_var "tup" (typ exp) in
+    letD tup exp ::
+    List.mapi (fun i v -> expD (assignE v (projE (varE v) i))) vars
+
+and exp' env e  : exp' = match e.it with
+  | VarE _ | LitE _     -> e.it
+  | AssignE (e1, e2)    -> AssignE (lexp env e1, exp env e2)
+  | PrimE (CallPrim insts, [e1; e2])  ->
+    begin match e1.it, env with
+    | VarE f1, { tail_pos = true;
+                 info = Some { func; typ_binds; temps; label; tail_called } }
+         when f1 = func && are_generic_insts typ_binds insts  ->
+      tail_called := true;
+      (blockE (assignEs temps (exp env e2)) (breakE label (unitE ()))).it
+    | _,_-> PrimE (CallPrim insts, [exp env e1; exp env e2])
+    end
+  | BlockE (ds, e)      -> BlockE (block env ds e)
+  | IfE (e1, e2, e3)    -> IfE (exp env e1, tailexp env e2, tailexp env e3)
+  | SwitchE (e, cs)     -> SwitchE (exp env e, cases env cs)
+  | TryE (e, cs)        -> TryE (exp env e, cases env cs) (* TBR *)
+  | LoopE e1            -> LoopE (exp env e1)
+  | LabelE (i, t, e)    -> let env1 = bind env i None in
+                           LabelE(i, t, exp env1 e)
+  | PrimE (RetPrim, [e])-> PrimE (RetPrim, [tailexp { env with tail_pos = true } e])
+  | AsyncE (s, tb, e, typ) -> AsyncE (s, tb, exp { tail_pos = true; info = None } e, typ)
+  | DeclareE (i, t, e)  -> let env1 = bind env i None in
+                           DeclareE (i, t, tailexp env1 e)
+  | DefineE (i, m, e)   -> DefineE (i, m, exp env e)
+  | FuncE (x, s, c, tbs, as_, ret_tys, exp0) ->
+    let env1 = { tail_pos = true; info = None} in
+    let env2 = args env1 as_ in
+    let exp0' = tailexp env2 exp0 in
+    FuncE (x, s, c, tbs, as_, ret_tys, exp0')
+  | SelfCallE (ts, exp1, exp2, exp3) ->
+    let env1 = { tail_pos = true; info = None} in
+    let exp1' = tailexp env1 exp1 in
+    let exp2' = exp env exp2 in
+    let exp3' = exp env exp3 in
+    SelfCallE (ts, exp1', exp2', exp3')
+  | ActorE (ds, fs, u, t) ->
+    let u = { u with preupgrade = exp env u.preupgrade; postupgrade = exp env u.postupgrade } in
+    ActorE (snd (decs env ds), fs, u, t)
+  | NewObjE (s,is,t)    -> NewObjE (s, is, t)
+  | PrimE (p, es)       -> PrimE (p, List.map (exp env) es)
+
+and lexp env le : lexp = {le with it = lexp' env le}
+
+and lexp' env le : lexp' = match le.it with
+  | VarLE i -> VarLE i
+  | DotLE (e, sn)  -> DotLE (exp env e, sn)
+  | IdxLE (e1, e2) -> IdxLE (exp env e1, exp env e2)
+
+and args env as_ =
+  List.fold_left (fun env a -> bind_arg env a None) env as_
+
+and pat env p =
+  let env = pat' env p.it in
+  env
+
+and pat' env = function
+  | WildP
+  | LitP _         -> env
+  | VarP i         -> bind env i None
+  | TupP ps        -> pats env ps
+  | ObjP pfs       -> pats env (pats_of_obj_pat pfs)
+  | OptP p
+  | TagP (_, p)    -> pat env p
+  | AltP (p1, _p2) -> pat env p1 (* both bind the same vars, ensured in check_pat *)
+
+and pats env ps  =
+  match ps with
+  | [] -> env
+  | p :: ps ->
+    let env1 = pat env p in
+    pats env1 ps
+
+and case env (c : case) =
+  { c with it = case' env c.it }
+and case' env {pat=p;exp=e} =
+  let env1 = pat env p in
+  let e' = tailexp env1 e in
+  { pat=p; exp=e' }
+
+
+and cases env cs = List.map (case env) cs
+
+and dec env d =
+  let (mk_d,env1) = dec' env d in
+  ({d with it = mk_d}, env1)
+
+and dec' env d =
+  match d.it with
+  (* A local let bound function, this is what we are looking for *)
+  (* TODO: Do we need to detect more? A tuple of functions? *)
+  | LetD (({it = VarP id;_} as id_pat),
+          ({it = FuncE (x, Local, c, tbs, as_, typT, exp0);_} as funexp)) ->
+    let env = bind env id None in
+    begin fun env1 ->
+      let temps = fresh_vars "temp" (List.map (fun a -> Mut a.note) as_) in
+      let label = fresh_id "tailcall" () in
+      let tail_called = ref false in
+      let env2 = { tail_pos = true;
+                   info = Some { func = id;
+                                 typ_binds = tbs;
+                                 temps;
+                                 label;
+                                 tail_called } }
+      in
+      let env3 = args env2 as_ in (* shadow id if necessary *)
+      let exp0' = tailexp env3 exp0 in
+      let cs = List.map (fun (tb : typ_bind) -> Con (tb.it.con, [])) tbs in
+      if !tail_called then
+        let ids = match typ funexp with
+          | Func( _, _, _, dom, _) ->
+            fresh_vars "id" (List.map (fun t -> open_ cs t) dom)
+          | _ -> assert false
+        in
+        let l_typ = Type.unit in
+        let body =
+          blockE (List.map2 (fun t i -> varD t (varE i)) temps ids) (
+            loopE (
+              labelE label l_typ (blockE
+                (List.map2 (fun a t -> letD (var_of_arg a) (immuteE (varE t))) as_ temps)
+                (retE exp0'))
+            )
+          )
+        in
+        LetD (id_pat, {funexp with it = FuncE (x, Local, c, tbs, List.map arg_of_var ids, typT, body)})
+      else
+        LetD (id_pat, {funexp with it = FuncE (x, Local, c, tbs, as_, typT, exp0')})
+    end,
+    env
+  | LetD (p, e) ->
+    let env = pat env p in
+    (fun env1 -> LetD(p,exp env1 e)),
+    env
+  | VarD (i, t, e) ->
+    let env = bind env i None in
+    (fun env1 -> VarD(i, t, exp env1 e)),
+    env
+  | RefD (i, t, e) ->
+    let env = bind env i None in
+    (fun env1 -> RefD(i, t, lexp env1 e)),
+    env
+
+and decs env ds =
+  let rec decs_aux env ds =
+    match ds with
+    | [] -> ([],env)
+    | d::ds ->
+      let (mk_d, env1) = dec env d in
+      let (mk_ds, env2) = decs_aux env1 ds in
+      (mk_d :: mk_ds,env2)
+  in
+  let mk_ds,env1 = decs_aux env ds in
+  env1,
+  List.map
+    (fun mk_d ->
+      let env2 = { env1 with tail_pos = false } in
+      { mk_d with it = mk_d.it env2 })
+    mk_ds
+
+and block env ds exp =
+  let (env1, ds') = decs env ds in
+  ( ds', tailexp env1 exp)
+
+and comp_unit env = function
+  | LibU _ -> raise (Invalid_argument "cannot compile library")
+  | ProgU ds -> ProgU (snd (decs env ds))
+  | ActorU (as_opt, ds, fs, u, t)  ->
+    let u = { u with preupgrade = exp env u.preupgrade; postupgrade = exp env u.postupgrade } in
+    ActorU (as_opt, snd (decs env ds), fs, u, t)
+
+and prog (cu, flavor) =
+  let env = { tail_pos = false; info = None } in
+  (comp_unit env cu, flavor)
+
+(* validation *)
+
+let transform = prog
+
+
+
+ + + diff --git a/coverage/lang_utils/diag.ml.html b/coverage/lang_utils/diag.ml.html new file mode 100644 index 00000000000..5a18dd86298 --- /dev/null +++ b/coverage/lang_utils/diag.ml.html @@ -0,0 +1,337 @@ + + + + + diag.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+
+
open Mo_config
+
+type error_code = string
+type severity = Warning | Error | Info
+type message = {
+  sev : severity;
+  code : error_code;
+  at : Source.region;
+  cat : string;
+  text : string
+}
+type messages = message list
+
+let info_message at cat text = {sev = Info; code = ""; at; cat; text}
+let warning_message at code cat text = {sev = Warning; code; at; cat; text}
+let error_message at code cat text = {sev = Error; code; at; cat; text}
+
+type 'a result = ('a * messages, messages) Stdlib.result
+
+let return x = Ok (x, [])
+
+let info at cat text = Ok ((), [info_message at cat text])
+let warn at code cat text = Ok ((), [warning_message at code cat text])
+let error at code cat text = Stdlib.Error [error_message at code cat text]
+
+let map f = function
+  | Stdlib.Error msgs -> Stdlib.Error msgs
+  | Ok (x, msgs) -> Ok (f x, msgs)
+
+let bind x f = match x with
+  | Stdlib.Error msgs -> Stdlib.Error msgs
+  | Ok (y, msgs1) -> match f y with
+    | Ok (z, msgs2) -> Ok (z, msgs1 @ msgs2)
+    | Stdlib.Error msgs2 -> Error (msgs1 @ msgs2)
+
+let finally f r = f (); r
+
+module Syntax = struct
+  let (let*) = bind
+end
+
+let rec traverse : ('a -> 'b result) -> 'a list -> 'b list result = fun f -> function
+  | [] -> return []
+  | x :: xs -> bind (f x) (fun y -> map (fun ys -> y :: ys) (traverse f xs))
+
+let rec traverse_ : ('a -> unit result) -> 'a list -> unit result = fun f -> function
+  | [] -> return ()
+  | x :: xs -> bind (f x) (fun () -> traverse_ f xs)
+
+let rec fold : ('a -> 'b -> 'a result) -> 'a -> 'b list -> 'a result = fun f acc -> function
+  | [] -> return acc
+  | x :: xs -> bind (f acc x) (fun y -> fold f y xs)
+
+type msg_store = messages ref
+let add_msg s m = s := m :: !s
+let add_msgs s ms = s := List.rev ms @ !s
+let get_msgs s = List.rev !s
+
+let has_errors : messages -> bool =
+  List.fold_left (fun b msg -> b || msg.sev == Error) false
+
+let string_of_message msg =
+  let code = match msg.sev, msg.code with
+    | Info, _ -> ""
+    | _, "" -> ""
+    | _, code -> Printf.sprintf " [%s]" code in
+  let label = match msg.sev with
+    | Error -> Printf.sprintf "%s error" msg.cat
+    | Warning -> "warning"
+    | Info -> "info" in
+  Printf.sprintf "%s: %s%s, %s\n" (Source.string_of_region msg.at) label code msg.text
+
+let print_message msg =
+  if msg.sev <> Error && not !Flags.print_warnings
+  then ()
+  else Printf.eprintf "%s%!" (string_of_message msg)
+
+let print_messages = List.iter print_message
+
+let with_message_store f =
+  let s = ref [] in
+  let r = f s in
+  let msgs = get_msgs s in
+  match r with
+  | Some x when not (has_errors msgs) -> Ok (x, msgs)
+  | _ -> Error msgs
+
+let flush_messages : 'a result -> 'a option = function
+  | Stdlib.Error msgs ->
+    print_messages msgs;
+    None
+  | Ok (x, msgs) ->
+    print_messages msgs;
+    if !Flags.warnings_are_errors && msgs <> []
+    then None
+    else Some x
+
+let run r = match flush_messages r with
+  | None -> exit 1
+  | Some x -> x
+
+
+
+ + + diff --git a/coverage/lang_utils/dom.ml.html b/coverage/lang_utils/dom.ml.html new file mode 100644 index 00000000000..3887a0677ae --- /dev/null +++ b/coverage/lang_utils/dom.ml.html @@ -0,0 +1,93 @@ + + + + + dom.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+
+
module type S =
+sig
+  include Set.S
+
+  exception Clash of elt
+
+  val disjoint_add : elt -> t -> t (* raises Clash *)
+  val disjoint_union : t -> t -> t (* raises Clash *)
+end
+
+module Make(X : Set.OrderedType) : S with type elt = X.t =
+struct
+  include Set.Make(X)
+
+  exception Clash of elt
+
+  let disjoint_add e set = if mem e set then raise (Clash e) else add e set
+  let disjoint_union set1 set2 = fold (fun e s -> disjoint_add e s) set2 set1
+end
+
+
+
+ + + diff --git a/coverage/lang_utils/env.ml.html b/coverage/lang_utils/env.ml.html new file mode 100644 index 00000000000..2d3d7218862 --- /dev/null +++ b/coverage/lang_utils/env.ml.html @@ -0,0 +1,145 @@ + + + + + env.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+
+
module type S =
+sig
+  include Map.S
+
+  module Dom : Dom.S with type elt = key
+
+  exception Clash of key
+
+  val dom : 'a t -> Dom.t
+  val keys : 'a t -> key list
+  val from_list : (key * 'a) list -> 'a t
+  val from_list2 : key list -> 'a list -> 'a t
+  val adjoin : 'a t -> 'a t -> 'a t
+  val disjoint_add : key -> 'a -> 'a t -> 'a t (* raises Clash *)
+  val disjoint_union : 'a t -> 'a t -> 'a t (* raises Clash *)
+  val disjoint_unions : 'a t list -> 'a t (* raises Clash *)
+end
+
+module Make(X : Map.OrderedType) : S with type key = X.t =
+struct
+  include Map.Make(X)
+
+  module Dom = Dom.Make(X)
+
+  exception Clash of key
+
+  let dom env = List.fold_left (fun s (x, _) -> Dom.add x s) Dom.empty (bindings env)
+  let keys env = List.map fst (bindings env)
+  let from_list kxs = List.fold_left (fun env (k, x) -> add k x env) empty kxs
+  let from_list2 ks xs = List.fold_left2 (fun env k x -> add k x env) empty ks xs
+  let adjoin env1 env2 = union (fun _ x1 x2 -> Some x2) env1 env2
+  let disjoint_union env1 env2 = union (fun k _ _ -> raise (Clash k)) env1 env2
+  let disjoint_unions envs = List.fold_left disjoint_union empty envs
+  let disjoint_add k x env = disjoint_union env (singleton k x)
+
+end
+
+
+
+ + + diff --git a/coverage/lang_utils/error_codes.ml.html b/coverage/lang_utils/error_codes.ml.html new file mode 100644 index 00000000000..84cafeb5977 --- /dev/null +++ b/coverage/lang_utils/error_codes.ml.html @@ -0,0 +1,650 @@ + + + + + error_codes.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+
+
(* A list of all error codes used in the compiler. The second field in
+   each tuple represents a possible long-form description of the
+   error. *)
+let error_codes : (string * string option) list =
+  [
+    "M0000", None; (* Internal compiler error *)
+    "M0001", None; (* Parsing errors *)
+    "M0002", None; (* Lexer errors *)
+    "M0003", Some([%blob "lang_utils/error_codes/M0003.md"]); (* Self-import *)
+    "M0004", None; (* IDL file doesn't define a service *)
+    "M0005", None; (* Case mismatch between import and filename *)
+    "M0006", None; (* Failed to parse import URL *)
+    "M0007", None; (* Failed to parse actor alias *)
+    "M0008", None; (* Actor import without IDL path *)
+    "M0009", None; (* File not found for import *)
+    "M0010", None; (* Imported package was not defined *)
+    "M0011", None; (* Imported canister alias was not defined *)
+    "M0012", None; (* File for package does not exist *)
+    "M0013", None; (* Tried to map the prim package *)
+    "M0014", None; (* Non-static expression in library or module *)
+    "M0015", None; (* Non-trivial pattern in static expression *)
+    "M0016", None; (* Usage before definition *)
+    "M0017", None; (* Duplicate binding in pattern *)
+    "M0018", None; (* Duplicate name in type *)
+    "M0019", None; (* Colliding hashes in type *)
+    "M0020", None; (* Unresolved import *)
+    "M0021", None; (* Cannot infer type of forward import *)
+    "M0022", None; (* Imported file not loaded *)
+    "M0023", None; (* Path expression is not a module, object, or actor *)
+    "M0024", None; (* Cannot infer type of forward variable *)
+    "M0025", None; (* Unavailable variable *)
+    "M0026", None; (* Unbound variable *)
+    "M0027", None; (* Cannot infer type of forward field reference *)
+    "M0028", None; (* Field does not exist in type *)
+    "M0029", None; (* Unbound type *)
+    "M0030", None; (* Type field does not exist in type *)
+    "M0031", None; (* Shared function has non-shared parameter type *)
+    "M0032", None; (* Shared function has non-shared return type *)
+    "M0033", None; (* Async has non-shared content type *)
+    "M0034", None; (* Shared constructor has non-shared parameter type *)
+    "M0035", None; (* Invalid return type for shared function *)
+    "M0036", None; (* Invalid return type for shared query function *)
+    "M0037", None; (* Misplaced async expression *)
+    "M0038", None; (* Misplaced await *)
+    "M0039", None; (* Misplaced try/throw/catch *)
+    "M0040", None; (* Unknown primitive type *)
+    "M0041", None; (* Shared function has non-async result type *)
+    "M0042", None; (* Actor field must have shared function type *)
+    "M0043", None; (* Type parameter has cyclic bounds *)
+    "M0044", None; (* Duplicate name in type parameter list *)
+    "M0045", None; (* Wrong number of type arguments *)
+    "M0046", None; (* Type argument does not match parameter bound *)
+    "M0047", None; (* Send capability required *)
+    "M0048", None; (* Literal out of range *)
+    "M0049", None; (* String literal is not valid utf8 *)
+    "M0050", None; (* Literal does not have expected type *)
+    "M0051", None; (* Duplicate definition in block *)
+    (* "M0052" DEFUNCT Duplicate definition in object *)
+    "M0053", None; (* Cannot infer expression in class using forward type reference *)
+    "M0054", None; (* Cannot infer type of primitive *)
+    "M0055", None; (* Cannot infer type of forward variable *)
+    "M0056", None; (* Variable is not available in compiled code *)
+    "M0057", None; (* Unbound variable *)
+    "M0058", None; (* No type can be inferred for actor reference *)
+    "M0059", None; (* Operator is not defined for operand type *)
+    "M0060", None; (* Operator is not defined for operand types *)
+    "M0061", None; (* Comparing abstract type to itself at supertype *)
+    "M0062", None; (* Comparing incompatible type at common supertype *)
+    "M0063", None; (* Show is not defined for operand type *)
+    "M0064", None; (* Misplaced '!' without enclosing do block *)
+    "M0065", None; (* Expected option type before '!' *)
+    "M0066", None; (* Tuple projection is out of bounds *)
+    "M0067", None; (* Expected tuple type *)
+    "M0068", None; (* Actors are not supported *)
+    "M0069", None; (* Non-toplevel actor *)
+    "M0070", None; (* Expected object type *)
+    "M0071", None; (* Cannot infer type of forward field reference *)
+    "M0072", None; (* Field does not exist in type *)
+    "M0073", None; (* Expected mutable assignment target *)
+    "M0074", None; (* Array elements have inconsistent types *)
+    "M0075", None; (* Expected array type *)
+    "M0076", None; (* Shared functions are not supported *)
+    "M0077", None; (* Shared function is only allowed as a public field of an actor *)
+    "M0078", None; (* Shared function with () result type has unexpected body *)
+    "M0079", None; (* Shared function with async result type has non-async body *)
+    (* "M0080" DEFUNCT Local class type is contained in inferred block type *)
+    "M0081", None; (* If branches have inconsistent types *)
+    "M0082", None; (* Expected iterable type *)
+    "M0083", None; (* Unbound label *)
+    "M0084", None; (* Cannot infer return type *)
+    "M0085", None; (* Misplaced return *)
+    "M0086", None; (* Async expressions are not supported *)
+    "M0087", None; (* Ill-scoped await *)
+    "M0088", None; (* Expected async type *)
+    "M0089", None; (* Redundant ignore *)
+    "M0090", None; (* Actor reference must have an actor type *)
+    "M0091", None; (* Mutable array expression cannot produce expected type *)
+    "M0092", None; (* Async cannot produce scope *)
+    "M0093", None; (* Bases of record extensions must be objects or modules *)
+    "M0094", None; (* Shared functions does not match shared function type *)
+    "M0095", None; (* Function return type does not match expected return type *)
+    "M0096", None; (* Expression can't produce expected type *)
+    "M0097", None; (* Expected function type *)
+    "M0098", None; (* Cannot instantiate function type *)
+    "M0099", None; (* Shared function argument contains abstract type *)
+    "M0100", None; (* Shared function call result contains abstract type *)
+    "M0101", None; (* Switch with inconsistent branch types *)
+    "M0102", None; (* Cannot infer type of wildcard *)
+    "M0103", None; (* Cannot infer type of variable *)
+    (* "M0104" DEFUNCT Pattern branches have incompatible types *)
+    (* "M0105" DEFUNCT Variables are not allowed in pattern alternatives *)
+    "M0106", None; (* Shared function cannot take a context pattern *)
+    "M0107", None; (* Non-actor class cannot take a context pattern *)
+    "M0108", None; (* Actor class cannot take a context pattern *)
+    "M0109", None; (* Class cannot be a query *)
+    "M0110", None; (* Literal pattern cannot consume type *)
+    "M0111", None; (* Operator pattern cannot consume type *)
+    "M0112", None; (* Tuple pattern cannot consume type *)
+    "M0113", None; (* Object pattern cannot consume type *)
+    "M0114", None; (* Object pattern cannot consume actor type *)
+    "M0115", None; (* Option pattern cannot consume type *)
+    "M0116", None; (* Variant pattern cannot consume type *)
+    "M0117", None; (* Pattern cannot consume type *)
+    "M0118", None; (* Tuple pattern size mismatch *)
+    "M0119", None; (* Object field is not contained in type *)
+    "M0120", None; (* Cannot pattern match mutable field *)
+    "M0121", None; (* Duplicate field in object pattern *)
+    "M0122", None; (* Colliding hashes in object type *)
+    (* "M0123" DEFUNCT Local class type contained in object or actor type *)
+    "M0124", None; (* Public actor field has non-shared type *)
+    "M0125", None; (* Public actor field needs to be a manifest function *)
+    "M0126", None; (* Shared function cannot be private *)
+    "M0127", None; (* System function with wrong type *)
+    "M0128", None; (* Function with system function name but wrong visibility *)
+    "M0129", None; (* Unexpected system method name *)
+    "M0130", None; (* Misplaced system visibility *)
+    "M0131", None; (* Expected stable type *)
+    "M0132", None; (* Misplaced stability declaration *)
+    "M0133", None; (* Misplaced stability modifier *)
+    "M0134", None; (* Class body type mismatch *)
+    "M0135", None; (* Actor class has non-async return type *)
+    "M0136", None; (* Empty block type mismatch *)
+    "M0137", Some([%blob "lang_utils/error_codes/M0137.md"]); (* Type definition references type parameter from outer scope *)
+    "M0138", None; (* Actor classes are not supported *)
+    "M0139", None; (* Inner actor classes are not supported *)
+    "M0140", None; (* Actor classes with type parameters are not supported *)
+    "M0141", None; (* Forbidden declaration in program *)
+    "M0142", None; (* An imported library should be a module or named actor class *)
+    "M0143", None; (* Imported actor class cannot be anonymous *)
+    "M0144", None; (* Expected a module or actor class *)
+    "M0145", None; (* Pattern does not cover value *)
+    "M0146", None; (* Pattern is never matched *)
+    (* "M0147" DEFUNCT Object syntax is deprecated in this position *)
+    (* "M0148" DEFUNCT Block syntax is deprecated in this position *)
+    "M0149", Some([%blob "lang_utils/error_codes/M0149.md"]); (* Expected mutable 'var' field, found immutable field *)
+    "M0150", Some([%blob "lang_utils/error_codes/M0150.md"]); (* Expected immutable field, found mutable 'var' field *)
+    "M0151", Some([%blob "lang_utils/error_codes/M0151.md"]); (* missing field in object literal *)
+    (* "M0152" DEFUNCT Word field deprecation *)
+    "M0153", Some([%blob "lang_utils/error_codes/M0153.md"]); (* IDL types not expressible in Motoko *)
+    "M0154", Some([%blob "lang_utils/error_codes/M0154.md"]); (* Deprecation annotation *)
+    "M0155", Some([%blob "lang_utils/error_codes/M0155.md"]); (* Inferred type Nat for subtraction *)
+    "M0156", Some([%blob "lang_utils/error_codes/M0156.md"]); (* block contains expansive type definitions *)
+    "M0157", Some([%blob "lang_utils/error_codes/M0157.md"]); (* block contains non-productive type definitions *)
+    "M0158", Some([%blob "lang_utils/error_codes/M0158.md"]); (* a public class cannot be anonymous, please provide a name *)
+    (* "M0159" DEFUNCT Word deprecation *)
+    "M0160", None; (* Candid method name is not a valid Motoko identifier *)
+    "M0161", None; (* Candid float32 type cannot be imported as a Motoko type *)
+    "M0162", None; (* Candid service constructor type not supported as Motoko type *)
+    (* "M0163" DEFUNCT Cannot import a Candid service constructor *)
+    "M0164", None; (* Unknown record or variant label in textual representation *)
+    "M0165", None; (* Odd expected type *)
+    "M0166", None; (* Type intersection results in abstract type *)
+    "M0167", None; (* Type union results in bottom type *)
+    "M0168", None; (* Type union or intersection on forward types *)
+    "M0169", None; (* Stable variable cannot be discarded *)
+    "M0170", None; (* Stable variable must subtype *)
+    "M0171", None; (* Stable variable changing mutability *)
+    "M0172", None; (* to_candid produces Blob, not -- *)
+    "M0173", None; (* to_candid arg must have shared type, not -- *)
+    "M0174", None; (* from_candid produces an optional shared, not -- *)
+    "M0175", None; (* to_candid argument must have shared type, not -- *)
+    "M0176", None; (* from_candid requires known type from context *)
+    "M0177", None; (* Bases of record extensions must not have common fields that are not overwritten *)
+    "M0178", None; (* Bases of record extensions must be either objects or modules *)
+    "M0179", None; (* Mutable (var) fields from bases must be overwritten explicitly *)
+    "M0180", None; (* Shared function has unexpected type parameters *)
+    "M0181", None; (* Verification mode assertions not allowed *)
+    "M0182", None; (* Timer defined by user when -no-timer flag is specified *)
+    "M0183", None; (* Incompatible async sorts *)
+    "M0184", None; (* Cannot infer or-pattern, please use an annotation *)
+    "M0185", None; (* Importing Candid service constructor as instantiated service *)
+    "M0186", None; (* Send capability required (calling shared from composite) *)
+    "M0187", None; (* Send capability required (calling composite from non-composite) *)
+    "M0188", None; (* Send capability required (calling shared from query) *)
+    "M0189", None; (* Different set of bindings in pattern alternatives *)
+    "M0190", None; (* Types inconsistent for alternative pattern variables, losing information *)
+    "M0191", None; (* Code requires Wasm features ... to execute *)
+    "M0192", None; (* Object/Actor/Module body type mismatch *)
+    "M0193", None; (* Can't declare actor class to have `async*` result *)
+    "M0194", Some([%blob "lang_utils/error_codes/M0194.md"]); (* Unused identifier warning *)
+    "M0195", Some([%blob "lang_utils/error_codes/M0195.md"]); (* warn that `system` capability is implicitly supplied *)
+    "M0196", None; (* `system` capability supplied but not required *)
+    "M0197", Some([%blob "lang_utils/error_codes/M0197.md"]); (* `system` capability required *)
+    "M0198", Some([%blob "lang_utils/error_codes/M0198.md"]); (* Unused field pattern warning *)
+  ]
+
+
+
+ + + diff --git a/coverage/lang_utils/expGraph.ml.html b/coverage/lang_utils/expGraph.ml.html new file mode 100644 index 00000000000..d5f2f3e27a6 --- /dev/null +++ b/coverage/lang_utils/expGraph.ml.html @@ -0,0 +1,710 @@ + + + + + expGraph.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+
+
module IM = Map.Make(Int)
+module IS = Set.Make(Int)
+
+(*
+Note [A running example]
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+How do we go from
+
+  type A = ?[A]
+  type B = [?B]
+  t = ([A], B, [B])
+
+to the canonical representation
+
+  t = (1=?[!1], !1, [!1])
+
+in this code? By these transformations:
+
+Step 1: `unfold` will turn this tree into the following graph (depth first,
+memoizing graph nodes based on structural equality on the tree)
+
+  0: ("tuple", [1,4,6])
+  1: ("vector",[2])
+  2: ("opt",   [3])
+  3: ("vector",[2])
+  4: ("vector",[5])
+  5: ("opt",   [4])
+  6: ("vector",[4])
+
+Note that this graph is not minimal.
+
+Step 2: `combine` will find the equivalence relations on the nodes of the graph.
+To find the coarsest we begin with
+
+   [0 1 2 3 4 5 6]
+
+and now iterate using `equiv_classes`. First distinguishing by constructor
+
+   [0] [1 3 4 6] [2 5]
+
+then by whether the argument list is different (with respect to the current equivalence relation!)
+
+   [0] [1 3 4] [6] [2 5]
+
+Now the iteration stops (could go further with deeper types). Renumbering based
+on this equivelence relation gives:
+
+  0: ("tuple", [1,1,2])
+  1: ("vector",[3])
+  2: ("vector",[1])
+  3: ("opt",   [1])
+
+Step 3: `renumber` to get canonical numbers (depth-first traversal)
+
+  0: ("tuple", [1,1,3])
+  1: ("vector",[2])
+  2: ("opt",   [1])
+  3: ("vector",[1])
+
+
+Step 4: `unfold`
+
+To unfold nicely, the nodes that are referenced more than once are 1, so only
+that gets a name. This way we end up with something like
+
+  t = (1=?[!1], !1, [!1])
+
+*)
+
+
+(* A graph of nodes, nodes labeled by ints, root at node 0 *)
+type 'a t = ('a * int list) IM.t
+
+(* Simple counter data structure *)
+let start_counting start : (unit -> int) =
+  let r = ref start in
+  fun () -> let i = !r in r := !r + 1; i
+
+let unfold (type e) node (root : e) : 'a t =
+  let module M = Map.Make (struct type t = e let compare = compare end) in
+
+  let seen = ref M.empty in
+  let next = start_counting 0 in
+  let graph = ref IM.empty in
+  let rec go e : int =
+    match M.find_opt e !seen with
+    | Some i -> i
+    | None ->
+      let i = next () in
+      seen := M.add e i !seen;
+      let (k, args) = node e in
+      let args' = List.map go args in
+      graph := IM.add i (k, args') !graph;
+      i
+  in
+  let i = go root in
+  assert (i == 0);
+  !graph
+
+
+(* Maps an index mapping over the graph. If not injective, will combine nodes *)
+let rename (lookup : int -> int) graph = graph
+    |> IM.to_seq
+    |> Seq.map (fun (i, (k, args)) -> (lookup i, (k, List.map lookup args)))
+    |> IM.of_seq
+
+(* Given a function on int (given as sequences of points),
+   calculates the equivalence classes it represents,
+   in the form of a mapping from int to int (plus size)
+
+   Example Input:   Example Output:
+     0 ↦ "Ho"         0 ↦ 0
+     1 ↦ "Hi"         1 ↦ 1
+     3 ↦ "Ho"         3 ↦ 0
+
+*)
+let equiv_classes (type b) (graph : (int * b) Seq.t) : (int IM.t * int) =
+  let module BM = Map.Make (struct type t = b let compare = compare end) in
+  let m = ref BM.empty in
+  let next = start_counting 0 in
+
+  let m =
+    IM.of_seq (Seq.map (fun (i,y) ->
+      match BM.find_opt y !m with
+      | Some j -> (i, j)
+      | None ->
+        let j = next () in
+        m := BM.add y j !m;
+        (i, j)
+    ) graph) in
+  let size = next () in
+  m, size
+
+
+(* Finds a minimal graph by finding the smallest index mapping that is consistent *)
+(* Equivalently: The coarsest equivalence classes on the nodes *)
+let combine graph =
+  let m : int IM.t ref = ref IM.empty in
+  let lookup i = IM.find i !m in
+  (* map all nodes to the same initially *)
+  IM.iter (fun i _ -> m := IM.add i 0 !m) graph;
+  let size = ref 1 in
+  let finished = ref false in
+
+  (* Fixed-point iteration *)
+  while not !finished do
+    (* Update the equivalence classes. By including the previous class,
+       this is a refinement *)
+    let m', size' = graph
+      |> IM.to_seq
+      |> Seq.map (fun (i, (k, args)) -> (i, (lookup i, k, List.map lookup args)))
+      |> equiv_classes in
+    assert (size' >= !size); (* New equivalence class better be finer *)
+    finished := size' = !size;
+    size := size';
+    m := m';
+  done;
+
+  assert (lookup 0 = 0);
+  rename lookup graph
+
+(* Changes the numbering to be canonical (depth first) *)
+let renumber graph =
+  let m = ref IM.empty in
+  let lookup i = IM.find i !m in
+  let next = start_counting 0 in
+
+  let rec go i = match IM.find_opt i !m with
+    | None -> (* not seen before *)
+      m := IM.add i (next ()) !m;
+      let (k, args) = IM.find i graph in
+      List.iter go args
+    | Some _ -> ()
+  in
+  go 0;
+
+  assert (lookup 0 = 0);
+  rename lookup graph
+
+(* Find a canonical graph *)
+let canonicalize graph = renumber (combine graph)
+
+(* Folds over the graph *)
+let fold
+  (of_con : 'a -> 'b list -> 'b)
+  (of_def : int -> 'b -> 'b)
+  (of_ref : int -> 'b)
+  (graph : 'a t) : 'b =
+
+  (* Find which entries are referenced more than once *)
+  let tally : int IM.t =
+    let tally = ref IM.empty in
+    let succ = function | None -> Some 1 | Some i -> Some (i + 1) in
+    let bump i = tally := IM.update i succ !tally in
+    bump 0;
+    IM.iter (fun _ (_, args) -> List.iter bump args) graph;
+    !tally
+  in
+
+  (* Nodes need an explicit definition if not nullary and referenced
+     more than once
+   *)
+  let needs_def : IS.t =
+    IS.of_seq (Seq.filter_map (fun (i, (k, args)) ->
+        if args != [] && IM.find i tally > 1 then Some i else None
+    ) (IM.to_seq graph))
+  in
+
+  (* Now fold the graph using the user-provided combinators *)
+  let seen = ref IS.empty in
+  let rec go_con i : 'b =
+    (* This node is only visited once *)
+    let (k, args) = IM.find i graph in
+    of_con k (List.map go args)
+  and go i : 'b =
+    (* This node is only visited once: *)
+    if IS.mem i needs_def then
+      (* We have seen this before: *)
+      if IS.mem i !seen then of_ref i
+      (* This is a shared node, first visit: *)
+      else (seen := IS.add i !seen; of_def i (go_con i))
+    else go_con i
+  in
+  go 0
+
+
+
+ + + diff --git a/coverage/lang_utils/lbool.ml.html b/coverage/lang_utils/lbool.ml.html new file mode 100644 index 00000000000..94c91ebd25c --- /dev/null +++ b/coverage/lang_utils/lbool.ml.html @@ -0,0 +1,174 @@ + + + + + lbool.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+
+
(*
+See lbool.mli for an overview
+*)
+
+type callback = unit Lazy.t
+
+let do_nothing : callback = lazy ()
+
+let (>>) cb1 cb2 = lazy Lazy.(force cb1; force cb2)
+
+(* The lazy bool value type *)
+
+type t' =
+  | SurelyTrue
+  | SurelyFalse
+  | MaybeFalse of callback (* whom to notify when turning false *)
+type t = t' ref
+
+let set_false (l : t) =
+  match !l with
+  | SurelyTrue ->
+    raise (Invalid_argument "Lbool.set_false() on surely true variable")
+  | SurelyFalse -> ()
+  | MaybeFalse when_false ->
+    l := SurelyFalse; (* do this first, this breaks cycles *)
+    Lazy.force when_false
+
+let when_false (l : t) (act : callback) =
+  match !l with
+  | SurelyTrue -> ()
+  | SurelyFalse -> Lazy.force act
+  | MaybeFalse when_false ->
+    l := MaybeFalse (act >> when_false)
+
+let surely_true = ref SurelyTrue (* sharing is ok *)
+let surely_false = ref SurelyFalse (* sharing is ok *)
+let maybe_false () = ref (MaybeFalse do_nothing) (* no sharing, so unit argument *)
+
+let required_for (a : t) (b : t) =
+  when_false a (lazy (set_false b))
+
+let all (xs : t list) : t =
+  if xs = [] then surely_true else
+  let b = maybe_false () in
+  List.iter (fun a -> required_for a b) xs;
+  b
+
+
+
+ + + diff --git a/coverage/lang_utils/nameRel.ml.html b/coverage/lang_utils/nameRel.ml.html new file mode 100644 index 00000000000..baa859d1b65 --- /dev/null +++ b/coverage/lang_utils/nameRel.ml.html @@ -0,0 +1,280 @@ + + + + + nameRel.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
+
(* A data structure for binary relations on names *)
+
+module M = Env.Make(String)
+module S = Set.Make(String)
+
+type t = S.t M.t
+
+let empty : t = M.empty
+
+let cardinal : t -> int = fun m ->
+  M.fold (fun _ s c -> S.cardinal s + c) m 0
+
+let iter : (string -> string -> unit) -> t -> unit = fun f ->
+  M.iter (fun x -> S.iter (f x))
+
+let diag : string list -> t =
+  List.fold_left (fun rel x -> M.add x (S.singleton x) rel) empty
+
+let diag_set : S.t -> t = fun s ->
+  S.fold (fun x rel -> M.add x (S.singleton x) rel) s empty
+
+let cross : S.t -> S.t -> t = fun s1 s2 ->
+  S.fold (fun x rel -> M.add x s2 rel) s1 empty
+
+let lookup : string -> t -> S.t = fun k rel ->
+  match M.find_opt k rel with
+  | None -> S.empty
+  | Some s -> s
+
+(* dom R = { x | (x,y) ∈ R } *)
+let dom : t -> S.t = fun rel ->
+  M.fold (fun v s dom -> if S.is_empty s then dom else S.add v dom) rel S.empty
+
+(* range R = { y | (x,y) ∈ R } *)
+let range : t -> S.t = fun rel ->
+  M.fold (fun _ s ran -> S.union s ran) rel S.empty
+
+(* remove_range R S = { (x,y) | (x,y) ∈ R ∧ y ∉ S } *)
+let remove_range : S.t -> t -> t = fun s ->
+  M.map (fun s' -> S.diff s' s)
+
+(* union R1 R2 = R1 ∪ R2 = { (x,y) | (x,y) ∈ R1 ∨ (x,y) ∈ R2 } *)
+let union : t -> t -> t =
+  M.union (fun _ s1 s2 -> Some (S.union s1 s2))
+
+let unions : t list -> t =
+  List.fold_left union empty
+
+(* prod S1 S2 = S1 × S2 *)
+let prod : S.t -> S.t -> t = fun s1 s2 ->
+  S.fold (fun x rel -> M.add x s2 rel) s1 empty
+
+(* Just a utility function *)
+let set_bind f s =
+  S.fold (fun y -> S.union (f y)) s S.empty
+
+(* comp R1 R2 = R1 ∘ R2 = { (x,z) | (x,y) ∈ R1 ∧ (y,z) ∈ R2 } *)
+let comp : t -> t -> t = fun rel1 rel2 ->
+  M.map (set_bind (fun y -> lookup y rel2)) rel1
+
+(* We can use a relation R to represent its transitive closure R⁺,
+   and operations like dom, union, prod, comp work just fine.
+   Only removing needs special care:*)
+
+(* remove_range_trans S R = R' where remove_range S R⁺ = R'⁺ *)
+let remove_range_trans : S.t -> t -> t = fun s rel ->
+  M.map (set_bind (fun y -> if S.mem y s then S.diff (lookup y rel) s else S.singleton y)) rel
+
+(* restricted_rtcl S R = { (x,z) | x ∈ S ∧ (x,z) ∈ R^* } *)
+let restricted_rtcl : S.t -> t -> t = fun s rel ->
+  let rec go prev =
+    (* Add one iteration of R to the relation *)
+    let next = union prev (comp prev rel) in
+    (* Do we have a fixed point? *)
+    if cardinal prev = cardinal next
+    then prev
+    else go next
+  in go (diag_set s)
+
+
+
+
+
+ + + diff --git a/coverage/lang_utils/scc.ml.html b/coverage/lang_utils/scc.ml.html new file mode 100644 index 00000000000..178a69d6fb4 --- /dev/null +++ b/coverage/lang_utils/scc.ml.html @@ -0,0 +1,311 @@ + + + + + scc.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+
+
(*
+  A naive implementation of Tarjan's algorithm.
+
+  Computes the strongly connected components of a directed graph, returning
+  the list of components in topological order.
+
+  Adapted from:
+  https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+*)
+
+module Make(Vertex : Set.OrderedType) :
+  sig
+    module VertexSet :
+      Set.S with type elt = Vertex.t with type t = Set.Make(Vertex).t
+    module Edge : Set.OrderedType with type t = Vertex.t * Vertex.t
+    module EdgeSet : Set.S with type elt = Edge.t
+    val scc : VertexSet.t -> EdgeSet.t -> VertexSet.t list
+  end
+ = struct
+
+  module Edge = struct
+    type t = Vertex.t * Vertex.t
+    (* the lexicographic ordering on pairs *)
+    let compare (v1, w1) (v2, w2) =
+     match Vertex.compare v1 v2 with
+     | 0 -> Vertex.compare w1 w2
+     | o -> o
+  end
+
+  module VertexSet = Set.Make(Vertex)
+  module EdgeSet = Set.Make(Edge)
+
+  module VertexMap = Map.Make(Vertex)
+
+  type state = {
+    mutable index : int;
+    mutable lowlink : int;
+    mutable onstack : bool
+  }
+
+  let scc vs es =
+  let sccs = ref [] in
+  let undefined = -1 in
+  let index = ref 0 in
+  let states = VertexSet.fold (fun v m ->
+    VertexMap.add v {index = undefined; lowlink = 0; onstack = false} m)
+    vs VertexMap.empty
+  in
+  let stack = ref [] in
+  let successors = EdgeSet.fold (fun (v, w) m ->
+    VertexMap.add v (VertexSet.add w (VertexMap.find v m)) m)
+      es
+      (VertexSet.fold (fun v m -> VertexMap.add v VertexSet.empty m) vs VertexMap.empty)
+  in
+  let rec strongconnect v =
+    let sv = VertexMap.find v states in
+    sv.index <- !index;
+    sv.lowlink <- !index;
+    index := !index +1 ;
+    stack := v::!stack;
+    sv.onstack <- true;
+
+    let ws = VertexMap.find v successors in
+    ws |> VertexSet.iter (fun w ->
+      let sw = VertexMap.find w states in
+      if sw.index = undefined then begin
+        strongconnect(w);
+        sv.lowlink <- min sv.lowlink sw.lowlink;
+      end
+      else
+        if sw.onstack then
+          sv.lowlink <- min sv.lowlink sw.index);
+    if sv.lowlink = sv.index then
+      let rec pop scc =
+        let w = List.hd !stack in
+        stack := List.tl !stack;
+        let sw = VertexMap.find w states in
+        sw.onstack <- false;
+        let scc' = VertexSet.add w scc in
+        if Vertex.compare w v <> 0
+        then pop scc'
+        else sccs := scc' :: !sccs
+      in
+      pop VertexSet.empty
+  in
+  vs |> VertexSet.iter (fun v ->
+    let sv = VertexMap.find v states in
+    if sv.index = undefined then
+      strongconnect v);
+  List.rev !sccs
+
+end
+
+
+
+ + + diff --git a/coverage/lang_utils/source.ml.html b/coverage/lang_utils/source.ml.html new file mode 100644 index 00000000000..64ae5544f03 --- /dev/null +++ b/coverage/lang_utils/source.ml.html @@ -0,0 +1,126 @@ + + + + + source.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
+
type pos = {file : string; line : int; column : int}
+type region = {left : pos; right : pos}
+type ('a, 'b) annotated_phrase = {at : region; it : 'a; mutable note: 'b}
+type 'a phrase = ('a, unit) annotated_phrase
+
+let (@@) it at = {it; at; note = ()}
+
+(* Positions and regions *)
+
+let no_pos = {file = ""; line = 0; column = 0}
+let no_region = {left = no_pos; right = no_pos}
+
+let span r1 r2 = {left = r1.left; right = r2.right}
+let between r1 r2 = {left = r1.right; right = r2.left}
+
+let string_of_pos pos =
+  if pos.line = -1 then
+    Printf.sprintf "0x%x" pos.column
+  else
+    string_of_int pos.line ^ "." ^ string_of_int (pos.column + 1)
+
+let string_of_region r =
+  if r.left.file = "" then "(unknown location)" else
+  r.left.file ^ ":" ^ string_of_pos r.left ^
+  (if r.right = r.left then "" else "-" ^ string_of_pos r.right)
+
+(* generic parse error *)
+
+exception ParseError of region * string
+
+
+
+
+ + + diff --git a/coverage/lang_utils/trivia.ml.html b/coverage/lang_utils/trivia.ml.html new file mode 100644 index 00000000000..abd62f97341 --- /dev/null +++ b/coverage/lang_utils/trivia.ml.html @@ -0,0 +1,380 @@ + + + + + trivia.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+
+
open Source
+
+type line_feed = LF | CRLF
+
+type 'l trivia = Comment of string | Space of int | Tab of int | Line of 'l
+
+type void = |
+
+let absurd : void -> 'a = function _ -> .
+
+let map_trivia : ('a -> 'b) -> 'a trivia -> 'b trivia =
+ fun f -> function
+  | Comment str -> Comment str
+  | Space n -> Space n
+  | Tab n -> Tab n
+  | Line l -> Line (f l)
+
+let string_of_line_feed = function LF -> "LF" | CRLF -> "CRLF"
+
+let string_of_trivia : ('a -> string) -> 'a trivia -> string =
+ fun f t ->
+  match t with
+  | Comment str -> str
+  | Space n -> Printf.sprintf "Space(%d)" n
+  | Tab n -> Printf.sprintf "Tab(%d)" n
+  | Line l -> Printf.sprintf "Line(%s)" (f l)
+
+let string_of_trivia_lf : line_feed trivia -> string =
+  string_of_trivia string_of_line_feed
+
+type trivia_info = {
+  leading_trivia : line_feed trivia list;
+  trailing_trivia : void trivia list;
+}
+
+let string_of_trivia_info (info : trivia_info) : string =
+    let leading = List.map (string_of_trivia string_of_line_feed) info.leading_trivia |> String.concat ", " in
+    let trailing = List.map (string_of_trivia (fun _ -> "")) info.trailing_trivia |> String.concat ", " in
+    Printf.sprintf "Leading: [%s]; Trailing: [%s]" leading trailing
+
+type pos = { line : int; column : int }
+
+let pos_of_lexpos : Lexing.position -> pos =
+ fun lexpos ->
+  Lexing.{ line = lexpos.pos_lnum; column = lexpos.pos_cnum - lexpos.pos_bol }
+
+module PosHash = struct
+  type t = pos
+
+  let equal i j = i = j
+
+  let hash ({ line; column } : pos) = column lor 20 land line
+end
+
+module PosHashtbl = Hashtbl.Make (PosHash)
+
+(* type triv_table = trivia_info IntHashtbl.t *)
+type triv_table = trivia_info PosHashtbl.t
+
+let empty_triv_table = PosHashtbl.create 0
+
+let find_trivia triv_table (parser_pos : Source.region) : trivia_info =
+  PosHashtbl.find triv_table
+    { line = parser_pos.left.line; column = parser_pos.left.column }
+
+let deprecated_of_trivia_info : trivia_info -> string option =
+ fun info ->
+  let lines =
+    List.filter_map
+      (function
+        | Comment s -> (
+            match Lib.String.chop_prefix "/// @deprecated" s with
+            | Some "" -> Some ""
+            | Some line_comment ->
+                (* We expect a documentation line comment to start with a space
+                 *  (which we remove here) *)
+                Lib.String.chop_prefix " " line_comment
+            | None -> None )
+        | _ -> None)
+      info.leading_trivia
+  in
+  if lines = [] then None else Some (String.concat "\n" lines)
+
+type doc = LineComment of string | BlockComment of string
+
+let docs_of_trivia_info (info : trivia_info) : doc list =
+  List.filter_map
+    (function
+      | Comment s -> (
+          match Lib.String.chop_prefix "///" s with
+          | Some "" -> Some (LineComment "")
+          | Some line_comment ->
+              (* We expect a documentation line comment to start with a space
+              *  (which we remove here) *)
+              Lib.String.chop_prefix " " line_comment
+              |> Option.map (fun c -> LineComment c)
+          | None ->
+              Option.bind
+                (Lib.String.chop_prefix "/**" s)
+                (Lib.String.chop_suffix "*/")
+              |> Option.map String.trim
+              |> Option.map (fun c -> BlockComment c))
+      | _ -> None)
+    info.leading_trivia
+ 
+let doc_comment_of_trivia_info (info : trivia_info) : string option =
+  let docs = docs_of_trivia_info info in
+  let lines = List.map (function BlockComment s | LineComment s -> s) docs in
+  if lines = [] then None else Some (String.concat "\n" lines)
+
+
+
+ + + diff --git a/coverage/lib/lib.ml.html b/coverage/lib/lib.ml.html new file mode 100644 index 00000000000..f16cf6e0264 --- /dev/null +++ b/coverage/lib/lib.ml.html @@ -0,0 +1,2768 @@ + + + + + lib.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+
+
module Format =
+struct
+  let with_str_formatter f x =
+    let b = Buffer.create 16 in
+    let ppf = Format.formatter_of_buffer b in
+    Format.pp_set_geometry ppf ~max_indent:2 ~margin:(1000000010-1); (* hack to output all on one line *)
+    Format.fprintf ppf "@[%a@]" f x;
+    Format.pp_print_flush ppf ();
+    Buffer.contents b
+
+  let display pp ppf x =
+    Format.fprintf ppf "@\n@[<v 2>  %a@]" pp x
+end
+
+module Fun =
+struct
+  let curry f x y = f (x, y)
+  let uncurry f (x, y) = f x y
+
+  let rec repeat n f x =
+    if n = 0 then () else (f x; repeat (n - 1) f x)
+end
+
+module Int =
+struct
+  let log2 n =
+    if n <= 0 then failwith "log2";
+    let rec loop acc n = if n = 1 then acc else loop (acc + 1) (n lsr 1) in
+    loop 0 n
+
+  let is_power_of_two n =
+    if n < 0 then failwith "is_power_of_two";
+    n <> 0 && n land (n - 1) = 0
+end
+
+module Uint32 =
+struct
+  type t = int32
+  let of_string str = Int32.of_string ("0u" ^ str)
+  let of_string_opt str = Int32.of_string_opt ("0u" ^ str)
+  let to_string n = Printf.sprintf "%lu" n
+  let add = Int32.add
+  let sub = Int32.sub
+  let mul = Int32.mul
+  let succ = Int32.succ
+  let zero = Int32.zero
+  let one = Int32.one
+  let of_int = Int32.of_int
+  let to_int = Int32.to_int
+  let logand = Int32.logand
+  let logor = Int32.logor
+  let shift_right_logical = Int32.shift_right_logical
+  let of_int32 x = x
+  let to_int32 x = x
+  let compare i1 i2 =
+    if i1 < 0l && i2 >= 0l then 1
+    else if i1 >= 0l && i2 < 0l then -1
+    else Int32.compare i1 i2
+end
+
+module CRC =
+struct
+  let crc8 (bs : string) : int =
+    let inner _ = function
+      | crc when crc land 0x80 <> 0 -> (crc lsl 1) lxor 0x7
+      | crc -> crc lsl 1 in
+    let outer crc b =
+      List.fold_right inner [0;1;2;3;4;5;6;7] (Char.code b lxor crc) land 0xFF in
+    Seq.fold_left outer 0 (String.to_seq bs)
+
+  let crc32 (bs : string) : int32 =
+    Optint.(to_int32 (Checkseum.Crc32.digest_string bs 0 (String.length bs) zero))
+end
+
+module Hex =
+struct
+  let hexdigit = let open Char in function
+    | c when c >= '0' && c <= '9' -> code c - code '0'
+    | c when c >= 'A' && c <= 'F' -> code c - code 'A' + 10
+    | c when c >= 'a' && c <= 'f' -> code c - code 'a' + 10
+    | _ -> assert false
+
+  let bytes_of_hex hex : string =
+    let open String in
+    let extract i _ =
+      Char.chr (hexdigit (get hex (i * 2)) lsl 4 lor hexdigit (get hex (i * 2 + 1))) in
+    Bytes.to_string (Bytes.mapi extract (Bytes.create (length hex / 2)))
+
+  let int_of_hex_byte hex : int =
+    assert (String.length hex = 2);
+    String.(hexdigit (get hex 0) lsl 4 lor hexdigit (get hex 1))
+
+  let hex_of_nibble =
+    let open Char in
+    function
+    | c when 0 <= c && c <= 9 -> chr (code '0' + c)
+    | c when 10 <= c && c <= 15 -> chr (code 'A' + (c - 10))
+    | _ -> assert false
+
+  let hex_of_byte i : string =
+    String.init 2 (function
+      | 0 -> hex_of_nibble (i / 16)
+      | 1 -> hex_of_nibble (i mod 16)
+      | _ -> assert false)
+
+  let hex_of_char c = hex_of_byte (Char.code c)
+
+  let hex_of_bytes bytes : string =
+    let open Stdlib.String in
+    of_seq (Stdlib.Seq.flat_map (fun c -> to_seq (hex_of_char c)) (to_seq bytes))
+end
+
+module Base32 =
+struct
+  let decode input =
+    let len = String.length input in
+    let buf = Buffer.create (len / 2) in
+    let rec evac = function
+      | v, b when b >= 8 ->
+        let b' = b - 8 in
+        Buffer.add_uint8 buf (v lsr b');
+        evac (v land (1 lsl b' - 1), b')
+      | vb -> vb in
+    let b32 a = function
+      | v when v >= 'A' && v <= 'Z' -> a lsl 5 lor (Char.code v - 65)
+      | v when v >= '2' && v <= '7' -> a lsl 5 lor (Char.code v - 24)
+      | '=' -> a
+      | _ -> raise (Invalid_argument "Char out of base32 alphabet") in
+      let pump (v, b) c = evac (b32 v c, b + 5) in
+    try
+      ignore (Seq.fold_left pump (0, 0) (String.to_seq input));
+      Ok (Buffer.contents buf)
+    with Invalid_argument s -> Error s
+
+  let encode input =
+    let len = String.length input in
+    let buf = Buffer.create (len * 2) in
+    let b32 = function
+      | v when v <= 25 -> 65 + v
+      | v -> 24 + v in
+    let rec evac = function
+      | v, b when b >= 5 ->
+        let b' = b - 5 in
+        Buffer.add_uint8 buf (b32 (v lsr b'));
+        evac (v land (1 lsl b' - 1), b')
+      | vb -> vb
+    in
+    let pump (v, b) c = evac (v lsl 8 lor (Char.code c land 0xFF), b + 8) in
+    let v, b = Seq.fold_left pump (0, 0) (String.to_seq input) in
+    if b > 0 then ignore (evac (v lsl 4, b + 4));
+    Buffer.contents buf
+end
+
+module String =
+struct
+
+  let implode cs =
+    let buf = Buffer.create 80 in
+    List.iter (Buffer.add_char buf) cs;
+    Buffer.contents buf
+
+  let implode_map f cs =
+    let buf = Buffer.create 80 in
+    List.iter (fun c -> Buffer.add_char buf (f c)) cs;
+    Buffer.contents buf
+
+  let explode s =
+    let cs = ref [] in
+    for i = String.length s - 1 downto 0 do cs := s.[i] :: !cs done;
+    !cs
+
+  let explode_map f s =
+    let cs = ref [] in
+    for i = String.length s - 1 downto 0 do cs := f s.[i] :: !cs done;
+    !cs
+
+  (** Stack.fold (fun x y -> y ^ c ^ x) "" (String.split s c) == s *)
+  let split s c =
+    let len = String.length s in
+    let rec loop i =
+      if i > len then [] else
+      let j = try String.index_from s i c with Not_found -> len in
+      String.sub s i (j - i) :: loop (j + 1)
+    in loop 0
+
+  let breakup s n =
+    let rec loop i =
+      let len = min n (String.length s - i) in
+      if len = 0 then [] else String.sub s i len :: loop (i + len)
+    in loop 0
+
+  let rec find_from_opt f s i =
+    if i = String.length s then
+      None
+    else if f s.[i] then
+      Some i
+    else
+      find_from_opt f s (i + 1)
+
+  let chop_prefix prefix s =
+    let prefix_len = String.length prefix in
+    let s_len = String.length s in
+    if s_len < prefix_len then
+      None
+    else if String.sub s 0 prefix_len = prefix then
+      Some (String.sub s prefix_len (s_len - prefix_len))
+    else
+      None
+
+  let starts_with prefix s = (* in OCaml 4.13 *)
+    match chop_prefix prefix s with
+    | Some _ -> true
+    | _ -> false
+
+  let chop_suffix suffix s =
+    let suffix_len = String.length suffix in
+    let s_len = String.length s in
+    if s_len < suffix_len then
+      None
+    else if String.sub s (s_len - suffix_len) suffix_len = suffix then
+      Some (String.sub s 0 (s_len - suffix_len))
+    else
+      None
+
+  let lightweight_escaped s =
+    let buf = Buffer.create (String.length s) in
+    for i = 0 to String.length s - 1 do
+      match s.[i] with
+      | '\"' | '\'' | '\\' as c ->
+        Buffer.add_char buf '\\'; Buffer.add_char buf c
+      | '\n' -> Buffer.add_string buf "\\n"
+      | '\r' -> Buffer.add_string buf "\\r"
+      | '\t' -> Buffer.add_string buf "\\t"
+      | c -> Buffer.add_char buf c
+    done;
+    Buffer.contents buf
+end
+
+module Utf8 =
+struct
+  type t = int list
+  exception Utf8 = Wasm.Utf8.Utf8
+
+  let rec is_valid s = is_valid' (String.explode_map Char.code s)
+  and is_valid' = function
+    | [] -> true
+    | b1::bs when b1 < 0x80 ->
+      is_valid' bs
+    | b1::bs when b1 < 0xc0 -> false
+    | b1::b2::bs when b1 < 0xe0 ->
+      (b2 land 0xc0 = 0x80) && is_valid' bs
+    | b1::b2::b3::bs when b1 < 0xf0 ->
+      (b2 land 0xc0 = 0x80) && (b3 land 0xc0 = 0x80) && is_valid' bs
+    | b1::b2::b3::b4::bs when b1 < 0xf8 ->
+      (b2 land 0xc0 = 0x80) && (b3 land 0xc0 = 0x80) && (b4 land 0xc0 = 0x80) && is_valid' bs
+    | _ -> false
+
+  let con b = if b land 0xc0 = 0x80 then b land 0x3f else raise Utf8
+  let code min n =
+    if n < min || (0xd800 <= n && n < 0xe000) || n >= 0x110000 then raise Utf8
+    else n
+
+  let rec decode s = decode' [] (String.explode_map Char.code s)
+  and decode' acc = function
+    | [] -> List.rev acc
+    | b1::bs when b1 < 0x80 ->
+      decode' (code 0x0 b1 :: acc) bs
+    | b1::bs when b1 < 0xc0 -> raise Utf8
+    | b1::b2::bs when b1 < 0xe0 ->
+      decode' (code 0x80 ((b1 land 0x1f) lsl 6 + con b2) :: acc) bs
+    | b1::b2::b3::bs when b1 < 0xf0 ->
+      decode' (code 0x800 ((b1 land 0x0f) lsl 12 + con b2 lsl 6 + con b3) :: acc) bs
+    | b1::b2::b3::b4::bs when b1 < 0xf8 ->
+      decode' (code 0x10000 ((b1 land 0x07) lsl 18 + con b2 lsl 12 + con b3 lsl 6 + con b4) :: acc) bs
+    | _ -> raise Utf8
+
+  let con n = 0x80 lor (n land 0x3f)
+
+  let rec encode ns = String.implode_map Char.chr (encode' [] ns)
+  and encode' acc = function
+    | [] -> List.rev acc
+    | n::ns when n < 0 -> raise Utf8
+    | n::ns when n < 0x80 ->
+      encode' (n :: acc) ns
+    | n::ns when n < 0x800 ->
+      encode' (con n :: 0xc0 lor (n lsr 6) :: acc) ns
+    | n::ns when n < 0x10000 ->
+      encode' (con n :: con (n lsr 6) :: 0xe0 lor (n lsr 12) :: acc) ns
+    | n::ns when n < 0x110000 ->
+      encode' (con n :: con (n lsr 6) :: con (n lsr 12) :: 0xf0 lor (n lsr 18) :: acc) ns
+    | _ -> raise Utf8
+end
+
+module List =
+struct
+  let equal p xs ys =
+    try List.for_all2 p xs ys with _ -> false
+
+  let rec make n x = make' n x []
+  and make' n x xs =
+    if n = 0 then xs else make' (n - 1) x (x::xs)
+
+  let rec table n f = table' n f []
+  and table' n f xs =
+    if n = 0 then xs else table' (n - 1) f (f (n - 1) :: xs)
+
+  let group f l =
+    let rec grouping acc = function
+      | [] -> acc
+      | hd::tl ->
+         let l1,l2 = List.partition (f hd) tl in
+         grouping ((hd::l1)::acc) l2
+    in grouping [] l
+
+  let rec take n xs =
+    match n, xs with
+    | _ when n <= 0 -> []
+    | n, x::xs' when n > 0 -> x :: take (n - 1) xs'
+    | _ -> failwith "take"
+
+  let rec drop n xs =
+    match n, xs with
+    | 0, _ -> xs
+    | n, _::xs' when n > 0 -> drop (n - 1) xs'
+    | _ -> failwith "drop"
+
+  let split_at n xs =
+    if n <= List.length xs
+    then (take n xs, drop n xs)
+    else (xs, [])
+
+  let hd_opt = function
+    | x :: _ -> Some x
+    | _ -> None
+
+  let rec last = function
+    | [x] -> x
+    | _::xs -> last xs
+    | [] -> failwith "last"
+
+  let last_opt = function
+    | [] -> None
+    | xs -> Some (last xs)
+
+  let rec split_last = function
+    | [x] -> [], x
+    | x::xs -> let ys, y = split_last xs in x::ys, y
+    | [] -> failwith "split_last"
+
+  let rec index_where p xs = index_where' p xs 0
+  and index_where' p xs i =
+    match xs with
+    | [] -> None
+    | x::xs' when p x -> Some i
+    | x::xs' -> index_where' p xs' (i+1)
+
+  let index_of x = index_where ((=) x)
+
+  let rec compare f xs ys =
+    match xs, ys with
+    | [], [] -> 0
+    | [], _ -> -1
+    | _, [] -> +1
+    | x::xs', y::ys' ->
+      match f x y with
+      | 0 -> compare f xs' ys'
+      | n -> n
+
+  let rec is_ordered f xs =
+    match xs with
+    | [] | [_] -> true
+    | x1::x2::xs' ->
+      match f x1 x2 with
+      | -1 | 0 -> is_ordered f (x2::xs')
+      | _ -> false
+
+  let rec is_strictly_ordered f xs =
+    match xs with
+    | [] | [_] -> true
+    | x1::x2::xs' ->
+      match f x1 x2 with
+      | -1 -> is_strictly_ordered f (x2::xs')
+      | _ -> false
+
+  let rec iter_pairs f = function
+    | [] -> ()
+    | x::ys -> List.iter (fun y -> f x y) ys; iter_pairs f ys
+
+  let rec is_prefix equal prefix list =
+    match prefix with
+    | [] -> true
+    | hd :: tl ->
+      (match list with
+       | [] -> false
+       | hd' :: tl' -> equal hd hd' && is_prefix equal tl tl')
+end
+
+module List32 =
+struct
+  let rec make n x = make' n x []
+  and make' n x xs =
+    if n = 0l then xs else make' (Int32.sub n 1l) x (x::xs)
+
+  let rec length xs = length' xs 0l
+  and length' xs n =
+    match xs with
+    | [] -> n
+    | _::xs' when n < Int32.max_int -> length' xs' (Int32.add n 1l)
+    | _ -> failwith "length"
+
+  let rec nth xs n =
+    match n, xs with
+    | 0l, x::_ -> x
+    | n, _::xs' when n > 0l -> nth xs' (Int32.sub n 1l)
+    | _ -> failwith "nth"
+
+  let rec take n xs =
+    match n, xs with
+    | 0l, _ -> []
+    | n, x::xs' when n > 0l -> x :: take (Int32.sub n 1l) xs'
+    | _ -> failwith "take"
+
+  let rec drop n xs =
+    match n, xs with
+    | 0l, _ -> xs
+    | n, _::xs' when n > 0l -> drop (Int32.sub n 1l) xs'
+    | _ -> failwith "drop"
+end
+
+module Array =
+struct
+  include Array
+
+  let rec compare f x y = compare' f x y 0
+  and compare' f x y i =
+    match i = Array.length x, i = Array.length y with
+    | true, true -> 0
+    | true, false -> -1
+    | false, true -> +1
+    | false, false ->
+      match f x.(i) y.(i) with
+      | 0 -> compare' f x y (i + 1)
+      | n -> n
+
+  let for_all2 p xs ys =
+    if Array.length xs <> Array.length ys then failwith "for_all2"
+    else
+      let rec go i =
+        i = Array.length xs || (p xs.(i) ys.(i) && go (i + 1))
+      in
+      go 0
+end
+
+module Array32 =
+struct
+  let make n x =
+    if n < 0l || Int64.of_int32 n > Int64.of_int max_int then
+      raise (Invalid_argument "Array32.make");
+    Array.make (Int32.to_int n) x
+
+  let length a = Int32.of_int (Array.length a)
+
+  let index_of_int32 i =
+    if i < 0l || Int64.of_int32 i > Int64.of_int max_int then -1 else
+    Int32.to_int i
+
+  let get a i = Array.get a (index_of_int32 i)
+  let set a i x = Array.set a (index_of_int32 i) x
+  let blit a1 i1 a2 i2 n =
+    Array.blit a1 (index_of_int32 i1) a2 (index_of_int32 i2) (index_of_int32 n)
+end
+
+module Bigarray =
+struct
+  open Bigarray
+
+  module Array1_64 =
+  struct
+    let create kind layout n =
+      if n < 0L || n > Int64.of_int max_int then
+        raise (Invalid_argument "Bigarray.Array1_64.create");
+      Array1.create kind layout (Int64.to_int n)
+
+    let dim a = Int64.of_int (Array1.dim a)
+
+    let index_of_int64 i =
+      if i < 0L || i > Int64.of_int max_int then -1 else
+      Int64.to_int i
+
+    let get a i = Array1.get a (index_of_int64 i)
+    let set a i x = Array1.set a (index_of_int64 i) x
+    let sub a i n = Array1.sub a (index_of_int64 i) (index_of_int64 n)
+  end
+end
+
+module Seq =
+struct
+  let rec for_all p s = match s () with
+    | Seq.Nil -> true
+    | Seq.Cons (x, s') -> p x && for_all p s'
+end
+
+module Option =
+struct
+  let get o x =
+    match o with
+    | Some y -> y
+    | None -> x
+
+  let map2 (f : 'a -> 'b -> 'c) (a : 'a option) (b : 'b option) =
+    match a, b with
+    | Some a, Some b -> Some (f a b)
+    | _ -> None
+
+  module Syntax =
+  struct
+    let (let+) x f = Option.map f x
+    let (and+) x y = match x, y with
+      | Some x, Some y -> Some (x, y)
+      | _  -> None
+    let (let*) = Option.bind
+  end
+end
+
+module Promise =
+struct
+  type 'a t = 'a option ref
+
+  exception Promise
+
+  let make () = ref None
+  let make_fulfilled x = ref (Some x)
+  let fulfill p x = if !p = None then p := Some x else raise Promise
+  let is_fulfilled p = !p <> None
+  let value_opt p = !p
+  let value p = match !p with Some x -> x | None -> raise Promise
+  let lazy_value p f =
+    begin
+      if not (is_fulfilled p) then
+      let x = f () in
+      (* Evaluating f might have actually fulfilled this. We assume f to be pure
+         (or at least be idempotent), and do not try to update it again.
+      *)
+      if not (is_fulfilled p) then fulfill p x
+    end;
+    value p
+end
+
+module AllocOnUse =
+struct
+  (*
+  A slighty more elaborate form of a promise: It describes something that can
+  be allocated, defined, and used (e.g. a Wasm function with a function id). It
+  will only be allocated if it is both defined and used. Cyclic use is supported,
+  e.g. the code that defines the thing will already be able to use it.
+
+  Beware: Calling def twice is allowed, the second one will be ignored.
+
+  Re `… Lazy.t` vs. `unit -> …`:
+  We use `… Lazy.t` for thunks that will be called exactly once (e.g. producing the
+  definition), but `unit -> …` for functions called many times with different
+  results (e.g. allocation)
+  *)
+
+  type ('a, 'b) alloc = unit -> ('a * ('b -> unit))
+
+  type ('a, 'b) t' =
+    | UnUsedUnDef of ('a, 'b) alloc
+    | UsedUnDef of 'a * ('b -> unit)
+    | UnUsedDef of ('a, 'b) alloc * ('b Lazy.t)
+    | UsedDef of 'a
+  type ('a, 'b) t = ('a, 'b) t' ref
+
+  let make : ('a, 'b) alloc -> ('a, 'b) t =
+    fun alloc -> ref (UnUsedUnDef alloc)
+
+  let def : ('a, 'b) t -> ('b Lazy.t) -> unit =
+    fun r mk -> match !r with
+      | UnUsedUnDef alloc ->
+        r := UnUsedDef (alloc, mk)
+      | UsedUnDef (a, fill) ->
+        r := UsedDef a;
+        fill (Lazy.force mk);
+      | UnUsedDef _ | UsedDef _ ->
+        ()
+
+  let use : ('a, 'b) t -> 'a =
+    fun r -> match !r with
+      | UnUsedUnDef alloc ->
+        let (a, fill) = alloc () in
+        r := UsedUnDef (a, fill);
+        a
+      | UsedUnDef (a, fill) ->
+        a
+      | UnUsedDef (alloc, mk) ->
+        let (a, fill) = alloc () in
+        r := UsedDef a;
+        fill (Lazy.force mk);
+        a
+      | UsedDef a ->
+        a
+end
+
+module FilePath =
+struct
+  let segments p = String.split p '/'
+
+  let normalise file_path =
+    if file_path = "" then "" else
+    let has_trailing_slash =
+      Stdlib.Option.is_some (String.chop_suffix "/" file_path) in
+    let has_leading_slash = not (Filename.is_relative file_path) in
+    let acc = Stack.create () in
+    segments file_path |> Stdlib.List.iter
+     (function
+      | "" -> ()
+      | "." -> ()
+      | ".." ->
+         if Stack.is_empty acc || Stack.top acc = ".."
+         then Stack.push ".." acc
+         else ignore (Stack.pop acc)
+      | segment -> Stack.push segment acc);
+    let result = Stack.fold (fun x y -> y ^ "/" ^ x) "" acc in
+    if result = ""
+    then
+      (if has_leading_slash then "/" else
+      (if has_trailing_slash then "./" else "."))
+    else
+      (if has_leading_slash then "/" else "") ^
+      (if has_trailing_slash then result
+      else Stdlib.Option.get (String.chop_suffix "/" result))
+
+  let relative_to base path =
+    String.chop_prefix
+      (normalise (base ^ "/"))
+      (normalise path)
+  let make_absolute base path =
+    if not (Filename.is_relative path)
+    then path
+    else normalise (Filename.concat base path)
+
+  let is_subpath base path =
+    if Filename.is_relative base || Filename.is_relative path
+    then assert false
+    (* We can't just check for prefixing on the string because
+       /path/tosomething is not a subpath of /path/to*)
+    else List.is_prefix (=) (segments base) (segments path)
+
+  (* TODO: this function does not belong here *)
+  (* When opening is successful, but there is a case mismatch (because the file
+     system is case insensitive), generate a warning. *)
+  let open_in path : in_channel * string list =
+    let ic = Stdlib.open_in path in
+    let dir, base = Filename.(dirname path, basename path) in
+    (* TODO: we could check dir too, but it's hairier *)
+    let files = Sys.readdir dir in
+    if not (Array.exists (fun name -> name = base) files) then
+      begin
+        let open Stdlib.String in
+        let lbase = lowercase_ascii base in
+        if Array.exists (fun name -> lowercase_ascii name = lbase) files then
+          let message = Printf.sprintf "file %s has been located with a name of different case" base in
+          ic, [message]
+        else
+          let message = Printf.sprintf "file %s has been located with a different name" base in
+          ic, [message]
+      end
+    else ic, []
+end
+
+
+[@@@warning "-60-32"]
+module Test =
+struct
+(* need to put tests in this file because
+   dune does not like it if other files in lib depend on Lib
+   Maybe we should break up lib into its components, now that
+   it is a dune library.
+*)
+  let%test "bytes_of_hex DEADBEEF" =
+    Hex.bytes_of_hex "DEADBEEF" = "\xDE\xAD\xBE\xEF"
+  let%test "bytes_of_hex 0000" =
+    Hex.bytes_of_hex "0000" = "\x00\x00"
+  let%test "bytes_of_hex empty" =
+    Hex.bytes_of_hex "" = ""
+
+  let%test "int_of_hex_byte 00" = Hex.int_of_hex_byte "00" = 0
+  let%test "int_of_hex_byte AB" = Hex.int_of_hex_byte "AB" = 0xAB
+  let%test "int_of_hex_byte FF" = Hex.int_of_hex_byte "FF" = 0xFF
+
+  (* see https://crccalc.com/ *)
+  let %test "crc8 DEADBEEF" = CRC.crc8 "\xDE\xAD\xBE\xEF" = 0xCA
+  let %test "crc8 empty" = CRC.crc8 "" = 0x00
+  let %test "crc8 0000" = CRC.crc8 "\x00\x00" = 0x00
+
+  let%test "Base32.decode empty" = Base32.decode "" = Ok ""
+  let%test "Base32.decode 0000000000" = Base32.decode "AAAAAAA" = Ok "\x00\x00\x00\x00"
+  let%test "Base32.decode 000000000000" = Base32.decode "AAAAAAAA" = Ok "\x00\x00\x00\x00\x00"
+  let%test "Base32.decode DEADBEEF" = Base32.decode "32W353Y" = Ok "\xDE\xAD\xBE\xEF"
+
+  let%test "Utf8.decode prim emoji" = Wasm.Utf8.encode (Utf8.decode "mo:⛔") = "mo:⛔"
+  let%test "Utf8.encode prim emoji" = Utf8.encode (Wasm.Utf8.decode "mo:⛔") = "mo:⛔"
+
+  let%test "Utf8.encode decode large" =
+    (* this test overflows if we use Wasm.Utf8 functions instead *)
+    let b = Buffer.create 16 in
+    for i = 0 to 65535*16 do
+      Buffer.add_char b (Char.chr (i land 0x7F))
+    done;
+    let s = Buffer.contents b in
+    Utf8.is_valid s &&
+    Utf8.encode (Utf8.decode s) = s
+
+  let%test "Utf8.is_valid agrees with Utf8.decode for single-byte strings" =
+    let rec loop f i =
+      if i > 0xFF then true
+      else if not (f i) then false
+      else loop f (i + 1)
+    in loop (fun i ->
+      let s = Utf8.encode [i] in
+      Utf8.is_valid s = (try (ignore (Utf8.decode s); true) with Utf8.Utf8 -> false)
+    ) 0
+
+  let%test "String.split \"\"" = String.split "" '/' = [""]
+  let%test "String.split \"/\"" = String.split "/" '/' = ["";""]
+  let%test "String.split \"//\"" = String.split "//" '/' = ["";"";""]
+  let%test "String.split \"a/b/c\"" = String.split "a/b/c" '/' = ["a";"b";"c"]
+  let%test "String.split \"a/b//c\"" = String.split "a/b//c" '/' = ["a";"b";"";"c"]
+
+  (* FilePath tests *)
+  let normalise_test_case input expected =
+    let actual = FilePath.normalise input in
+    Stdlib.String.equal actual expected ||
+      (Printf.printf
+         "\nExpected: %s\nActual: %s\n"
+         expected
+         actual;
+       false)
+
+  let relative_to_test_case root contained expected =
+    let actual = FilePath.relative_to root contained in
+    let show = function
+      | None -> "None"
+      | Some s -> "Some " ^ s in
+    Stdlib.Option.equal Stdlib.String.equal actual expected ||
+      (Printf.printf
+         "\nExpected: %s\nActual: %s\n"
+         (show expected)
+         (show actual);
+       false)
+
+  let%test "it removes leading current directory" =
+    normalise_test_case "./ListClient.mo" "ListClient.mo"
+
+  let%test "it removes leading `./` for relative paths" =
+    normalise_test_case "./lib/foo" "lib/foo"
+
+  let%test "it removes duplicate `//`s" =
+    normalise_test_case ".//lib/foo" "lib/foo"
+
+  let%test "it preserves trailing slashes" =
+    normalise_test_case "lib/foo/" "lib/foo/"
+
+  let%test "it combines multiple trailing slashes" =
+    normalise_test_case "lib/foo//" "lib/foo/"
+
+  let%test "it drops intermediate references to the `.` directory" =
+    normalise_test_case "lib/./foo/" "lib/foo/"
+
+  let%test "it applies parent directory traversals" =
+    normalise_test_case "lib/../foo/" "foo/"
+
+  let%test "it keeps parent directory references at the start of a path" =
+    normalise_test_case "../foo/lib" "../foo/lib"
+
+  let%test "it keeps multiple parent directory references at the start of a path" =
+    normalise_test_case "../../foo/lib" "../../foo/lib"
+
+  let%test "it does everything at once" =
+    normalise_test_case "../foo//.././lib" "../lib"
+
+  let%test "it handles absolute paths" =
+    normalise_test_case "/foo" "/foo"
+
+  let%test "it handles absolute directory paths" =
+    normalise_test_case "/foo/./lib/" "/foo/lib/"
+
+  let%test "it handles ." =
+    normalise_test_case "." "."
+
+  let%test "it handles ./" =
+    normalise_test_case "./." "."
+
+  let%test "it handles ./" =
+    normalise_test_case "./" "./"
+
+  let%test "it handles .//" =
+    normalise_test_case ".//" "./"
+
+  let%test "it makes one absolute path relative to another one" =
+    relative_to_test_case
+      "/home/project"
+      "/home/project/src/main.mo"
+      (Some "src/main.mo")
+
+  let%test "it's robust in the face of trailing slashes" =
+    relative_to_test_case
+      "/home/project/"
+      "/home/project/src/main.mo"
+      (Some "src/main.mo")
+
+  let%test "it makes a file path relative to a path" =
+    relative_to_test_case
+      "/home/project"
+      "/home/project/main.mo"
+      (Some "main.mo")
+
+  let%test "it preserves trailing slashes" =
+    relative_to_test_case
+      "/home/project/"
+      "/home/project/src/"
+      (Some "src/")
+
+  let%test "it handles directory traversals" =
+    relative_to_test_case
+      "/home/project"
+      "/home/project/src/../lib/"
+      (Some "lib/")
+
+  let%test "it fails to make disjoint paths relative to one another" =
+    relative_to_test_case
+      "/home/project"
+      "/home/main.mo"
+      None
+
+  let%test "it handles relative paths" =
+    relative_to_test_case
+      "project/src"
+      "project/src/Main.mo"
+      (Some "Main.mo")
+end
+
+
+
+ + + diff --git a/coverage/linking/linkModule.ml.html b/coverage/linking/linkModule.ml.html new file mode 100644 index 00000000000..b86d828ab1a --- /dev/null +++ b/coverage/linking/linkModule.ml.html @@ -0,0 +1,2799 @@ + + + + + linkModule.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+
+
(*
+The type for a dynamic library: A normal WebAssembly module
+plus the dylink section.
+*)
+
+open Wasm_exts.Ast
+open Wasm.Source
+open Wasm_exts.CustomModule
+
+(*
+This module is a first stab that should be functionally working, but will go
+through further refactoring before we are happy with it. Things to do:
+
+ * much code (finding imports, counting) is duplicated for globals and
+   functions. This could be refactored into general functions and predicates.
+ * There are multiple AST traversals. These could be turned into a single one
+   (taking multiple rename functions) or even more generally taking a record
+   of functions for each syntactic category.
+*)
+
+(*
+Resolving GOT.func and GOT.mem imports
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+GOT.func and GOT.mem imports arise from function and data pointers,
+respectively, in languages with pointers (e.g. C and Rust). The idea is that if
+a shared library exposes a function/data pointer the entire process should use
+the same pointer for the function/data so that the pointer arithmetic and
+comparisons will work. For example, this C code:
+
+    __attribute__ ((visibility("default")))
+    int f0(int x, int y)
+    {
+        return x + y;
+    }
+
+    __attribute__ ((visibility("default")))
+    int (\*f1(void)) (int x, int y)
+    {
+        return &f0;
+    }
+
+generates this GOT.func import:
+
+    (import "GOT.func" "f0" (global (;N;) (mut i32)))
+
+The host is responsible of allocating a table index for this function and
+resolving the import to the table index for `f0` so that this code in the
+importing module would work:
+
+    assert(f1() == f0);
+
+Note that the definition of `f1` is in the *imported* module and this assertion
+is in the *importing* module.
+
+Similarly exposing a data pointer generates a GOT.mem import. All GOT.mem
+imports to a symbol should resolve to the same constant to support equality as
+above, and additionally pointer arithmetic.
+
+(Pointer arithmetic on function pointers are undefined behavior is C and is not
+supported by clang's wasm backend)
+
+Normally this stuff is for dynamic linking, but we want to link the RTS
+statically, so we resolve these imports during linking. Currently we only
+support GOT.func imports, but implementing GOT.mem imports would be similar.
+Secondly, we only support GOT.func imports in the module that defines the
+function that we take the address of. This currently works as moc-generated code
+doesn't import function addresses from the RTS.
+
+We resolve GOT.func imports in two steps:
+
+- After loading the RTS module we generate a list of (global index, function
+  index) pairs of GOT.func imports. In the example above, global index is N and
+  function index is the index of f0 in the defining module (the RTS).
+
+  This is implemented in `collect_got_func_imports`.
+
+- After merging the sections we add the functions to the table and replace
+  `GOT.func` imports with globals to the functions' table indices.
+
+  Note that we don't reuse table entries when a function is already in the
+  table, to avoid breakage when [ref-types] proposal is implemented, which will
+  allow mutating table entries.
+
+  [ref-types]: https://github.com/WebAssembly/reference-types
+
+  This is implemented in `replace_got_func_imports`.
+
+See also the test `test/ld/fun-ptr` for a concrete exaple of GOT.func generation
+and resolving.
+*)
+
+(* Linking *)
+
+type imports = (int32 * name) list
+
+let phrase f x = { x with it = f x.it }
+
+let map_module f (em : extended_module) = { em with module_ = f em.module_ }
+let map_name_section f (em : extended_module) = { em with name = f em.name }
+
+(* Generic functions about import and export lists *)
+
+let get_import is_thing j m =
+  let open Int32 in
+  let rec go i = function
+    | [] -> assert false
+    | imp::is ->
+      if is_thing imp.it.idesc.it
+      then
+        if i = j
+        then imp
+        else go (add i 1l) is
+      else go i is
+  in go 0l m.imports
+
+let find_imports is_thing libname m : imports =
+  let name = Lib.Utf8.decode libname in
+  let rec go i acc = function
+    | [] -> List.rev acc
+    | imp::is ->
+      if is_thing imp.it.idesc.it
+      then
+        if imp.it.module_name = name
+        then go (i + 1) ((Int32.of_int i, imp.it.item_name) :: acc) is
+        else go (i + 1) acc is
+      else go i acc is
+  in go 0 [] m.imports
+
+let remove_imports is_thing resolved : module_' -> module_' = fun m ->
+  let rec go i = function
+    | [] -> []
+    | (imp::is) ->
+      if is_thing imp.it.idesc.it
+      then
+        if List.mem_assoc i resolved
+        then go (Int32.add i 1l) is
+        else imp :: go (Int32.add i 1l) is
+      else imp :: go i is
+  in
+  { m with imports = go 0l m.imports }
+
+let count_imports is_thing m =
+  Lib.List32.length (List.filter (fun i -> is_thing i.it.idesc.it) m.imports)
+
+let remove_export is_thing name : module_' -> module_' = fun m ->
+  let to_remove e =
+    not (is_thing e.it.edesc.it <> None && e.it.name = Lib.Utf8.decode name)
+  in
+  { m with exports = List.filter to_remove m.exports }
+
+module NameMap = Map.Make(struct type t = Wasm.Ast.name let compare = compare end)
+
+type exports = int32 NameMap.t
+
+let find_exports is_thing m : exports =
+  List.fold_left (fun map exp ->
+    match is_thing exp.it.edesc.it with
+    | Some v -> NameMap.add exp.it.name v.it map
+    | _ -> map
+  ) NameMap.empty m.exports
+
+
+(* Predicate to specialize these generic functions to the various entities *)
+
+let is_fun_import = function
+  | FuncImport _ -> true
+  | _ -> false
+
+let is_global_import = function
+  | GlobalImport _ -> true
+  | _ -> false
+
+let is_table_import = function
+  | TableImport _ -> true
+  | _ -> false
+
+let is_memory_import = function
+  | MemoryImport _ -> true
+  | _ -> false
+
+let is_fun_export = function
+  | FuncExport v -> Some v
+  | _ -> None
+
+let is_global_export = function
+  | GlobalExport v -> Some v
+  | _ -> None
+
+
+let get_fun_typ i m : Wasm.Types.func_type =
+  let imports_n = count_imports is_fun_import m in
+  let tyvar =
+    if i < imports_n
+    then
+      match (get_import is_fun_import i m).it.idesc.it with
+      | FuncImport ty -> ty.it
+      | _ -> assert false
+    else
+      let f = Lib.List32.nth m.funcs (Int32.sub i imports_n) in
+      f.it.ftype.it
+    in
+  (Lib.List32.nth m.types tyvar).it
+
+let get_global_typ i m : Wasm.Types.global_type =
+  let imports_n = count_imports is_global_import m in
+  if i < imports_n
+  then
+    match (get_import is_global_import i m).it.idesc.it with
+    | GlobalImport ty -> ty
+    | _ -> assert false
+  else
+    let f = Lib.List32.nth m.globals (Int32.sub i imports_n) in
+    f.it.gtype
+
+(* Utilities related to functions *)
+
+let remove_fun_imports_name_section resolved : name_section -> name_section = fun ns ->
+  let keep (fi, x) = not (List.mem_assoc fi resolved) in
+  { ns with
+    function_names = List.filter keep ns.function_names;
+    locals_names = List.filter keep ns.locals_names;
+  }
+
+let prepend_to_start fi ftype (em : extended_module)  =
+  let imports_n = count_imports is_fun_import em.module_ in
+  let wrap_fi = Int32.add imports_n (Lib.List32.length em.module_.funcs) in
+
+  let wrap_fun = {
+    ftype = ftype @@ no_region;
+    locals = [];
+    body =
+      [ Call (fi @@ no_region) @@ no_region ] @
+      (match em.module_.start with
+        | Some start_fi -> [ Call start_fi @@ no_region ]
+        | None -> [])
+    } @@ no_region in
+
+  { em with
+    module_ =
+      { em.module_ with
+        funcs = em.module_.funcs @ [ wrap_fun ];
+        start = Some (wrap_fi @@ no_region)
+      };
+    name =
+      { em.name with
+        function_names = em.name.function_names @ [ wrap_fi, "link_start" ]
+      }
+  }
+
+let _remove_non_canister_exports (em : extended_module) : extended_module =
+  let is_canister_export (exp : export) = Lib.String.chop_prefix "canister_" (Lib.Utf8.encode exp.it.name) <> None in
+  map_module (fun m -> { m with exports = List.filter is_canister_export m.exports }) em
+
+let remove_non_ic_exports (em : extended_module) : extended_module =
+  (* We assume that every exported function that does not have an entry in the
+   custom types section was only exported for linking, and should not be
+   exported in the final module *)
+  let is_ic_export (exp : export) =
+    Lib.String.chop_prefix "canister_" (Lib.Utf8.encode exp.it.name) <> None ||
+    "_start" = Lib.Utf8.encode exp.it.name
+  in
+
+  let keep_export exp =
+    is_ic_export exp ||
+    match exp.it.edesc.it with
+      | FuncExport _
+      | GlobalExport _ -> false
+      | MemoryExport _
+      | TableExport _ -> true in
+
+  map_module (fun m -> { m with exports = List.filter keep_export m.exports }) em
+
+(* Generic linking logic *)
+
+exception LinkError of string
+
+type renumbering = int32 -> int32
+
+let resolve imports exports : (int32 * int32) list =
+  List.flatten (List.map (fun (fi, name) ->
+    match NameMap.find_opt name exports with
+    | Some fi' -> [ (fi, fi') ]
+    | None -> []
+    ) imports)
+
+let calculate_renaming n_imports1 n_things1 n_imports2 resolved12 resolved21 : (renumbering * renumbering) =
+  let open Int32 in
+
+  let n_imports1' = sub n_imports1 (Lib.List32.length resolved12) in
+  let n_imports2' = sub n_imports2 (Lib.List32.length resolved21) in
+
+  let rec fun1 i =
+    let rec go skipped = function
+      | (imp, exp)::is ->
+        if i < imp then sub i skipped
+        else if i = imp then fun2 exp
+        else go (add skipped 1l) is
+      | [] ->
+        if i < n_imports1
+        then sub i skipped
+        else sub (add i n_imports2') skipped
+    in go 0l resolved12
+  and fun2 i =
+    let rec go skipped = function
+      | (imp, exp)::is ->
+        if i < imp then sub (add i n_imports1') skipped
+        else if i = imp then fun1 exp
+        else go (add skipped 1l) is
+      | [] ->
+        if i < n_imports2
+        then sub (add i n_imports1') skipped
+        else sub (add (add i n_imports1') n_things1) skipped
+    in go 0l resolved21
+  in
+  (fun1, fun2)
+
+
+(* AST traversals *)
+
+let rename_funcs rn : module_' -> module_' = fun m ->
+  let var' = rn in
+  let var = phrase var' in
+
+  let rec instr' = function
+    | Call v -> Call (var v)
+    | Block (ty, is) -> Block (ty, instrs is)
+    | Loop (ty, is) -> Loop (ty, instrs is)
+    | If (ty, is1, is2) -> If (ty, instrs is1, instrs is2)
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let edesc' = function
+    | FuncExport v -> FuncExport (var v)
+    | e -> e in
+  let edesc = phrase edesc' in
+  let export' e = { e with edesc = edesc e.edesc } in
+  let export = phrase export' in
+  let exports = List.map export in
+
+  let segment' f s = { s with init  = f s.init } in
+  let segment f = phrase (segment' f) in
+
+  { m with
+    funcs = funcs m.funcs;
+    exports = exports m.exports;
+    start = Option.map var m.start;
+    elems = List.map (segment (List.map var)) m.elems;
+  }
+
+let rename_globals rn : module_' -> module_' = fun m ->
+  let var' = rn in
+  let var = phrase var' in
+
+  let rec instr' = function
+    | Block (ty, is) -> Block (ty, instrs is)
+    | Loop (ty, is) -> Loop (ty, instrs is)
+    | If (ty, is1, is2) -> If (ty, instrs is1, instrs is2)
+    | GlobalGet v -> GlobalGet (var v)
+    | GlobalSet v -> GlobalSet (var v)
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let const = phrase instrs in
+
+  let global' g = { g with value = const g.value } in
+  let global = phrase global' in
+  let globals = List.map global in
+
+  let table_segment' (s : var list segment') = { s with offset = const s.offset; } in
+  let table_segment = phrase (table_segment') in
+  let table_segments = List.map table_segment in
+
+  let memory_segment' (s : string segment') = { s with offset = const s.offset; } in
+  let memory_segment = phrase (memory_segment') in
+  let memory_segments = List.map memory_segment in
+
+
+  { m with
+    funcs = funcs m.funcs;
+    globals = globals m.globals;
+    elems = table_segments m.elems;
+    data = memory_segments m.data;
+  }
+
+let set_global global value = fun m ->
+  let rec go i = function
+    | [] -> assert false
+    | g::gs when i = Int32.to_int global ->
+      let open Wasm.Types in
+      assert (g.it.gtype = GlobalType (I32Type, Immutable));
+      let g = phrase (fun g' ->
+        { g' with value = [Const (Wasm.Values.I32 value @@ g.at) @@ g.at] @@ g.at }
+      ) g in
+      g :: gs
+    | g::gs -> g :: go (i+1) gs
+  in
+  { m with globals = go 0 m.globals }
+
+let fill_global (global : int32) (value : int32) : module_' -> module_' = fun m ->
+  let rec instr' = function
+    | Block (ty, is) -> Block (ty, instrs is)
+    | Loop (ty, is) -> Loop (ty, instrs is)
+    | If (ty, is1, is2) -> If (ty, instrs is1, instrs is2)
+    | GlobalGet v when v.it = global -> Const (Wasm.Values.I32 value @@ v.at)
+    | GlobalSet v when v.it = global -> assert false
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let const = phrase instrs in
+
+  let global' g = { g with value = const g.value } in
+  let global = phrase global' in
+  let globals = List.map global in
+
+  let table_segment' (s : var list segment') = { s with offset = const s.offset; } in
+  let table_segment = phrase (table_segment') in
+  let table_segments = List.map table_segment in
+
+  let memory_segment' (s : string segment') = { s with offset = const s.offset; } in
+  let memory_segment = phrase (memory_segment') in
+  let memory_segments = List.map memory_segment in
+
+
+  { m with
+    funcs = funcs m.funcs;
+    globals = globals m.globals;
+    elems = table_segments m.elems;
+    data = memory_segments m.data;
+  }
+
+let rename_funcs_name_section rn (ns : name_section) =
+  { ns with
+    function_names = List.map (fun (fi, name) -> (rn fi, name)) ns.function_names;
+    locals_names = List.map (fun (fi, locals) -> (rn fi, locals)) ns.locals_names;
+  }
+
+let rename_funcs_extended rn (em : extended_module) =
+  { em with
+    module_ = rename_funcs rn em.module_;
+    name = rename_funcs_name_section rn em.name;
+  }
+
+let rename_globals_extended rn (em : extended_module) =
+  { em with
+    module_ = rename_globals rn em.module_;
+  }
+
+let rename_types rn m =
+  let ty_var = phrase rn in
+
+  let block_type = function
+    | VarBlockType tv -> VarBlockType (ty_var tv)
+    | ValBlockType vto -> ValBlockType vto in
+
+  let rec instr' = function
+    | CallIndirect tv -> CallIndirect (ty_var tv)
+    | Block (bty, is) -> Block (block_type bty, instrs is)
+    | Loop (bty, is) -> Loop (block_type bty, instrs is)
+    | If (bty, is1, is2) -> If (block_type bty, instrs is1, instrs is2)
+    | i -> i
+  and instr i = phrase instr' i
+  and instrs is = List.map instr is in
+
+  let func' f = { f with ftype = ty_var f.ftype; body = instrs f.body } in
+  let func = phrase func' in
+  let funcs = List.map func in
+
+  let idesc' = function
+    | FuncImport tv -> FuncImport (ty_var tv)
+    | id -> id in
+  let idesc = phrase idesc' in
+  let import' i = { i with idesc = idesc i.idesc } in
+  let import = phrase import' in
+  let imports = List.map import in
+
+  { m with
+    funcs = funcs m.funcs;
+    imports = imports m.imports;
+  }
+
+(* Setting and getting top-level module data *)
+
+let read_global gi (m : module_') : int32 =
+  let n_impo = count_imports is_global_import m in
+  let g = List.nth m.globals (Int32.(to_int (sub gi n_impo))) in
+  let open Wasm.Types in
+  assert (g.it.gtype = GlobalType (I32Type, Immutable));
+  match g.it.value.it with
+  | [{ it = Const {it = Wasm.Values.I32 i;_}; _}] -> i
+  | _ -> assert false
+
+let read_table_size (m : module_') : int32 =
+  (* Assumes there is one table *)
+  let open Wasm.Types in
+  match m.tables with
+  | [t] ->
+    let TableType ({min;max}, _) = t.it.ttype in
+    if Some min <> max
+    then raise (LinkError "Expect fixed sized table in first module")
+    else min
+  | _ -> raise (LinkError "Expect one table in first module")
+
+let set_memory_size new_size_bytes : module_' -> module_' = fun m ->
+  let open Wasm.Types in
+  let page_size = Int32.of_int (64*1024) in
+  let new_size_pages = Int32.(add (div new_size_bytes page_size) 1l) in
+  match m.memories with
+  | [t;t1] ->
+    { m with
+      memories = [(phrase (fun m ->
+        { mtype = MemoryType ({min = new_size_pages; max = None}) }
+        ) t); t1]
+    }
+  | [t] ->
+    { m with
+      memories = [phrase (fun m ->
+        { mtype = MemoryType ({min = new_size_pages; max = None}) }
+      ) t]
+    }
+  | _ -> raise (LinkError "Expect one memory in first module")
+
+let set_table_size new_size : module_' -> module_' = fun m ->
+  let open Wasm.Types in
+  match m.tables with
+  | [t] ->
+    { m with
+      tables = [ phrase (fun t ->
+        let TableType (_, ty) = t.ttype in
+        { ttype = TableType ({min = new_size; max = Some new_size}, ty) }
+      ) t ]
+    }
+  | _ -> raise (LinkError "Expect one table in first module")
+
+
+let fill_item_import module_name item_name new_base (m : module_') : module_' =
+  (* We need to find the right import,
+     replace all uses of get_global of that import with the constant,
+     and finally rename all globals
+  *)
+  let base_global =
+    let rec go i = function
+      | [] -> assert false
+      | imp::is -> match imp.it.idesc.it with
+        | GlobalImport _ty
+          when imp.it.module_name = Lib.Utf8.decode module_name &&
+               imp.it.item_name = Lib.Utf8.decode item_name ->
+          Int32.of_int i
+        | GlobalImport _ ->
+          go (i + 1) is
+        | _ ->
+          go i is
+    in go 0 m.imports in
+
+    m |> fill_global base_global new_base
+      |> remove_imports is_global_import [base_global, base_global]
+      |> rename_globals Int32.(fun i ->
+          if i < base_global then i
+          else if i = base_global then assert false
+          else sub i one
+        )
+
+let fill_memory_base_import new_base : module_' -> module_' =
+  fill_item_import "env" "__memory_base" new_base
+
+let fill_table_base_import new_base : module_' -> module_' =
+  fill_item_import "env" "__table_base" new_base
+
+
+(* Concatenation of modules *)
+
+let join_modules
+      (em1 : extended_module) (m2 : module_') (ns2 : name_section)
+      (type_indices : (Wasm.Types.func_type, int32) Hashtbl.t) : extended_module =
+  let m1 = em1.module_ in
+  let joined = 
+    { em1 with
+      module_ = {
+        types = m1.types @ m2.types;
+        globals = m1.globals @ m2.globals;
+        tables = m1.tables @ m2.tables;
+        memories = m1.memories @ m2.memories;
+        funcs = m1.funcs @ m2.funcs;
+        start = m1.start;
+        elems = m1.elems @ m2.elems;
+        data = m1.data @ m2.data;
+        imports = m1.imports @ m2.imports;
+        exports = m1.exports @ m2.exports;
+      };
+      name = {
+        em1.name with
+        function_names = em1.name.function_names @ ns2.function_names;
+        locals_names = em1.name.locals_names @ ns2.locals_names;
+      };
+      motoko = em1.motoko;
+    }
+  in
+  (* If second module has a start, prepend it to the first module's start.
+     OK to use `Hashtbl.find` below as the first module will have a start, so
+     we'll have the unit function in the type section already. *)
+  match m2.start with
+  | None -> joined
+  | Some fi -> prepend_to_start fi.it (Hashtbl.find type_indices (Wasm.Types.FuncType ([], []))) joined
+
+(* The main linking function *)
+
+let check_typ is_thing get_typ string_of m1 m2 (i1, i2) =
+  let t1 = get_typ i1 m1 in
+  let t2 = get_typ i2 m2 in
+  let imp = get_import is_thing i1 m1 in
+  if t1 <> t2 then
+    let msg = Printf.sprintf
+      "Type mismatch when linking %s.%s:\nimport type: %s\nexport type: %s"
+      (string_of_name imp.it.module_name)
+      (string_of_name imp.it.item_name)
+      (string_of t1)
+      (string_of t2)
+    in
+    raise (LinkError msg)
+
+let check_fun_typ =
+  check_typ is_fun_import get_fun_typ Wasm.Types.string_of_func_type
+let check_global_typ =
+  check_typ is_global_import get_global_typ Wasm.Types.string_of_global_type
+
+
+let align p n =
+  let open Int32 in
+  let p = to_int p in
+  shift_left (shift_right_logical (add n (sub (shift_left 1l p) 1l)) p) p
+
+let find_fun_export (name : name) (exports : export list) : var option =
+  List.find_map (fun (export : export) ->
+    if export.it.name = name then
+      match export.it.edesc.it with
+      | FuncExport var -> Some var
+      | _ -> raise (LinkError (Format.sprintf "Export %s is not a function" (Lib.Utf8.encode name)))
+    else
+      None
+  ) exports
+
+let remove_got_func_imports (imports : import list) : import list =
+  let got_func_str = Lib.Utf8.decode "GOT.func" in
+  List.filter (fun import -> import.it.module_name <> got_func_str) imports
+
+(* Merge global list of a module with a sorted (on global index) list of (global
+   index, global) pairs, overriding globals at those indices, and appending
+   left-overs at the end. *)
+let add_globals (globals0 : global list) (insert0 : (int32 * global') list) : global list =
+  let rec go (current_idx : int32) globals insert =
+    match insert with
+    | [] -> globals
+    | (insert_idx, global) :: rest ->
+      if current_idx = insert_idx then
+        (global @@ no_region) :: go (Int32.add current_idx 1l) globals rest
+      else
+        match globals with
+        | [] -> List.map (fun (_, global) -> global @@ no_region) insert
+        | global :: globals -> global :: go (Int32.add current_idx 1l) globals rest
+  in
+  go 0l globals0 insert0
+
+let mk_i32_const (i : int32) =
+  Const (Wasm.Values.I32 i @@ no_region) @@ no_region
+
+let mk_i32_global (i : int32) =
+  { gtype = Wasm.Types.GlobalType (Wasm.Types.I32Type, Wasm.Types.Immutable);
+    value = [mk_i32_const i] @@ no_region }
+
+(* Generate (global index, function index) pairs for GOT.func imports of a
+   module. Uses import and export lists of the module so those should be valid. *)
+let collect_got_func_imports (m : module_') : (int32 * int32) list =
+  let got_func_name = Lib.Utf8.decode "GOT.func" in
+
+  let get_got_func_import (global_idx, imports) import : (int32 * (int32 * int32) list) =
+    if import.it.module_name = got_func_name then
+      (* Found a GOT.func import, find the exported function for it *)
+      let name = import.it.item_name in
+      let fun_idx =
+        match find_fun_export name m.exports with
+        | None -> raise (LinkError (Format.sprintf "Can't find export for GOT.func import %s" (Lib.Utf8.encode name)))
+        | Some export_idx -> export_idx.it
+      in
+      let global_idx =
+        if is_global_import import.it.idesc.it then
+          global_idx
+        else
+          raise (LinkError "GOT.func import is not global")
+      in
+      ( Int32.add global_idx (Int32.of_int 1), (global_idx, fun_idx) :: imports )
+    else
+      let global_idx =
+        if is_global_import import.it.idesc.it then
+          Int32.add global_idx (Int32.of_int 1)
+        else
+          global_idx
+      in
+      ( global_idx, imports )
+  in
+
+  (* (global index, function index) list *)
+  let (_, got_func_imports) =
+    List.fold_left get_got_func_import (0l, []) m.imports
+  in
+
+  got_func_imports
+
+(* Add functions imported from GOT.func to the table, replace GOT.func imports
+   with globals to the table indices.
+
+   `tbe_size` is the size of the table in the merged module before adding
+   GOT.func functions. *)
+let replace_got_func_imports (tbl_size : int32) (imports : (int32 * int32) list) (m : module_') : module_' =
+  (* null check to avoid adding empty elem section *)
+  if imports = [] then
+    m
+  else
+    let imports =
+      List.sort (fun (gbl_idx_1, _) (gbl_idx_2, _) -> compare gbl_idx_1 gbl_idx_2) imports
+    in
+
+    let elems : var list =
+      List.map (fun (_, fun_idx) -> fun_idx @@ no_region) imports
+    in
+
+    let elem_section =
+      { index = 0l @@ no_region; offset = [ mk_i32_const tbl_size ] @@ no_region; init = elems }
+    in
+
+    let globals =
+      List.mapi (fun idx (global_idx, _) -> (global_idx, mk_i32_global (Int32.add tbl_size (Int32.of_int idx)))) imports
+    in
+
+    { m with
+      elems = List.append m.elems [elem_section @@ no_region];
+      imports = remove_got_func_imports m.imports;
+      globals = add_globals m.globals globals
+    }
+
+(* The first argument specifies the global of the first module indicating the
+start of free memory *)
+let link (em1 : extended_module) libname (em2 : extended_module) =
+
+  let global_exports1 = find_exports is_global_export em1.module_ in
+
+  let heap_global =
+    match NameMap.find_opt (Lib.Utf8.decode "__heap_base") global_exports1 with
+    | None -> raise (LinkError "First module does not export __heap_base")
+    | Some gi -> gi in
+
+  let dylink = match em2.dylink with
+    | Some dylink -> dylink
+    | None -> raise (LinkError "Second module does not have a dylink section") in
+
+  (* Beginning of unused space *)
+  let old_heap_start = read_global heap_global em1.module_ in
+  let lib_heap_start = align dylink.memory_alignment old_heap_start in
+  let new_heap_start = align 4l (Int32.add lib_heap_start dylink.memory_size) in
+
+  let old_table_size = read_table_size em1.module_ in
+  let lib_table_start = align dylink.table_alignment old_table_size in
+
+  (* Fill in memory and table base pointers *)
+  let dm2 = em2.module_
+    |> fill_memory_base_import lib_heap_start
+    |> fill_table_base_import lib_table_start in
+
+  let got_func_imports = collect_got_func_imports dm2 in
+
+  (* Link functions *)
+  let fun_required1 = find_imports is_fun_import libname em1.module_ in
+  let fun_required2 = find_imports is_fun_import "env" dm2 in
+  let fun_exports1 = find_exports is_fun_export em1.module_ in
+  let fun_exports2 = find_exports is_fun_export dm2 in
+  (* Resolve imports, to produce a renumbering function: *)
+  let fun_resolved12 = resolve fun_required1 fun_exports2 in
+  let fun_resolved21 = resolve fun_required2 fun_exports1 in
+  let (funs1, funs2) =
+    calculate_renaming
+      (count_imports is_fun_import em1.module_)
+      (Lib.List32.length em1.module_.funcs)
+      (count_imports is_fun_import dm2)
+      fun_resolved12
+      fun_resolved21 in
+
+  List.iter (check_fun_typ em1.module_ dm2) fun_resolved12;
+  List.iter (check_fun_typ dm2 em1.module_) fun_resolved21;
+
+  (* Link globals *)
+  let global_required1 = find_imports is_global_import libname em1.module_ in
+  let global_required2 = find_imports is_global_import "env" dm2 in
+  let global_exports2 = find_exports is_global_export dm2 in
+  (* Resolve imports, to produce a renumbering *)
+  let global_resolved12 = resolve global_required1 global_exports2 in
+  let global_resolved21 = resolve global_required2 global_exports1 in
+  let (globals1, globals2) =
+    calculate_renaming
+      (count_imports is_global_import em1.module_)
+      (Lib.List32.length em1.module_.globals)
+      (count_imports is_global_import dm2)
+      global_resolved12
+      global_resolved21 in
+  assert (global_required1 = []); (* so far, we do not import globals *)
+
+  List.iter (check_global_typ em1.module_ dm2) global_resolved12;
+  List.iter (check_global_typ dm2 em1.module_) global_resolved21;
+
+  (* Rename types in both modules to eliminate duplicate types. *)
+
+  (* Maps function types to their indices in the new module we're creating *)
+  let type_indices : (Wasm.Types.func_type, int32) Hashtbl.t = Hashtbl.create 100 in
+
+  (* Get index of a function type. Creates a new one if we haven't added this
+     type yet. *)
+  let add_or_get_ty (ty : Wasm.Types.func_type) =
+    match Hashtbl.find_opt type_indices ty with
+    | None ->
+      let idx = Int32.of_int (Hashtbl.length type_indices) in
+      Hashtbl.add type_indices ty idx;
+      idx
+    | Some idx ->
+      idx
+  in
+
+  (* Rename a type in a module. First argument is the list of types in the module. *)
+  let ty_renamer (tys : Wasm.Types.func_type phrase list) (t : int32) : int32 =
+    let fun_ty = List.nth tys (Int32.to_int t) in
+    add_or_get_ty fun_ty.it
+  in
+
+  (* Rename types in first module *)
+  let em1_tys =
+    map_module (fun m -> { (rename_types (ty_renamer m.types) m) with types = [] }) em1
+  in
+
+  (* Rename types in second module *)
+  let dm2 =
+    { (rename_types (ty_renamer dm2.types) dm2) with types = [] }
+  in
+
+  (* Generate type section for the final module *)
+  let type_indices_sorted : type_ list =
+    Hashtbl.to_seq type_indices |>
+    List.of_seq |>
+    List.sort (fun (_, idx1) (_, idx2) -> compare idx1 idx2) |>
+    List.map (fun (ty, _) -> ty @@ no_region)
+  in
+
+  (* Inject call to "__wasm_call_ctors" *)
+  let add_call_ctors =
+    match NameMap.find_opt (Lib.Utf8.decode "__wasm_call_ctors") fun_exports2 with
+    | None -> fun em -> em
+    | Some fi -> prepend_to_start (funs2 fi) (add_or_get_ty (Wasm.Types.FuncType ([], [])))
+  in
+
+  let new_table_size =
+    Int32.add (Int32.add lib_table_start dylink.table_size) (Int32.of_int (List.length got_func_imports))
+  in
+
+  let merged = join_modules
+    ( em1_tys
+    |> map_module (fun m -> { m with types = type_indices_sorted })
+    |> map_module (remove_imports is_fun_import fun_resolved12)
+    |> map_name_section (remove_fun_imports_name_section fun_resolved12)
+    |> map_module (remove_imports is_global_import global_resolved12)
+    |> rename_funcs_extended funs1
+    |> rename_globals_extended globals1
+    |> map_module (set_global heap_global new_heap_start)
+    |> map_module (set_memory_size new_heap_start)
+    |> map_module (set_table_size new_table_size)
+    )
+    ( dm2
+    |> remove_imports is_fun_import fun_resolved21
+    |> remove_imports is_global_import global_resolved21
+    |> remove_imports is_memory_import [0l, 0l]
+    |> remove_imports is_table_import [0l, 0l]
+    |> rename_funcs funs2
+    |> rename_globals globals2
+    |> remove_export is_fun_export "__wasm_call_ctors"
+    )
+    ( em2.name
+    |> remove_fun_imports_name_section fun_resolved21
+    |> rename_funcs_name_section funs2
+    )
+    type_indices
+  |> add_call_ctors
+  |> remove_non_ic_exports (* only sane if no additional files get linked in *)
+  in
+
+  (* Rename global and function indices in GOT.func stuff *)
+  let got_func_imports =
+    List.map (fun (global_idx, func_idx) -> (globals2 global_idx, funs2 func_idx)) got_func_imports
+  in
+
+  (* Replace GOT.func imports with globals to function table indices *)
+  let final =
+    replace_got_func_imports (Int32.add lib_table_start dylink.table_size) got_func_imports merged.module_
+  in
+
+  { merged with module_ = final }
+
+
+
+ + + diff --git a/coverage/lowering/desugar.ml.html b/coverage/lowering/desugar.ml.html new file mode 100644 index 00000000000..208a410e494 --- /dev/null +++ b/coverage/lowering/desugar.ml.html @@ -0,0 +1,3521 @@ + + + + + desugar.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+
+
open Ir_def
+open Mo_def
+open Mo_types
+open Mo_values
+open Syntax
+
+open Source
+open Operator
+module S = Syntax
+module I = Ir
+module T = Type
+open Construct
+
+(*
+As a first scaffolding, we translate imported files into let-bound
+variables with a special, non-colliding name, which we sometimes
+want to recognize for better user experience.
+*)
+
+let id_of_full_path (fp : string) : string =
+  "file$" ^ fp
+
+(* Combinators used in the desugaring *)
+
+let apply_sign op l = Syntax.(match op, l with
+  | PosOp, l -> l
+  | NegOp, (NatLit n | IntLit n) -> IntLit (Numerics.Int.sub Numerics.Int.zero n)
+  | NegOp, Int8Lit n -> Int8Lit (Numerics.Int_8.sub Numerics.Int_8.zero n)
+  | NegOp, Int16Lit n -> Int16Lit (Numerics.Int_16.sub Numerics.Int_16.zero n)
+  | NegOp, Int32Lit n -> Int32Lit (Numerics.Int_32.sub Numerics.Int_32.zero n)
+  | NegOp, Int64Lit n -> Int64Lit (Numerics.Int_64.sub Numerics.Int_64.zero n)
+  | _, _ -> raise (Invalid_argument "Invalid signed pattern")
+  )
+
+let phrase f x = { x with it = f x.it }
+
+let typ_note : S.typ_note -> Note.t =
+  fun S.{ note_typ; note_eff } -> Note.{ def with typ = note_typ; eff = note_eff }
+
+let phrase' f x =
+  { x with it = f x.at x.note x.it }
+
+let typed_phrase' f x =
+  let n' = typ_note x.note in
+  { x with it = f x.at n' x.it; note = n' }
+
+
+let rec exps es = List.map exp es
+
+and exp e =
+    (* We short-cut AnnotE here, so that we get the position of the inner expression *)
+    match e.it with
+    | S.AnnotE (e', t) -> exp e'
+    | _ -> typed_phrase' exp' e
+
+and exp' at note = function
+  | S.VarE i -> I.VarE i.it
+  | S.ActorUrlE e ->
+    I.(PrimE (ActorOfIdBlob note.Note.typ, [url e at]))
+  | S.LitE l -> I.LitE (lit !l)
+  | S.UnE (ot, o, e) ->
+    I.PrimE (I.UnPrim (!ot, o), [exp e])
+  | S.BinE (ot, e1, o, e2) ->
+    I.PrimE (I.BinPrim (!ot, o), [exp e1; exp e2])
+  | S.RelE (ot, e1, Operator.NeqOp, e2) ->
+    (notE (primE (I.RelPrim (!ot, Operator.EqOp)) [exp e1; exp e2])).it
+  | S.RelE (ot, e1, o, e2) ->
+    I.PrimE (I.RelPrim (!ot, o), [exp e1; exp e2])
+  | S.ShowE (ot, e) ->
+    I.PrimE (I.ShowPrim !ot, [exp e])
+  | S.ToCandidE es ->
+    let args = exps es in
+    let ts = List.map (fun e -> e.note.Note.typ) args in
+    (primE (I.SerializePrim ts) [seqE args]).it
+  | S.FromCandidE e ->
+    begin match T.normalize note.Note.typ with
+    | T.Opt t -> (primE (I.DeserializeOptPrim (T.as_seq t)) [exp e]).it
+    | _ -> assert false
+    end
+  | S.TupE es -> (tupE (exps es)).it
+  | S.ProjE (e, i) -> (projE (exp e) i).it
+  | S.OptE e -> (optE (exp e)).it
+  | S.DoOptE e ->
+    I.LabelE ("!", note.Note.typ, optE (exp e))
+  | S.BangE e ->
+    let ty = note.Note.typ in
+    let v = fresh_var "v" ty in
+    (switch_optE (exp e)
+      (* case null : *)
+      (breakE "!" (nullE()))
+      (* case ? v : *)
+      (varP v) (varE v) ty).it
+  | S.ObjBlockE (s, _t, dfs) ->
+    obj_block at s None dfs note.Note.typ
+  | S.ObjE (bs, efs) ->
+    obj note.Note.typ efs bs
+  | S.TagE (c, e) -> (tagE c.it (exp e)).it
+  | S.DotE (e, x) when T.is_array e.note.S.note_typ ->
+    (array_dotE e.note.S.note_typ x.it (exp e)).it
+  | S.DotE (e, x) when T.is_prim T.Blob e.note.S.note_typ ->
+    (blob_dotE  x.it (exp e)).it
+  | S.DotE (e, x) when T.is_prim T.Text e.note.S.note_typ ->
+    (text_dotE  x.it (exp e)).it
+  | S.DotE (e, x) ->
+    begin match T.as_obj_sub [x.it] e.note.S.note_typ with
+    | T.Actor, _ -> I.PrimE (I.ActorDotPrim x.it, [exp e])
+    | _ -> I.PrimE (I.DotPrim x.it, [exp e])
+    end
+  | S.AssignE (e1, e2) -> I.AssignE (lexp e1, exp e2)
+  | S.ArrayE (m, es) ->
+    let t = T.as_array note.Note.typ in
+    I.PrimE (I.ArrayPrim (mut m, T.as_immut t), exps es)
+  | S.IdxE (e1, e2) -> I.PrimE (I.IdxPrim, [exp e1; exp e2])
+  | S.FuncE (name, sp, tbs, p, _t_opt, _, e) ->
+    let s, po = match sp.it with
+      | T.Local -> (T.Local, None)
+      | T.Shared (ss, {it = S.WildP; _} ) -> (* don't bother with ctxt pat *)
+        (T.Shared ss, None)
+      | T.Shared (ss, sp) -> (T.Shared ss, Some sp) in
+    let args, wrap, control, res_tys = to_args note.Note.typ po p in
+    let tbs' = typ_binds tbs in
+    let vars = List.map (fun (tb : I.typ_bind) -> T.Con (tb.it.I.con, [])) tbs' in
+    let tys = List.map (T.open_ vars) res_tys in
+    I.FuncE (name, s, control, tbs', args, tys, wrap (exp e))
+  (* Primitive functions in the prelude have particular shapes *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_}, _);note;_}, _, e)
+    when Lib.String.chop_prefix "num_conv" p <> None ->
+    begin match String.split_on_char '_' p with
+    | ["num"; "conv"; s1; s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      I.PrimE (I.NumConvTrapPrim (p1, p2), [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_}, _);note;_}, _, e)
+    when Lib.String.chop_prefix "num_wrap" p <> None ->
+    begin match String.split_on_char '_' p with
+    | ["num"; "wrap"; s1; s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      I.PrimE (I.NumConvWrapPrim (p1, p2), [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "decodeUtf8";_},_);_}, _, e) ->
+    I.PrimE (I.DecodeUtf8, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "encodeUtf8";_},_);_}, _, e) ->
+    I.PrimE (I.EncodeUtf8, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cast";_}, _);note;_}, _, e) ->
+    begin match note.S.note_typ with
+    | T.Func (T.Local, T.Returns, [], ts1, ts2) ->
+      I.PrimE (I.CastPrim (T.seq ts1, T.seq ts2), [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "serialize";_}, _);note;_}, _, e) ->
+    begin match note.S.note_typ with
+    | T.Func (T.Local, T.Returns, [], ts1, ts2) ->
+      I.PrimE (I.SerializePrim ts1, [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "deserialize";_}, _);note;_}, _, e) ->
+    begin match note.S.note_typ with
+    | T.Func (T.Local, T.Returns, [], ts1, ts2) ->
+      I.PrimE (I.DeserializePrim ts2, [exp e])
+    | _ -> assert false
+    end
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "caller";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.ICCallerPrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "time";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemTimePrim, [])
+  (* Cycles *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesBalance";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemCyclesBalancePrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesAvailable";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemCyclesAvailablePrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesRefunded";_},_);_}, _, {it=S.TupE es;_}) ->
+    assert (es = []);
+    I.PrimE (I.SystemCyclesRefundedPrim, [])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesAccept";_},_);_}, _, e) ->
+    I.PrimE (I.SystemCyclesAcceptPrim, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "cyclesAdd";_},_);_}, _, e) ->
+    I.PrimE (I.SystemCyclesAddPrim, [exp e])
+  (* Certified data *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "setCertifiedData";_},_);_}, _, e) ->
+    I.PrimE (I.SetCertifiedData, [exp e])
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE "getCertificate";_},_);_}, _, {it=S.TupE es;_}) ->
+    I.PrimE (I.GetCertificate, [])
+  (* Other *)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_},_);_}, _, {it=S.TupE es;_}) ->
+    I.PrimE (I.OtherPrim p, exps es)
+  | S.CallE ({it=S.AnnotE ({it=S.PrimE p;_},_);_}, _, e) ->
+    I.PrimE (I.OtherPrim p, [exp e])
+  (* Optimizing array.size() *)
+  | S.CallE ({it=S.DotE (e1, proj); _}, _, {it=S.TupE [];_})
+      when T.is_array e1.note.S.note_typ && proj.it = "size" ->
+    I.PrimE (I.OtherPrim "array_len", [exp e1])
+  | S.CallE ({it=S.DotE (e1, proj); _}, _, {it=S.TupE [];_})
+      when T.(is_prim Text) e1.note.S.note_typ && proj.it = "size" ->
+    I.PrimE (I.OtherPrim "text_len", [exp e1])
+  | S.CallE ({it=S.DotE (e1, proj); _}, _, {it=S.TupE [];_})
+      when T.(is_prim Blob) e1.note.S.note_typ && proj.it = "size" ->
+    I.PrimE (I.OtherPrim "blob_size", [exp e1])
+  (* Normal call *)
+  | S.CallE (e1, inst, e2) ->
+    I.PrimE (I.CallPrim inst.note, [exp e1; exp e2])
+  | S.BlockE [] -> (unitE ()).it
+  | S.BlockE [{it = S.ExpD e; _}] -> (exp e).it
+  | S.BlockE ds -> I.BlockE (block (T.is_unit note.Note.typ) ds)
+  | S.NotE e -> (notE (exp e)).it
+  | S.AndE (e1, e2) -> (andE (exp e1) (exp e2)).it
+  | S.OrE (e1, e2) -> (orE (exp e1) (exp e2)).it
+  | S.ImpliesE (e1, e2) -> (impliesE (exp e1) (exp e2)).it
+  | S.OldE e -> (oldE (exp e)).it
+  | S.IfE (e1, e2, e3) -> I.IfE (exp e1, exp e2, exp e3)
+  | S.SwitchE (e1, cs) -> I.SwitchE (exp e1, cases cs)
+  | S.TryE (e1, cs) -> I.TryE (exp e1, cases cs)
+  | S.WhileE (e1, e2) -> (whileE (exp e1) (exp e2)).it
+  | S.LoopE (e1, None) -> I.LoopE (exp e1)
+  | S.LoopE (e1, Some e2) -> (loopWhileE (exp e1) (exp e2)).it
+  | S.ForE (p, {it=S.CallE ({it=S.DotE (arr, proj); _}, _, e1); _}, e2)
+      when T.is_array arr.note.S.note_typ && (proj.it = "vals" || proj.it = "keys")
+    -> (transform_for_to_while p arr proj e1 e2).it
+  | S.ForE (p, e1, e2) -> (forE (pat p) (exp e1) (exp e2)).it
+  | S.DebugE e -> if !Mo_config.Flags.release_mode then (unitE ()).it else (exp e).it
+  | S.LabelE (l, t, e) -> I.LabelE (l.it, t.Source.note, exp e)
+  | S.BreakE (l, e) -> (breakE l.it (exp e)).it
+  | S.RetE e -> (retE (exp e)).it
+  | S.ThrowE e -> I.PrimE (I.ThrowPrim, [exp e])
+  | S.AsyncE (s, tb, e) ->
+    I.AsyncE (s, typ_bind tb, exp e,
+      match note.Note.typ with
+      | T.Async (_, t, _) -> t
+      | _ -> assert false)
+  | S.AwaitE (s, e) -> I.PrimE (I.AwaitPrim s, [exp e])
+  | S.AssertE (Runtime, e) -> I.PrimE (I.AssertPrim, [exp e])
+  | S.AssertE (_, e) -> (unitE ()).it
+  | S.AnnotE (e, _) -> assert false
+  | S.ImportE (f, ir) -> raise (Invalid_argument (Printf.sprintf "Import expression found in unit body: %s" f))
+  | S.PrimE s -> raise (Invalid_argument ("Unapplied prim " ^ s))
+  | S.IgnoreE e ->
+    I.BlockE ([
+      { it = I.LetD ({it = I.WildP; at = e.at; note = T.Any}, exp e);
+        at = e.at; note = ()}], (unitE ()))
+
+and url e at =
+    (* Set position explicitly *)
+    match e.it with
+    | S.AnnotE (e,_) -> url e at
+    | _ ->
+      let e' = exp e in
+      { it = I.(PrimE (BlobOfIcUrl, [e'])); at; note = Note.{def with typ = T.blob; eff = e'.note.eff } }
+
+and lexp e =
+    (* We short-cut AnnotE here, so that we get the position of the inner expression *)
+    match e.it with
+    | S.AnnotE (e,_) -> lexp e
+    | _ -> { e with it = lexp' e.it; note = e.note.S.note_typ }
+
+and lexp' = function
+  | S.VarE i -> I.VarLE i.it
+  | S.DotE (e, x) -> I.DotLE (exp e, x.it)
+  | S.IdxE (e1, e2) -> I.IdxLE (exp e1, exp e2)
+  | _ -> raise (Invalid_argument ("Unexpected expression as lvalue"))
+
+and transform_for_to_while p arr_exp proj e1 e2 =
+  (* for (p in (arr_exp : [_]).proj(e1)) e2 when proj in {"keys", "vals"}
+     ~~>
+     let arr = arr_exp ;
+     let last = arr.size(e1) : Int - 1 ;
+     var indx = 0;
+     if (last == -1) { }
+     else {
+       label l loop {
+         let p = arr[indx]; /* sans bound check */
+         e2;
+         if (indx == last)
+         else { break l }
+         then { indx += 1 }
+       }
+     }
+  *)
+  let arr_typ = arr_exp.note.note_typ in
+  let arrv = fresh_var "arr" arr_typ in
+  let indx = fresh_var "indx" T.(Mut nat) in
+  let indexing_exp = match proj.it with
+    | "vals" -> primE I.DerefArrayOffset [varE arrv; varE indx]
+    | "keys" -> varE indx
+    | _ -> assert false in
+  let last = fresh_var "last" T.int in
+  let lab = fresh_id "done" () in
+  blockE
+    [ letD arrv (exp arr_exp)
+    ; expD (exp e1)
+    ; letD last (primE I.GetLastArrayOffset [varE arrv]) (* -1 for empty array *)
+    ; varD indx (natE Numerics.Nat.zero)]
+    (ifE (primE I.EqArrayOffset [varE last; intE (Numerics.Int.of_int (-1))])
+      (* empty array, do nothing *)
+      (unitE())
+      (labelE lab T.unit (
+        loopE (
+          (blockE
+            [ letP (pat p) indexing_exp
+            ; expD (exp e2)]
+           (ifE (primE I.EqArrayOffset [varE indx; varE last])
+             (* last, exit loop *)
+             (breakE lab (tupE []))
+             (* else increment and continue *)
+             (assignE indx (primE I.NextArrayOffset [varE indx]))))))))
+
+and mut m = match m.it with
+  | S.Const -> Ir.Const
+  | S.Var -> Ir.Var
+
+and obj_block at s self_id dfs obj_typ =
+  match s.it with
+  | T.Object | T.Module ->
+    build_obj at s.it self_id dfs obj_typ
+  | T.Actor ->
+    build_actor at [] self_id dfs obj_typ
+  | T.Memory -> assert false
+
+and build_field {T.lab; T.typ;_} =
+  { it = I.{ name = lab
+           ; var = lab
+           }
+  ; at = no_region
+  ; note = typ
+  }
+
+and build_fields obj_typ =
+    match obj_typ with
+    | T.Obj (_, fields) ->
+      (* TBR: do we need to sort val_fields?*)
+      let val_fields = List.filter (fun {T.lab; T.typ; _} -> not (T.is_typ typ)) fields in
+      List.map build_field val_fields
+    | _ -> assert false
+
+and with_self i typ decs =
+  let_no_shadow (var i typ) (selfRefE typ) decs
+
+and call_system_func_opt name es obj_typ =
+  List.find_map (fun es ->
+    match es.it with
+    | { S.vis = { it = S.System; _ };
+        S.dec = { it = S.LetD( { it = S.VarP id; note; _ }, _, _); at; _ };
+        _ }
+      when id.it = name ->
+      Some (
+        match name with
+        | "timer" when not !Mo_config.Flags.global_timer -> assert false;
+        | "timer" ->
+           let timer =
+             blockE
+               [ expD T.(callE (varE (var id.it note)) [Any]
+                   (varE (var "@set_global_timer" (Func (Local, Returns, [], [Prim Nat64], []))))) ]
+               (unitE ()) in
+           { timer with at }
+        | "heartbeat" ->
+          blockE
+            [ expD (callE (varE (var id.it note)) [T.Any] (unitE())) ]
+           (unitE ())
+        | "inspect" ->
+          let _, tfs = T.as_obj obj_typ in
+          let caller = fresh_var "caller" T.caller in
+          let arg = fresh_var "arg" T.blob in
+          let msg_typ = T.decode_msg_typ tfs in
+          let msg = fresh_var "msg" msg_typ in
+          let record_typ =
+            T.Obj (T.Object, List.sort T.compare_field
+             [{T.lab = "caller"; T.typ = typ_of_var caller; T.src = T.empty_src};
+               {T.lab = "arg"; T.typ = typ_of_var arg; T.src = T.empty_src};
+               {T.lab = "msg"; T.typ = typ_of_var msg; T.src = T.empty_src}])
+          in
+          let record = fresh_var "record" record_typ in
+          let msg_variant =
+            switch_textE (primE Ir.ICMethodNamePrim [])
+              (List.map (fun tf ->
+                (tf.T.lab,
+                  match tf.T.typ with
+                  | T.Func(T.Local, _, [], [], ts) ->
+                    tagE tf.T.lab
+                      T.(funcE ("$"^tf.lab) Local Returns [] [] ts
+                        (primE (Ir.DeserializePrim ts) [varE arg]))
+                  | _ -> assert false))
+                (T.as_variant msg_typ))
+               (* Trap early, refusing all other messages,
+                  including those in T.well_known_actor_fields. *)
+              (wildP,
+                (primE (Ir.OtherPrim "trap")
+                  [textE "canister_inspect_message implicitly refused message"]))
+              msg_typ
+          in
+          let accept = fresh_var "accept" T.bool
+          in
+            blockE
+              [ letD record (
+                  blockE [
+                    letD caller (primE Ir.ICCallerPrim []);
+                    letD arg (primE Ir.ICArgDataPrim []);
+                    letD msg msg_variant
+                  ]
+                  (newObjE T.Object [
+                    {it = I.{name = "caller"; var = id_of_var caller}; at = no_region; note = typ_of_var caller };
+                    {it = I.{name = "arg"; var = id_of_var arg}; at = no_region; note = typ_of_var arg };
+                    {it = I.{name = "msg"; var = id_of_var msg}; at = no_region; note = typ_of_var msg }]
+                    record_typ));
+                letD accept (callE (varE (var id.it note)) [] (varE record))]
+              (ifE (varE accept)
+                (unitE ())
+                (primE (Ir.OtherPrim "trap")
+                  [textE "canister_inspect_message explicitly refused message"]))
+        | name ->
+           let inst = match name with
+             | "preupgrade" | "postupgrade" -> [T.scope_bound]
+             | _ -> [] in
+          callE (varE (var id.it note)) inst (tupE []))
+    | _ -> None) es
+and build_candid ts obj_typ =
+  let open Idllib in
+  let (args, prog) = Mo_idl.Mo_to_idl.of_service_type ts obj_typ in
+  let module WithComments = Arrange_idl.Make(struct let trivia = Some prog.note.Syntax.trivia end) in
+  I.{
+   args = WithComments.string_of_args args;
+   service = WithComments.string_of_prog prog;
+  }
+
+and export_footprint self_id expr =
+  let open T in
+  let {lab;typ;_} = motoko_stable_var_info_fld in
+  let v = "$"^lab in
+  let size = fresh_var "size" T.nat64 in
+  let scope_con1 = Cons.fresh "T1" (Abs ([], scope_bound)) in
+  let scope_con2 = Cons.fresh "T2" (Abs ([], Any)) in
+  let bind1  = typ_arg scope_con1 Scope scope_bound in
+  let bind2 = typ_arg scope_con2 Scope scope_bound in
+  let ret_typ = T.Obj(Object,[{lab = "size"; typ = T.nat64; src = empty_src}]) in
+  let caller = fresh_var "caller" caller in
+  ([ letD (var v typ) (
+       funcE v (Shared Query) Promises [bind1] [] [ret_typ] (
+           (asyncE T.Fut bind2
+              (blockE [
+                   letD caller (primE I.ICCallerPrim []);
+                   expD (assertE (orE (primE (I.RelPrim (principal, Operator.EqOp))
+                                         [varE caller; selfRefE principal])
+                                    (primE (I.OtherPrim "is_controller") [varE caller])));
+                   letD size (primE (I.ICStableSize expr.note.Note.typ) [expr])
+                 ]
+                 (newObjE T.Object
+                   [{ it = Ir.{name = "size"; var = id_of_var size};
+                      at = no_region;
+                      note = T.nat64 }]
+                   ret_typ))
+              (Con (scope_con1, []))))
+  )],
+  [{ it = I.{ name = lab; var = v }; at = no_region; note = typ }])
+
+
+and build_actor at ts self_id es obj_typ =
+  let candid = build_candid ts obj_typ in
+  let fs = build_fields obj_typ in
+  let es = List.filter (fun ef -> is_not_typD ef.it.S.dec) es in
+  let ds = decs (List.map (fun ef -> ef.it.S.dec) es) in
+  let stabs = List.map (fun ef -> ef.it.S.stab) es in
+  let pairs = List.map2 stabilize stabs ds in
+  let idss = List.map fst pairs in
+  let ids = List.concat idss in
+  let sig_ = List.sort T.compare_field
+    (List.map (fun (i,t) -> T.{lab = i; typ = t; src = empty_src}) ids)
+  in
+  let fields = List.map (fun (i,t) -> T.{lab = i; typ = T.Opt (T.as_immut t); src = T.empty_src}) ids in
+  let mk_ds = List.map snd pairs in
+  let ty = T.Obj (T.Memory, List.sort T.compare_field fields) in
+  let state = fresh_var "state" (T.Mut (T.Opt ty)) in
+  let get_state = fresh_var "getState" (T.Func(T.Local, T.Returns, [], [], [ty])) in
+  let ds = List.map (fun mk_d -> mk_d get_state) mk_ds in
+  let ds =
+    varD state (optE (primE (I.ICStableRead ty) []))
+    ::
+    nary_funcD get_state []
+      (let v = fresh_var "v" ty in
+       switch_optE (immuteE (varE state))
+         (unreachableE ())
+         (varP v) (varE v)
+         ty)
+    ::
+    ds
+    @
+    [expD (assignE state (nullE()))]
+  in
+  let ds' = match self_id with
+    | Some n -> with_self n.it obj_typ ds
+    | None -> ds in
+  let meta =
+    I.{ candid = candid;
+        sig_ = T.string_of_stab_sig sig_} in
+  let with_stable_vars wrap =
+    let vs = fresh_vars "v" (List.map (fun f -> f.T.typ) fields) in
+    blockE
+      ((match call_system_func_opt "preupgrade" es obj_typ with
+        | Some call -> [ expD (primE (I.ICPerformGC) []); expD call]
+        | None -> []) @
+         [letP (seqP (List.map varP vs)) (* dereference any mutable vars, option 'em all *)
+            (seqE (List.map (fun (i,t) -> optE (varE (var i t))) ids))])
+      (wrap
+         (newObjE T.Memory
+            (List.map2 (fun f v ->
+                 { it = I.{name = f.T.lab; var = id_of_var v};
+                   at = no_region;
+                   note = f.T.typ }
+               ) fields vs)
+            ty)) in
+  let footprint_d, footprint_f = export_footprint self_id (with_stable_vars (fun e -> e)) in
+  I.(ActorE (footprint_d @ ds', footprint_f @ fs,
+     { meta;
+       preupgrade = with_stable_vars (fun e -> primE (I.ICStableWrite ty) [e]);
+       postupgrade =
+         (match call_system_func_opt "postupgrade" es obj_typ with
+          | Some call -> call
+          | None -> tupE []);
+       heartbeat =
+         (match call_system_func_opt "heartbeat" es obj_typ with
+          | Some call -> call
+          | None -> tupE []);
+       timer =
+         (match call_system_func_opt "timer" es obj_typ with
+          | Some call -> call
+          | None when !Mo_config.Flags.global_timer ->
+            blockE
+              [ expD T.(callE (varE (var "@timer_helper" Mo_frontend.Typing.heartbeat_type)) [unit] (unitE())) ]
+              (unitE ())
+          | None -> tupE []);
+       inspect =
+         (match call_system_func_opt "inspect" es obj_typ with
+          | Some call -> call
+          | None -> tupE [])
+     },
+     obj_typ))
+
+
+and stabilize stab_opt d =
+  let s = match stab_opt with None -> S.Flexible | Some s -> s.it  in
+  match s, d.it with
+  | (S.Flexible, _) ->
+    ([], fun _ -> d)
+  | (S.Stable, I.VarD(i, t, e)) ->
+    ([(i, T.Mut t)],
+     fun get_state ->
+     let v = fresh_var i t in
+     varD (var i (T.Mut t))
+       (switch_optE (dotE (callE (varE get_state) [] (unitE ())) i (T.Opt t))
+         e
+         (varP v) (varE v)
+         t))
+  | (S.Stable, I.RefD _) -> assert false (* RefD cannot come from user code *)
+  | (S.Stable, I.LetD({it = I.VarP i; _} as p, e)) ->
+    let t = p.note in
+    ([(i, t)],
+     fun get_state ->
+     let v = fresh_var i t in
+     letP p
+       (switch_optE (dotE (callE (varE get_state) [] (unitE ())) i (T.Opt t))
+         e
+         (varP v) (varE v)
+         t))
+  | (S.Stable, I.LetD _) ->
+    assert false
+
+and build_obj at s self_id dfs obj_typ =
+  let fs = build_fields obj_typ in
+  let obj_e = newObjE s fs obj_typ in
+  let ds = decs (List.map (fun df -> df.it.S.dec) dfs) in
+  let e = blockE ds obj_e in
+  match self_id with
+    | None -> e.it
+    | Some self_id ->
+      let self = var self_id.it obj_typ in
+      (letE self e (varE self)).it
+
+and exp_field obj_typ ef =
+  let _, fts = T.as_obj_sub [] obj_typ in
+  let S.{mut; id; exp = e} = ef.it in
+  match mut.it with
+  | S.Var ->
+    let typ = match T.lookup_val_field_opt id.it fts with
+      | Some typ -> typ
+      | None -> T.Mut e.note.S.note_typ
+    in
+    assert (T.is_mut typ);
+    let id' = fresh_var id.it typ in
+    let d = varD id' (exp e) in
+    let f = { it = I.{ name = id.it; var = id_of_var id' }; at = no_region; note = typ } in
+    (d, f)
+  | S.Const ->
+    let typ = match T.lookup_val_field_opt id.it fts with
+      | Some typ -> typ
+      | None -> e.note.S.note_typ
+    in
+    assert (not (T.is_mut typ));
+    let id' = fresh_var id.it typ in
+    let d = letD id' (exp e) in
+    let f = { it = I.{ name = id.it; var = id_of_var id' }; at = no_region; note = typ } in
+    (d, f)
+
+and obj obj_typ efs bases =
+  let open List in
+  let base_info base =
+    let base_exp, base_t = exp base, (typ_note base.note).Note.typ in
+    let base_var = fresh_var "base" base_t in
+    let base_dec = letD base_var base_exp in
+    let pick l =
+      if exists (fun { T.lab; _ } -> lab = l) T.(promote base_t |> as_obj |> snd)
+      then [base_var] else [] in
+    base_dec, pick in
+
+  let base_decs, pickers = map base_info bases |> split in
+  let gap T.{ lab; typ; _ } = match typ with
+    | T.Typ _ -> []
+    | _ ->
+      if exists (fun (ef : S.exp_field) -> ef.it.id.it = lab) efs then []
+      else
+        let id = fresh_var lab typ in
+        let [@warning "-8"] [base_var] = concat_map ((|>) lab) pickers in
+        let d =
+          if T.is_mut typ then
+            refD id { it = I.DotLE(varE base_var, lab); note = typ; at = no_region }
+          else
+            letD id (dotE (varE base_var) lab typ) in
+        let f = { it = I.{ name = lab; var = id_of_var id }; at = no_region; note = typ } in
+        [d, f] in
+
+  let ds, fs = map (exp_field obj_typ) efs |> split in
+  let ds', fs' = concat_map gap (T.as_obj obj_typ |> snd) |> split in
+  let obj_e = newObjE T.Object (append fs fs') obj_typ in
+  I.BlockE(append base_decs (append ds ds'), obj_e)
+
+and typ_binds tbs = List.map typ_bind tbs
+
+and typ_bind tb =
+  let c = match tb.note with
+    | Some c -> c
+    | _ -> assert false
+  in
+  { it = { Ir.con = c; Ir.sort = tb.it.S.sort.it; Ir.bound = tb.it.S.bound.note}
+  ; at = tb.at
+  ; note = ()
+  }
+
+and array_dotE array_ty proj e =
+  let fun_ty bs t1 t2 = T.Func (T.Local, T.Returns, bs, t1, t2) in
+  let varA = T.Var ("A", 0) in
+  let element_ty = T.as_immut (T.as_array array_ty) in
+  let call name t1 t2 =
+    let poly_array_ty =
+      if T.is_mut (T.as_array array_ty)
+      then T.Array (T.Mut varA)
+      else T.Array varA in
+    let ty_param = {T.var = "A"; sort = T.Type; T.bound = T.Any} in
+    let f = var name (fun_ty [ty_param] [poly_array_ty] [fun_ty [] t1 t2]) in
+    callE (varE f) [element_ty] e in
+  match T.is_mut (T.as_array array_ty), proj with
+    | true,  "size" -> call "@mut_array_size"   [] [T.nat]
+    | false, "size" -> call "@immut_array_size" [] [T.nat]
+    | true,  "get"  -> call "@mut_array_get"    [T.nat] [varA]
+    | false, "get"  -> call "@immut_array_get"  [T.nat] [varA]
+    | true,  "put"  -> call "@mut_array_put"    [T.nat; varA] []
+    | true,  "keys" -> call "@mut_array_keys"   [] [T.iter_obj T.nat]
+    | false, "keys" -> call "@immut_array_keys" [] [T.iter_obj T.nat]
+    | true,  "vals" -> call "@mut_array_vals"   [] [T.iter_obj varA]
+    | false, "vals" -> call "@immut_array_vals" [] [T.iter_obj varA]
+    | _, _ -> assert false
+
+and blob_dotE proj e =
+  let fun_ty t1 t2 = T.Func (T.Local, T.Returns, [], t1, t2) in
+  let call name t1 t2 =
+    let f = var name (fun_ty [T.blob] [fun_ty t1 t2]) in
+    callE (varE f) [] e in
+  match proj with
+    | "size"   -> call "@blob_size"   [] [T.nat]
+    | "vals" -> call "@blob_vals" [] [T.iter_obj T.(Prim Nat8)]
+    |  _ -> assert false
+
+and text_dotE proj e =
+  let fun_ty t1 t2 = T.Func (T.Local, T.Returns, [], t1, t2) in
+  let call name t1 t2 =
+    let f = var name (fun_ty [T.text] [fun_ty t1 t2]) in
+    callE (varE f) [] e in
+  match proj with
+    | "size"   -> call "@text_size"   [] [T.nat]
+    | "chars" -> call "@text_chars" [] [T.iter_obj T.char]
+    |  _ -> assert false
+
+and block force_unit ds =
+  match ds with
+  | [] -> ([], tupE [])
+  | [{it = S.ExpD ({it = S.BlockE ds; _}); _}] -> block force_unit ds
+  | _ ->
+  let prefix, last = Lib.List.split_last ds in
+  match force_unit, last.it with
+  | _, S.ExpD e ->
+    (decs prefix, exp e)
+  | false, S.LetD ({it = S.VarP x; _}, e, _) -> (* Fail block dead, pattern match irrefutable *)
+    (decs ds, varE (var x.it e.note.S.note_typ))
+  | false, S.LetD (p, e, None) ->
+    let x = fresh_var "x" (e.note.S.note_typ) in
+    (decs prefix @ [letD x (exp e); letP (pat p) (varE x)], varE x)
+  | false, S.LetD (p, e, Some f) ->
+    (decs prefix, let_else_switch (pat p) (exp e) (exp f))
+  | _, _ ->
+    (decs ds, tupE [])
+
+and is_not_typD d = match d.it with | S.TypD _ -> false | _ -> true
+
+and decs ds =
+  List.map dec (List.filter is_not_typD ds)
+
+and dec d = { (phrase' dec' d) with note = () }
+
+and dec' at n = function
+  | S.ExpD e -> (expD (exp e)).it
+  | S.LetD (p, e, f) ->
+    let p' = pat p in
+    let e' = exp e in
+    (* HACK: remove this once backend supports recursive actors *)
+    begin match p'.it, e'.it, f with
+    | I.VarP i, I.ActorE (ds, fs, u, t), _ ->
+      I.LetD (p', {e' with it = I.ActorE (with_self i t ds, fs, u, t)})
+    | _, _, None -> I.LetD (p', e')
+    | _, _, Some f -> I.LetD (p', let_else_switch (pat p) (exp e) (exp f))
+    end
+  | S.VarD (i, e) -> I.VarD (i.it, e.note.S.note_typ, exp e)
+  | S.TypD _ -> assert false
+  | S.ClassD (sp, id, tbs, p, _t_opt, s, self_id, dfs) ->
+    let id' = {id with note = ()} in
+    let sort, _, _, _, _ = Type.as_func n.S.note_typ in
+    let op = match sp.it with
+      | T.Local -> None
+      | T.Shared (_, p) -> Some p in
+    let inst = List.map
+                 (fun tb ->
+                   match tb.note with
+                   | None -> assert false
+                   | Some c -> T.Con (c, []))
+                 tbs in
+    let fun_typ = n.S.note_typ in
+    let rng_typ =
+      match fun_typ with
+      | T.Func(_, _, bds, dom, [rng]) ->
+        assert(List.length inst = List.length bds);
+        T.promote (T.open_ inst rng)
+      | _ -> assert false
+    in
+    let varPat = {it = I.VarP id'.it; at = at; note = fun_typ } in
+    let args, wrap, control, _n_res = to_args n.S.note_typ op p in
+    let body = if s.it = T.Actor
+      then
+        let (_, _, obj_typ) = T.as_async rng_typ in
+        let c = Cons.fresh T.default_scope_var (T.Abs ([], T.scope_bound)) in
+        asyncE T.Fut (typ_arg c T.Scope T.scope_bound) (* TBR *)
+          (wrap { it = obj_block at s (Some self_id) dfs (T.promote obj_typ);
+            at = at;
+            note = Note.{def with typ = obj_typ } })
+          (List.hd inst)
+      else
+       wrap
+        { it = obj_block at s (Some self_id) dfs rng_typ;
+          at = at;
+          note = Note.{ def with typ = rng_typ } }
+    in
+    let fn = {
+      it = I.FuncE (id.it, sort, control, typ_binds tbs, args, [rng_typ], body);
+      at = at;
+      note = Note.{ def with typ = fun_typ }
+    } in
+    I.LetD (varPat, fn)
+
+and cases cs = List.map case cs
+
+and case c = phrase case' c
+
+and case' c = S.{ I.pat = pat c.pat; I.exp = exp c.exp }
+
+and pats ps = List.map pat ps
+
+and pat p = phrase pat' p
+
+and pat' = function
+  | S.VarP v -> I.VarP v.it
+  | S.WildP -> I.WildP
+  | S.LitP l -> I.LitP (lit !l)
+  | S.SignP (o, l) -> I.LitP (lit (apply_sign o (!l)))
+  | S.TupP ps -> I.TupP (pats ps)
+  | S.ObjP pfs ->
+    I.ObjP (pat_fields pfs)
+  | S.OptP p -> I.OptP (pat p)
+  | S.TagP (i, p) -> I.TagP (i.it, pat p)
+  | S.AltP (p1, p2) -> I.AltP (pat p1, pat p2)
+  | S.AnnotP (p, _)
+  | S.ParP p -> pat' p.it
+
+and lit = function
+  | S.NullLit -> I.NullLit
+  | S.BoolLit x -> I.BoolLit x
+  | S.NatLit x -> I.NatLit x
+  | S.Nat8Lit x -> I.Nat8Lit x
+  | S.Nat16Lit x -> I.Nat16Lit x
+  | S.Nat32Lit x -> I.Nat32Lit x
+  | S.Nat64Lit x -> I.Nat64Lit x
+  | S.IntLit x -> I.IntLit x
+  | S.Int8Lit x -> I.Int8Lit x
+  | S.Int16Lit x -> I.Int16Lit x
+  | S.Int32Lit x -> I.Int32Lit x
+  | S.Int64Lit x -> I.Int64Lit x
+  | S.FloatLit x -> I.FloatLit x
+  | S.CharLit x -> I.CharLit x
+  | S.TextLit x -> I.TextLit x
+  | S.BlobLit x -> I.BlobLit x
+  | S.PreLit _ -> assert false
+
+and pat_fields pfs = List.map pat_field pfs
+
+and pat_field pf = phrase (fun S.{id; pat=p} -> I.{name=id.it; pat=pat p}) pf
+
+and to_args typ po p : Ir.arg list * (Ir.exp -> Ir.exp) * T.control * T.typ list =
+
+  let mergeE ds e =
+    match e.it with
+    | Ir.ActorE _ ->
+      (match Rename.exp' Rename.Renaming.empty e.it with
+       |  Ir.ActorE (ds', fs, up, ot) ->
+         { e with it = Ir.ActorE (ds @ ds', fs, up, ot) }
+       | _ -> assert false)
+    | _ -> blockE ds e
+  in
+
+  let sort, control, n_args, res_tys =
+    match typ with
+    | Type.Func (sort, control, tbds, dom, res) ->
+      sort, control, List.length dom, res
+    | Type.Non ->
+      Type.Local, Type.Returns, 1, []
+    | _ -> raise (Invalid_argument ("to_args " ^ Type.string_of_typ typ))
+  in
+
+  let tys = if n_args = 1 then [p.note] else T.seq_of_tup p.note in
+
+  let rec pat_unannot p = match p.it with
+    | S.AnnotP (p, _) -> pat_unannot p
+    | S.ParP p -> pat_unannot p
+    | _ -> p
+  in
+
+  (* In source, the context pattern is outside the argument pattern,
+  but in the IR, parameters are bound first. So if there is a context pattern,
+  we _must_ create fresh names for the parameters and bind the actual parameters
+  inside the wrapper. *)
+  let must_wrap = po <> None in
+
+  let to_arg p : (Ir.arg * (Ir.exp -> Ir.exp)) =
+    match (pat_unannot p).it with
+    | S.AnnotP _ | S.ParP _ -> assert false
+    | S.VarP i when not must_wrap ->
+      { i with note = p.note },
+      (fun e -> e)
+    | S.WildP ->
+      let v = fresh_var "param" p.note in
+      arg_of_var v,
+      (fun e -> e)
+    |  _ ->
+      let v = fresh_var "param" p.note in
+      arg_of_var v,
+      (fun e -> mergeE [letP (pat p) (varE v)] e)
+  in
+
+  let args, wrap =
+    match n_args, (pat_unannot p).it with
+    | _, (S.AnnotP _ | S.ParP _) -> assert false
+    | _, S.WildP ->
+      let vs = fresh_vars "ignored" tys in
+      List.map arg_of_var vs,
+      (fun e -> e)
+    | 1, _ ->
+      let a, wrap = to_arg p in
+      [a], wrap
+    | 0, S.TupP [] ->
+      [] , (fun e -> e)
+    | _, S.TupP ps ->
+      assert (List.length ps = n_args);
+      List.fold_right (fun p (args, wrap) ->
+        let (a, wrap1) = to_arg p in
+        (a::args, fun e -> wrap1 (wrap e))
+      ) ps ([], fun e -> e)
+    | _, _ ->
+      let vs = fresh_vars "param" tys in
+      List.map arg_of_var vs,
+      (fun e -> mergeE [letP (pat p) (tupE (List.map varE vs))] e)
+  in
+
+  let wrap_po e =
+    match po with
+    | None -> wrap e
+    | Some p ->
+      let v = fresh_var "caller" T.caller in
+      mergeE
+        [letD v (primE I.ICCallerPrim []);
+         letP (pat p)
+           (newObjE T.Object
+              [{ it = Ir.{name = "caller"; var = id_of_var v};
+                 at = no_region;
+                 note = T.caller }]
+              T.ctxt)]
+        (wrap e)
+  in
+
+  let wrap_under_async e =
+    if T.is_shared_sort sort
+    then match control, e.it with
+      | (T.Promises, Ir.AsyncE (s, tb, e', t)) ->
+        { e with it = Ir.AsyncE (s, tb, wrap_po e', t) }
+      | T.Returns, Ir.BlockE (
+          [{ it = Ir.LetD ({ it = Ir.WildP; _} as pat, ({ it = Ir.AsyncE (T.Fut, tb,e',t); _} as exp)); _ }],
+          ({ it = Ir.PrimE (Ir.TupPrim, []); _} as unit)) ->
+        blockE [letP pat {exp with it = Ir.AsyncE (T.Fut, tb,wrap_po e',t)} ] unit
+      | _, Ir.ActorE _ -> wrap_po e
+      | _ -> assert false
+    else
+      wrap_po e
+  in
+  args, wrap_under_async, control, res_tys
+
+type import_declaration = Ir.dec list
+
+let actor_class_mod_exp id class_typ default system =
+  let class_con = Cons.fresh id (T.Def([], class_typ)) in
+  (objE T.Module
+     [(id, class_con)]
+     [(id, default);
+      ("system", objE T.Module [] [(id, system)])])
+
+let import_compiled_class (lib : S.comp_unit) wasm : import_declaration =
+  let f = lib.note.filename in
+  let { body; _ } = lib.it in
+  let id = match body.it with
+    | S.ActorClassU (_, id, _, _, _, _, _) -> id.it
+    | _ -> assert false
+  in
+  let fun_typ = T.normalize body.note.S.note_typ in
+  let s, cntrl, tbs, ts1, ts2 = T.as_func fun_typ in
+  let cs = T.open_binds tbs in
+  let c, _ = T.as_con (List.hd cs) in
+  let ts1' = List.map (T.open_ cs) ts1 in
+  let ts2' = List.map (T.open_ cs) ts2 in
+  let class_typ = match List.map T.normalize ts2' with
+    | [T.Async (_, _, class_typ)] -> class_typ
+    | _ -> assert false
+  in
+  let t_async = T.codom cntrl (fun () -> assert false) ts2' in
+  let _, _, t_actor = T.as_async (T.normalize t_async) in
+  let cs' = T.open_binds tbs in
+  let c', _ = T.as_con (List.hd cs') in
+  let install_actor_helper = var "@install_actor_helper"
+    T.(Func (Local, Returns, [scope_bind],
+      [install_arg_typ; blob; blob],
+      [Async(Cmp, Var (default_scope_var, 0), principal)]))
+  in
+  let wasm_blob = fresh_var "wasm_blob" T.blob in
+  let install_arg =
+    fresh_var "install_arg" T.install_arg_typ  in
+  let system_body install_arg =
+    let vs = fresh_vars "param" ts1' in
+    let principal = fresh_var "principal" T.principal in
+    funcE id T.Local T.Returns
+    [typ_arg c T.Scope T.scope_bound]
+    (List.map arg_of_var vs)
+    ts2'
+    (asyncE T.Fut
+      (typ_arg c' T.Scope T.scope_bound)
+      (letE principal
+        (awaitE T.Cmp
+          (callE (varE install_actor_helper) cs'
+            (tupE [
+              install_arg;
+              varE wasm_blob;
+              primE (Ir.SerializePrim ts1') [seqE (List.map varE vs)]])))
+        (primE (Ir.CastPrim (T.principal, t_actor)) [varE principal]))
+      (List.hd cs))
+  in
+  let system = install_arg --> (system_body (varE install_arg)) in
+  let default =
+    system_body (tagE "new" (recordE ["settings", nullE()]))
+  in
+  let mod_exp = actor_class_mod_exp id class_typ default system in
+  let mod_typ = mod_exp.note.Note.typ in
+  [ letD wasm_blob (blobE wasm);
+    letD (var (id_of_full_path f) mod_typ) mod_exp ]
+
+let import_prelude prelude : import_declaration =
+  decs prelude.it
+
+let inject_decs extra_ds u =
+  let open Ir in
+  match u with
+  | LibU (ds, exp) -> LibU (extra_ds @ ds, exp)
+  | ProgU ds -> ProgU (extra_ds @ ds)
+  | ActorU (None, ds, fs, up, t) ->
+    Ir.ActorU (None, extra_ds @ ds, fs, up, t)
+  | ActorU (Some _, _, _, _, _) ->
+    let u'= Rename.comp_unit Rename.Renaming.empty u in
+    match u' with
+    | ActorU (as_opt, ds, fs, up, t) ->
+      Ir.ActorU (as_opt, extra_ds @ ds, fs, up, t)
+    | _ -> assert false
+
+let link_declarations imports (cu, flavor) =
+  inject_decs imports cu, flavor
+
+let transform_import (i : S.import) : import_declaration =
+  let (p, f, ir) = i.it in
+  let t = i.note in
+  assert (t <> T.Pre);
+  let rhs = match !ir with
+    | S.Unresolved -> raise (Invalid_argument ("Unresolved import " ^ f))
+    | S.LibPath {path = fp; _} ->
+      varE (var (id_of_full_path fp) t)
+    | S.PrimPath ->
+      varE (var (id_of_full_path "@prim") t)
+    | S.IDLPath (fp, canister_id) ->
+      primE (I.ActorOfIdBlob t) [blobE canister_id]
+  in [ letP (pat p) rhs ]
+
+let transform_unit_body (u : S.comp_unit_body) : Ir.comp_unit =
+  match u.it with
+  | S.ProgU ds -> I.ProgU (decs ds)
+  | S.ModuleU (self_id, fields) -> (* compiling a module as a library *)
+    I.LibU ([], {
+      it = build_obj u.at T.Module self_id fields u.note.S.note_typ;
+      at = u.at; note = typ_note u.note})
+  | S.ActorClassU (sp, typ_id, _tbs, p, _, self_id, fields) ->
+    let fun_typ = u.note.S.note_typ in
+    let op = match sp.it with
+      | T.Local -> None
+      | T.Shared (_, p) -> Some p in
+    let args, wrap, control, _n_res = to_args fun_typ op p in
+    let (ts, obj_typ) =
+      match fun_typ with
+      | T.Func(_s, _c, bds, ts1, [async_rng]) ->
+        assert(1 = List.length bds);
+        let cs  = T.open_binds bds in
+        let (_, _, rng) = T.as_async (T.normalize (T.open_ cs async_rng)) in
+        List.map (T.open_ cs) ts1,
+        T.promote rng
+      | _ -> assert false
+    in
+    let e = wrap {
+       it = build_actor u.at ts (Some self_id) fields obj_typ;
+       at = no_region;
+       note = Note.{ def with typ = obj_typ } }
+    in
+    begin match e.it with
+    | I.ActorE(ds, fs, u, t) -> I.ActorU (Some args, ds, fs, u, t)
+    | _ -> assert false
+    end
+  | S.ActorU (self_id, fields) ->
+    begin match build_actor u.at [] self_id fields u.note.S.note_typ with
+    | I.ActorE (ds, fs, u, t) -> I.ActorU (None, ds, fs, u, t)
+    | _ -> assert false
+    end
+
+let transform_unit (u : S.comp_unit) : Ir.prog  =
+  let { imports; body; _ } = u.it in
+  let imports' = List.concat_map transform_import imports in
+  let body' = transform_unit_body body in
+  inject_decs imports' body', Ir.full_flavor()
+
+
+(* Import a unit by composing IR.
+
+   When used for IR interpretation only, this includes
+   any class that would have been separately handled by
+   import_compiled_class (above) for compilation.
+*)
+let import_unit (u : S.comp_unit) : import_declaration =
+  let { imports; body; _ } = u.it in
+  let f = u.note.filename in
+  let t = body.note.S.note_typ in
+  assert (t <> T.Pre);
+  let imports' = List.concat_map transform_import imports in
+  let body' = transform_unit_body body in
+  let prog = inject_decs imports' body' in
+  match prog with
+  | I.LibU (ds, e) ->
+    let exp = blockE ds e in
+    [ letD (var (id_of_full_path f) exp.note.Note.typ) exp ]
+  | I.ActorU (None, ds, fs, up, t) ->
+    raise (Invalid_argument "Desugar: Cannot import actor")
+  | I.ActorU (Some as_, ds, fs, up, actor_t) ->
+    let id = match body.it with
+      | S.ActorClassU (_, id, _, _, _, _, _) -> id.it
+      | _ -> assert false
+    in
+    let s, cntrl, tbs, ts1, ts2 = T.as_func t in
+    let cs = T.open_binds [T.scope_bind] in
+    let c, _ = T.as_con (List.hd cs) in
+    let cs' = T.open_binds [T.scope_bind] in
+    let c', _ = T.as_con (List.hd cs') in
+    let class_typ = match List.map T.normalize ts2 with
+      | [ T.Async(_, _, t2) ] -> t2
+      | _ -> assert false in
+    let install_arg =
+      fresh_var "install_arg" T.install_arg_typ
+    in
+    let system_body install_arg =
+      funcE id T.Local T.Returns
+        [typ_arg c T.Scope T.scope_bound]
+        as_
+        [T.Async (T.Fut, List.hd cs, actor_t)]
+        (asyncE
+          T.Fut
+          (typ_arg c' T.Scope T.scope_bound)
+          (ifE
+            (primE (Ir.RelPrim (T.install_arg_typ, Operator.EqOp))
+              [ install_arg;
+                tagE "new" (recordE ["settings", nullE()]) ])
+             { it = I.ActorE (ds, fs, up, actor_t); at = u.at; note = Note.{ def with typ = actor_t } }
+             (primE (Ir.OtherPrim "trap")
+               [textE "actor class configuration not supported in interpreter"]))
+          (List.hd cs))
+    in
+    let system = install_arg --> (system_body (varE install_arg)) in
+    let system_var = fresh_var "system" system.note.Note.typ in
+    let default = (varE system_var) -*- (tagE "new" (recordE ["settings", nullE()])) in
+    let mod_exp = actor_class_mod_exp id class_typ default (varE system_var) in
+    let mod_typ = mod_exp.note.Note.typ in
+    [ letD system_var system;
+      letD (var (id_of_full_path f) mod_typ) mod_exp ]
+  | I.ProgU ds ->
+    raise (Invalid_argument "Desugar: Cannot import program")
+
+
+
+ + + diff --git a/coverage/mo_config/args.ml.html b/coverage/mo_config/args.ml.html new file mode 100644 index 00000000000..a39de53d433 --- /dev/null +++ b/coverage/mo_config/args.ml.html @@ -0,0 +1,150 @@ + + + + + args.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
+
(* This module contains some argument parsing that is common between
+multiple executables *)
+
+let string_map flag r desc =
+  let key_ref = ref "DEADBEEF" in
+  flag,
+  Arg.Tuple [
+    Arg.Set_string key_ref ;
+    Arg.String (fun value ->
+      let key = !key_ref in
+      if Flags.M.mem key !r
+      then (Printf.eprintf "duplicate %s %s" flag key ; exit 1)
+      else r := Flags.M.add key value !r
+    )
+  ],
+  desc
+
+(* Everything related to imports, packages, aliases *)
+let package_args = [
+  string_map "--package" Flags.package_urls "<package-name> <package-path> specify a <package-name> <package-path> pair, separated by a space";
+  "--actor-idl", Arg.String (fun fp -> Flags.actor_idl_path := Some fp), "<idl-path>   path to actor IDL (Candid) files";
+  string_map "--actor-alias" Flags.actor_aliases "<alias> <principal>  actor import alias"
+  ]
+
+let error_args = [
+  "--error-detail", Arg.Set_int Flags.error_detail, "<n>  set error message detail for syntax errors, n in [0..3] (default 2)"
+  (* TODO move --hide-warnings here? *)
+  ]
+
+let inclusion_args = [
+    (* generic arg inclusion from file *)
+  "--args", Arg.Expand Arg.read_arg,
+    "<file>  read additional newline separated command line arguments \n\
+    \      from <file>";
+  "--args0", Arg.Expand Arg.read_arg0,
+    "<file>  read additional NUL separated command line arguments from \n\
+    \      <file>"
+  ]
+
+
+
+ + + diff --git a/coverage/mo_config/flags.ml.html b/coverage/mo_config/flags.ml.html new file mode 100644 index 00000000000..4a3ead83b21 --- /dev/null +++ b/coverage/mo_config/flags.ml.html @@ -0,0 +1,191 @@ + + + + + flags.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+
+
(* common flags for the moc compiler *)
+
+module M = Map.Make(String)
+
+type compile_mode = WasmMode | ICMode | RefMode | WASIMode
+
+type gc_strategy = MarkCompact | Copying | Generational | Incremental
+
+let trace = ref false
+let verbose = ref false
+let print_warnings = ref true
+let warnings_are_errors = ref false
+let print_depth = ref 2
+let release_mode = ref false
+let compile_mode = ref ICMode
+let debug_info = ref false
+let multi_value = ref false
+let await_lowering = ref true
+let async_lowering = ref true
+let dump_parse = ref false
+let dump_tc = ref false
+let dump_lowering = ref false
+let check_ir = ref true
+let package_urls : string M.t ref = ref M.empty
+let actor_aliases : string M.t ref = ref M.empty
+let actor_idl_path : string option ref = ref None
+let max_stable_pages_default = 65536
+let max_stable_pages : int ref = ref max_stable_pages_default
+let measure_rts_stack = ref false
+let pre_ref : string option ref = ref None
+let post_ref : string option ref = ref None
+let profile = ref false
+let profile_verbose = ref false
+let profile_file = ref "profiling-counters.csv"
+let profile_line_prefix = ref ""
+let profile_field_names : string list ref = ref []
+let public_metadata_names : string list ref = ref []
+let omit_metadata_names : string list ref = ref []
+let compiled = ref false
+let error_detail = ref 2
+let sanity = ref false
+let gc_strategy = ref Copying
+let force_gc = ref false
+let global_timer = ref true
+let experimental_field_aliasing = ref false
+let ocaml_js = ref false
+let rts_stack_pages_default = 32 (* 2MB *)
+let rts_stack_pages : int ref = ref rts_stack_pages_default
+let rtti = ref false
+let trap_on_call_error = ref false
+let use_stable_regions = ref false
+let share_code = ref false
+
+
+
+ + + diff --git a/coverage/mo_config/internal_error.ml.html b/coverage/mo_config/internal_error.ml.html new file mode 100644 index 00000000000..59c6365eda6 --- /dev/null +++ b/coverage/mo_config/internal_error.ml.html @@ -0,0 +1,65 @@ + + + + + internal_error.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+9
+
+

+let setup_handler () =
+  let open Printexc in
+  record_backtrace true;
+  set_uncaught_exception_handler (fun exn rb ->
+    Printf.eprintf "OOPS! You've triggered a compiler bug.\n";
+    Printf.eprintf "Please report this at https://github.com/dfinity/motoko/issues/new with the following details:\n\nMotoko %s\n\n" Source_id.banner;
+    default_uncaught_exception_handler exn rb
+  );
+
+
+
+ + + diff --git a/coverage/mo_def/arrange.ml.html b/coverage/mo_def/arrange.ml.html new file mode 100644 index 00000000000..44237778e5e --- /dev/null +++ b/coverage/mo_def/arrange.ml.html @@ -0,0 +1,1054 @@ + + + + + arrange.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+
+
open Mo_types
+open Mo_values
+
+open Source
+open Syntax
+open Wasm.Sexpr
+
+module type Config = sig
+  val include_sources : bool
+  val include_types : bool
+  val include_docs : Trivia.trivia_info Trivia.PosHashtbl.t option
+  val main_file : string option
+end
+
+module Default = struct
+  let include_sources = false
+  let include_types = false
+  let include_docs = None
+  let main_file = None
+end
+
+module Type_pretty = Mo_types.Type.MakePretty (Mo_types.Type.ElideStamps)
+
+
+module Make (Cfg : Config) = struct
+  let ($$) head inner = Node (head, inner)
+
+  let pos p =
+    let file = match Cfg.main_file with
+    | Some f when f <> p.file -> p.file
+    | _ -> ""
+    in "Pos" $$ [Atom file; Atom (string_of_int p.line); Atom (string_of_int p.column)]
+  let source at it = if Cfg.include_sources && at <> Source.no_region then "@" $$ [pos at.left; pos at.right; it] else it
+
+  let typ t = Atom (Type_pretty.string_of_typ t)
+
+  let trivia at it =
+    match Cfg.include_docs with
+    | Some table ->
+      let rec lookup_trivia (line, column) =
+        Trivia.PosHashtbl.find_opt table Trivia.{ line; column }
+      and find_trivia (parser_pos : Source.region) : Trivia.trivia_info =
+        lookup_trivia Source.(parser_pos.left.line, parser_pos.left.column) |> Option.get
+      in
+      (match Trivia.doc_comment_of_trivia_info (find_trivia at) with
+      | Some s -> "*" $$ [Atom s; it]
+      | None -> it)
+    | None -> it
+
+  let eff (eff : Mo_types.Type.eff) = match eff with
+  | Mo_types.Type.Triv -> Atom "Triv"
+  | Mo_types.Type.Await -> Atom "Await"
+
+  let annot_typ t it = if Cfg.include_types then ":" $$ [it; typ t] else it
+  let annot note = annot_typ note.note_typ
+
+  let id i = Atom i.it
+  let tag i = Atom ("#" ^ i.it)
+
+  let rec exp e = source e.at (annot e.note (match e.it with
+    | VarE x              -> "VarE"      $$ [id x]
+    | LitE l              -> "LitE"      $$ [lit !l]
+    | ActorUrlE e         -> "ActorUrlE" $$ [exp e]
+    | UnE (ot, uo, e)     -> "UnE"       $$ [operator_type !ot; Arrange_ops.unop uo; exp e]
+    | BinE (ot, e1, bo, e2) -> "BinE"    $$ [operator_type !ot; exp e1; Arrange_ops.binop bo; exp e2]
+    | RelE (ot, e1, ro, e2) -> "RelE"    $$ [operator_type !ot; exp e1; Arrange_ops.relop ro; exp e2]
+    | ShowE (ot, e)       -> "ShowE"     $$ [operator_type !ot; exp e]
+    | ToCandidE es        -> "ToCandidE"   $$ exps es
+    | FromCandidE e       -> "FromCandidE" $$ [exp e]
+    | TupE es             -> "TupE"      $$ exps es
+    | ProjE (e, i)        -> "ProjE"     $$ [exp e; Atom (string_of_int i)]
+    | ObjBlockE (s, t, dfs) -> "ObjBlockE" $$ [obj_sort s; match t with None -> Atom "_" | Some t -> typ t] @ List.map dec_field dfs
+    | ObjE ([], efs)      -> "ObjE"      $$ List.map exp_field efs
+    | ObjE (bases, efs)   -> "ObjE"      $$ exps bases @ [Atom "with"] @ List.map exp_field efs
+    | DotE (e, x)         -> "DotE"      $$ [exp e; id x]
+    | AssignE (e1, e2)    -> "AssignE"   $$ [exp e1; exp e2]
+    | ArrayE (m, es)      -> "ArrayE"    $$ [mut m] @ exps es
+    | IdxE (e1, e2)       -> "IdxE"      $$ [exp e1; exp e2]
+    | FuncE (x, sp, tp, p, t, sugar, e') ->
+      "FuncE" $$ [
+        Atom (Type.string_of_typ e.note.note_typ);
+        shared_pat sp;
+        Atom x] @
+        List.map typ_bind tp @ [
+        pat p;
+        (match t with None -> Atom "_" | Some t -> typ t);
+        Atom (if sugar then "" else "=");
+        exp e'
+      ]
+    | CallE (e1, ts, e2)  -> "CallE"   $$ [exp e1] @ inst ts @ [exp e2]
+    | BlockE ds           -> "BlockE"  $$ List.map dec ds
+    | NotE e              -> "NotE"    $$ [exp e]
+    | AndE (e1, e2)       -> "AndE"    $$ [exp e1; exp e2]
+    | OrE (e1, e2)        -> "OrE"     $$ [exp e1; exp e2]
+    | ImpliesE (e1, e2)   -> "ImpliesE"$$ [exp e1; exp e2]
+    | OldE e              -> "OldE"    $$ [exp e]
+    | IfE (e1, e2, e3)    -> "IfE"     $$ [exp e1; exp e2; exp e3]
+    | SwitchE (e, cs)     -> "SwitchE" $$ [exp e] @ List.map case cs
+    | WhileE (e1, e2)     -> "WhileE"  $$ [exp e1; exp e2]
+    | LoopE (e1, None)    -> "LoopE"   $$ [exp e1]
+    | LoopE (e1, Some e2) -> "LoopE"   $$ [exp e1; exp e2]
+    | ForE (p, e1, e2)    -> "ForE"    $$ [pat p; exp e1; exp e2]
+    | LabelE (i, t, e)    -> "LabelE"  $$ [id i; typ t; exp e]
+    | DebugE e            -> "DebugE"  $$ [exp e]
+    | BreakE (i, e)       -> "BreakE"  $$ [id i; exp e]
+    | RetE e              -> "RetE"    $$ [exp e]
+    | AsyncE (Type.Fut, tb, e) -> "AsyncE"  $$ [typ_bind tb; exp e]
+    | AsyncE (Type.Cmp, tb, e) -> "AsyncE*" $$ [typ_bind tb; exp e]
+    | AwaitE (Type.Fut, e)     -> "AwaitE"  $$ [exp e]
+    | AwaitE (Type.Cmp, e)     -> "AwaitE*" $$ [exp e]
+    | AssertE (Runtime, e)       -> "AssertE" $$ [exp e]
+    | AssertE (Static, e)        -> "Static_AssertE" $$ [exp e]
+    | AssertE (Invariant, e)     -> "Invariant" $$ [exp e]
+    | AssertE (Precondition, e)  -> "Precondition" $$ [exp e]
+    | AssertE (Postcondition, e) -> "Postcondition" $$ [exp e]
+    | AssertE (Loop_entry, e)    -> "Loop_entry" $$ [exp e]
+    | AssertE (Loop_continue, e) -> "Loop_continue" $$ [exp e]
+    | AssertE (Loop_exit, e)     -> "Loop_exit" $$ [exp e]
+    | AssertE (Concurrency s, e) -> "Concurrency"^s $$ [exp e]
+    | AnnotE (e, t)       -> "AnnotE"  $$ [exp e; typ t]
+    | OptE e              -> "OptE"    $$ [exp e]
+    | DoOptE e            -> "DoOptE"  $$ [exp e]
+    | BangE e             -> "BangE"   $$ [exp e]
+    | TagE (i, e)         -> "TagE"    $$ [id i; exp e]
+    | PrimE p             -> "PrimE"   $$ [Atom p]
+    | ImportE (f, _fp)    -> "ImportE" $$ [Atom f]
+    | ThrowE e            -> "ThrowE"  $$ [exp e]
+    | TryE (e, cs)        -> "TryE"    $$ [exp e] @ List.map catch cs
+    | IgnoreE e           -> "IgnoreE" $$ [exp e]))
+
+  and exps es = List.map exp es
+
+  and inst inst = match inst.it with
+    | None -> []
+    | Some (false, ts) -> List.map typ ts
+    | Some (true, ts) -> Atom "system" :: List.map typ ts
+
+  and pat p = source p.at (annot_typ p.note (match p.it with
+    | WildP           -> Atom "WildP"
+    | VarP x          -> "VarP"       $$ [id x]
+    | TupP ps         -> "TupP"       $$ List.map pat ps
+    | ObjP ps         -> "ObjP"       $$ List.map pat_field ps
+    | AnnotP (p, t)   -> "AnnotP"     $$ [pat p; typ t]
+    | LitP l          -> "LitP"       $$ [lit !l]
+    | SignP (uo, l)   -> "SignP"      $$ [Arrange_ops.unop uo ; lit !l]
+    | OptP p          -> "OptP"       $$ [pat p]
+    | TagP (i, p)     -> "TagP"       $$ [tag i; pat p]
+    | AltP (p1, p2)   -> "AltP"       $$ [pat p1; pat p2]
+    | ParP p          -> "ParP"       $$ [pat p]))
+
+  and lit = function
+    | NullLit       -> Atom "NullLit"
+    | BoolLit true  -> "BoolLit"   $$ [ Atom "true" ]
+    | BoolLit false -> "BoolLit"   $$ [ Atom "false" ]
+    | NatLit n      -> "NatLit"    $$ [ Atom (Numerics.Nat.to_pretty_string n) ]
+    | Nat8Lit n     -> "Nat8Lit"   $$ [ Atom (Numerics.Nat8.to_pretty_string n) ]
+    | Nat16Lit n    -> "Nat16Lit"  $$ [ Atom (Numerics.Nat16.to_pretty_string n) ]
+    | Nat32Lit n    -> "Nat32Lit"  $$ [ Atom (Numerics.Nat32.to_pretty_string n) ]
+    | Nat64Lit n    -> "Nat64Lit"  $$ [ Atom (Numerics.Nat64.to_pretty_string n) ]
+    | IntLit i      -> "IntLit"    $$ [ Atom (Numerics.Int.to_pretty_string i) ]
+    | Int8Lit i     -> "Int8Lit"   $$ [ Atom (Numerics.Int_8.to_pretty_string i) ]
+    | Int16Lit i    -> "Int16Lit"  $$ [ Atom (Numerics.Int_16.to_pretty_string i) ]
+    | Int32Lit i    -> "Int32Lit"  $$ [ Atom (Numerics.Int_32.to_pretty_string i) ]
+    | Int64Lit i    -> "Int64Lit"  $$ [ Atom (Numerics.Int_64.to_pretty_string i) ]
+    | FloatLit f    -> "FloatLit"  $$ [ Atom (Numerics.Float.to_pretty_string f) ]
+    | CharLit c     -> "CharLit"   $$ [ Atom (string_of_int c) ]
+    | TextLit t     -> "TextLit"   $$ [ Atom t ]
+    | BlobLit b     -> "BlobLit"   $$ [ Atom b ]
+    | PreLit (s, p)  -> "PreLit"    $$ [ Atom s; Arrange_type.prim p ]
+
+  and case c = source c.at ("case" $$ [pat c.it.pat; exp c.it.exp])
+
+  and catch c = "catch" $$ [pat c.it.pat; exp c.it.exp]
+
+  and pat_field pf = source pf.at (pf.it.id.it $$ [pat pf.it.pat])
+
+  and obj_sort s = match s.it with
+    | Type.Object -> Atom "Object"
+    | Type.Actor -> Atom "Actor"
+    | Type.Module -> Atom "Module"
+    | Type.Memory -> Atom "Memory"
+
+  and shared_pat sp = match sp.it with
+    | Type.Local -> Atom "Local"
+    | Type.Shared (Type.Write, p) -> "Shared" $$ [pat p]
+    | Type.Shared (Type.Query, p) -> "Query" $$ [pat p]
+    | Type.Shared (Type.Composite, p) -> "Composite" $$ [pat p]
+
+  and func_sort s = match s.it with
+    | Type.Local -> Atom "Local"
+    | Type.Shared Type.Write -> Atom "Shared"
+    | Type.Shared Type.Query -> Atom "Query"
+    | Type.Shared Type.Composite -> Atom "Composite"
+
+  and mut m = match m.it with
+    | Const -> Atom "Const"
+    | Var   -> Atom "Var"
+
+  and vis v = match v.it with
+    | Public None -> Atom "Public"
+    | Public (Some m) -> "Public" $$ [Atom m]
+    | Private -> Atom "Private"
+    | System -> Atom "System"
+
+  and stab s_opt = match s_opt with
+    | None -> Atom "(Flexible)"
+    | Some s ->
+      (match s.it with
+      | Flexible -> Atom "Flexible"
+      | Stable -> Atom "Stable")
+
+  and typ_field (tf : typ_field) = match tf.it with
+    | ValF (id, t, m) -> id.it $$ [typ t; mut m]
+    | TypF (id', tbs, t) ->
+        "TypF" $$ [id id'] @ List.map typ_bind tbs @ [typ t]
+  and typ_item ((id, ty) : typ_item) =
+    match id with
+    | None -> [typ ty]
+    | Some { it;_ } -> [Atom it; typ ty]
+
+  and typ_tag (tt : typ_tag)
+    = source tt.at (tt.it.tag.it $$ [typ tt.it.typ])
+
+  and typ_bind (tb : typ_bind)
+    = source tb.at (tb.it.var.it $$ [typ tb.it.bound])
+
+  and dec_field (df : dec_field)
+    = trivia df.at (source df.at ("DecField" $$ [dec df.it.dec; vis df.it.vis; stab df.it.stab]))
+
+  and exp_field (ef : exp_field)
+    = source ef.at ("ExpField" $$ [mut ef.it.mut; id ef.it.id; exp ef.it.exp])
+
+  and operator_type t = Atom (Type.string_of_typ t)
+
+  and path p = match p.it with
+    | IdH i -> "IdH" $$ [id i]
+    | DotH (p, i) -> "DotH" $$ [path p; id i]
+
+  and typ t = source t.at (annot_typ t.note (match t.it with
+  | PathT (p, ts) -> "PathT" $$ [path p] @ List.map typ ts
+  | PrimT p -> "PrimT" $$ [Atom p]
+  | ObjT (s, ts) -> "ObjT" $$ [obj_sort s] @ List.map typ_field ts
+  | ArrayT (m, t) -> "ArrayT" $$ [mut m; typ t]
+  | OptT t -> "OptT" $$ [typ t]
+  | VariantT cts -> "VariantT" $$ List.map typ_tag cts
+  | TupT ts -> "TupT" $$ List.concat_map typ_item ts
+  | FuncT (s, tbs, at, rt) -> "FuncT" $$ [func_sort s] @ List.map typ_bind tbs @ [ typ at; typ rt]
+  | AsyncT (Type.Fut, t1, t2) -> "AsyncT" $$ [typ t1; typ t2]
+  | AsyncT (Type.Cmp, t1, t2) -> "AsyncT*" $$ [typ t1; typ t2]
+  | AndT (t1, t2) -> "AndT" $$ [typ t1; typ t2]
+  | OrT (t1, t2) -> "OrT" $$ [typ t1; typ t2]
+  | ParT t -> "ParT" $$ [typ t]
+  | NamedT (id, t) -> "NamedT" $$ [Atom id.it; typ t]))
+
+  and dec d = trivia d.at (source d.at (match d.it with
+    | ExpD e -> "ExpD" $$ [exp e]
+    | LetD (p, e, Some f) -> "LetD" $$ [pat p; exp e; exp f]
+    | LetD (p, e, None) -> "LetD" $$ [pat p; exp e]
+    | VarD (x, e) -> "VarD" $$ [id x; exp e]
+    | TypD (x, tp, t) ->
+      "TypD" $$ [id x] @ List.map typ_bind tp @ [typ t]
+    | ClassD (sp, x, tp, p, rt, s, i', dfs) ->
+      "ClassD" $$ shared_pat sp :: id x :: List.map typ_bind tp @ [
+        pat p;
+        (match rt with None -> Atom "_" | Some t -> typ t);
+        obj_sort s; id i'
+      ] @ List.map dec_field dfs))
+
+  and prog p = "Prog" $$ List.map dec p.it
+end
+
+(* Defaults *)
+include Make (Default)
+
+
+
+ + + diff --git a/coverage/mo_def/compUnit.ml.html b/coverage/mo_def/compUnit.ml.html new file mode 100644 index 00000000000..bdebdb01cb7 --- /dev/null +++ b/coverage/mo_def/compUnit.ml.html @@ -0,0 +1,438 @@ + + + + + compUnit.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+
+
open Mo_types
+
+open Syntax
+
+
+(* Compilation unit detection *)
+
+let is_actor_def e =
+  let open Source in
+  match e.it with
+  | AwaitE (Type.Fut, { it = AsyncE (Type.Fut, _, {it = ObjBlockE ({ it = Type.Actor; _}, _t, _fields); _ }) ; _  }) -> true
+  | _ -> false
+
+let as_actor_def e =
+  let open Source in
+  match e.it with
+  | AwaitE (Type.Fut, { it = AsyncE (Type.Fut, _, {it = ObjBlockE ({ it = Type.Actor; _}, _t, fields); note; at }) ; _  }) ->
+    fields, note, at
+  | _ -> assert false
+
+let is_module_def e =
+  let open Source in
+  match e.it with
+  | ObjBlockE ({ it = Type.Module; _}, _, _) -> true
+  | _ -> false
+
+(* Happens after parsing, before type checking *)
+let comp_unit_of_prog as_lib (prog : prog) : comp_unit =
+  let open Source in
+  let f = prog.note in
+
+  let finish imports u =
+    { it = { imports = List.rev imports; body = u }; note = f; at = no_region } in
+  let prog_typ_note = { empty_typ_note with note_typ = Type.unit } in
+
+  let rec go imports ds : comp_unit =
+    match ds with
+    (* imports *)
+    | {it = LetD (p, ({it = ImportE (url, ri); _} as e), None); _} :: ds' ->
+      let i : import = { it = (p, url, ri); note = e.note.note_typ; at = e.at } in
+      go (i :: imports) ds'
+
+    (* terminal expressions *)
+    | [{it = ExpD ({it = ObjBlockE ({it = Type.Module; _}, _t, fields); _} as e); _}] when as_lib ->
+      finish imports { it = ModuleU (None, fields); note = e.note; at = e.at }
+    | [{it = ExpD e; _} ] when is_actor_def e ->
+      let fields, note, at = as_actor_def e in
+      finish imports { it = ActorU (None, fields); note; at }
+    | [{it = ClassD (sp, tid, tbs, p, typ_ann, {it = Type.Actor;_}, self_id, fields); _} as d] ->
+      assert (List.length tbs > 0);
+      finish imports { it = ActorClassU (sp, tid, tbs, p, typ_ann, self_id, fields); note = d.note; at = d.at }
+    (* let-bound terminal expressions *)
+    | [{it = LetD ({it = VarP i1; _}, ({it = ObjBlockE ({it = Type.Module; _}, _t, fields); _} as e), _); _}] when as_lib ->
+      finish imports { it = ModuleU (Some i1, fields); note = e.note; at = e.at }
+    | [{it = LetD ({it = VarP i1; _}, e, _); _}] when is_actor_def e ->
+      let fields, note, at = as_actor_def e in
+      finish imports { it = ActorU (Some i1, fields); note; at }
+
+    (* Everything else is a program *)
+    | ds' ->
+      if as_lib
+      then
+        (* Deprecated syntax, see Typing.check_lib *)
+        let fs = List.map (fun d -> {vis = Public None @@ no_region; dec = d; stab = None} @@ d.at) ds' in
+        finish imports {it = ModuleU (None, fs); at = no_region; note = empty_typ_note}
+      else finish imports { it = ProgU ds; note = prog_typ_note; at = no_region }
+  in
+  go [] prog.it
+
+
+(* Lib as decs *)
+let obj_decs obj_sort at note id_opt fields =
+  let open Source in
+  match id_opt with
+  | None -> [
+    { it = ExpD {
+        it = ObjBlockE ( { it = obj_sort; at; note = () }, None, fields);
+        at;
+        note };
+      at; note }]
+  | Some id -> [
+    { it = LetD (
+        { it = VarP id; at; note = note.note_typ },
+        { it = ObjBlockE ({ it = obj_sort; at; note = () }, None, fields);
+          at; note; },
+        None);
+      at; note
+    };
+    { it = ExpD { it = VarE id; at; note };
+      at; note }
+    ]
+
+(* To enable uniform definedness checking, typechecking and interpretation,
+   present the unit as a list of declarations.
+*)
+let decs_of_lib (cu : comp_unit) =
+  let open Source in
+  let { imports; body = cub; _ } = cu.it in
+  let import_decs = List.map (fun { it = (pat, fp, ri); at; note} ->
+    { it = LetD (
+      pat,
+      { it = ImportE (fp, ri);
+        at;
+        note = { note_typ = note; note_eff = Type.Triv} },
+      None);
+      at;
+      note = { note_typ = note; note_eff = Type.Triv } }) imports
+  in
+  import_decs,
+  match cub.it with
+  | ModuleU (id_opt, fields) ->
+    obj_decs Type.Module cub.at cub.note id_opt fields
+  | ActorClassU (csp, i, tbs, p, t, i', efs) ->
+    [{ it = ClassD (csp, i, tbs, p, t, { it = Type.Actor; at = no_region; note = ()}, i', efs);
+       at = cub.at;
+       note = cub.note;}];
+  | ProgU _
+  | ActorU _ ->
+    assert false
+
+(* a hack to support compiling multiple files *)
+let combine_progs (progs : prog list) : prog =
+  let open Source in
+  if progs = []
+  then
+    { it = [];
+      at = no_region;
+      note = { filename = "empty"; trivia = Trivia.empty_triv_table }
+    }
+  else
+    { it = List.concat_map (fun p -> p.it) progs;
+      at = (Lib.List.last progs).at;
+      note = (Lib.List.last progs).note
+    }
+
+
+
+ + + diff --git a/coverage/mo_def/syntax.ml.html b/coverage/mo_def/syntax.ml.html new file mode 100644 index 00000000000..1145b3a6578 --- /dev/null +++ b/coverage/mo_def/syntax.ml.html @@ -0,0 +1,1078 @@ + + + + + syntax.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+
+
open Mo_types
+open Mo_values
+
+open Operator
+
+
+(* Notes *)
+
+type typ_note = {note_typ : Type.typ; note_eff : Type.eff}
+
+let empty_typ_note = {note_typ = Type.Pre; note_eff = Type.Triv}
+
+(* Resolved imports (filled in separately after parsing) *)
+
+type lib_path = {package : string option; path : string}
+type resolved_import =
+  | Unresolved
+  | LibPath of lib_path
+  | IDLPath of (string * string) (* filepath * bytes *)
+  | PrimPath (* the built-in prim module *)
+
+(* Identifiers *)
+
+type id = string Source.phrase
+type typ_id = (string, Type.con option) Source.annotated_phrase
+
+
+(* Types *)
+
+type obj_sort = Type.obj_sort Source.phrase
+type func_sort = Type.func_sort Source.phrase
+
+type mut = mut' Source.phrase
+and mut' = Const | Var
+
+and path = (path', Type.typ) Source.annotated_phrase
+and path' =
+  | IdH  of id
+  | DotH of path * id
+
+and async_sort = Type.async_sort
+
+type typ = (typ', Type.typ) Source.annotated_phrase
+and typ' =
+  | PathT of path * typ list                       (* type path *)
+  | PrimT of string                                (* primitive *)
+  | ObjT of obj_sort * typ_field list              (* object *)
+  | ArrayT of mut * typ                            (* array *)
+  | OptT of typ                                    (* option *)
+  | VariantT of typ_tag list                       (* variant *)
+  | TupT of typ_item list                          (* tuple *)
+  | FuncT of func_sort * typ_bind list * typ * typ (* function *)
+  | AsyncT of async_sort * scope * typ             (* future / computation *)
+  | AndT of typ * typ                              (* intersection *)
+  | OrT of typ * typ                               (* union *)
+  | ParT of typ                                    (* parentheses, used to control function arity only *)
+  | NamedT of id * typ                             (* parenthesized single element named "tuple" *)
+
+and scope = typ
+and typ_field = typ_field' Source.phrase
+and typ_field' =
+  | ValF of id * typ * mut
+  | TypF of typ_id * typ_bind list * typ
+
+and typ_tag = typ_tag' Source.phrase
+and typ_tag' = {tag : id; typ : typ}
+
+and bind_sort = Type.bind_sort Source.phrase
+and typ_bind = (typ_bind', Type.con option) Source.annotated_phrase
+and typ_bind' = {var : id; sort : bind_sort; bound : typ;}
+
+and typ_item = id option * typ
+
+
+(* Literals *)
+
+type lit =
+  | NullLit
+  | BoolLit of bool
+  | NatLit of Numerics.Nat.t
+  | Nat8Lit of Numerics.Nat8.t
+  | Nat16Lit of Numerics.Nat16.t
+  | Nat32Lit of Numerics.Nat32.t
+  | Nat64Lit of Numerics.Nat64.t
+  | IntLit of Numerics.Int.t
+  | Int8Lit of Numerics.Int_8.t
+  | Int16Lit of Numerics.Int_16.t
+  | Int32Lit of Numerics.Int_32.t
+  | Int64Lit of Numerics.Int_64.t
+  | FloatLit of Numerics.Float.t
+  | CharLit of Value.unicode
+  | TextLit of string
+  | BlobLit of string
+  | PreLit of string * Type.prim
+
+
+(* Patterns *)
+
+type pat = (pat', Type.typ) Source.annotated_phrase
+and pat' =
+  | WildP                                      (* wildcard *)
+  | VarP of id                                 (* variable *)
+  | LitP of lit ref                            (* literal *)
+  | SignP of unop * lit ref                    (* signed literal *)
+  | TupP of pat list                           (* tuple *)
+  | ObjP of pat_field list                     (* object *)
+  | OptP of pat                                (* option *)
+  | TagP of id * pat                           (* tagged variant *)
+  | AltP of pat * pat                          (* disjunctive *)
+  | AnnotP of pat * typ                        (* type annotation *)
+  | ParP of pat                                (* parenthesis *)
+(*
+  | AsP of pat * pat                           (* conjunctive *)
+*)
+
+and pat_field = pat_field' Source.phrase
+and pat_field' = {id : id; pat : pat}
+
+
+(* Expressions *)
+
+type vis = vis' Source.phrase
+and vis' =
+  | Public of string option
+  | Private
+  | System
+
+let is_public vis = match vis.Source.it with Public _ -> true | _ -> false
+let is_private vis = match vis.Source.it with Private -> true | _ -> false
+
+type stab = stab' Source.phrase
+and stab' = Stable | Flexible
+
+type op_typ = Type.typ ref (* For overloaded resolution; initially Type.Pre. *)
+
+type inst = ((bool * typ list) option, Type.typ list) Source.annotated_phrase (* For implicit scope instantiation *)
+
+type sort_pat = (Type.shared_sort * pat) Type.shared Source.phrase
+
+type sugar = bool (* Is the source of a function body a block `<block>`,
+                     subject to further desugaring during parse,
+                     or the invariant form `= <exp>`.
+                     In the final output of the parser, the exp in FuncE is
+                     always in its fully desugared form and the
+                     value of the sugar field is irrelevant.
+                     This flag is used to correctly desugar an actor's
+                     public functions as oneway, shared functions *)
+
+type exp = (exp', typ_note) Source.annotated_phrase
+and exp' =
+  | PrimE of string                            (* primitive *)
+  | VarE of id                                 (* variable *)
+  | LitE of lit ref                            (* literal *)
+  | ActorUrlE of exp                           (* actor reference *)
+  | UnE of op_typ * unop * exp                 (* unary operator *)
+  | BinE of op_typ * exp * binop * exp         (* binary operator *)
+  | RelE of op_typ * exp * relop * exp         (* relational operator *)
+  | ShowE of (op_typ * exp)                    (* debug show operator *)
+  | ToCandidE of exp list                      (* to_candid operator *)
+  | FromCandidE of exp                         (* from_candid operator *)
+  | TupE of exp list                           (* tuple *)
+  | ProjE of exp * int                         (* tuple projection *)
+  | OptE of exp                                (* option injection *)
+  | DoOptE of exp                              (* option monad *)
+  | BangE of exp                               (* scoped option projection *)
+  | ObjBlockE of obj_sort * typ option * dec_field list  (* object block *)
+  | ObjE of exp list * exp_field list          (* record literal/extension *)
+  | TagE of id * exp                           (* variant *)
+  | DotE of exp * id                           (* object projection *)
+  | AssignE of exp * exp                       (* assignment *)
+  | ArrayE of mut * exp list                   (* array *)
+  | IdxE of exp * exp                          (* array indexing *)
+  | FuncE of string * sort_pat * typ_bind list * pat * typ option * sugar * exp  (* function *)
+  | CallE of exp * inst * exp                  (* function call *)
+  | BlockE of dec list                         (* block (with type after avoidance)*)
+  | NotE of exp                                (* negation *)
+  | AndE of exp * exp                          (* conjunction *)
+  | OrE of exp * exp                           (* disjunction *)
+  | ImpliesE of exp * exp                      (* implication *)
+  | OldE of exp                                (* old-expression *)
+  | IfE of exp * exp * exp                     (* conditional *)
+  | SwitchE of exp * case list                 (* switch *)
+  | WhileE of exp * exp                        (* while-do loop *)
+  | LoopE of exp * exp option                  (* do-while loop *)
+  | ForE of pat * exp * exp                    (* iteration *)
+  | LabelE of id * typ * exp                   (* label *)
+  | BreakE of id * exp                         (* break *)
+  | RetE of exp                                (* return *)
+  | DebugE of exp                              (* debugging *)
+  | AsyncE of async_sort * typ_bind * exp      (* future / computation *)
+  | AwaitE of async_sort * exp                 (* await *)
+  | AssertE of assert_kind * exp               (* assertion *)
+  | AnnotE of exp * typ                        (* type annotation *)
+  | ImportE of (string * resolved_import ref)  (* import statement *)
+  | ThrowE of exp                              (* throw exception *)
+  | TryE of exp * case list                    (* catch exception *)
+  | IgnoreE of exp                             (* ignore *)
+(*
+  | FinalE of exp * exp                        (* finally *)
+  | AtomE of string                            (* atom *)
+*)
+
+and assert_kind =
+  | Runtime | Static | Invariant | Precondition | Postcondition | Concurrency of string | Loop_entry | Loop_continue | Loop_exit
+
+and dec_field = dec_field' Source.phrase
+and dec_field' = {dec : dec; vis : vis; stab: stab option}
+
+and exp_field = exp_field' Source.phrase
+and exp_field' = {mut : mut; id : id; exp : exp}
+
+and case = case' Source.phrase
+and case' = {pat : pat; exp : exp}
+
+
+(* Declarations *)
+
+and dec = (dec', typ_note) Source.annotated_phrase
+and dec' =
+  | ExpD of exp                                (* plain unit expression *)
+  | LetD of pat * exp * exp option             (* immutable, with an optional fail block *)
+  | VarD of id * exp                           (* mutable *)
+  | TypD of typ_id * typ_bind list * typ       (* type *)
+  | ClassD of                                  (* class *)
+      sort_pat * typ_id * typ_bind list * pat * typ option * obj_sort * id * dec_field list
+
+
+(* Program (pre unit detection) *)
+
+type prog_note = { filename : string; trivia : Trivia.triv_table }
+type prog = (prog', prog_note) Source.annotated_phrase
+and prog' = dec list
+
+(* Signatures (stable variables) *)
+
+type stab_sig = (stab_sig', prog_note) Source.annotated_phrase
+and stab_sig' = (dec list * typ_field list)      (* type declarations & stable actor fields *)
+
+(* Compilation units *)
+
+type import = (import', Type.typ) Source.annotated_phrase
+and import' = pat * string * resolved_import ref
+
+type comp_unit_body = (comp_unit_body', typ_note) Source.annotated_phrase
+and comp_unit_body' =
+ | ProgU of dec list                         (* main programs *)
+ | ActorU of id option * dec_field list      (* main IC actor *)
+ | ModuleU of id option * dec_field list     (* module library *)
+ | ActorClassU of                            (* IC actor class, main or library *)
+     sort_pat * typ_id * typ_bind list * pat * typ option * id * dec_field list
+
+type comp_unit = (comp_unit', prog_note) Source.annotated_phrase
+and comp_unit' = {
+  imports : import list;
+  body : comp_unit_body;
+  }
+
+type lib = comp_unit
+
+
+(* Helpers *)
+
+let (@@) = Source.(@@)
+let (@?) it at = Source.({it; at; note = empty_typ_note})
+let (@!) it at = Source.({it; at; note = Type.Pre})
+let (@=) it at = Source.({it; at; note = None})
+
+
+(* NB: This function is currently unused *)
+let string_of_lit = function
+  | BoolLit false -> "false"
+  | BoolLit true  ->  "true"
+  | IntLit n
+  | NatLit n      -> Numerics.Int.to_pretty_string n
+  | Int8Lit n     -> Numerics.Int_8.to_pretty_string n
+  | Int16Lit n    -> Numerics.Int_16.to_pretty_string n
+  | Int32Lit n    -> Numerics.Int_32.to_pretty_string n
+  | Int64Lit n    -> Numerics.Int_64.to_pretty_string n
+  | Nat8Lit n     -> Numerics.Nat8.to_pretty_string n
+  | Nat16Lit n    -> Numerics.Nat16.to_pretty_string n
+  | Nat32Lit n    -> Numerics.Nat32.to_pretty_string n
+  | Nat64Lit n    -> Numerics.Nat64.to_pretty_string n
+  | CharLit c     -> string_of_int c
+  | NullLit       -> "null"
+  | TextLit t     -> t
+  | BlobLit b     -> b
+  | FloatLit f    -> Numerics.Float.to_pretty_string f
+  | PreLit _      -> assert false
+
+
+
+(* Miscellaneous *)
+(* TODO: none of what follows should probably be in this file *)
+
+open Source
+
+
+(* Identifiers *)
+
+let anon_id sort at = "@anon-" ^ sort ^ "-" ^ string_of_pos at.left
+let is_anon_id id = Lib.String.chop_prefix "@anon-" id.it <> None
+
+(* Types & Scopes *)
+
+let arity t =
+  match t.Source.it with
+  | TupT ts -> List.length ts
+  | _ -> 1
+
+let is_any t =
+  match t.it with
+  | PrimT "Any" -> true
+  | _ -> false
+
+let scopeT at =
+  PathT (IdH {it = Type.default_scope_var; at; note = ()} @! at, []) @! at
+
+
+(* Expressions *)
+
+let asyncE sort tbs e =
+  AsyncE (sort, tbs, e) @? e.at
+
+let ignore_asyncE tbs e =
+  IgnoreE (
+    AnnotE (AsyncE (Type.Fut, tbs, e) @? e.at,
+      AsyncT (Type.Fut, scopeT e.at, TupT [] @! e.at) @! e.at) @? e.at ) @? e.at
+
+let is_asyncE e =
+  match e.it with
+  | AsyncE _ -> true
+  | _ -> false
+
+let is_ignore_asyncE e =
+  match e.it with
+  | IgnoreE
+      {it = AnnotE ({it = AsyncE (Type.Fut, _, _); _},
+        {it = AsyncT (Type.Fut, _, {it = TupT []; _}); _}); _} ->
+    true
+  | _ -> false
+
+
+
+ + + diff --git a/coverage/mo_frontend/bi_match.ml.html b/coverage/mo_frontend/bi_match.ml.html new file mode 100644 index 00000000000..6e4f35b03a1 --- /dev/null +++ b/coverage/mo_frontend/bi_match.ml.html @@ -0,0 +1,1073 @@ + + + + + bi_match.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+
+
open Mo_types
+open Type
+
+(* TODO: consider turning off show_stamps (but then do it elsewhere too)
+open MakePretty(struct let show_stamps = false end)
+*)
+
+let pp_rel ppf (t1, rel, t2) =
+  Format.fprintf ppf "@[<hv 2>%a  %s @ %a@]"
+    pp_typ t1
+    rel
+    pp_typ t2
+
+let pp_constraint ppf (lb, c, ub) =
+  Format.fprintf ppf "@[<hv 2>%a  <: @ @[<hv 2>%s  <: @ %a@]@]"
+    pp_typ lb
+    (Cons.name c)
+    pp_typ ub
+
+let display_constraint = Lib.Format.display pp_constraint
+let display_rel = Lib.Format.display pp_rel
+
+(* Bi-Matching *)
+
+exception Bimatch of string
+
+module SS = Set.Make (OrdPair)
+
+(* Types that are denotable (ranged over) by type variables *)
+let denotable t =
+  let t' = normalize t in
+  not (is_mut t' || is_typ t')
+
+let bound c = match Cons.kind c with
+  | Abs ([], t) -> t
+  | _ -> assert false
+
+(* Check instantiation `ts` satisfies bounds `tbs` and all the pairwise sub-typing relations in `subs`;
+   used to sanity check inferred instantiations *)
+let verify_inst tbs subs ts =
+  List.length tbs = List.length ts &&
+  List.for_all2 (fun t tb -> sub t (open_ ts tb.bound)) ts tbs &&
+  List.for_all (fun (t1, t2) -> sub (open_ ts t1) (open_ ts t2)) subs
+
+let bi_match_subs scope_opt tbs subs typ_opt =
+  let ts = open_binds tbs in
+
+  let ts1 = List.map (fun (t1, _) -> open_ ts t1) subs in
+  let ts2 = List.map (fun (_, t2) -> open_ ts t2) subs in
+
+  let cs = List.map (fun t -> fst (as_con t)) ts in
+
+  let cons = ConSet.of_list cs in
+
+  let flexible c = ConSet.mem c cons in
+
+  let variances =
+    match typ_opt with
+    | Some t ->
+      Variance.variances cons (open_ ts t)
+    | None ->
+      ConSet.fold (fun c ce -> ConEnv.add c Variance.Bivariant ce) cons ConEnv.empty
+  in
+
+  let variance c = ConEnv.find c variances in
+
+  let mentions typ ce = not (ConSet.is_empty (ConSet.inter (Type.cons typ) ce)) in
+
+  let rec bi_match_list p rel eq inst any xs1 xs2 =
+    match (xs1, xs2) with
+    | x1::xs1, x2::xs2 ->
+      (match p rel eq inst any x1 x2 with
+      | Some inst -> bi_match_list p rel eq inst any xs1 xs2
+      | None -> None)
+    | [], [] -> Some inst
+    | _, _ -> None
+  in
+
+  let update binop c t ce =
+    ConEnv.add c (binop t (ConEnv.find c ce)) ce
+  in
+
+  let rec bi_match_typ rel eq ((l, u) as inst) any t1 t2 =
+    if t1 == t2 || SS.mem (t1, t2) !rel
+    then Some inst
+    else begin
+    rel := SS.add (t1, t2) !rel;
+    match t1, t2 with
+    | Pre, _ | _, Pre ->
+      Some inst
+    | Any, Any ->
+      Some inst
+    | _, Any when rel != eq ->
+      Some inst
+    | Non, Non ->
+      Some inst
+    | Non, _ when rel != eq ->
+      Some inst
+    | _, Con (con2, ts2) when flexible con2 ->
+      assert (ts2 = []);
+      if mentions t1 any || not (denotable t1) then
+        None
+      else Some
+       (update lub con2 t1 l,
+        if rel != eq then u else update glb con2 t1 u)
+    | Con (con1, ts1), _ when flexible con1 ->
+      assert (ts1 = []);
+      if mentions t2 any || not (denotable t2) then
+        None
+      else Some
+        ((if rel != eq then l else update lub con1 t2 l),
+         update glb con1 t2 u)
+    | Con (con1, _), Con (con2, _) when flexible con1 && flexible con2 ->
+      (* Because we do matching, not unification, we never relate two flexible variables *)
+      assert false
+    | Con (con1, ts1), Con (con2, ts2) ->
+      (match Cons.kind con1, Cons.kind con2 with
+      | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | _, Def (tbs, t) -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any t1 (open_ ts2 t)
+      | _ when Cons.eq con1 con2 ->
+        assert (ts1 = []);
+        assert (ts2 = []);
+        Some inst
+      | Abs (tbs, t), _ when rel != eq ->
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | _ -> None
+      )
+    | Con (con1, ts1), t2 ->
+      (match Cons.kind con1, t2 with
+      | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | Abs (tbs, t), _ when rel != eq ->
+        bi_match_typ rel eq inst any (open_ ts1 t) t2
+      | _ -> None
+      )
+    | t1, Con (con2, ts2) ->
+      (match Cons.kind con2 with
+      | Def (tbs, t) -> (* TBR this may fail to terminate *)
+        bi_match_typ rel eq inst any t1 (open_ ts2 t)
+      | _ -> None
+      )
+    | Prim p1, Prim p2 when p1 = p2 ->
+      Some inst
+    | Prim p1, Prim p2 when rel != eq ->
+      if p1 = Nat && p2 = Int then Some inst else None
+    | Obj (s1, tfs1), Obj (s2, tfs2) ->
+      if s1 = s2 then
+        bi_match_fields rel eq inst any tfs1 tfs2
+      else None
+    | Array t1', Array t2' ->
+      bi_match_typ rel eq inst any t1' t2'
+    | Opt t1', Opt t2' ->
+      bi_match_typ rel eq inst any t1' t2'
+    | Prim Null, Opt t2' when rel != eq ->
+      Some inst
+    | Variant fs1, Variant fs2 ->
+      bi_match_tags rel eq inst any fs1 fs2
+    | Tup ts1, Tup ts2 ->
+      bi_match_list bi_match_typ rel eq inst any ts1 ts2
+    | Func (s1, c1, tbs1, t11, t12), Func (s2, c2, tbs2, t21, t22) ->
+      if s1 = s2 && c1 = c2 then
+      (match bi_match_binds rel eq inst any tbs1 tbs2 with
+       | Some (inst, ts) ->
+         let any' = List.fold_right
+           (fun t -> ConSet.add (fst (as_con t))) ts any
+         in
+         (match
+           bi_match_list bi_match_typ rel eq inst any' (List.map (open_ ts) t21) (List.map (open_ ts) t11)
+          with
+         | Some inst ->
+           bi_match_list bi_match_typ rel eq inst any' (List.map (open_ ts) t12) (List.map (open_ ts) t22)
+         | None -> None)
+       | None -> None
+      )
+      else None
+    | Async (s1, t11, t12), Async (s2, t21, t22) ->
+      if s1 = s2 then
+        (match bi_equate_typ rel eq inst any t11 t21  with
+         | Some inst ->
+           bi_match_typ rel eq inst any t12 t22
+         | None -> None)
+      else None
+    | Mut t1', Mut t2' ->
+      bi_equate_typ rel eq inst any t1' t2'
+    | Typ c1, Typ c2 ->
+      (* NB: we assume c1, c2 closed *)
+      if Type.eq t1 t2 then Some inst else None
+    | _, _ -> None
+    end
+
+  and bi_equate_typ rel eq inst any t1 t2 =
+    bi_match_typ eq eq inst any t1 t2
+
+  and bi_match_fields rel eq inst any tfs1 tfs2 =
+    (* Assume that tfs1 and tfs2 are sorted. *)
+    match tfs1, tfs2 with
+    | [], [] ->
+      Some inst
+    | _, [] when rel != eq ->
+      Some inst
+    | tf1::tfs1', tf2::tfs2' ->
+      (match compare_field tf1 tf2 with
+      | 0 ->
+        (match bi_match_typ rel eq inst any tf1.typ tf2.typ with
+         | Some inst -> bi_match_fields rel eq inst any tfs1' tfs2'
+         | None -> None)
+      | -1 when rel != eq ->
+        bi_match_fields rel eq inst any tfs1' tfs2
+      | _ -> None
+      )
+    | _, _ -> None
+
+  and bi_match_tags rel eq inst any tfs1 tfs2 =
+    (* Assume that tfs1 and tfs2 are sorted. *)
+    match tfs1, tfs2 with
+    | [], [] ->
+      Some inst
+    | [], _  ->
+      Some inst
+    | tf1::tfs1', tf2::tfs2' ->
+      (match compare_field tf1 tf2 with
+      | 0 ->
+        (match bi_match_typ rel eq inst any tf1.typ tf2.typ with
+         | Some inst -> bi_match_tags rel eq inst any tfs1' tfs2'
+         | None -> None)
+      | +1  when rel != eq->
+        bi_match_tags rel eq inst any tfs1 tfs2'
+      | _ -> None
+      )
+    | _, _ -> None
+
+  and bi_match_binds rel eq inst any tbs1 tbs2 =
+    let ts = open_binds tbs2 in
+    match bi_match_list (bi_match_bind ts) rel eq inst any tbs2 tbs1 with
+    | Some inst -> Some (inst,ts)
+    | None -> None
+
+  and bi_match_bind ts rel eq inst any tb1 tb2 =
+    bi_match_typ rel eq inst any (open_ ts tb1.bound) (open_ ts tb2.bound)
+
+  and choose_under_constrained lb c ub =
+    match variance c with
+    | Variance.Covariant -> lb
+    | Variance.Contravariant -> ub
+    | Variance.Bivariant -> lb
+    | Variance.Invariant ->
+      raise (Bimatch (Format.asprintf
+        "implicit instantiation of type parameter %s is under-constrained with%a\nwhere%a\nso that explicit type instantiation is required"
+        (Cons.name c)
+        display_constraint (lb, c, ub)
+        display_rel (lb,"=/=",ub)))
+
+  and fail_over_constrained lb c ub =
+    raise (Bimatch (Format.asprintf
+      "implicit instantiation of type parameter %s is over-constrained with%a\nwhere%a\nso that no valid instantiation exists"
+      (Cons.name c)
+      display_constraint (lb, c, ub)
+      display_rel (lb, "</:", ub)))
+
+  and fail_open_bound c bd =
+    let c = Cons.name c in
+    raise (Bimatch (Format.asprintf
+      "type parameter %s has an open bound%a\nmentioning another type parameter, so that explicit type instantiation is required due to limitation of inference"
+      c (Lib.Format.display pp_typ) bd))
+
+  in
+    let bds = List.map (fun tb -> open_ ts tb.bound) tbs in
+    List.iter2 (fun c bd -> if mentions bd cons then fail_open_bound c bd) cs bds;
+
+    let l = ConSet.fold (fun c l -> ConEnv.add c Non l) cons ConEnv.empty in
+    let u = ConSet.fold (fun c u -> ConEnv.add c (bound c) u) cons ConEnv.empty in
+
+    let l, u = match scope_opt, tbs with
+      | Some c, {sort = Scope; _}::tbs ->
+        let c0 = List.hd cs in
+        ConEnv.add c0 c l,
+        ConEnv.add c0 c u
+      | None, {sort = Scope; _}::tbs ->
+        raise (Bimatch "scope instantiation required but no scope available")
+      | _, _ ->
+        l,
+        u
+    in
+    match
+      bi_match_list bi_match_typ
+        (ref SS.empty) (ref SS.empty) (l, u) ConSet.empty ts1 ts2
+    with
+    | Some (l, u) ->
+      let us = List.map
+        (fun c ->
+          match ConEnv.find c l, ConEnv.find c u with
+          | lb, ub ->
+            if eq lb ub then
+              ub
+            else if sub lb ub then
+              choose_under_constrained lb c ub
+            else
+              fail_over_constrained lb c ub)
+        cs
+      in
+      if verify_inst tbs subs us then
+        us
+      else
+        raise (Bimatch
+          (Printf.sprintf
+             "bug: inferred bad instantiation\n  <%s>\nplease report this error message and, for now, supply an explicit instantiation instead"
+            (String.concat ", " (List.map string_of_typ us))))
+    | None ->
+      let tts =
+        List.filter (fun (t1, t2) -> not (sub t1 t2)) (List.combine ts1 ts2)
+      in
+      raise (Bimatch (Format.asprintf
+        "no instantiation of %s makes%s"
+        (String.concat ", " (List.map string_of_con cs))
+        (String.concat "\nand"
+          (List.map (fun (t1, t2) ->
+            Format.asprintf "%a" display_rel (t1, "<:", t2))
+            tts))))
+
+let bi_match_call scope_opt (tbs, dom_typ, rng_typ) arg_typ ret_typ_opt =
+  match ret_typ_opt with
+  | None ->
+    (* no ret_typ: use polarities of tbs in rng_typ to
+       choose principal instantiation, if any *)
+    bi_match_subs scope_opt tbs
+      [(arg_typ, dom_typ) (*; (rng_typ, Any) *)]
+      (Some rng_typ)
+  | Some ret_typ ->
+    bi_match_subs scope_opt tbs
+      [(arg_typ, dom_typ); (rng_typ, ret_typ)]
+      None
+
+
+
+ + + diff --git a/coverage/mo_frontend/coverage.ml.html b/coverage/mo_frontend/coverage.ml.html new file mode 100644 index 00000000000..67a361b90aa --- /dev/null +++ b/coverage/mo_frontend/coverage.ml.html @@ -0,0 +1,1195 @@ + + + + + coverage.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+
+
open Mo_def
+open Mo_types
+open Mo_values
+
+open Syntax
+open Source
+
+module T = Type
+module V = Value
+
+module ValSet = Set.Make(struct type t = V.value let compare = V.compare end)
+module TagSet = Set.Make(struct type t = string let compare = String.compare end)
+module LabMap = Map.Make(struct type t = string let compare = String.compare end)
+module AtSet = Set.Make(struct type t = Source.region let compare = compare end)
+
+type desc =
+  | Any
+  | Val of V.value
+  | NotVal of ValSet.t
+  | Tup of desc list
+  | Obj of desc LabMap.t
+  | Opt of desc
+  | Tag of desc * string
+  | NotTag of TagSet.t
+
+type ctxt =
+  | InOpt of ctxt
+  | InTag of ctxt * string
+  | InTup of ctxt * desc list * desc list * pat list * T.typ list
+  | InObj of ctxt * desc LabMap.t * string * pat_field list * T.field list
+  | InAlt1 of ctxt * Source.region * pat * T.typ
+  | InAlt2 of ctxt * Source.region
+  | InCase of Source.region * case list * T.typ
+
+type sets =
+  { mutable cases : AtSet.t;
+    mutable alts : AtSet.t;
+    mutable reached_cases : AtSet.t;
+    mutable reached_alts : AtSet.t;
+    mutable missing : desc list;
+  }
+
+
+let make_sets () =
+  { cases = AtSet.empty;
+    alts = AtSet.empty;
+    reached_cases = AtSet.empty;
+    reached_alts = AtSet.empty;
+    missing = [];
+  }
+
+
+(* Generating counter examples *)
+
+let max_expand = 2
+
+let pick_nat (type t) (module Num : Numerics.NumType with type t = t) to_val vs =
+  let x = ref Num.zero in
+  while ValSet.mem (to_val !x) vs do
+    x := Num.add (Num.of_int 1) !x
+  done;
+  Val (to_val !x)
+
+let pick_int (type t) (module Num : Numerics.NumType with type t = t) to_val vs =
+  let x = ref Num.zero in
+  while ValSet.mem (to_val !x) vs do
+    x := Num.neg !x;
+    if Num.ge !x Num.zero then x := Num.add (Num.of_int 1) !x
+  done;
+  Val (to_val !x)
+
+let pick_char vs =
+  let x = ref 0 in
+  while ValSet.mem (V.Char !x) vs do
+    x := !x + 1
+  done;
+  Val (V.Char !x)
+
+let pick_val vs = function
+  | T.Null -> Val V.Null
+  | T.Bool -> Val (V.Bool (ValSet.mem (V.Bool false) vs))
+  | T.Nat -> pick_nat (module Numerics.Nat) (fun x -> V.Int x) vs
+  | T.Nat8 -> pick_nat (module Numerics.Nat8) (fun x -> V.Nat8 x) vs
+  | T.Nat16 -> pick_nat (module Numerics.Nat16) (fun x -> V.Nat16 x) vs
+  | T.Nat32 -> pick_nat (module Numerics.Nat32) (fun x -> V.Nat32 x) vs
+  | T.Nat64 -> pick_nat (module Numerics.Nat64) (fun x -> V.Nat64 x) vs
+  | T.Int -> pick_int (module Numerics.Int) (fun x -> V.Int x) vs
+  | T.Int8 -> pick_int (module Numerics.Int_8) (fun x -> V.Int8 x) vs
+  | T.Int16 -> pick_int (module Numerics.Int_16) (fun x -> V.Int16 x) vs
+  | T.Int32 -> pick_int (module Numerics.Int_32) (fun x -> V.Int32 x) vs
+  | T.Int64 -> pick_int (module Numerics.Int_64) (fun x -> V.Int64 x) vs
+  | T.Char -> pick_char vs
+  | T.Text
+  | T.Blob
+  | T.Error
+  | T.Principal
+  | T.Region
+  | T.Float -> Any
+
+let rec expand_notval t n vs : desc list =
+  let missing = Lib.Option.get (T.span t) max_int - ValSet.cardinal vs in
+  if missing = 0 then [] else
+  if n = max_expand && missing > 1 then [Any] else
+  match t with
+  | T.Prim t' ->
+    (match pick_val vs t' with
+    | Val v -> Val v :: expand_notval t (n + 1) (ValSet.add v vs)
+    | _ -> [Any]
+    )
+  | T.Opt _ -> [Opt Any]
+  | _ -> [Any]
+
+
+let rec pick_tag ls = function
+  | [] -> assert false
+  | tf::tfs when TagSet.mem tf.T.lab ls -> pick_tag ls tfs
+  | tf::_ -> tf.T.lab
+
+let rec expand_nottag tfs n ls : desc list =
+  let missing = List.length tfs - TagSet.cardinal ls in
+  if missing = 0 then [] else
+  if n = max_expand && missing > 1 then [Any] else
+  let l = pick_tag ls tfs in
+  Tag (Any, l) :: expand_nottag tfs (n + 1) (TagSet.add l ls)
+
+(* TODO: pretty print *)
+let rec string_of_desc t = function
+  | Any -> "_"
+  | Val v -> V.string_of_val 100 t v
+  | NotVal vs -> string_of_descs t (expand_notval (T.promote t) 0 vs)
+  | Tup descs ->
+    let ts = T.as_tup_sub (List.length descs) t in
+    "(" ^ String.concat ", " (List.map2 string_of_desc ts descs) ^ ")"
+  | Obj ldescs ->
+    let fields = LabMap.bindings ldescs in
+    let _, tfs = T.as_obj_sub (List.map fst fields) t in
+    "{" ^ String.concat "; " (List.map (string_of_ldesc tfs) fields) ^ "}"
+  | Opt desc ->
+    let t' = T.as_opt_sub t in
+    "?(" ^ string_of_desc t' desc ^ ")"
+  | Tag (desc, l) ->
+    let t' = T.lookup_val_field l (T.as_variant_sub l t) in
+    if T.sub t' T.unit then "#" ^ l
+    else if T.is_tup t' then "#" ^ l ^ " " ^ string_of_desc t' desc
+    else "#" ^ l ^ "(" ^ string_of_desc t' desc ^ ")"
+  | NotTag ls ->
+    let tfs = T.as_variant (T.promote t) in
+    string_of_descs t (expand_nottag tfs 0 ls)
+
+and string_of_ldesc tfs (l, desc) =
+  l ^ " = " ^ string_of_desc (T.lookup_val_field l tfs) desc
+
+and string_of_descs t descs =
+  assert (descs <> []);
+  String.concat " or " (List.map (string_of_desc t) descs)
+
+
+(* Abstract interpretation *)
+
+let is_neg_int = function
+  | V.Int i -> Numerics.Int.(lt i zero)
+  | _ -> false
+
+let value_of_lit = function
+  | NullLit -> V.Null
+  | BoolLit b -> V.Bool b
+  | NatLit n -> V.Int n
+  | Nat8Lit w -> V.Nat8 w
+  | Nat16Lit w -> V.Nat16 w
+  | Nat32Lit w -> V.Nat32 w
+  | Nat64Lit w -> V.Nat64 w
+  | IntLit i -> V.Int i
+  | Int8Lit w -> V.Int8 w
+  | Int16Lit w -> V.Int16 w
+  | Int32Lit w -> V.Int32 w
+  | Int64Lit w -> V.Int64 w
+  | FloatLit z -> V.Float z
+  | CharLit c -> V.Char c
+  | TextLit t -> V.Text t
+  | BlobLit b -> V.Blob b
+  | PreLit _ -> assert false
+
+
+let (&&&) = (&&) (* No short-cutting *)
+
+let skip_pat at sets =
+  sets.alts <- AtSet.add at sets.alts;
+  true
+
+let rec match_pat ctxt desc pat t sets =
+  T.span t = Some 0 && skip_pat pat.at sets ||
+  match pat.it with
+  | WildP | VarP _ ->
+    if T.inhabited t then
+      succeed ctxt desc sets
+    else
+      skip_pat pat.at sets
+  | LitP lit ->
+    match_lit ctxt desc pat.at (value_of_lit !lit) t sets
+  | SignP (op, lit) ->
+    let f = Operator.unop op (Operator.type_unop op pat.note) in
+    match_lit ctxt desc pat.at (f (value_of_lit !lit)) t sets
+  | TupP pats ->
+    let ts = T.as_tup (T.promote t) in
+    let descs =
+      match desc with
+      | Tup descs -> descs
+      | Any -> List.map (fun _ -> Any) pats
+      | _ -> assert false
+    in match_tup ctxt [] descs pats ts sets
+  | ObjP pat_fields ->
+    let _, tfs = T.as_obj (T.promote t) in
+    let ldescs =
+      match desc with
+      | Obj ldescs -> ldescs
+      | Any ->
+        LabMap.(List.fold_left
+          (fun m (tf : T.field) -> add tf.T.lab Any m) empty tfs)
+      | _ -> assert false
+    in match_obj ctxt ldescs pat_fields tfs sets
+  | OptP pat1 ->
+    if T.is_prim T.Null (T.promote t) then  (* may occur through subtyping *)
+      skip_pat pat.at sets && fail ctxt (Val V.Null) sets
+    else
+      let t' = T.as_opt (T.promote t) in
+      (match desc with
+      | Opt desc' ->
+        match_pat (InOpt ctxt) desc' pat1 t' sets
+      | Val V.Null ->
+        fail ctxt desc sets
+      | NotVal vs when ValSet.mem V.Null vs ->
+        match_pat (InOpt ctxt) Any pat1 t' sets
+      | Any ->
+        fail ctxt (Val V.Null) sets &&&
+        match_pat (InOpt ctxt) Any pat1 t' sets
+      | _ -> assert false
+      )
+  | TagP (id, pat1) ->
+    let t', found =
+      match T.lookup_val_field_opt id.it (T.as_variant (T.promote t)) with
+      | None -> T.Non, false  (* may occur through subtyping *)
+      | Some t' -> t', true
+    in
+    (match desc with
+    | Tag (desc', l) ->
+      if id.it = l then
+        match_pat (InTag (ctxt, l)) desc' pat1 t' sets
+      else
+        fail ctxt desc sets
+    | NotTag ls ->
+      if TagSet.mem id.it ls then
+        fail ctxt desc sets
+      else if not found then
+        skip_pat pat.at sets && fail ctxt desc sets
+      else if T.span t = Some (TagSet.cardinal ls + 1) then
+        match_pat (InTag (ctxt, id.it)) Any pat1 t' sets
+      else
+        fail ctxt (NotTag (TagSet.add id.it ls)) sets &&&
+        match_pat (InTag (ctxt, id.it)) Any pat1 t' sets
+    | Any ->
+      match_pat ctxt (NotTag TagSet.empty) pat t sets
+    | _ -> assert false
+    )
+  | AltP (pat1, pat2) ->
+    sets.alts <- AtSet.add pat1.at (AtSet.add pat2.at sets.alts);
+    match_pat (InAlt1 (ctxt, pat1.at, pat2, t)) desc pat1 t sets
+  | AnnotP (pat1, _)
+  | ParP pat1 ->
+    match_pat ctxt desc pat1 t sets
+
+and match_lit ctxt desc at v t sets =
+  match desc with
+  | Val v' ->
+    if V.equal v v' then
+      succeed ctxt desc sets
+    else
+      fail ctxt desc sets
+  | NotVal vs ->
+    if ValSet.mem v vs then
+      fail ctxt desc sets
+    else if T.eq t T.nat && is_neg_int v then  (* may occur through subtyping *)
+      skip_pat at sets && fail ctxt desc sets
+    else if T.span t = Some (ValSet.cardinal vs + 1) then
+      succeed ctxt (Val v) sets
+    else
+      fail ctxt (NotVal (ValSet.add v vs)) sets &&&
+      succeed ctxt (Val v) sets
+  | Opt _ ->
+    fail ctxt desc sets
+  | Any ->
+    match_lit ctxt (NotVal ValSet.empty) at v t sets
+  | _ ->
+    assert false
+
+and match_tup ctxt descs_r descs pats ts sets =
+  match descs, pats, ts with
+  | [], [], [] ->
+    succeed ctxt (Tup (List.rev descs_r)) sets
+  | desc::descs', pat::pats', t::ts' ->
+    match_pat (InTup (ctxt, descs_r, descs', pats', ts')) desc pat t sets
+  | _ ->
+    assert false
+    
+and match_obj ctxt ldescs (pat_fields : pat_field list) tfs sets =
+  match pat_fields with
+  | [] -> succeed ctxt (Obj ldescs) sets
+  | pat_field::pat_fields' ->
+    let l = pat_field.it.id.it in
+    let tf = List.find (fun tf -> tf.T.lab = l) tfs in
+    let desc = LabMap.find l ldescs in
+    match_pat (InObj (ctxt, ldescs, l, pat_fields', tfs))
+      desc pat_field.it.pat tf.T.typ sets
+
+and succeed ctxt desc sets : bool =
+  match ctxt with
+  | InOpt ctxt' ->
+    succeed ctxt' (Opt desc) sets
+  | InTag (ctxt', l) ->
+    succeed ctxt' (Tag (desc, l)) sets
+  | InTup (ctxt', descs_r, descs, pats, ts) ->
+    match_tup ctxt' (desc::descs_r) descs pats ts sets
+  | InObj (ctxt', ldescs, l, pfs, tfs) ->
+    match_obj ctxt' (LabMap.add l desc ldescs) pfs tfs sets
+  | InAlt1 (ctxt', at1, _pat2, _t) ->
+    sets.reached_alts <- AtSet.add at1 sets.reached_alts;
+    succeed ctxt' desc sets
+  | InAlt2 (ctxt', at2) ->
+    sets.reached_alts <- AtSet.add at2 sets.reached_alts;
+    succeed ctxt' desc sets
+  | InCase (at, cases, _t) ->
+    sets.reached_cases <- AtSet.add at sets.reached_cases;
+    skip cases sets
+
+and skip cases sets : bool =
+  match cases with
+  | [] ->
+    true
+  | case::cases' ->
+    sets.cases <- AtSet.add case.it.pat.at sets.cases;
+    skip cases' sets
+
+and fail ctxt desc sets : bool =
+  match ctxt with
+  | InOpt ctxt' ->
+    fail ctxt' (Opt desc) sets
+  | InTag (ctxt', l) ->
+    fail ctxt' (Tag (desc, l)) sets
+  | InTup (ctxt', descs', descs, pats, _ts) ->
+    fail ctxt' (Tup (List.rev descs' @ [desc] @ descs)) sets
+  | InObj (ctxt', ldescs, l, pats, _tfs) ->
+    fail ctxt' (Obj (LabMap.add l desc ldescs)) sets
+  | InAlt1 (ctxt', at1, pat2, t) ->
+    match_pat (InAlt2 (ctxt', pat2.at)) desc pat2 t sets
+  | InAlt2 (ctxt', at2) ->
+    fail ctxt' desc sets
+  | InCase (at, [], t) ->
+    T.span t = Some 0 || not (T.inhabited t) ||
+    (sets.missing <- desc::sets.missing; false)
+  | InCase (at, case::cases, t) ->
+    T.span t = Some 0 && skip (case::cases) sets ||
+    match_pat (InCase (case.it.pat.at, cases, t)) desc case.it.pat t sets
+
+
+type uncovered = string
+type unreached = Source.region
+
+let check_cases cases t =
+  let sets = make_sets () in
+  let _exhaustive = fail (InCase (Source.no_region, cases, t)) Any sets in
+  let uncovered = List.map (string_of_desc t) (List.rev sets.missing) in
+  let unreached_cases = AtSet.diff sets.cases sets.reached_cases in
+  let unreached_alts = AtSet.diff sets.alts sets.reached_alts in
+  uncovered, AtSet.elements (AtSet.union unreached_cases unreached_alts)
+
+let (@?) it at = {it; at; note = empty_typ_note}
+
+let check_pat pat t =
+  let uncovered, unreached =
+    check_cases [{pat; exp = TupE [] @? Source.no_region} @@ Source.no_region] t
+  in uncovered, List.filter ((<>) pat.at) unreached
+
+
+
+ + + diff --git a/coverage/mo_frontend/definedness.ml.html b/coverage/mo_frontend/definedness.ml.html new file mode 100644 index 00000000000..0684475b418 --- /dev/null +++ b/coverage/mo_frontend/definedness.ml.html @@ -0,0 +1,769 @@ + + + + + definedness.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+
+
(*
+This module implements a check that rules out use-before define.
+It is a compositional algorithm that returns, for each subexpression,
+ * Which variables are used eagerly and
+ * which are delayed
+these sets are disjoint and their union makes up the set of free variables, so
+the structure of this module is very similar to that of freevars.ml.
+
+We keep it still separate, because we are doing much more interesting things
+here in for blocks (function decs).
+*)
+
+open Mo_def
+open Mo_types
+open Source
+open Syntax
+
+(* We collect a few things along the way *)
+type usage_info = Eager | Delayed
+
+let join u1 u2 = match u1, u2 with
+  | Eager, _ -> Eager
+  | _, Eager -> Eager
+  | Delayed, Delayed -> Delayed
+
+
+module M = Env.Make(String)
+module S = Set.Make(String)
+
+let map_of_set x s = S.fold (fun v m -> M.add v x m) s M.empty
+let set_unions = List.fold_left S.union S.empty
+
+(* A set of free variables *)
+type f = usage_info M.t
+
+(* The analysis result of a recursive group, before tying the knot *)
+type group = (Source.region * S.t * S.t * S.t) list
+
+(* Operations: Union and removal *)
+let (++) : f -> f -> f = M.union (fun _ u1 u2 -> Some (join u1 u2))
+let unions f xs = List.fold_left (++) M.empty (List.map f xs)
+
+(* A combined set of free variables and defined variables,
+   e.g. in patterns and declaration *)
+type defs = S.t
+type fd = f * defs
+
+
+(* Operations: *)
+
+(* This adds a set of free variables to a combined set *)
+let (+++) ((f, d) : fd) x = ((++) f x, d)
+(* This takes the union of two combined sets *)
+let (++++) (f1, d1) (f2, d2) = ((++) f1 f2, S.union d1 d2)
+let union_binders f xs = List.fold_left (++++) (M.empty, S.empty) (List.map f xs)
+
+let diff f d = M.filter (fun k _ -> not (S.mem k d)) f
+
+(* The bound variables from the second argument scope over the first *)
+let (///) (x : f) ((f, d) : fd) = f ++ diff x d
+
+(* Usage tracking. We distinguish between eager and delayed variable use.
+   Eager variables become delayed
+   - inside lambda
+   Delayed variables may stay delayed
+   - when storing variables in data structures (tuples, objects, arrays)
+   Delayed variables become eager
+   - when occurs in an application
+   - when a block uses some of its own variables eagerly
+*)
+let delayify : f -> f = M.map (fun _ -> Delayed)
+let eagerify : f -> f = M.map (fun _ -> Eager)
+
+let eager_vars : f -> S.t =
+  fun f -> S.of_list (M.keys (M.filter (fun _ u -> u = Eager) f))
+let delayed_vars : f -> S.t =
+  fun f -> S.of_list (M.keys (M.filter (fun _ u -> u = Delayed) f))
+
+(* One traversal for each syntactic category, named by that category *)
+
+let rec exp msgs e : f = match e.it with
+  (* Eager uses are either first-class uses of a variable: *)
+  | VarE i              -> M.singleton i.it Eager
+  (* Or anything that is occurring in a call (as this may call a closure): *)
+  | CallE (e1, ts, e2)  -> eagerify (exps msgs [e1; e2])
+  (* And break, return, throw can be thought of as calling a continuation: *)
+  | BreakE (i, e)       -> eagerify (exp msgs e)
+  | RetE e              -> eagerify (exp msgs e)
+  | ThrowE e            -> eagerify (exp msgs e)
+  (* Uses are delayed by function expressions *)
+  | FuncE (_, sp, tp, p, t, _, e) ->
+      delayify ((exp msgs e /// pat msgs p) /// shared_pat msgs sp)
+  (* The rest remaining cases just collect the uses of subexpressions: *)
+  | LitE _ | ActorUrlE _
+  | PrimE _ | ImportE _ -> M.empty
+  | UnE (_, uo, e)      -> exp msgs e
+  | BinE (_, e1, bo, e2)-> exps msgs [e1; e2]
+  | RelE (_, e1, ro, e2)-> exps msgs [e1; e2]
+  | ShowE (_, e)        -> exp msgs e
+  | ToCandidE es        -> exps msgs es
+  | FromCandidE e       -> exp msgs e
+  | TupE es             -> exps msgs es
+  | ProjE (e, i)        -> exp msgs e
+  | ObjBlockE (s, _, dfs) ->
+    (* For actors, this may be too permissive; to be revised when we work on actors again *)
+    group msgs (dec_fields msgs dfs)
+  | ObjE (bases, efs)   -> exps msgs bases ++ exp_fields msgs efs
+  | DotE (e, i)         -> exp msgs e
+  | AssignE (e1, e2)    -> exps msgs [e1; e2]
+  | ArrayE (m, es)      -> exps msgs es
+  | IdxE (e1, e2)       -> exps msgs [e1; e2]
+  | BlockE ds           -> group msgs (decs msgs ds)
+  | NotE e              -> exp msgs e
+  | AndE (e1, e2)       -> exps msgs [e1; e2]
+  | OrE (e1, e2)        -> exps msgs [e1; e2]
+  | ImpliesE (e1, e2)   -> exps msgs [e1; e2]
+  | OldE e              -> exp msgs e
+  | IfE (e1, e2, e3)    -> exps msgs [e1; e2; e3]
+  | SwitchE (e, cs)     -> exp msgs e ++ cases msgs cs
+  | TryE (e, cs)        -> exp msgs e ++ cases msgs cs
+  | WhileE (e1, e2)     -> exps msgs [e1; e2]
+  | LoopE (e1, None)    -> exp msgs e1
+  | LoopE (e1, Some e2) -> exps msgs [e1; e2]
+  | ForE (p, e1, e2)    -> exp msgs e1 ++ (exp msgs e2 /// pat msgs p)
+  | LabelE (i, t, e)    -> exp msgs e
+  | DebugE e            -> exp msgs e
+  | AsyncE (_, _, e)    -> exp msgs e
+  | AwaitE (_, e)       -> exp msgs e
+  | AssertE (_, e)      -> exp msgs e
+  | AnnotE (e, t)       -> exp msgs e
+  | OptE e              -> exp msgs e
+  | DoOptE e            -> exp msgs e
+  | BangE e             -> exp msgs e
+  | TagE (_, e)         -> exp msgs e
+  | IgnoreE e           -> exp msgs e
+
+and exps msgs es : f = unions (exp msgs) es
+
+and exp_fields msgs efs : f = unions (exp_field msgs) efs
+and exp_field msgs ef : f = exp msgs ef.it.exp
+
+and pat msgs p : fd = match p.it with
+  | WildP         -> (M.empty, S.empty)
+  | VarP i        -> (M.empty, S.singleton i.it)
+  | TupP ps       -> pats msgs ps
+  | ObjP pfs      -> pat_fields msgs pfs
+  | AnnotP (p, _)
+  | ParP p        -> pat msgs p
+  | LitP l        -> (M.empty, S.empty)
+  | SignP (uo, l) -> (M.empty, S.empty)
+  | OptP p
+  | TagP (_, p)   -> pat msgs p
+  | AltP (p1, p2) -> pat msgs p1 ++++ pat msgs p2
+
+and pats msgs ps : fd = union_binders (pat msgs) ps
+
+and pat_fields msgs pfs = union_binders (fun (pf : pat_field) -> pat msgs pf.it.pat) pfs
+
+and shared_pat msgs shared_pat =
+  match shared_pat.it with
+  | Type.Local ->
+    (M.empty, S.empty)
+  | Type.Shared (_, p1) ->
+    pat msgs p1
+
+and case msgs (c : case) = exp msgs c.it.exp /// pat msgs c.it.pat
+
+and cases msgs cs : f = unions (case msgs) cs
+
+and dec_fields msgs dfs =
+  decs msgs (List.map (fun df -> df.it.dec) dfs)
+
+and dec msgs d = match d.it with
+  | ExpD e -> (exp msgs e, S.empty)
+  | LetD (p, e, None) -> pat msgs p +++ exp msgs e
+  | LetD (p, e, Some f) -> pat msgs p +++ exp msgs e +++ exp msgs f
+  | VarD (i, e) -> (M.empty, S.singleton i.it) +++ exp msgs e
+  | TypD (i, tp, t) -> (M.empty, S.empty)
+  | ClassD (csp, i, tp, p, t, s, i', dfs) ->
+    (M.empty, S.singleton i.it) +++ delayify (
+      group msgs (dec_fields msgs dfs @ class_self d.at i') /// pat msgs p /// shared_pat msgs csp
+    )
+
+(* The class self binding is treated as defined at the very end of the group *)
+and class_self at i : group = [(at, S.singleton i.it, S.empty, S.empty)]
+
+and decs msgs decs : group =
+  (* Annotate the declarations with the analysis results *)
+  List.map (fun d ->
+    let (f, defs) = dec msgs d in
+    (d.at, defs, eager_vars f, delayed_vars f)
+  ) decs
+
+and group msgs (grp : group) : f =
+  (* Create a map from declared variable to their definition point *)
+  let defWhen = M.disjoint_unions (List.mapi (fun i (_, defs, _, _) -> map_of_set i defs) grp) in
+  (* Calculate the relation R *)
+  let r = NameRel.unions (List.map (fun (_, defs, _, delayed) -> NameRel.cross defs delayed) grp) in
+  (* Check for errors *)
+  List.iteri (fun i (at, _, eager, _) ->
+    NameRel.iter (fun x y ->
+      match M.find_opt y defWhen with
+      | Some j ->
+        (* At position i, we are evaluating something that requires y, which is
+           defined after j *)
+        if j < i
+        then () (* all izz well *)
+        else
+          Diag.add_msg
+            msgs
+            (Diag.error_message
+               at
+               "M0016"
+               "definedness"
+               (Printf.sprintf "cannot use %s before %s has been defined" x y))
+      | None ->
+        (* External variable, ok for now *)
+        ()
+    ) (NameRel.restricted_rtcl eager r)
+  ) grp;
+  (* Now calculate the analysis result: Eager is everything that is eager, or
+     used by eager things *)
+  let e = set_unions (List.map (fun (_,_,eager,_) ->
+    NameRel.range (NameRel.restricted_rtcl eager r)
+  ) grp) in
+  (* Everything else is lazy *)
+  let d = S.diff (set_unions (List.map (fun (_,_,_,delayed) -> delayed) grp)) e in
+  (* And remove whats defined here  *)
+  M.disjoint_union (map_of_set Eager e) (map_of_set Delayed d) |>
+    M.filter (fun v _ -> M.mem v defWhen = false)
+
+let check_prog prog =
+  Diag.with_message_store (fun msgs ->
+    ignore (group msgs (decs msgs prog.it));
+    Some ()
+  )
+
+let check_lib lib =
+  Diag.with_message_store (fun msgs ->
+    let (imp_ds, ds) = CompUnit.decs_of_lib lib in
+    ignore (group msgs (decs msgs (imp_ds @ ds)));
+    Some ()
+  )
+
+
+
+
+ + + diff --git a/coverage/mo_frontend/effect.ml.html b/coverage/mo_frontend/effect.ml.html new file mode 100644 index 00000000000..f1083e40da4 --- /dev/null +++ b/coverage/mo_frontend/effect.ml.html @@ -0,0 +1,487 @@ + + + + + effect.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+
+
open Mo_def
+open Mo_types
+
+open Syntax
+open Source
+
+module T = Type
+
+(* a simple effect analysis to annote expressions as Triv(ial) (await-free) or Await (containing unprotected awaits) *)
+
+(* in future we could merge this with the type-checker
+   but I prefer to keep it mostly separate for now *)
+
+let max_eff e1 e2 =
+  match e1,e2 with
+  | T.Triv,T.Triv -> T.Triv
+  | _ , T.Await -> T.Await
+  | T.Await,_ -> T.Await
+
+let max_effs = List.fold_left max_eff T.Triv
+let map_max_effs f l = max_effs (List.map f l)
+
+let typ phrase = phrase.note.note_typ
+
+let eff phrase = phrase.note.note_eff
+
+let is_triv phrase  =
+  eff phrase = T.Triv
+
+let is_shared_func exp =
+  T.(match typ exp with
+    | Func (Shared _, _, _, _, _) -> true
+    | _ -> false)
+
+let is_local_async_func exp =
+ T.(match typ exp with
+   | Func (Local, Returns,
+      { sort = Scope; _ }::_,
+       _,
+      [Async (Fut, Var (_ ,0), _)]) -> true
+   | _ -> false)
+
+let is_async_call exp1 inst exp2 =
+   is_shared_func exp1 ||
+   is_local_async_func exp1
+
+let effect_exp (exp:Syntax.exp) : T.eff = eff exp
+
+(* infer the effect of an expression, assuming all sub-expressions are correctly effect-annotated es *)
+let rec infer_effect_exp (exp:Syntax.exp) : T.eff =
+  match exp.it with
+  | CallE (exp1, inst, exp2) when is_async_call exp1 inst exp2 ->
+    T.Await
+  | PrimE _
+  | VarE _
+  | LitE _
+  | ImportE _
+  | FuncE _ ->
+    T.Triv
+  | ActorUrlE exp1
+  | UnE (_, _, exp1)
+  | ShowE (_, exp1)
+  | FromCandidE exp1
+  | ProjE (exp1, _)
+  | OptE exp1
+  | DoOptE exp1
+  | BangE exp1
+  | TagE (_, exp1)
+  | DotE (exp1, _)
+  | NotE exp1
+  | OldE (exp1)
+  | AssertE (_, exp1)
+  | LabelE (_, _, exp1)
+  | BreakE (_, exp1)
+  | RetE exp1
+  | AnnotE (exp1, _)
+  | IgnoreE exp1
+  | LoopE (exp1, None) ->
+    effect_exp exp1
+  | BinE (_, exp1, _, exp2)
+  | IdxE (exp1, exp2)
+  | RelE (_, exp1, _, exp2)
+  | AssignE (exp1, exp2)
+  | CallE (exp1, _, exp2)
+  | AndE (exp1, exp2)
+  | OrE (exp1, exp2)
+  | ImpliesE (exp1, exp2)
+  | WhileE (exp1, exp2)
+  | LoopE (exp1, Some exp2)
+  | ForE (_, exp1, exp2) ->
+    let t1 = effect_exp exp1 in
+    let t2 = effect_exp exp2 in
+    max_eff t1 t2
+  | DebugE exp1 ->
+    effect_exp exp1
+  | ToCandidE exps
+  | TupE exps
+  | ArrayE (_, exps) ->
+    map_max_effs effect_exp exps
+  | BlockE decs ->
+    map_max_effs effect_dec decs
+  | ObjBlockE (sort, _, dfs) ->
+    infer_effect_dec_fields dfs
+  | ObjE (bases, efs) ->
+    let bases = map_max_effs effect_exp bases in
+    let fields = infer_effect_exp_fields efs in
+    max_eff fields bases
+  | IfE (exp1, exp2, exp3) ->
+    map_max_effs effect_exp [exp1; exp2; exp3]
+  | SwitchE (exp1, cases) ->
+    let e1 = effect_exp exp1 in
+    let e2 = effect_cases cases in
+    max_eff e1 e2
+  | AsyncE (T.Fut, _, _) ->
+    T.Await
+  | AsyncE (T.Cmp, _, _) ->
+    T.Triv
+  | ThrowE _
+  | TryE _
+  | AwaitE _ ->
+    T.Await (* TBR: perhaps we should rename the effect *)
+
+and effect_cases cases =
+  match cases with
+  | [] ->
+    T.Triv
+  | {it = {pat; exp}; _}::cases' ->
+    let e = effect_exp exp in
+    max_eff e (effect_cases cases')
+
+and infer_effect_dec_fields dfs =
+  List.fold_left (fun e (df : dec_field) -> max_eff e (effect_dec df.it.dec)) T.Triv dfs
+
+and infer_effect_exp_fields efs =
+  List.fold_left (fun e (ef : exp_field) -> max_eff e (effect_exp ef.it.exp)) T.Triv efs
+
+and effect_dec dec =
+  dec.note.note_eff
+
+and infer_effect_dec dec =
+  match dec.it with
+  | LetD (_, e, Some f) ->
+    max_eff (effect_exp e) (effect_exp f)
+  | ExpD e
+  | LetD (_, e, None)
+  | VarD (_, e) ->
+    effect_exp e
+  | TypD _
+  | ClassD _ ->
+    T.Triv
+
+
+
+ + + diff --git a/coverage/mo_frontend/error_reporting.ml.html b/coverage/mo_frontend/error_reporting.ml.html new file mode 100644 index 00000000000..d33af088b4d --- /dev/null +++ b/coverage/mo_frontend/error_reporting.ml.html @@ -0,0 +1,440 @@ + + + + + error_reporting.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+
+
open Parser
+open Parser.MenhirInterpreter
+
+(* In order to submit artificial tokens to the parser, we need a function that
+   converts a terminal symbol to a (dummy) token. Unfortunately, we cannot (in
+   general) auto-generate this code, because it requires making up semantic
+   values of arbitrary OCaml types. *)
+
+let terminal2token (type a) (symbol : a terminal) : token =
+  match symbol with
+      | T_error -> assert false
+      | T_XOROP -> XOROP
+      | T_XORASSIGN -> XORASSIGN
+      | T_WHILE -> WHILE
+      | T_VAR -> VAR
+      | T_SHROP -> SHROP
+      | T_SHRASSIGN -> SHRASSIGN
+      | T_UNDERSCORE -> UNDERSCORE
+      | T_COMPOSITE -> COMPOSITE
+      | T_TYPE -> TYPE
+      | T_TRY -> TRY
+      | T_THROW -> THROW
+      | T_TEXT -> TEXT "..."
+      | T_SWITCH -> SWITCH
+      | T_SUBOP -> SUBOP
+      | T_SUB -> SUB
+      | T_SHLOP -> SHLOP
+      | T_SHLASSIGN -> SHLASSIGN
+      | T_SHARED -> SHARED
+      | T_SEMICOLON_EOL -> SEMICOLON_EOL
+      | T_SEMICOLON -> SEMICOLON
+      | T_STABLE -> STABLE
+      | T_SYSTEM -> SYSTEM
+      | T_WITH -> WITH
+      | T_RPAR -> RPAR
+      | T_ROTROP -> ROTROP
+      | T_ROTRASSIGN -> ROTRASSIGN
+      | T_ROTLOP -> ROTLOP
+      | T_ROTLASSIGN -> ROTLASSIGN
+      | T_RETURN -> RETURN
+      | T_RCURLY -> RCURLY
+      | T_RBRACKET -> RBRACKET
+      | T_QUEST -> QUEST
+      | T_BANG -> BANG
+      | T_QUERY -> QUERY
+      | T_PUBLIC -> PUBLIC
+      | T_PRIVATE -> PRIVATE
+      | T_PRIM -> PRIM
+      | T_POWOP -> POWOP
+      | T_POWASSIGN -> POWASSIGN
+      | T_PLUSASSIGN -> PLUSASSIGN
+      | T_OROP -> OROP
+      | T_ORASSIGN -> ORASSIGN
+      | T_OR -> OR
+      | T_OBJECT -> OBJECT
+      | T_NULL -> NULL
+      | T_NOT -> NOT
+      | T_NEQOP -> NEQOP
+      | T_NAT -> NAT "<nat>"
+      | T_MULOP -> MULOP
+      | T_MULASSIGN -> MULASSIGN
+      | T_MODULE -> MODULE
+      | T_MODOP -> MODOP
+      | T_MODASSIGN -> MODASSIGN
+      | T_MINUSASSIGN -> MINUSASSIGN
+      | T_LTOP -> LTOP
+      | T_LT -> LT
+      | T_LPAR -> LPAR
+      | T_LOOP -> LOOP
+      | T_LET -> LET
+      | T_LEOP -> LEOP
+      | T_LCURLY -> LCURLY
+      | T_LBRACKET -> LBRACKET
+      | T_LABEL -> LABEL
+      | T_IN -> IN
+      | T_IMPORT -> IMPORT
+      | T_IGNORE -> IGNORE
+      | T_IF -> IF
+      | T_ID -> ID "<id>"
+      | T_HASH -> HASH
+      | T_GTOP -> GTOP
+      | T_GT -> GT
+      | T_GEOP -> GEOP
+      | T_FUNC -> FUNC
+      | T_FOR -> FOR
+      | T_FLEXIBLE -> FLEXIBLE
+      | T_FLOAT -> FLOAT "<float>"
+      | T_EQOP -> EQOP
+      | T_EQ -> EQ
+      | T_EOF -> EOF
+      | T_ELSE -> ELSE
+      | T_DOT_NUM -> DOT_NUM "<num>"
+      | T_DOT -> DOT
+      | T_DO -> DO
+      | T_DIVOP -> DIVOP
+      | T_DIVASSIGN -> DIVASSIGN
+      | T_DISALLOWED -> DISALLOWED
+      | T_DEBUG_SHOW -> DEBUG_SHOW
+      | T_TO_CANDID -> TO_CANDID
+      | T_FROM_CANDID -> FROM_CANDID
+      | T_DEBUG -> DEBUG
+      | T_CONTINUE -> CONTINUE
+      | T_COMMA -> COMMA
+      | T_COLON -> COLON
+      | T_CLASS -> CLASS
+      | T_CHAR -> CHAR 0
+      | T_CATCH -> CATCH
+      | T_CATASSIGN -> CATASSIGN
+      | T_CASE -> CASE
+      | T_BREAK -> BREAK
+      | T_BOOL -> BOOL false
+      | T_AWAIT -> AWAIT
+      | T_AWAITSTAR -> AWAITSTAR
+      | T_ASYNC -> ASYNC
+      | T_ASYNCSTAR -> ASYNCSTAR
+      | T_ASSIGN -> ASSIGN
+      | T_ASSERT -> ASSERT
+      | T_ARROW -> ARROW
+      | T_ANDOP -> ANDOP
+      | T_ANDASSIGN -> ANDASSIGN
+      | T_AND -> AND
+      | T_IMPLIES -> IMPLIES
+      | T_OLD -> OLD
+      | T_ADDOP -> ADDOP
+      | T_ACTOR -> ACTOR
+      | T_INVARIANT -> INVARIANT
+      | T_WRAPADDOP -> WRAPADDOP
+      | T_WRAPSUBOP -> WRAPSUBOP
+      | T_WRAPMULOP -> WRAPMULOP
+      | T_WRAPPOWOP -> WRAPPOWOP
+      | T_WRAPADDASSIGN -> WRAPADDASSIGN
+      | T_WRAPSUBASSIGN -> WRAPSUBASSIGN
+      | T_WRAPMULASSIGN -> WRAPMULASSIGN
+      | T_WRAPPOWASSIGN -> WRAPPOWASSIGN
+      | T_PIPE -> PIPE
+
+
+
+ + + diff --git a/coverage/mo_frontend/lexer.ml.html b/coverage/mo_frontend/lexer.ml.html new file mode 100644 index 00000000000..fbc0f56c1d6 --- /dev/null +++ b/coverage/mo_frontend/lexer.ml.html @@ -0,0 +1,290 @@ + + + + + lexer.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+
+
module ST = Source_token
+open Trivia
+include Lexer_lib
+
+type source_token = ST.token * Lexing.position * Lexing.position
+
+type parser_token = Parser.token * Lexing.position * Lexing.position
+
+let first (t, _, _) = t
+
+let opt_is_whitespace : 'a trivia option -> bool =
+ fun x -> Option.fold ~none:false ~some:ST.is_whitespace x
+
+let tokenizer (mode : Lexer_lib.mode) (lexbuf : Lexing.lexbuf) :
+    (unit -> parser_token) * triv_table =
+  let trivia_table : triv_table = PosHashtbl.create 1013 in
+  let lookahead : source_token option ref = ref None in
+  (* We keep the trailing whitespace of the previous token
+     around so we can disambiguate operators *)
+  let last_trailing : line_feed trivia list ref = ref [] in
+  let next () : source_token =
+    match !lookahead with
+    | Some t ->
+        lookahead := None;
+        t
+    | None ->
+        let token = Source_lexer.token mode lexbuf in
+        let start = Lexing.lexeme_start_p lexbuf in
+        let end_ = Lexing.lexeme_end_p lexbuf in
+        (token, start, end_)
+  in
+  let peek () : source_token =
+    match !lookahead with
+    | None ->
+        let token = next () in
+        lookahead := Some token;
+        token
+    | Some t -> t
+  in
+  let next_parser_token () : parser_token =
+    let rec eat_leading acc =
+      let token, start, end_ = next () in
+      match ST.to_parser_token token with
+      (* A semicolon immediately followed by a newline gets a special token for the REPL *)
+      | Ok Parser.SEMICOLON when ST.is_line_feed (first (peek ())) ->
+          (List.rev acc, (Parser.SEMICOLON_EOL, start, end_))
+      (* >> can either close two nested type applications, or be a shift
+         operator depending on whether it's prefixed with whitespace *)
+      | Ok Parser.GT
+        when opt_is_whitespace (Lib.List.hd_opt (acc @ List.rev !last_trailing))
+             && first (peek ()) = ST.GT ->
+          let _, _, end_ = next () in
+          (acc, (Parser.SHROP, start, end_))
+      | Ok t -> (List.rev acc, (t, start, end_))
+      | Error t -> eat_leading (t :: acc)
+    in
+    let rec eat_trailing acc =
+      match ST.is_lineless_trivia (first (peek ())) with
+      | Some t ->
+          ignore (next ());
+          eat_trailing (t :: acc)
+      | None -> List.rev acc
+    in
+    let leading_trivia, (token, start, end_) = eat_leading [] in
+    let trailing_trivia = eat_trailing [] in
+    let leading_ws () =
+      opt_is_whitespace (Lib.List.last_opt (!last_trailing @ leading_trivia))
+    in
+    let trailing_ws () =
+      opt_is_whitespace (Lib.List.hd_opt trailing_trivia)
+      || (trailing_trivia = [] && ST.is_line_feed (first (peek ())))
+    in
+    (* Disambiguating operators based on whitespace *)
+    let token =
+      match token with
+      | Parser.GT when leading_ws () && trailing_ws () -> Parser.GTOP
+      | Parser.LT when leading_ws () && trailing_ws () -> Parser.LTOP
+      | _ -> token
+    in
+    last_trailing := List.map (map_trivia absurd) trailing_trivia;
+    PosHashtbl.add trivia_table (pos_of_lexpos start)
+      { leading_trivia; trailing_trivia };
+    (token, start, end_)
+  in
+  (next_parser_token, trivia_table)
+
+
+
+ + + diff --git a/coverage/mo_frontend/lexer_lib.ml.html b/coverage/mo_frontend/lexer_lib.ml.html new file mode 100644 index 00000000000..280495af2c4 --- /dev/null +++ b/coverage/mo_frontend/lexer_lib.ml.html @@ -0,0 +1,116 @@ + + + + + lexer_lib.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+
+
(**
+  This module exists so it can be included by lexer.ml. This way
+  source_lexer.ml can use these definitions but stay internal to
+  lexer.ml.
+*)
+type mode = {
+  privileged : bool;
+  verification : bool;
+}
+
+let mode : mode = {
+  privileged = Option.is_some (Sys.getenv_opt "MOC_UNLOCK_PRIM");
+  verification = Option.is_some (Sys.getenv_opt "MOC_UNLOCK_VERIFICATION");
+}
+
+let mode_priv : mode = { mode with privileged = true }
+let mode_verification : mode = { mode with verification = true }
+
+
+exception Error of Source.region * string
+
+let convert_pos pos =
+  { Source.file = pos.Lexing.pos_fname;
+    Source.line = pos.Lexing.pos_lnum;
+    Source.column = pos.Lexing.pos_cnum - pos.Lexing.pos_bol
+  }
+
+
+
+
+ + + diff --git a/coverage/mo_frontend/menhir_error_reporting.ml.html b/coverage/mo_frontend/menhir_error_reporting.ml.html new file mode 100644 index 00000000000..66b59f85c7c --- /dev/null +++ b/coverage/mo_frontend/menhir_error_reporting.ml.html @@ -0,0 +1,567 @@ + + + + + menhir_error_reporting.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+
+
module Make
+  (I : MenhirLib.IncrementalEngine.EVERYTHING)
+  (User : sig
+
+    (* In order to submit artificial tokens to the parser, we need a function
+       that converts a terminal symbol to a token. Unfortunately, we cannot
+       (in general) auto-generate this code, because it requires making up
+       semantic values of arbitrary OCaml types. *)
+
+    val terminal2token: _ I.terminal -> I.token
+
+  end)
+= struct
+
+  open MenhirLib.General
+  open I
+  open User
+
+  (* ------------------------------------------------------------------------ *)
+
+  (* Explanations. *)
+
+  type explanation = {
+    item: item;
+    past: (xsymbol * Lexing.position * Lexing.position) list
+  }
+
+  let item explanation =
+    explanation.item
+
+  let past explanation =
+    explanation.past
+
+  let future explanation =
+    let prod, index = explanation.item in
+    let rhs = rhs prod in
+    drop index rhs
+
+  let goal explanation =
+    let prod, _ = explanation.item in
+    lhs prod
+
+  (* ------------------------------------------------------------------------ *)
+
+  (* [items_current env] assumes that [env] is not an initial state (which
+     implies that the stack is non-empty). Under this assumption, it extracts
+     the automaton's current state, i.e., the LR(1) state found in the top
+     stack cell. It then goes through [items] so as to obtain the LR(0) items
+     associated with this state. *)
+
+  let items_current env : item list =
+    (* Get the current state. *)
+    match Lazy.force (stack env) with
+    | Nil ->
+        (* If we get here, then the stack is empty, which means the parser
+           is in an initial state. This should not happen. *)
+        invalid_arg "items_current" (* TEMPORARY it DOES happen! *)
+    | Cons (Element (current, _, _, _), _) ->
+        (* Extract the current state out of the top stack element, and
+           convert it to a set of LR(0) items. Returning a set of items
+           instead of an ['a lr1state] is convenient; returning [current]
+           would require wrapping it in an existential type. *)
+        items current
+
+  (* [is_shift_item t item] determines whether [item] justifies a shift
+     transition along the terminal symbol [t]. *)
+
+  let is_shift_item (t : _ terminal) (prod, index) : bool =
+    let rhs = rhs prod in
+    let length = List.length rhs in
+    assert (0 < index && index <= length);
+    (* We test that there is one symbol after the bullet and this symbol
+       is [t] or can generate a word that begins with [t]. (Note that we
+       don't need to worry about the case where this symbol is nullable
+       and [t] is generated by the following symbol. In that situation,
+       we would have to reduce before we can shift [t].) *)
+    index < length && xfirst (List.nth rhs index) t
+
+  let compare_explanations x1 x2 =
+    let c = compare_items x1.item x2.item in
+    (* TEMPORARY checking that if [c] is 0 then the positions are the same *)
+    assert (
+      c <> 0 || List.for_all2 (fun (_, start1, end1) (_, start2, end2) ->
+        start1.Lexing.pos_cnum = start2.Lexing.pos_cnum &&
+        end1.Lexing.pos_cnum = end2.Lexing.pos_cnum
+      ) x1.past x2.past
+    );
+    c
+
+  (* [marry past stack] TEMPORARY comment *)
+
+  let rec marry past stack =
+    match past, stack with
+    | [], _ ->
+        []
+    | symbol :: past, lazy (Cons (Element (s, _, startp, endp), stack)) ->
+        assert (compare_symbols symbol (X (incoming_symbol s)) = 0);
+        (symbol, startp, endp) :: marry past stack
+    | _ :: _, lazy Nil ->
+        assert false
+
+  (* [accumulate t env explanations] is called if the parser decides to shift
+     the test token [t]. The parameter [env] describes the parser configuration
+     before it shifts this token. (Some reductions have taken place.) We use the
+     shift items found in [env] to produce new explanations. *)
+
+  let accumulate (t : _ terminal) env explanations =
+    (* The parser is about to shift, which means it is willing to
+       consume the terminal symbol [t]. In the state before the
+       transition, look at the items that justify shifting [t].
+       We view these items as explanations: they explain what
+       we have read and what we expect to read. *)
+    let stack = stack env in
+    List.fold_left (fun explanations item ->
+      if is_shift_item t item then
+        let prod, index = item in
+        let rhs = rhs prod in
+        {
+          item = item;
+          past = List.rev (marry (List.rev (take index rhs)) stack)
+        } :: explanations
+      else
+        explanations
+    ) explanations (items_current env)
+      (* TEMPORARY [env] may be an initial state!
+         violating [item_current]'s precondition *)
+
+  (* [investigate pos checkpoint] assumes that [checkpoint] is of the form
+     [InputNeeded _].  For every terminal symbol [t], it investigates
+     how the parser reacts when fed the symbol [t], and returns a list
+     of explanations. The position [pos] is where a syntax error was
+     detected; it is used when manufacturing dummy tokens. This is
+     important because the position of the dummy token may end up in
+     the explanations that we produce. *)
+
+  let investigate pos (checkpoint : _ checkpoint) : explanation list =
+    weed compare_explanations (
+      foreach_terminal_but_error (fun symbol explanations ->
+        match symbol with
+        | X (N _) -> assert false
+        | X (T t) ->
+            (* Build a dummy token for the terminal symbol [t]. *)
+            let token = (terminal2token t, pos, pos) in
+            (* Submit it to the parser. Accumulate explanations. *)
+            match shifts (offer checkpoint token) with
+            | None ->
+                explanations
+            | Some env ->
+                accumulate t env explanations
+      ) []
+    )
+
+  (* We drive the parser in the usual way, but records the last [InputNeeded]
+     checkpoint. If a syntax error is detected, we go back to this checkpoint
+     and analyze it in order to produce a meaningful diagnostic. *)
+
+  exception Error of (Lexing.position * Lexing.position) * explanation list
+
+  let entry (start : 'a I.checkpoint) lexer =
+    let fail (inputneeded : 'a I.checkpoint) (checkpoint : 'a I.checkpoint) =
+      (* The parser signals a syntax error. Note the position of the
+         problematic token, which is useful. Then, go back to the
+         last [InputNeeded] checkpoint and investigate. *)
+      match checkpoint with
+      | HandlingError env ->
+          let (startp, _) as positions = positions env in
+          raise (Error (positions, investigate startp inputneeded))
+      | _ ->
+          assert false
+    in
+    I.loop_handle_undo Fun.id fail lexer start
+
+  (* TEMPORARY could also publish a list of the terminal symbols that
+     do not cause an error *)
+
+end
+
+
+
+ + + diff --git a/coverage/mo_frontend/parser.ml.html b/coverage/mo_frontend/parser.ml.html new file mode 100644 index 00000000000..108372d3fc2 --- /dev/null +++ b/coverage/mo_frontend/parser.ml.html @@ -0,0 +1,120882 @@ + + + + + parser.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+   10
+   11
+   12
+   13
+   14
+   15
+   16
+   17
+   18
+   19
+   20
+   21
+   22
+   23
+   24
+   25
+   26
+   27
+   28
+   29
+   30
+   31
+   32
+   33
+   34
+   35
+   36
+   37
+   38
+   39
+   40
+   41
+   42
+   43
+   44
+   45
+   46
+   47
+   48
+   49
+   50
+   51
+   52
+   53
+   54
+   55
+   56
+   57
+   58
+   59
+   60
+   61
+   62
+   63
+   64
+   65
+   66
+   67
+   68
+   69
+   70
+   71
+   72
+   73
+   74
+   75
+   76
+   77
+   78
+   79
+   80
+   81
+   82
+   83
+   84
+   85
+   86
+   87
+   88
+   89
+   90
+   91
+   92
+   93
+   94
+   95
+   96
+   97
+   98
+   99
+  100
+  101
+  102
+  103
+  104
+  105
+  106
+  107
+  108
+  109
+  110
+  111
+  112
+  113
+  114
+  115
+  116
+  117
+  118
+  119
+  120
+  121
+  122
+  123
+  124
+  125
+  126
+  127
+  128
+  129
+  130
+  131
+  132
+  133
+  134
+  135
+  136
+  137
+  138
+  139
+  140
+  141
+  142
+  143
+  144
+  145
+  146
+  147
+  148
+  149
+  150
+  151
+  152
+  153
+  154
+  155
+  156
+  157
+  158
+  159
+  160
+  161
+  162
+  163
+  164
+  165
+  166
+  167
+  168
+  169
+  170
+  171
+  172
+  173
+  174
+  175
+  176
+  177
+  178
+  179
+  180
+  181
+  182
+  183
+  184
+  185
+  186
+  187
+  188
+  189
+  190
+  191
+  192
+  193
+  194
+  195
+  196
+  197
+  198
+  199
+  200
+  201
+  202
+  203
+  204
+  205
+  206
+  207
+  208
+  209
+  210
+  211
+  212
+  213
+  214
+  215
+  216
+  217
+  218
+  219
+  220
+  221
+  222
+  223
+  224
+  225
+  226
+  227
+  228
+  229
+  230
+  231
+  232
+  233
+  234
+  235
+  236
+  237
+  238
+  239
+  240
+  241
+  242
+  243
+  244
+  245
+  246
+  247
+  248
+  249
+  250
+  251
+  252
+  253
+  254
+  255
+  256
+  257
+  258
+  259
+  260
+  261
+  262
+  263
+  264
+  265
+  266
+  267
+  268
+  269
+  270
+  271
+  272
+  273
+  274
+  275
+  276
+  277
+  278
+  279
+  280
+  281
+  282
+  283
+  284
+  285
+  286
+  287
+  288
+  289
+  290
+  291
+  292
+  293
+  294
+  295
+  296
+  297
+  298
+  299
+  300
+  301
+  302
+  303
+  304
+  305
+  306
+  307
+  308
+  309
+  310
+  311
+  312
+  313
+  314
+  315
+  316
+  317
+  318
+  319
+  320
+  321
+  322
+  323
+  324
+  325
+  326
+  327
+  328
+  329
+  330
+  331
+  332
+  333
+  334
+  335
+  336
+  337
+  338
+  339
+  340
+  341
+  342
+  343
+  344
+  345
+  346
+  347
+  348
+  349
+  350
+  351
+  352
+  353
+  354
+  355
+  356
+  357
+  358
+  359
+  360
+  361
+  362
+  363
+  364
+  365
+  366
+  367
+  368
+  369
+  370
+  371
+  372
+  373
+  374
+  375
+  376
+  377
+  378
+  379
+  380
+  381
+  382
+  383
+  384
+  385
+  386
+  387
+  388
+  389
+  390
+  391
+  392
+  393
+  394
+  395
+  396
+  397
+  398
+  399
+  400
+  401
+  402
+  403
+  404
+  405
+  406
+  407
+  408
+  409
+  410
+  411
+  412
+  413
+  414
+  415
+  416
+  417
+  418
+  419
+  420
+  421
+  422
+  423
+  424
+  425
+  426
+  427
+  428
+  429
+  430
+  431
+  432
+  433
+  434
+  435
+  436
+  437
+  438
+  439
+  440
+  441
+  442
+  443
+  444
+  445
+  446
+  447
+  448
+  449
+  450
+  451
+  452
+  453
+  454
+  455
+  456
+  457
+  458
+  459
+  460
+  461
+  462
+  463
+  464
+  465
+  466
+  467
+  468
+  469
+  470
+  471
+  472
+  473
+  474
+  475
+  476
+  477
+  478
+  479
+  480
+  481
+  482
+  483
+  484
+  485
+  486
+  487
+  488
+  489
+  490
+  491
+  492
+  493
+  494
+  495
+  496
+  497
+  498
+  499
+  500
+  501
+  502
+  503
+  504
+  505
+  506
+  507
+  508
+  509
+  510
+  511
+  512
+  513
+  514
+  515
+  516
+  517
+  518
+  519
+  520
+  521
+  522
+  523
+  524
+  525
+  526
+  527
+  528
+  529
+  530
+  531
+  532
+  533
+  534
+  535
+  536
+  537
+  538
+  539
+  540
+  541
+  542
+  543
+  544
+  545
+  546
+  547
+  548
+  549
+  550
+  551
+  552
+  553
+  554
+  555
+  556
+  557
+  558
+  559
+  560
+  561
+  562
+  563
+  564
+  565
+  566
+  567
+  568
+  569
+  570
+  571
+  572
+  573
+  574
+  575
+  576
+  577
+  578
+  579
+  580
+  581
+  582
+  583
+  584
+  585
+  586
+  587
+  588
+  589
+  590
+  591
+  592
+  593
+  594
+  595
+  596
+  597
+  598
+  599
+  600
+  601
+  602
+  603
+  604
+  605
+  606
+  607
+  608
+  609
+  610
+  611
+  612
+  613
+  614
+  615
+  616
+  617
+  618
+  619
+  620
+  621
+  622
+  623
+  624
+  625
+  626
+  627
+  628
+  629
+  630
+  631
+  632
+  633
+  634
+  635
+  636
+  637
+  638
+  639
+  640
+  641
+  642
+  643
+  644
+  645
+  646
+  647
+  648
+  649
+  650
+  651
+  652
+  653
+  654
+  655
+  656
+  657
+  658
+  659
+  660
+  661
+  662
+  663
+  664
+  665
+  666
+  667
+  668
+  669
+  670
+  671
+  672
+  673
+  674
+  675
+  676
+  677
+  678
+  679
+  680
+  681
+  682
+  683
+  684
+  685
+  686
+  687
+  688
+  689
+  690
+  691
+  692
+  693
+  694
+  695
+  696
+  697
+  698
+  699
+  700
+  701
+  702
+  703
+  704
+  705
+  706
+  707
+  708
+  709
+  710
+  711
+  712
+  713
+  714
+  715
+  716
+  717
+  718
+  719
+  720
+  721
+  722
+  723
+  724
+  725
+  726
+  727
+  728
+  729
+  730
+  731
+  732
+  733
+  734
+  735
+  736
+  737
+  738
+  739
+  740
+  741
+  742
+  743
+  744
+  745
+  746
+  747
+  748
+  749
+  750
+  751
+  752
+  753
+  754
+  755
+  756
+  757
+  758
+  759
+  760
+  761
+  762
+  763
+  764
+  765
+  766
+  767
+  768
+  769
+  770
+  771
+  772
+  773
+  774
+  775
+  776
+  777
+  778
+  779
+  780
+  781
+  782
+  783
+  784
+  785
+  786
+  787
+  788
+  789
+  790
+  791
+  792
+  793
+  794
+  795
+  796
+  797
+  798
+  799
+  800
+  801
+  802
+  803
+  804
+  805
+  806
+  807
+  808
+  809
+  810
+  811
+  812
+  813
+  814
+  815
+  816
+  817
+  818
+  819
+  820
+  821
+  822
+  823
+  824
+  825
+  826
+  827
+  828
+  829
+  830
+  831
+  832
+  833
+  834
+  835
+  836
+  837
+  838
+  839
+  840
+  841
+  842
+  843
+  844
+  845
+  846
+  847
+  848
+  849
+  850
+  851
+  852
+  853
+  854
+  855
+  856
+  857
+  858
+  859
+  860
+  861
+  862
+  863
+  864
+  865
+  866
+  867
+  868
+  869
+  870
+  871
+  872
+  873
+  874
+  875
+  876
+  877
+  878
+  879
+  880
+  881
+  882
+  883
+  884
+  885
+  886
+  887
+  888
+  889
+  890
+  891
+  892
+  893
+  894
+  895
+  896
+  897
+  898
+  899
+  900
+  901
+  902
+  903
+  904
+  905
+  906
+  907
+  908
+  909
+  910
+  911
+  912
+  913
+  914
+  915
+  916
+  917
+  918
+  919
+  920
+  921
+  922
+  923
+  924
+  925
+  926
+  927
+  928
+  929
+  930
+  931
+  932
+  933
+  934
+  935
+  936
+  937
+  938
+  939
+  940
+  941
+  942
+  943
+  944
+  945
+  946
+  947
+  948
+  949
+  950
+  951
+  952
+  953
+  954
+  955
+  956
+  957
+  958
+  959
+  960
+  961
+  962
+  963
+  964
+  965
+  966
+  967
+  968
+  969
+  970
+  971
+  972
+  973
+  974
+  975
+  976
+  977
+  978
+  979
+  980
+  981
+  982
+  983
+  984
+  985
+  986
+  987
+  988
+  989
+  990
+  991
+  992
+  993
+  994
+  995
+  996
+  997
+  998
+  999
+ 1000
+ 1001
+ 1002
+ 1003
+ 1004
+ 1005
+ 1006
+ 1007
+ 1008
+ 1009
+ 1010
+ 1011
+ 1012
+ 1013
+ 1014
+ 1015
+ 1016
+ 1017
+ 1018
+ 1019
+ 1020
+ 1021
+ 1022
+ 1023
+ 1024
+ 1025
+ 1026
+ 1027
+ 1028
+ 1029
+ 1030
+ 1031
+ 1032
+ 1033
+ 1034
+ 1035
+ 1036
+ 1037
+ 1038
+ 1039
+ 1040
+ 1041
+ 1042
+ 1043
+ 1044
+ 1045
+ 1046
+ 1047
+ 1048
+ 1049
+ 1050
+ 1051
+ 1052
+ 1053
+ 1054
+ 1055
+ 1056
+ 1057
+ 1058
+ 1059
+ 1060
+ 1061
+ 1062
+ 1063
+ 1064
+ 1065
+ 1066
+ 1067
+ 1068
+ 1069
+ 1070
+ 1071
+ 1072
+ 1073
+ 1074
+ 1075
+ 1076
+ 1077
+ 1078
+ 1079
+ 1080
+ 1081
+ 1082
+ 1083
+ 1084
+ 1085
+ 1086
+ 1087
+ 1088
+ 1089
+ 1090
+ 1091
+ 1092
+ 1093
+ 1094
+ 1095
+ 1096
+ 1097
+ 1098
+ 1099
+ 1100
+ 1101
+ 1102
+ 1103
+ 1104
+ 1105
+ 1106
+ 1107
+ 1108
+ 1109
+ 1110
+ 1111
+ 1112
+ 1113
+ 1114
+ 1115
+ 1116
+ 1117
+ 1118
+ 1119
+ 1120
+ 1121
+ 1122
+ 1123
+ 1124
+ 1125
+ 1126
+ 1127
+ 1128
+ 1129
+ 1130
+ 1131
+ 1132
+ 1133
+ 1134
+ 1135
+ 1136
+ 1137
+ 1138
+ 1139
+ 1140
+ 1141
+ 1142
+ 1143
+ 1144
+ 1145
+ 1146
+ 1147
+ 1148
+ 1149
+ 1150
+ 1151
+ 1152
+ 1153
+ 1154
+ 1155
+ 1156
+ 1157
+ 1158
+ 1159
+ 1160
+ 1161
+ 1162
+ 1163
+ 1164
+ 1165
+ 1166
+ 1167
+ 1168
+ 1169
+ 1170
+ 1171
+ 1172
+ 1173
+ 1174
+ 1175
+ 1176
+ 1177
+ 1178
+ 1179
+ 1180
+ 1181
+ 1182
+ 1183
+ 1184
+ 1185
+ 1186
+ 1187
+ 1188
+ 1189
+ 1190
+ 1191
+ 1192
+ 1193
+ 1194
+ 1195
+ 1196
+ 1197
+ 1198
+ 1199
+ 1200
+ 1201
+ 1202
+ 1203
+ 1204
+ 1205
+ 1206
+ 1207
+ 1208
+ 1209
+ 1210
+ 1211
+ 1212
+ 1213
+ 1214
+ 1215
+ 1216
+ 1217
+ 1218
+ 1219
+ 1220
+ 1221
+ 1222
+ 1223
+ 1224
+ 1225
+ 1226
+ 1227
+ 1228
+ 1229
+ 1230
+ 1231
+ 1232
+ 1233
+ 1234
+ 1235
+ 1236
+ 1237
+ 1238
+ 1239
+ 1240
+ 1241
+ 1242
+ 1243
+ 1244
+ 1245
+ 1246
+ 1247
+ 1248
+ 1249
+ 1250
+ 1251
+ 1252
+ 1253
+ 1254
+ 1255
+ 1256
+ 1257
+ 1258
+ 1259
+ 1260
+ 1261
+ 1262
+ 1263
+ 1264
+ 1265
+ 1266
+ 1267
+ 1268
+ 1269
+ 1270
+ 1271
+ 1272
+ 1273
+ 1274
+ 1275
+ 1276
+ 1277
+ 1278
+ 1279
+ 1280
+ 1281
+ 1282
+ 1283
+ 1284
+ 1285
+ 1286
+ 1287
+ 1288
+ 1289
+ 1290
+ 1291
+ 1292
+ 1293
+ 1294
+ 1295
+ 1296
+ 1297
+ 1298
+ 1299
+ 1300
+ 1301
+ 1302
+ 1303
+ 1304
+ 1305
+ 1306
+ 1307
+ 1308
+ 1309
+ 1310
+ 1311
+ 1312
+ 1313
+ 1314
+ 1315
+ 1316
+ 1317
+ 1318
+ 1319
+ 1320
+ 1321
+ 1322
+ 1323
+ 1324
+ 1325
+ 1326
+ 1327
+ 1328
+ 1329
+ 1330
+ 1331
+ 1332
+ 1333
+ 1334
+ 1335
+ 1336
+ 1337
+ 1338
+ 1339
+ 1340
+ 1341
+ 1342
+ 1343
+ 1344
+ 1345
+ 1346
+ 1347
+ 1348
+ 1349
+ 1350
+ 1351
+ 1352
+ 1353
+ 1354
+ 1355
+ 1356
+ 1357
+ 1358
+ 1359
+ 1360
+ 1361
+ 1362
+ 1363
+ 1364
+ 1365
+ 1366
+ 1367
+ 1368
+ 1369
+ 1370
+ 1371
+ 1372
+ 1373
+ 1374
+ 1375
+ 1376
+ 1377
+ 1378
+ 1379
+ 1380
+ 1381
+ 1382
+ 1383
+ 1384
+ 1385
+ 1386
+ 1387
+ 1388
+ 1389
+ 1390
+ 1391
+ 1392
+ 1393
+ 1394
+ 1395
+ 1396
+ 1397
+ 1398
+ 1399
+ 1400
+ 1401
+ 1402
+ 1403
+ 1404
+ 1405
+ 1406
+ 1407
+ 1408
+ 1409
+ 1410
+ 1411
+ 1412
+ 1413
+ 1414
+ 1415
+ 1416
+ 1417
+ 1418
+ 1419
+ 1420
+ 1421
+ 1422
+ 1423
+ 1424
+ 1425
+ 1426
+ 1427
+ 1428
+ 1429
+ 1430
+ 1431
+ 1432
+ 1433
+ 1434
+ 1435
+ 1436
+ 1437
+ 1438
+ 1439
+ 1440
+ 1441
+ 1442
+ 1443
+ 1444
+ 1445
+ 1446
+ 1447
+ 1448
+ 1449
+ 1450
+ 1451
+ 1452
+ 1453
+ 1454
+ 1455
+ 1456
+ 1457
+ 1458
+ 1459
+ 1460
+ 1461
+ 1462
+ 1463
+ 1464
+ 1465
+ 1466
+ 1467
+ 1468
+ 1469
+ 1470
+ 1471
+ 1472
+ 1473
+ 1474
+ 1475
+ 1476
+ 1477
+ 1478
+ 1479
+ 1480
+ 1481
+ 1482
+ 1483
+ 1484
+ 1485
+ 1486
+ 1487
+ 1488
+ 1489
+ 1490
+ 1491
+ 1492
+ 1493
+ 1494
+ 1495
+ 1496
+ 1497
+ 1498
+ 1499
+ 1500
+ 1501
+ 1502
+ 1503
+ 1504
+ 1505
+ 1506
+ 1507
+ 1508
+ 1509
+ 1510
+ 1511
+ 1512
+ 1513
+ 1514
+ 1515
+ 1516
+ 1517
+ 1518
+ 1519
+ 1520
+ 1521
+ 1522
+ 1523
+ 1524
+ 1525
+ 1526
+ 1527
+ 1528
+ 1529
+ 1530
+ 1531
+ 1532
+ 1533
+ 1534
+ 1535
+ 1536
+ 1537
+ 1538
+ 1539
+ 1540
+ 1541
+ 1542
+ 1543
+ 1544
+ 1545
+ 1546
+ 1547
+ 1548
+ 1549
+ 1550
+ 1551
+ 1552
+ 1553
+ 1554
+ 1555
+ 1556
+ 1557
+ 1558
+ 1559
+ 1560
+ 1561
+ 1562
+ 1563
+ 1564
+ 1565
+ 1566
+ 1567
+ 1568
+ 1569
+ 1570
+ 1571
+ 1572
+ 1573
+ 1574
+ 1575
+ 1576
+ 1577
+ 1578
+ 1579
+ 1580
+ 1581
+ 1582
+ 1583
+ 1584
+ 1585
+ 1586
+ 1587
+ 1588
+ 1589
+ 1590
+ 1591
+ 1592
+ 1593
+ 1594
+ 1595
+ 1596
+ 1597
+ 1598
+ 1599
+ 1600
+ 1601
+ 1602
+ 1603
+ 1604
+ 1605
+ 1606
+ 1607
+ 1608
+ 1609
+ 1610
+ 1611
+ 1612
+ 1613
+ 1614
+ 1615
+ 1616
+ 1617
+ 1618
+ 1619
+ 1620
+ 1621
+ 1622
+ 1623
+ 1624
+ 1625
+ 1626
+ 1627
+ 1628
+ 1629
+ 1630
+ 1631
+ 1632
+ 1633
+ 1634
+ 1635
+ 1636
+ 1637
+ 1638
+ 1639
+ 1640
+ 1641
+ 1642
+ 1643
+ 1644
+ 1645
+ 1646
+ 1647
+ 1648
+ 1649
+ 1650
+ 1651
+ 1652
+ 1653
+ 1654
+ 1655
+ 1656
+ 1657
+ 1658
+ 1659
+ 1660
+ 1661
+ 1662
+ 1663
+ 1664
+ 1665
+ 1666
+ 1667
+ 1668
+ 1669
+ 1670
+ 1671
+ 1672
+ 1673
+ 1674
+ 1675
+ 1676
+ 1677
+ 1678
+ 1679
+ 1680
+ 1681
+ 1682
+ 1683
+ 1684
+ 1685
+ 1686
+ 1687
+ 1688
+ 1689
+ 1690
+ 1691
+ 1692
+ 1693
+ 1694
+ 1695
+ 1696
+ 1697
+ 1698
+ 1699
+ 1700
+ 1701
+ 1702
+ 1703
+ 1704
+ 1705
+ 1706
+ 1707
+ 1708
+ 1709
+ 1710
+ 1711
+ 1712
+ 1713
+ 1714
+ 1715
+ 1716
+ 1717
+ 1718
+ 1719
+ 1720
+ 1721
+ 1722
+ 1723
+ 1724
+ 1725
+ 1726
+ 1727
+ 1728
+ 1729
+ 1730
+ 1731
+ 1732
+ 1733
+ 1734
+ 1735
+ 1736
+ 1737
+ 1738
+ 1739
+ 1740
+ 1741
+ 1742
+ 1743
+ 1744
+ 1745
+ 1746
+ 1747
+ 1748
+ 1749
+ 1750
+ 1751
+ 1752
+ 1753
+ 1754
+ 1755
+ 1756
+ 1757
+ 1758
+ 1759
+ 1760
+ 1761
+ 1762
+ 1763
+ 1764
+ 1765
+ 1766
+ 1767
+ 1768
+ 1769
+ 1770
+ 1771
+ 1772
+ 1773
+ 1774
+ 1775
+ 1776
+ 1777
+ 1778
+ 1779
+ 1780
+ 1781
+ 1782
+ 1783
+ 1784
+ 1785
+ 1786
+ 1787
+ 1788
+ 1789
+ 1790
+ 1791
+ 1792
+ 1793
+ 1794
+ 1795
+ 1796
+ 1797
+ 1798
+ 1799
+ 1800
+ 1801
+ 1802
+ 1803
+ 1804
+ 1805
+ 1806
+ 1807
+ 1808
+ 1809
+ 1810
+ 1811
+ 1812
+ 1813
+ 1814
+ 1815
+ 1816
+ 1817
+ 1818
+ 1819
+ 1820
+ 1821
+ 1822
+ 1823
+ 1824
+ 1825
+ 1826
+ 1827
+ 1828
+ 1829
+ 1830
+ 1831
+ 1832
+ 1833
+ 1834
+ 1835
+ 1836
+ 1837
+ 1838
+ 1839
+ 1840
+ 1841
+ 1842
+ 1843
+ 1844
+ 1845
+ 1846
+ 1847
+ 1848
+ 1849
+ 1850
+ 1851
+ 1852
+ 1853
+ 1854
+ 1855
+ 1856
+ 1857
+ 1858
+ 1859
+ 1860
+ 1861
+ 1862
+ 1863
+ 1864
+ 1865
+ 1866
+ 1867
+ 1868
+ 1869
+ 1870
+ 1871
+ 1872
+ 1873
+ 1874
+ 1875
+ 1876
+ 1877
+ 1878
+ 1879
+ 1880
+ 1881
+ 1882
+ 1883
+ 1884
+ 1885
+ 1886
+ 1887
+ 1888
+ 1889
+ 1890
+ 1891
+ 1892
+ 1893
+ 1894
+ 1895
+ 1896
+ 1897
+ 1898
+ 1899
+ 1900
+ 1901
+ 1902
+ 1903
+ 1904
+ 1905
+ 1906
+ 1907
+ 1908
+ 1909
+ 1910
+ 1911
+ 1912
+ 1913
+ 1914
+ 1915
+ 1916
+ 1917
+ 1918
+ 1919
+ 1920
+ 1921
+ 1922
+ 1923
+ 1924
+ 1925
+ 1926
+ 1927
+ 1928
+ 1929
+ 1930
+ 1931
+ 1932
+ 1933
+ 1934
+ 1935
+ 1936
+ 1937
+ 1938
+ 1939
+ 1940
+ 1941
+ 1942
+ 1943
+ 1944
+ 1945
+ 1946
+ 1947
+ 1948
+ 1949
+ 1950
+ 1951
+ 1952
+ 1953
+ 1954
+ 1955
+ 1956
+ 1957
+ 1958
+ 1959
+ 1960
+ 1961
+ 1962
+ 1963
+ 1964
+ 1965
+ 1966
+ 1967
+ 1968
+ 1969
+ 1970
+ 1971
+ 1972
+ 1973
+ 1974
+ 1975
+ 1976
+ 1977
+ 1978
+ 1979
+ 1980
+ 1981
+ 1982
+ 1983
+ 1984
+ 1985
+ 1986
+ 1987
+ 1988
+ 1989
+ 1990
+ 1991
+ 1992
+ 1993
+ 1994
+ 1995
+ 1996
+ 1997
+ 1998
+ 1999
+ 2000
+ 2001
+ 2002
+ 2003
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023
+ 2024
+ 2025
+ 2026
+ 2027
+ 2028
+ 2029
+ 2030
+ 2031
+ 2032
+ 2033
+ 2034
+ 2035
+ 2036
+ 2037
+ 2038
+ 2039
+ 2040
+ 2041
+ 2042
+ 2043
+ 2044
+ 2045
+ 2046
+ 2047
+ 2048
+ 2049
+ 2050
+ 2051
+ 2052
+ 2053
+ 2054
+ 2055
+ 2056
+ 2057
+ 2058
+ 2059
+ 2060
+ 2061
+ 2062
+ 2063
+ 2064
+ 2065
+ 2066
+ 2067
+ 2068
+ 2069
+ 2070
+ 2071
+ 2072
+ 2073
+ 2074
+ 2075
+ 2076
+ 2077
+ 2078
+ 2079
+ 2080
+ 2081
+ 2082
+ 2083
+ 2084
+ 2085
+ 2086
+ 2087
+ 2088
+ 2089
+ 2090
+ 2091
+ 2092
+ 2093
+ 2094
+ 2095
+ 2096
+ 2097
+ 2098
+ 2099
+ 2100
+ 2101
+ 2102
+ 2103
+ 2104
+ 2105
+ 2106
+ 2107
+ 2108
+ 2109
+ 2110
+ 2111
+ 2112
+ 2113
+ 2114
+ 2115
+ 2116
+ 2117
+ 2118
+ 2119
+ 2120
+ 2121
+ 2122
+ 2123
+ 2124
+ 2125
+ 2126
+ 2127
+ 2128
+ 2129
+ 2130
+ 2131
+ 2132
+ 2133
+ 2134
+ 2135
+ 2136
+ 2137
+ 2138
+ 2139
+ 2140
+ 2141
+ 2142
+ 2143
+ 2144
+ 2145
+ 2146
+ 2147
+ 2148
+ 2149
+ 2150
+ 2151
+ 2152
+ 2153
+ 2154
+ 2155
+ 2156
+ 2157
+ 2158
+ 2159
+ 2160
+ 2161
+ 2162
+ 2163
+ 2164
+ 2165
+ 2166
+ 2167
+ 2168
+ 2169
+ 2170
+ 2171
+ 2172
+ 2173
+ 2174
+ 2175
+ 2176
+ 2177
+ 2178
+ 2179
+ 2180
+ 2181
+ 2182
+ 2183
+ 2184
+ 2185
+ 2186
+ 2187
+ 2188
+ 2189
+ 2190
+ 2191
+ 2192
+ 2193
+ 2194
+ 2195
+ 2196
+ 2197
+ 2198
+ 2199
+ 2200
+ 2201
+ 2202
+ 2203
+ 2204
+ 2205
+ 2206
+ 2207
+ 2208
+ 2209
+ 2210
+ 2211
+ 2212
+ 2213
+ 2214
+ 2215
+ 2216
+ 2217
+ 2218
+ 2219
+ 2220
+ 2221
+ 2222
+ 2223
+ 2224
+ 2225
+ 2226
+ 2227
+ 2228
+ 2229
+ 2230
+ 2231
+ 2232
+ 2233
+ 2234
+ 2235
+ 2236
+ 2237
+ 2238
+ 2239
+ 2240
+ 2241
+ 2242
+ 2243
+ 2244
+ 2245
+ 2246
+ 2247
+ 2248
+ 2249
+ 2250
+ 2251
+ 2252
+ 2253
+ 2254
+ 2255
+ 2256
+ 2257
+ 2258
+ 2259
+ 2260
+ 2261
+ 2262
+ 2263
+ 2264
+ 2265
+ 2266
+ 2267
+ 2268
+ 2269
+ 2270
+ 2271
+ 2272
+ 2273
+ 2274
+ 2275
+ 2276
+ 2277
+ 2278
+ 2279
+ 2280
+ 2281
+ 2282
+ 2283
+ 2284
+ 2285
+ 2286
+ 2287
+ 2288
+ 2289
+ 2290
+ 2291
+ 2292
+ 2293
+ 2294
+ 2295
+ 2296
+ 2297
+ 2298
+ 2299
+ 2300
+ 2301
+ 2302
+ 2303
+ 2304
+ 2305
+ 2306
+ 2307
+ 2308
+ 2309
+ 2310
+ 2311
+ 2312
+ 2313
+ 2314
+ 2315
+ 2316
+ 2317
+ 2318
+ 2319
+ 2320
+ 2321
+ 2322
+ 2323
+ 2324
+ 2325
+ 2326
+ 2327
+ 2328
+ 2329
+ 2330
+ 2331
+ 2332
+ 2333
+ 2334
+ 2335
+ 2336
+ 2337
+ 2338
+ 2339
+ 2340
+ 2341
+ 2342
+ 2343
+ 2344
+ 2345
+ 2346
+ 2347
+ 2348
+ 2349
+ 2350
+ 2351
+ 2352
+ 2353
+ 2354
+ 2355
+ 2356
+ 2357
+ 2358
+ 2359
+ 2360
+ 2361
+ 2362
+ 2363
+ 2364
+ 2365
+ 2366
+ 2367
+ 2368
+ 2369
+ 2370
+ 2371
+ 2372
+ 2373
+ 2374
+ 2375
+ 2376
+ 2377
+ 2378
+ 2379
+ 2380
+ 2381
+ 2382
+ 2383
+ 2384
+ 2385
+ 2386
+ 2387
+ 2388
+ 2389
+ 2390
+ 2391
+ 2392
+ 2393
+ 2394
+ 2395
+ 2396
+ 2397
+ 2398
+ 2399
+ 2400
+ 2401
+ 2402
+ 2403
+ 2404
+ 2405
+ 2406
+ 2407
+ 2408
+ 2409
+ 2410
+ 2411
+ 2412
+ 2413
+ 2414
+ 2415
+ 2416
+ 2417
+ 2418
+ 2419
+ 2420
+ 2421
+ 2422
+ 2423
+ 2424
+ 2425
+ 2426
+ 2427
+ 2428
+ 2429
+ 2430
+ 2431
+ 2432
+ 2433
+ 2434
+ 2435
+ 2436
+ 2437
+ 2438
+ 2439
+ 2440
+ 2441
+ 2442
+ 2443
+ 2444
+ 2445
+ 2446
+ 2447
+ 2448
+ 2449
+ 2450
+ 2451
+ 2452
+ 2453
+ 2454
+ 2455
+ 2456
+ 2457
+ 2458
+ 2459
+ 2460
+ 2461
+ 2462
+ 2463
+ 2464
+ 2465
+ 2466
+ 2467
+ 2468
+ 2469
+ 2470
+ 2471
+ 2472
+ 2473
+ 2474
+ 2475
+ 2476
+ 2477
+ 2478
+ 2479
+ 2480
+ 2481
+ 2482
+ 2483
+ 2484
+ 2485
+ 2486
+ 2487
+ 2488
+ 2489
+ 2490
+ 2491
+ 2492
+ 2493
+ 2494
+ 2495
+ 2496
+ 2497
+ 2498
+ 2499
+ 2500
+ 2501
+ 2502
+ 2503
+ 2504
+ 2505
+ 2506
+ 2507
+ 2508
+ 2509
+ 2510
+ 2511
+ 2512
+ 2513
+ 2514
+ 2515
+ 2516
+ 2517
+ 2518
+ 2519
+ 2520
+ 2521
+ 2522
+ 2523
+ 2524
+ 2525
+ 2526
+ 2527
+ 2528
+ 2529
+ 2530
+ 2531
+ 2532
+ 2533
+ 2534
+ 2535
+ 2536
+ 2537
+ 2538
+ 2539
+ 2540
+ 2541
+ 2542
+ 2543
+ 2544
+ 2545
+ 2546
+ 2547
+ 2548
+ 2549
+ 2550
+ 2551
+ 2552
+ 2553
+ 2554
+ 2555
+ 2556
+ 2557
+ 2558
+ 2559
+ 2560
+ 2561
+ 2562
+ 2563
+ 2564
+ 2565
+ 2566
+ 2567
+ 2568
+ 2569
+ 2570
+ 2571
+ 2572
+ 2573
+ 2574
+ 2575
+ 2576
+ 2577
+ 2578
+ 2579
+ 2580
+ 2581
+ 2582
+ 2583
+ 2584
+ 2585
+ 2586
+ 2587
+ 2588
+ 2589
+ 2590
+ 2591
+ 2592
+ 2593
+ 2594
+ 2595
+ 2596
+ 2597
+ 2598
+ 2599
+ 2600
+ 2601
+ 2602
+ 2603
+ 2604
+ 2605
+ 2606
+ 2607
+ 2608
+ 2609
+ 2610
+ 2611
+ 2612
+ 2613
+ 2614
+ 2615
+ 2616
+ 2617
+ 2618
+ 2619
+ 2620
+ 2621
+ 2622
+ 2623
+ 2624
+ 2625
+ 2626
+ 2627
+ 2628
+ 2629
+ 2630
+ 2631
+ 2632
+ 2633
+ 2634
+ 2635
+ 2636
+ 2637
+ 2638
+ 2639
+ 2640
+ 2641
+ 2642
+ 2643
+ 2644
+ 2645
+ 2646
+ 2647
+ 2648
+ 2649
+ 2650
+ 2651
+ 2652
+ 2653
+ 2654
+ 2655
+ 2656
+ 2657
+ 2658
+ 2659
+ 2660
+ 2661
+ 2662
+ 2663
+ 2664
+ 2665
+ 2666
+ 2667
+ 2668
+ 2669
+ 2670
+ 2671
+ 2672
+ 2673
+ 2674
+ 2675
+ 2676
+ 2677
+ 2678
+ 2679
+ 2680
+ 2681
+ 2682
+ 2683
+ 2684
+ 2685
+ 2686
+ 2687
+ 2688
+ 2689
+ 2690
+ 2691
+ 2692
+ 2693
+ 2694
+ 2695
+ 2696
+ 2697
+ 2698
+ 2699
+ 2700
+ 2701
+ 2702
+ 2703
+ 2704
+ 2705
+ 2706
+ 2707
+ 2708
+ 2709
+ 2710
+ 2711
+ 2712
+ 2713
+ 2714
+ 2715
+ 2716
+ 2717
+ 2718
+ 2719
+ 2720
+ 2721
+ 2722
+ 2723
+ 2724
+ 2725
+ 2726
+ 2727
+ 2728
+ 2729
+ 2730
+ 2731
+ 2732
+ 2733
+ 2734
+ 2735
+ 2736
+ 2737
+ 2738
+ 2739
+ 2740
+ 2741
+ 2742
+ 2743
+ 2744
+ 2745
+ 2746
+ 2747
+ 2748
+ 2749
+ 2750
+ 2751
+ 2752
+ 2753
+ 2754
+ 2755
+ 2756
+ 2757
+ 2758
+ 2759
+ 2760
+ 2761
+ 2762
+ 2763
+ 2764
+ 2765
+ 2766
+ 2767
+ 2768
+ 2769
+ 2770
+ 2771
+ 2772
+ 2773
+ 2774
+ 2775
+ 2776
+ 2777
+ 2778
+ 2779
+ 2780
+ 2781
+ 2782
+ 2783
+ 2784
+ 2785
+ 2786
+ 2787
+ 2788
+ 2789
+ 2790
+ 2791
+ 2792
+ 2793
+ 2794
+ 2795
+ 2796
+ 2797
+ 2798
+ 2799
+ 2800
+ 2801
+ 2802
+ 2803
+ 2804
+ 2805
+ 2806
+ 2807
+ 2808
+ 2809
+ 2810
+ 2811
+ 2812
+ 2813
+ 2814
+ 2815
+ 2816
+ 2817
+ 2818
+ 2819
+ 2820
+ 2821
+ 2822
+ 2823
+ 2824
+ 2825
+ 2826
+ 2827
+ 2828
+ 2829
+ 2830
+ 2831
+ 2832
+ 2833
+ 2834
+ 2835
+ 2836
+ 2837
+ 2838
+ 2839
+ 2840
+ 2841
+ 2842
+ 2843
+ 2844
+ 2845
+ 2846
+ 2847
+ 2848
+ 2849
+ 2850
+ 2851
+ 2852
+ 2853
+ 2854
+ 2855
+ 2856
+ 2857
+ 2858
+ 2859
+ 2860
+ 2861
+ 2862
+ 2863
+ 2864
+ 2865
+ 2866
+ 2867
+ 2868
+ 2869
+ 2870
+ 2871
+ 2872
+ 2873
+ 2874
+ 2875
+ 2876
+ 2877
+ 2878
+ 2879
+ 2880
+ 2881
+ 2882
+ 2883
+ 2884
+ 2885
+ 2886
+ 2887
+ 2888
+ 2889
+ 2890
+ 2891
+ 2892
+ 2893
+ 2894
+ 2895
+ 2896
+ 2897
+ 2898
+ 2899
+ 2900
+ 2901
+ 2902
+ 2903
+ 2904
+ 2905
+ 2906
+ 2907
+ 2908
+ 2909
+ 2910
+ 2911
+ 2912
+ 2913
+ 2914
+ 2915
+ 2916
+ 2917
+ 2918
+ 2919
+ 2920
+ 2921
+ 2922
+ 2923
+ 2924
+ 2925
+ 2926
+ 2927
+ 2928
+ 2929
+ 2930
+ 2931
+ 2932
+ 2933
+ 2934
+ 2935
+ 2936
+ 2937
+ 2938
+ 2939
+ 2940
+ 2941
+ 2942
+ 2943
+ 2944
+ 2945
+ 2946
+ 2947
+ 2948
+ 2949
+ 2950
+ 2951
+ 2952
+ 2953
+ 2954
+ 2955
+ 2956
+ 2957
+ 2958
+ 2959
+ 2960
+ 2961
+ 2962
+ 2963
+ 2964
+ 2965
+ 2966
+ 2967
+ 2968
+ 2969
+ 2970
+ 2971
+ 2972
+ 2973
+ 2974
+ 2975
+ 2976
+ 2977
+ 2978
+ 2979
+ 2980
+ 2981
+ 2982
+ 2983
+ 2984
+ 2985
+ 2986
+ 2987
+ 2988
+ 2989
+ 2990
+ 2991
+ 2992
+ 2993
+ 2994
+ 2995
+ 2996
+ 2997
+ 2998
+ 2999
+ 3000
+ 3001
+ 3002
+ 3003
+ 3004
+ 3005
+ 3006
+ 3007
+ 3008
+ 3009
+ 3010
+ 3011
+ 3012
+ 3013
+ 3014
+ 3015
+ 3016
+ 3017
+ 3018
+ 3019
+ 3020
+ 3021
+ 3022
+ 3023
+ 3024
+ 3025
+ 3026
+ 3027
+ 3028
+ 3029
+ 3030
+ 3031
+ 3032
+ 3033
+ 3034
+ 3035
+ 3036
+ 3037
+ 3038
+ 3039
+ 3040
+ 3041
+ 3042
+ 3043
+ 3044
+ 3045
+ 3046
+ 3047
+ 3048
+ 3049
+ 3050
+ 3051
+ 3052
+ 3053
+ 3054
+ 3055
+ 3056
+ 3057
+ 3058
+ 3059
+ 3060
+ 3061
+ 3062
+ 3063
+ 3064
+ 3065
+ 3066
+ 3067
+ 3068
+ 3069
+ 3070
+ 3071
+ 3072
+ 3073
+ 3074
+ 3075
+ 3076
+ 3077
+ 3078
+ 3079
+ 3080
+ 3081
+ 3082
+ 3083
+ 3084
+ 3085
+ 3086
+ 3087
+ 3088
+ 3089
+ 3090
+ 3091
+ 3092
+ 3093
+ 3094
+ 3095
+ 3096
+ 3097
+ 3098
+ 3099
+ 3100
+ 3101
+ 3102
+ 3103
+ 3104
+ 3105
+ 3106
+ 3107
+ 3108
+ 3109
+ 3110
+ 3111
+ 3112
+ 3113
+ 3114
+ 3115
+ 3116
+ 3117
+ 3118
+ 3119
+ 3120
+ 3121
+ 3122
+ 3123
+ 3124
+ 3125
+ 3126
+ 3127
+ 3128
+ 3129
+ 3130
+ 3131
+ 3132
+ 3133
+ 3134
+ 3135
+ 3136
+ 3137
+ 3138
+ 3139
+ 3140
+ 3141
+ 3142
+ 3143
+ 3144
+ 3145
+ 3146
+ 3147
+ 3148
+ 3149
+ 3150
+ 3151
+ 3152
+ 3153
+ 3154
+ 3155
+ 3156
+ 3157
+ 3158
+ 3159
+ 3160
+ 3161
+ 3162
+ 3163
+ 3164
+ 3165
+ 3166
+ 3167
+ 3168
+ 3169
+ 3170
+ 3171
+ 3172
+ 3173
+ 3174
+ 3175
+ 3176
+ 3177
+ 3178
+ 3179
+ 3180
+ 3181
+ 3182
+ 3183
+ 3184
+ 3185
+ 3186
+ 3187
+ 3188
+ 3189
+ 3190
+ 3191
+ 3192
+ 3193
+ 3194
+ 3195
+ 3196
+ 3197
+ 3198
+ 3199
+ 3200
+ 3201
+ 3202
+ 3203
+ 3204
+ 3205
+ 3206
+ 3207
+ 3208
+ 3209
+ 3210
+ 3211
+ 3212
+ 3213
+ 3214
+ 3215
+ 3216
+ 3217
+ 3218
+ 3219
+ 3220
+ 3221
+ 3222
+ 3223
+ 3224
+ 3225
+ 3226
+ 3227
+ 3228
+ 3229
+ 3230
+ 3231
+ 3232
+ 3233
+ 3234
+ 3235
+ 3236
+ 3237
+ 3238
+ 3239
+ 3240
+ 3241
+ 3242
+ 3243
+ 3244
+ 3245
+ 3246
+ 3247
+ 3248
+ 3249
+ 3250
+ 3251
+ 3252
+ 3253
+ 3254
+ 3255
+ 3256
+ 3257
+ 3258
+ 3259
+ 3260
+ 3261
+ 3262
+ 3263
+ 3264
+ 3265
+ 3266
+ 3267
+ 3268
+ 3269
+ 3270
+ 3271
+ 3272
+ 3273
+ 3274
+ 3275
+ 3276
+ 3277
+ 3278
+ 3279
+ 3280
+ 3281
+ 3282
+ 3283
+ 3284
+ 3285
+ 3286
+ 3287
+ 3288
+ 3289
+ 3290
+ 3291
+ 3292
+ 3293
+ 3294
+ 3295
+ 3296
+ 3297
+ 3298
+ 3299
+ 3300
+ 3301
+ 3302
+ 3303
+ 3304
+ 3305
+ 3306
+ 3307
+ 3308
+ 3309
+ 3310
+ 3311
+ 3312
+ 3313
+ 3314
+ 3315
+ 3316
+ 3317
+ 3318
+ 3319
+ 3320
+ 3321
+ 3322
+ 3323
+ 3324
+ 3325
+ 3326
+ 3327
+ 3328
+ 3329
+ 3330
+ 3331
+ 3332
+ 3333
+ 3334
+ 3335
+ 3336
+ 3337
+ 3338
+ 3339
+ 3340
+ 3341
+ 3342
+ 3343
+ 3344
+ 3345
+ 3346
+ 3347
+ 3348
+ 3349
+ 3350
+ 3351
+ 3352
+ 3353
+ 3354
+ 3355
+ 3356
+ 3357
+ 3358
+ 3359
+ 3360
+ 3361
+ 3362
+ 3363
+ 3364
+ 3365
+ 3366
+ 3367
+ 3368
+ 3369
+ 3370
+ 3371
+ 3372
+ 3373
+ 3374
+ 3375
+ 3376
+ 3377
+ 3378
+ 3379
+ 3380
+ 3381
+ 3382
+ 3383
+ 3384
+ 3385
+ 3386
+ 3387
+ 3388
+ 3389
+ 3390
+ 3391
+ 3392
+ 3393
+ 3394
+ 3395
+ 3396
+ 3397
+ 3398
+ 3399
+ 3400
+ 3401
+ 3402
+ 3403
+ 3404
+ 3405
+ 3406
+ 3407
+ 3408
+ 3409
+ 3410
+ 3411
+ 3412
+ 3413
+ 3414
+ 3415
+ 3416
+ 3417
+ 3418
+ 3419
+ 3420
+ 3421
+ 3422
+ 3423
+ 3424
+ 3425
+ 3426
+ 3427
+ 3428
+ 3429
+ 3430
+ 3431
+ 3432
+ 3433
+ 3434
+ 3435
+ 3436
+ 3437
+ 3438
+ 3439
+ 3440
+ 3441
+ 3442
+ 3443
+ 3444
+ 3445
+ 3446
+ 3447
+ 3448
+ 3449
+ 3450
+ 3451
+ 3452
+ 3453
+ 3454
+ 3455
+ 3456
+ 3457
+ 3458
+ 3459
+ 3460
+ 3461
+ 3462
+ 3463
+ 3464
+ 3465
+ 3466
+ 3467
+ 3468
+ 3469
+ 3470
+ 3471
+ 3472
+ 3473
+ 3474
+ 3475
+ 3476
+ 3477
+ 3478
+ 3479
+ 3480
+ 3481
+ 3482
+ 3483
+ 3484
+ 3485
+ 3486
+ 3487
+ 3488
+ 3489
+ 3490
+ 3491
+ 3492
+ 3493
+ 3494
+ 3495
+ 3496
+ 3497
+ 3498
+ 3499
+ 3500
+ 3501
+ 3502
+ 3503
+ 3504
+ 3505
+ 3506
+ 3507
+ 3508
+ 3509
+ 3510
+ 3511
+ 3512
+ 3513
+ 3514
+ 3515
+ 3516
+ 3517
+ 3518
+ 3519
+ 3520
+ 3521
+ 3522
+ 3523
+ 3524
+ 3525
+ 3526
+ 3527
+ 3528
+ 3529
+ 3530
+ 3531
+ 3532
+ 3533
+ 3534
+ 3535
+ 3536
+ 3537
+ 3538
+ 3539
+ 3540
+ 3541
+ 3542
+ 3543
+ 3544
+ 3545
+ 3546
+ 3547
+ 3548
+ 3549
+ 3550
+ 3551
+ 3552
+ 3553
+ 3554
+ 3555
+ 3556
+ 3557
+ 3558
+ 3559
+ 3560
+ 3561
+ 3562
+ 3563
+ 3564
+ 3565
+ 3566
+ 3567
+ 3568
+ 3569
+ 3570
+ 3571
+ 3572
+ 3573
+ 3574
+ 3575
+ 3576
+ 3577
+ 3578
+ 3579
+ 3580
+ 3581
+ 3582
+ 3583
+ 3584
+ 3585
+ 3586
+ 3587
+ 3588
+ 3589
+ 3590
+ 3591
+ 3592
+ 3593
+ 3594
+ 3595
+ 3596
+ 3597
+ 3598
+ 3599
+ 3600
+ 3601
+ 3602
+ 3603
+ 3604
+ 3605
+ 3606
+ 3607
+ 3608
+ 3609
+ 3610
+ 3611
+ 3612
+ 3613
+ 3614
+ 3615
+ 3616
+ 3617
+ 3618
+ 3619
+ 3620
+ 3621
+ 3622
+ 3623
+ 3624
+ 3625
+ 3626
+ 3627
+ 3628
+ 3629
+ 3630
+ 3631
+ 3632
+ 3633
+ 3634
+ 3635
+ 3636
+ 3637
+ 3638
+ 3639
+ 3640
+ 3641
+ 3642
+ 3643
+ 3644
+ 3645
+ 3646
+ 3647
+ 3648
+ 3649
+ 3650
+ 3651
+ 3652
+ 3653
+ 3654
+ 3655
+ 3656
+ 3657
+ 3658
+ 3659
+ 3660
+ 3661
+ 3662
+ 3663
+ 3664
+ 3665
+ 3666
+ 3667
+ 3668
+ 3669
+ 3670
+ 3671
+ 3672
+ 3673
+ 3674
+ 3675
+ 3676
+ 3677
+ 3678
+ 3679
+ 3680
+ 3681
+ 3682
+ 3683
+ 3684
+ 3685
+ 3686
+ 3687
+ 3688
+ 3689
+ 3690
+ 3691
+ 3692
+ 3693
+ 3694
+ 3695
+ 3696
+ 3697
+ 3698
+ 3699
+ 3700
+ 3701
+ 3702
+ 3703
+ 3704
+ 3705
+ 3706
+ 3707
+ 3708
+ 3709
+ 3710
+ 3711
+ 3712
+ 3713
+ 3714
+ 3715
+ 3716
+ 3717
+ 3718
+ 3719
+ 3720
+ 3721
+ 3722
+ 3723
+ 3724
+ 3725
+ 3726
+ 3727
+ 3728
+ 3729
+ 3730
+ 3731
+ 3732
+ 3733
+ 3734
+ 3735
+ 3736
+ 3737
+ 3738
+ 3739
+ 3740
+ 3741
+ 3742
+ 3743
+ 3744
+ 3745
+ 3746
+ 3747
+ 3748
+ 3749
+ 3750
+ 3751
+ 3752
+ 3753
+ 3754
+ 3755
+ 3756
+ 3757
+ 3758
+ 3759
+ 3760
+ 3761
+ 3762
+ 3763
+ 3764
+ 3765
+ 3766
+ 3767
+ 3768
+ 3769
+ 3770
+ 3771
+ 3772
+ 3773
+ 3774
+ 3775
+ 3776
+ 3777
+ 3778
+ 3779
+ 3780
+ 3781
+ 3782
+ 3783
+ 3784
+ 3785
+ 3786
+ 3787
+ 3788
+ 3789
+ 3790
+ 3791
+ 3792
+ 3793
+ 3794
+ 3795
+ 3796
+ 3797
+ 3798
+ 3799
+ 3800
+ 3801
+ 3802
+ 3803
+ 3804
+ 3805
+ 3806
+ 3807
+ 3808
+ 3809
+ 3810
+ 3811
+ 3812
+ 3813
+ 3814
+ 3815
+ 3816
+ 3817
+ 3818
+ 3819
+ 3820
+ 3821
+ 3822
+ 3823
+ 3824
+ 3825
+ 3826
+ 3827
+ 3828
+ 3829
+ 3830
+ 3831
+ 3832
+ 3833
+ 3834
+ 3835
+ 3836
+ 3837
+ 3838
+ 3839
+ 3840
+ 3841
+ 3842
+ 3843
+ 3844
+ 3845
+ 3846
+ 3847
+ 3848
+ 3849
+ 3850
+ 3851
+ 3852
+ 3853
+ 3854
+ 3855
+ 3856
+ 3857
+ 3858
+ 3859
+ 3860
+ 3861
+ 3862
+ 3863
+ 3864
+ 3865
+ 3866
+ 3867
+ 3868
+ 3869
+ 3870
+ 3871
+ 3872
+ 3873
+ 3874
+ 3875
+ 3876
+ 3877
+ 3878
+ 3879
+ 3880
+ 3881
+ 3882
+ 3883
+ 3884
+ 3885
+ 3886
+ 3887
+ 3888
+ 3889
+ 3890
+ 3891
+ 3892
+ 3893
+ 3894
+ 3895
+ 3896
+ 3897
+ 3898
+ 3899
+ 3900
+ 3901
+ 3902
+ 3903
+ 3904
+ 3905
+ 3906
+ 3907
+ 3908
+ 3909
+ 3910
+ 3911
+ 3912
+ 3913
+ 3914
+ 3915
+ 3916
+ 3917
+ 3918
+ 3919
+ 3920
+ 3921
+ 3922
+ 3923
+ 3924
+ 3925
+ 3926
+ 3927
+ 3928
+ 3929
+ 3930
+ 3931
+ 3932
+ 3933
+ 3934
+ 3935
+ 3936
+ 3937
+ 3938
+ 3939
+ 3940
+ 3941
+ 3942
+ 3943
+ 3944
+ 3945
+ 3946
+ 3947
+ 3948
+ 3949
+ 3950
+ 3951
+ 3952
+ 3953
+ 3954
+ 3955
+ 3956
+ 3957
+ 3958
+ 3959
+ 3960
+ 3961
+ 3962
+ 3963
+ 3964
+ 3965
+ 3966
+ 3967
+ 3968
+ 3969
+ 3970
+ 3971
+ 3972
+ 3973
+ 3974
+ 3975
+ 3976
+ 3977
+ 3978
+ 3979
+ 3980
+ 3981
+ 3982
+ 3983
+ 3984
+ 3985
+ 3986
+ 3987
+ 3988
+ 3989
+ 3990
+ 3991
+ 3992
+ 3993
+ 3994
+ 3995
+ 3996
+ 3997
+ 3998
+ 3999
+ 4000
+ 4001
+ 4002
+ 4003
+ 4004
+ 4005
+ 4006
+ 4007
+ 4008
+ 4009
+ 4010
+ 4011
+ 4012
+ 4013
+ 4014
+ 4015
+ 4016
+ 4017
+ 4018
+ 4019
+ 4020
+ 4021
+ 4022
+ 4023
+ 4024
+ 4025
+ 4026
+ 4027
+ 4028
+ 4029
+ 4030
+ 4031
+ 4032
+ 4033
+ 4034
+ 4035
+ 4036
+ 4037
+ 4038
+ 4039
+ 4040
+ 4041
+ 4042
+ 4043
+ 4044
+ 4045
+ 4046
+ 4047
+ 4048
+ 4049
+ 4050
+ 4051
+ 4052
+ 4053
+ 4054
+ 4055
+ 4056
+ 4057
+ 4058
+ 4059
+ 4060
+ 4061
+ 4062
+ 4063
+ 4064
+ 4065
+ 4066
+ 4067
+ 4068
+ 4069
+ 4070
+ 4071
+ 4072
+ 4073
+ 4074
+ 4075
+ 4076
+ 4077
+ 4078
+ 4079
+ 4080
+ 4081
+ 4082
+ 4083
+ 4084
+ 4085
+ 4086
+ 4087
+ 4088
+ 4089
+ 4090
+ 4091
+ 4092
+ 4093
+ 4094
+ 4095
+ 4096
+ 4097
+ 4098
+ 4099
+ 4100
+ 4101
+ 4102
+ 4103
+ 4104
+ 4105
+ 4106
+ 4107
+ 4108
+ 4109
+ 4110
+ 4111
+ 4112
+ 4113
+ 4114
+ 4115
+ 4116
+ 4117
+ 4118
+ 4119
+ 4120
+ 4121
+ 4122
+ 4123
+ 4124
+ 4125
+ 4126
+ 4127
+ 4128
+ 4129
+ 4130
+ 4131
+ 4132
+ 4133
+ 4134
+ 4135
+ 4136
+ 4137
+ 4138
+ 4139
+ 4140
+ 4141
+ 4142
+ 4143
+ 4144
+ 4145
+ 4146
+ 4147
+ 4148
+ 4149
+ 4150
+ 4151
+ 4152
+ 4153
+ 4154
+ 4155
+ 4156
+ 4157
+ 4158
+ 4159
+ 4160
+ 4161
+ 4162
+ 4163
+ 4164
+ 4165
+ 4166
+ 4167
+ 4168
+ 4169
+ 4170
+ 4171
+ 4172
+ 4173
+ 4174
+ 4175
+ 4176
+ 4177
+ 4178
+ 4179
+ 4180
+ 4181
+ 4182
+ 4183
+ 4184
+ 4185
+ 4186
+ 4187
+ 4188
+ 4189
+ 4190
+ 4191
+ 4192
+ 4193
+ 4194
+ 4195
+ 4196
+ 4197
+ 4198
+ 4199
+ 4200
+ 4201
+ 4202
+ 4203
+ 4204
+ 4205
+ 4206
+ 4207
+ 4208
+ 4209
+ 4210
+ 4211
+ 4212
+ 4213
+ 4214
+ 4215
+ 4216
+ 4217
+ 4218
+ 4219
+ 4220
+ 4221
+ 4222
+ 4223
+ 4224
+ 4225
+ 4226
+ 4227
+ 4228
+ 4229
+ 4230
+ 4231
+ 4232
+ 4233
+ 4234
+ 4235
+ 4236
+ 4237
+ 4238
+ 4239
+ 4240
+ 4241
+ 4242
+ 4243
+ 4244
+ 4245
+ 4246
+ 4247
+ 4248
+ 4249
+ 4250
+ 4251
+ 4252
+ 4253
+ 4254
+ 4255
+ 4256
+ 4257
+ 4258
+ 4259
+ 4260
+ 4261
+ 4262
+ 4263
+ 4264
+ 4265
+ 4266
+ 4267
+ 4268
+ 4269
+ 4270
+ 4271
+ 4272
+ 4273
+ 4274
+ 4275
+ 4276
+ 4277
+ 4278
+ 4279
+ 4280
+ 4281
+ 4282
+ 4283
+ 4284
+ 4285
+ 4286
+ 4287
+ 4288
+ 4289
+ 4290
+ 4291
+ 4292
+ 4293
+ 4294
+ 4295
+ 4296
+ 4297
+ 4298
+ 4299
+ 4300
+ 4301
+ 4302
+ 4303
+ 4304
+ 4305
+ 4306
+ 4307
+ 4308
+ 4309
+ 4310
+ 4311
+ 4312
+ 4313
+ 4314
+ 4315
+ 4316
+ 4317
+ 4318
+ 4319
+ 4320
+ 4321
+ 4322
+ 4323
+ 4324
+ 4325
+ 4326
+ 4327
+ 4328
+ 4329
+ 4330
+ 4331
+ 4332
+ 4333
+ 4334
+ 4335
+ 4336
+ 4337
+ 4338
+ 4339
+ 4340
+ 4341
+ 4342
+ 4343
+ 4344
+ 4345
+ 4346
+ 4347
+ 4348
+ 4349
+ 4350
+ 4351
+ 4352
+ 4353
+ 4354
+ 4355
+ 4356
+ 4357
+ 4358
+ 4359
+ 4360
+ 4361
+ 4362
+ 4363
+ 4364
+ 4365
+ 4366
+ 4367
+ 4368
+ 4369
+ 4370
+ 4371
+ 4372
+ 4373
+ 4374
+ 4375
+ 4376
+ 4377
+ 4378
+ 4379
+ 4380
+ 4381
+ 4382
+ 4383
+ 4384
+ 4385
+ 4386
+ 4387
+ 4388
+ 4389
+ 4390
+ 4391
+ 4392
+ 4393
+ 4394
+ 4395
+ 4396
+ 4397
+ 4398
+ 4399
+ 4400
+ 4401
+ 4402
+ 4403
+ 4404
+ 4405
+ 4406
+ 4407
+ 4408
+ 4409
+ 4410
+ 4411
+ 4412
+ 4413
+ 4414
+ 4415
+ 4416
+ 4417
+ 4418
+ 4419
+ 4420
+ 4421
+ 4422
+ 4423
+ 4424
+ 4425
+ 4426
+ 4427
+ 4428
+ 4429
+ 4430
+ 4431
+ 4432
+ 4433
+ 4434
+ 4435
+ 4436
+ 4437
+ 4438
+ 4439
+ 4440
+ 4441
+ 4442
+ 4443
+ 4444
+ 4445
+ 4446
+ 4447
+ 4448
+ 4449
+ 4450
+ 4451
+ 4452
+ 4453
+ 4454
+ 4455
+ 4456
+ 4457
+ 4458
+ 4459
+ 4460
+ 4461
+ 4462
+ 4463
+ 4464
+ 4465
+ 4466
+ 4467
+ 4468
+ 4469
+ 4470
+ 4471
+ 4472
+ 4473
+ 4474
+ 4475
+ 4476
+ 4477
+ 4478
+ 4479
+ 4480
+ 4481
+ 4482
+ 4483
+ 4484
+ 4485
+ 4486
+ 4487
+ 4488
+ 4489
+ 4490
+ 4491
+ 4492
+ 4493
+ 4494
+ 4495
+ 4496
+ 4497
+ 4498
+ 4499
+ 4500
+ 4501
+ 4502
+ 4503
+ 4504
+ 4505
+ 4506
+ 4507
+ 4508
+ 4509
+ 4510
+ 4511
+ 4512
+ 4513
+ 4514
+ 4515
+ 4516
+ 4517
+ 4518
+ 4519
+ 4520
+ 4521
+ 4522
+ 4523
+ 4524
+ 4525
+ 4526
+ 4527
+ 4528
+ 4529
+ 4530
+ 4531
+ 4532
+ 4533
+ 4534
+ 4535
+ 4536
+ 4537
+ 4538
+ 4539
+ 4540
+ 4541
+ 4542
+ 4543
+ 4544
+ 4545
+ 4546
+ 4547
+ 4548
+ 4549
+ 4550
+ 4551
+ 4552
+ 4553
+ 4554
+ 4555
+ 4556
+ 4557
+ 4558
+ 4559
+ 4560
+ 4561
+ 4562
+ 4563
+ 4564
+ 4565
+ 4566
+ 4567
+ 4568
+ 4569
+ 4570
+ 4571
+ 4572
+ 4573
+ 4574
+ 4575
+ 4576
+ 4577
+ 4578
+ 4579
+ 4580
+ 4581
+ 4582
+ 4583
+ 4584
+ 4585
+ 4586
+ 4587
+ 4588
+ 4589
+ 4590
+ 4591
+ 4592
+ 4593
+ 4594
+ 4595
+ 4596
+ 4597
+ 4598
+ 4599
+ 4600
+ 4601
+ 4602
+ 4603
+ 4604
+ 4605
+ 4606
+ 4607
+ 4608
+ 4609
+ 4610
+ 4611
+ 4612
+ 4613
+ 4614
+ 4615
+ 4616
+ 4617
+ 4618
+ 4619
+ 4620
+ 4621
+ 4622
+ 4623
+ 4624
+ 4625
+ 4626
+ 4627
+ 4628
+ 4629
+ 4630
+ 4631
+ 4632
+ 4633
+ 4634
+ 4635
+ 4636
+ 4637
+ 4638
+ 4639
+ 4640
+ 4641
+ 4642
+ 4643
+ 4644
+ 4645
+ 4646
+ 4647
+ 4648
+ 4649
+ 4650
+ 4651
+ 4652
+ 4653
+ 4654
+ 4655
+ 4656
+ 4657
+ 4658
+ 4659
+ 4660
+ 4661
+ 4662
+ 4663
+ 4664
+ 4665
+ 4666
+ 4667
+ 4668
+ 4669
+ 4670
+ 4671
+ 4672
+ 4673
+ 4674
+ 4675
+ 4676
+ 4677
+ 4678
+ 4679
+ 4680
+ 4681
+ 4682
+ 4683
+ 4684
+ 4685
+ 4686
+ 4687
+ 4688
+ 4689
+ 4690
+ 4691
+ 4692
+ 4693
+ 4694
+ 4695
+ 4696
+ 4697
+ 4698
+ 4699
+ 4700
+ 4701
+ 4702
+ 4703
+ 4704
+ 4705
+ 4706
+ 4707
+ 4708
+ 4709
+ 4710
+ 4711
+ 4712
+ 4713
+ 4714
+ 4715
+ 4716
+ 4717
+ 4718
+ 4719
+ 4720
+ 4721
+ 4722
+ 4723
+ 4724
+ 4725
+ 4726
+ 4727
+ 4728
+ 4729
+ 4730
+ 4731
+ 4732
+ 4733
+ 4734
+ 4735
+ 4736
+ 4737
+ 4738
+ 4739
+ 4740
+ 4741
+ 4742
+ 4743
+ 4744
+ 4745
+ 4746
+ 4747
+ 4748
+ 4749
+ 4750
+ 4751
+ 4752
+ 4753
+ 4754
+ 4755
+ 4756
+ 4757
+ 4758
+ 4759
+ 4760
+ 4761
+ 4762
+ 4763
+ 4764
+ 4765
+ 4766
+ 4767
+ 4768
+ 4769
+ 4770
+ 4771
+ 4772
+ 4773
+ 4774
+ 4775
+ 4776
+ 4777
+ 4778
+ 4779
+ 4780
+ 4781
+ 4782
+ 4783
+ 4784
+ 4785
+ 4786
+ 4787
+ 4788
+ 4789
+ 4790
+ 4791
+ 4792
+ 4793
+ 4794
+ 4795
+ 4796
+ 4797
+ 4798
+ 4799
+ 4800
+ 4801
+ 4802
+ 4803
+ 4804
+ 4805
+ 4806
+ 4807
+ 4808
+ 4809
+ 4810
+ 4811
+ 4812
+ 4813
+ 4814
+ 4815
+ 4816
+ 4817
+ 4818
+ 4819
+ 4820
+ 4821
+ 4822
+ 4823
+ 4824
+ 4825
+ 4826
+ 4827
+ 4828
+ 4829
+ 4830
+ 4831
+ 4832
+ 4833
+ 4834
+ 4835
+ 4836
+ 4837
+ 4838
+ 4839
+ 4840
+ 4841
+ 4842
+ 4843
+ 4844
+ 4845
+ 4846
+ 4847
+ 4848
+ 4849
+ 4850
+ 4851
+ 4852
+ 4853
+ 4854
+ 4855
+ 4856
+ 4857
+ 4858
+ 4859
+ 4860
+ 4861
+ 4862
+ 4863
+ 4864
+ 4865
+ 4866
+ 4867
+ 4868
+ 4869
+ 4870
+ 4871
+ 4872
+ 4873
+ 4874
+ 4875
+ 4876
+ 4877
+ 4878
+ 4879
+ 4880
+ 4881
+ 4882
+ 4883
+ 4884
+ 4885
+ 4886
+ 4887
+ 4888
+ 4889
+ 4890
+ 4891
+ 4892
+ 4893
+ 4894
+ 4895
+ 4896
+ 4897
+ 4898
+ 4899
+ 4900
+ 4901
+ 4902
+ 4903
+ 4904
+ 4905
+ 4906
+ 4907
+ 4908
+ 4909
+ 4910
+ 4911
+ 4912
+ 4913
+ 4914
+ 4915
+ 4916
+ 4917
+ 4918
+ 4919
+ 4920
+ 4921
+ 4922
+ 4923
+ 4924
+ 4925
+ 4926
+ 4927
+ 4928
+ 4929
+ 4930
+ 4931
+ 4932
+ 4933
+ 4934
+ 4935
+ 4936
+ 4937
+ 4938
+ 4939
+ 4940
+ 4941
+ 4942
+ 4943
+ 4944
+ 4945
+ 4946
+ 4947
+ 4948
+ 4949
+ 4950
+ 4951
+ 4952
+ 4953
+ 4954
+ 4955
+ 4956
+ 4957
+ 4958
+ 4959
+ 4960
+ 4961
+ 4962
+ 4963
+ 4964
+ 4965
+ 4966
+ 4967
+ 4968
+ 4969
+ 4970
+ 4971
+ 4972
+ 4973
+ 4974
+ 4975
+ 4976
+ 4977
+ 4978
+ 4979
+ 4980
+ 4981
+ 4982
+ 4983
+ 4984
+ 4985
+ 4986
+ 4987
+ 4988
+ 4989
+ 4990
+ 4991
+ 4992
+ 4993
+ 4994
+ 4995
+ 4996
+ 4997
+ 4998
+ 4999
+ 5000
+ 5001
+ 5002
+ 5003
+ 5004
+ 5005
+ 5006
+ 5007
+ 5008
+ 5009
+ 5010
+ 5011
+ 5012
+ 5013
+ 5014
+ 5015
+ 5016
+ 5017
+ 5018
+ 5019
+ 5020
+ 5021
+ 5022
+ 5023
+ 5024
+ 5025
+ 5026
+ 5027
+ 5028
+ 5029
+ 5030
+ 5031
+ 5032
+ 5033
+ 5034
+ 5035
+ 5036
+ 5037
+ 5038
+ 5039
+ 5040
+ 5041
+ 5042
+ 5043
+ 5044
+ 5045
+ 5046
+ 5047
+ 5048
+ 5049
+ 5050
+ 5051
+ 5052
+ 5053
+ 5054
+ 5055
+ 5056
+ 5057
+ 5058
+ 5059
+ 5060
+ 5061
+ 5062
+ 5063
+ 5064
+ 5065
+ 5066
+ 5067
+ 5068
+ 5069
+ 5070
+ 5071
+ 5072
+ 5073
+ 5074
+ 5075
+ 5076
+ 5077
+ 5078
+ 5079
+ 5080
+ 5081
+ 5082
+ 5083
+ 5084
+ 5085
+ 5086
+ 5087
+ 5088
+ 5089
+ 5090
+ 5091
+ 5092
+ 5093
+ 5094
+ 5095
+ 5096
+ 5097
+ 5098
+ 5099
+ 5100
+ 5101
+ 5102
+ 5103
+ 5104
+ 5105
+ 5106
+ 5107
+ 5108
+ 5109
+ 5110
+ 5111
+ 5112
+ 5113
+ 5114
+ 5115
+ 5116
+ 5117
+ 5118
+ 5119
+ 5120
+ 5121
+ 5122
+ 5123
+ 5124
+ 5125
+ 5126
+ 5127
+ 5128
+ 5129
+ 5130
+ 5131
+ 5132
+ 5133
+ 5134
+ 5135
+ 5136
+ 5137
+ 5138
+ 5139
+ 5140
+ 5141
+ 5142
+ 5143
+ 5144
+ 5145
+ 5146
+ 5147
+ 5148
+ 5149
+ 5150
+ 5151
+ 5152
+ 5153
+ 5154
+ 5155
+ 5156
+ 5157
+ 5158
+ 5159
+ 5160
+ 5161
+ 5162
+ 5163
+ 5164
+ 5165
+ 5166
+ 5167
+ 5168
+ 5169
+ 5170
+ 5171
+ 5172
+ 5173
+ 5174
+ 5175
+ 5176
+ 5177
+ 5178
+ 5179
+ 5180
+ 5181
+ 5182
+ 5183
+ 5184
+ 5185
+ 5186
+ 5187
+ 5188
+ 5189
+ 5190
+ 5191
+ 5192
+ 5193
+ 5194
+ 5195
+ 5196
+ 5197
+ 5198
+ 5199
+ 5200
+ 5201
+ 5202
+ 5203
+ 5204
+ 5205
+ 5206
+ 5207
+ 5208
+ 5209
+ 5210
+ 5211
+ 5212
+ 5213
+ 5214
+ 5215
+ 5216
+ 5217
+ 5218
+ 5219
+ 5220
+ 5221
+ 5222
+ 5223
+ 5224
+ 5225
+ 5226
+ 5227
+ 5228
+ 5229
+ 5230
+ 5231
+ 5232
+ 5233
+ 5234
+ 5235
+ 5236
+ 5237
+ 5238
+ 5239
+ 5240
+ 5241
+ 5242
+ 5243
+ 5244
+ 5245
+ 5246
+ 5247
+ 5248
+ 5249
+ 5250
+ 5251
+ 5252
+ 5253
+ 5254
+ 5255
+ 5256
+ 5257
+ 5258
+ 5259
+ 5260
+ 5261
+ 5262
+ 5263
+ 5264
+ 5265
+ 5266
+ 5267
+ 5268
+ 5269
+ 5270
+ 5271
+ 5272
+ 5273
+ 5274
+ 5275
+ 5276
+ 5277
+ 5278
+ 5279
+ 5280
+ 5281
+ 5282
+ 5283
+ 5284
+ 5285
+ 5286
+ 5287
+ 5288
+ 5289
+ 5290
+ 5291
+ 5292
+ 5293
+ 5294
+ 5295
+ 5296
+ 5297
+ 5298
+ 5299
+ 5300
+ 5301
+ 5302
+ 5303
+ 5304
+ 5305
+ 5306
+ 5307
+ 5308
+ 5309
+ 5310
+ 5311
+ 5312
+ 5313
+ 5314
+ 5315
+ 5316
+ 5317
+ 5318
+ 5319
+ 5320
+ 5321
+ 5322
+ 5323
+ 5324
+ 5325
+ 5326
+ 5327
+ 5328
+ 5329
+ 5330
+ 5331
+ 5332
+ 5333
+ 5334
+ 5335
+ 5336
+ 5337
+ 5338
+ 5339
+ 5340
+ 5341
+ 5342
+ 5343
+ 5344
+ 5345
+ 5346
+ 5347
+ 5348
+ 5349
+ 5350
+ 5351
+ 5352
+ 5353
+ 5354
+ 5355
+ 5356
+ 5357
+ 5358
+ 5359
+ 5360
+ 5361
+ 5362
+ 5363
+ 5364
+ 5365
+ 5366
+ 5367
+ 5368
+ 5369
+ 5370
+ 5371
+ 5372
+ 5373
+ 5374
+ 5375
+ 5376
+ 5377
+ 5378
+ 5379
+ 5380
+ 5381
+ 5382
+ 5383
+ 5384
+ 5385
+ 5386
+ 5387
+ 5388
+ 5389
+ 5390
+ 5391
+ 5392
+ 5393
+ 5394
+ 5395
+ 5396
+ 5397
+ 5398
+ 5399
+ 5400
+ 5401
+ 5402
+ 5403
+ 5404
+ 5405
+ 5406
+ 5407
+ 5408
+ 5409
+ 5410
+ 5411
+ 5412
+ 5413
+ 5414
+ 5415
+ 5416
+ 5417
+ 5418
+ 5419
+ 5420
+ 5421
+ 5422
+ 5423
+ 5424
+ 5425
+ 5426
+ 5427
+ 5428
+ 5429
+ 5430
+ 5431
+ 5432
+ 5433
+ 5434
+ 5435
+ 5436
+ 5437
+ 5438
+ 5439
+ 5440
+ 5441
+ 5442
+ 5443
+ 5444
+ 5445
+ 5446
+ 5447
+ 5448
+ 5449
+ 5450
+ 5451
+ 5452
+ 5453
+ 5454
+ 5455
+ 5456
+ 5457
+ 5458
+ 5459
+ 5460
+ 5461
+ 5462
+ 5463
+ 5464
+ 5465
+ 5466
+ 5467
+ 5468
+ 5469
+ 5470
+ 5471
+ 5472
+ 5473
+ 5474
+ 5475
+ 5476
+ 5477
+ 5478
+ 5479
+ 5480
+ 5481
+ 5482
+ 5483
+ 5484
+ 5485
+ 5486
+ 5487
+ 5488
+ 5489
+ 5490
+ 5491
+ 5492
+ 5493
+ 5494
+ 5495
+ 5496
+ 5497
+ 5498
+ 5499
+ 5500
+ 5501
+ 5502
+ 5503
+ 5504
+ 5505
+ 5506
+ 5507
+ 5508
+ 5509
+ 5510
+ 5511
+ 5512
+ 5513
+ 5514
+ 5515
+ 5516
+ 5517
+ 5518
+ 5519
+ 5520
+ 5521
+ 5522
+ 5523
+ 5524
+ 5525
+ 5526
+ 5527
+ 5528
+ 5529
+ 5530
+ 5531
+ 5532
+ 5533
+ 5534
+ 5535
+ 5536
+ 5537
+ 5538
+ 5539
+ 5540
+ 5541
+ 5542
+ 5543
+ 5544
+ 5545
+ 5546
+ 5547
+ 5548
+ 5549
+ 5550
+ 5551
+ 5552
+ 5553
+ 5554
+ 5555
+ 5556
+ 5557
+ 5558
+ 5559
+ 5560
+ 5561
+ 5562
+ 5563
+ 5564
+ 5565
+ 5566
+ 5567
+ 5568
+ 5569
+ 5570
+ 5571
+ 5572
+ 5573
+ 5574
+ 5575
+ 5576
+ 5577
+ 5578
+ 5579
+ 5580
+ 5581
+ 5582
+ 5583
+ 5584
+ 5585
+ 5586
+ 5587
+ 5588
+ 5589
+ 5590
+ 5591
+ 5592
+ 5593
+ 5594
+ 5595
+ 5596
+ 5597
+ 5598
+ 5599
+ 5600
+ 5601
+ 5602
+ 5603
+ 5604
+ 5605
+ 5606
+ 5607
+ 5608
+ 5609
+ 5610
+ 5611
+ 5612
+ 5613
+ 5614
+ 5615
+ 5616
+ 5617
+ 5618
+ 5619
+ 5620
+ 5621
+ 5622
+ 5623
+ 5624
+ 5625
+ 5626
+ 5627
+ 5628
+ 5629
+ 5630
+ 5631
+ 5632
+ 5633
+ 5634
+ 5635
+ 5636
+ 5637
+ 5638
+ 5639
+ 5640
+ 5641
+ 5642
+ 5643
+ 5644
+ 5645
+ 5646
+ 5647
+ 5648
+ 5649
+ 5650
+ 5651
+ 5652
+ 5653
+ 5654
+ 5655
+ 5656
+ 5657
+ 5658
+ 5659
+ 5660
+ 5661
+ 5662
+ 5663
+ 5664
+ 5665
+ 5666
+ 5667
+ 5668
+ 5669
+ 5670
+ 5671
+ 5672
+ 5673
+ 5674
+ 5675
+ 5676
+ 5677
+ 5678
+ 5679
+ 5680
+ 5681
+ 5682
+ 5683
+ 5684
+ 5685
+ 5686
+ 5687
+ 5688
+ 5689
+ 5690
+ 5691
+ 5692
+ 5693
+ 5694
+ 5695
+ 5696
+ 5697
+ 5698
+ 5699
+ 5700
+ 5701
+ 5702
+ 5703
+ 5704
+ 5705
+ 5706
+ 5707
+ 5708
+ 5709
+ 5710
+ 5711
+ 5712
+ 5713
+ 5714
+ 5715
+ 5716
+ 5717
+ 5718
+ 5719
+ 5720
+ 5721
+ 5722
+ 5723
+ 5724
+ 5725
+ 5726
+ 5727
+ 5728
+ 5729
+ 5730
+ 5731
+ 5732
+ 5733
+ 5734
+ 5735
+ 5736
+ 5737
+ 5738
+ 5739
+ 5740
+ 5741
+ 5742
+ 5743
+ 5744
+ 5745
+ 5746
+ 5747
+ 5748
+ 5749
+ 5750
+ 5751
+ 5752
+ 5753
+ 5754
+ 5755
+ 5756
+ 5757
+ 5758
+ 5759
+ 5760
+ 5761
+ 5762
+ 5763
+ 5764
+ 5765
+ 5766
+ 5767
+ 5768
+ 5769
+ 5770
+ 5771
+ 5772
+ 5773
+ 5774
+ 5775
+ 5776
+ 5777
+ 5778
+ 5779
+ 5780
+ 5781
+ 5782
+ 5783
+ 5784
+ 5785
+ 5786
+ 5787
+ 5788
+ 5789
+ 5790
+ 5791
+ 5792
+ 5793
+ 5794
+ 5795
+ 5796
+ 5797
+ 5798
+ 5799
+ 5800
+ 5801
+ 5802
+ 5803
+ 5804
+ 5805
+ 5806
+ 5807
+ 5808
+ 5809
+ 5810
+ 5811
+ 5812
+ 5813
+ 5814
+ 5815
+ 5816
+ 5817
+ 5818
+ 5819
+ 5820
+ 5821
+ 5822
+ 5823
+ 5824
+ 5825
+ 5826
+ 5827
+ 5828
+ 5829
+ 5830
+ 5831
+ 5832
+ 5833
+ 5834
+ 5835
+ 5836
+ 5837
+ 5838
+ 5839
+ 5840
+ 5841
+ 5842
+ 5843
+ 5844
+ 5845
+ 5846
+ 5847
+ 5848
+ 5849
+ 5850
+ 5851
+ 5852
+ 5853
+ 5854
+ 5855
+ 5856
+ 5857
+ 5858
+ 5859
+ 5860
+ 5861
+ 5862
+ 5863
+ 5864
+ 5865
+ 5866
+ 5867
+ 5868
+ 5869
+ 5870
+ 5871
+ 5872
+ 5873
+ 5874
+ 5875
+ 5876
+ 5877
+ 5878
+ 5879
+ 5880
+ 5881
+ 5882
+ 5883
+ 5884
+ 5885
+ 5886
+ 5887
+ 5888
+ 5889
+ 5890
+ 5891
+ 5892
+ 5893
+ 5894
+ 5895
+ 5896
+ 5897
+ 5898
+ 5899
+ 5900
+ 5901
+ 5902
+ 5903
+ 5904
+ 5905
+ 5906
+ 5907
+ 5908
+ 5909
+ 5910
+ 5911
+ 5912
+ 5913
+ 5914
+ 5915
+ 5916
+ 5917
+ 5918
+ 5919
+ 5920
+ 5921
+ 5922
+ 5923
+ 5924
+ 5925
+ 5926
+ 5927
+ 5928
+ 5929
+ 5930
+ 5931
+ 5932
+ 5933
+ 5934
+ 5935
+ 5936
+ 5937
+ 5938
+ 5939
+ 5940
+ 5941
+ 5942
+ 5943
+ 5944
+ 5945
+ 5946
+ 5947
+ 5948
+ 5949
+ 5950
+ 5951
+ 5952
+ 5953
+ 5954
+ 5955
+ 5956
+ 5957
+ 5958
+ 5959
+ 5960
+ 5961
+ 5962
+ 5963
+ 5964
+ 5965
+ 5966
+ 5967
+ 5968
+ 5969
+ 5970
+ 5971
+ 5972
+ 5973
+ 5974
+ 5975
+ 5976
+ 5977
+ 5978
+ 5979
+ 5980
+ 5981
+ 5982
+ 5983
+ 5984
+ 5985
+ 5986
+ 5987
+ 5988
+ 5989
+ 5990
+ 5991
+ 5992
+ 5993
+ 5994
+ 5995
+ 5996
+ 5997
+ 5998
+ 5999
+ 6000
+ 6001
+ 6002
+ 6003
+ 6004
+ 6005
+ 6006
+ 6007
+ 6008
+ 6009
+ 6010
+ 6011
+ 6012
+ 6013
+ 6014
+ 6015
+ 6016
+ 6017
+ 6018
+ 6019
+ 6020
+ 6021
+ 6022
+ 6023
+ 6024
+ 6025
+ 6026
+ 6027
+ 6028
+ 6029
+ 6030
+ 6031
+ 6032
+ 6033
+ 6034
+ 6035
+ 6036
+ 6037
+ 6038
+ 6039
+ 6040
+ 6041
+ 6042
+ 6043
+ 6044
+ 6045
+ 6046
+ 6047
+ 6048
+ 6049
+ 6050
+ 6051
+ 6052
+ 6053
+ 6054
+ 6055
+ 6056
+ 6057
+ 6058
+ 6059
+ 6060
+ 6061
+ 6062
+ 6063
+ 6064
+ 6065
+ 6066
+ 6067
+ 6068
+ 6069
+ 6070
+ 6071
+ 6072
+ 6073
+ 6074
+ 6075
+ 6076
+ 6077
+ 6078
+ 6079
+ 6080
+ 6081
+ 6082
+ 6083
+ 6084
+ 6085
+ 6086
+ 6087
+ 6088
+ 6089
+ 6090
+ 6091
+ 6092
+ 6093
+ 6094
+ 6095
+ 6096
+ 6097
+ 6098
+ 6099
+ 6100
+ 6101
+ 6102
+ 6103
+ 6104
+ 6105
+ 6106
+ 6107
+ 6108
+ 6109
+ 6110
+ 6111
+ 6112
+ 6113
+ 6114
+ 6115
+ 6116
+ 6117
+ 6118
+ 6119
+ 6120
+ 6121
+ 6122
+ 6123
+ 6124
+ 6125
+ 6126
+ 6127
+ 6128
+ 6129
+ 6130
+ 6131
+ 6132
+ 6133
+ 6134
+ 6135
+ 6136
+ 6137
+ 6138
+ 6139
+ 6140
+ 6141
+ 6142
+ 6143
+ 6144
+ 6145
+ 6146
+ 6147
+ 6148
+ 6149
+ 6150
+ 6151
+ 6152
+ 6153
+ 6154
+ 6155
+ 6156
+ 6157
+ 6158
+ 6159
+ 6160
+ 6161
+ 6162
+ 6163
+ 6164
+ 6165
+ 6166
+ 6167
+ 6168
+ 6169
+ 6170
+ 6171
+ 6172
+ 6173
+ 6174
+ 6175
+ 6176
+ 6177
+ 6178
+ 6179
+ 6180
+ 6181
+ 6182
+ 6183
+ 6184
+ 6185
+ 6186
+ 6187
+ 6188
+ 6189
+ 6190
+ 6191
+ 6192
+ 6193
+ 6194
+ 6195
+ 6196
+ 6197
+ 6198
+ 6199
+ 6200
+ 6201
+ 6202
+ 6203
+ 6204
+ 6205
+ 6206
+ 6207
+ 6208
+ 6209
+ 6210
+ 6211
+ 6212
+ 6213
+ 6214
+ 6215
+ 6216
+ 6217
+ 6218
+ 6219
+ 6220
+ 6221
+ 6222
+ 6223
+ 6224
+ 6225
+ 6226
+ 6227
+ 6228
+ 6229
+ 6230
+ 6231
+ 6232
+ 6233
+ 6234
+ 6235
+ 6236
+ 6237
+ 6238
+ 6239
+ 6240
+ 6241
+ 6242
+ 6243
+ 6244
+ 6245
+ 6246
+ 6247
+ 6248
+ 6249
+ 6250
+ 6251
+ 6252
+ 6253
+ 6254
+ 6255
+ 6256
+ 6257
+ 6258
+ 6259
+ 6260
+ 6261
+ 6262
+ 6263
+ 6264
+ 6265
+ 6266
+ 6267
+ 6268
+ 6269
+ 6270
+ 6271
+ 6272
+ 6273
+ 6274
+ 6275
+ 6276
+ 6277
+ 6278
+ 6279
+ 6280
+ 6281
+ 6282
+ 6283
+ 6284
+ 6285
+ 6286
+ 6287
+ 6288
+ 6289
+ 6290
+ 6291
+ 6292
+ 6293
+ 6294
+ 6295
+ 6296
+ 6297
+ 6298
+ 6299
+ 6300
+ 6301
+ 6302
+ 6303
+ 6304
+ 6305
+ 6306
+ 6307
+ 6308
+ 6309
+ 6310
+ 6311
+ 6312
+ 6313
+ 6314
+ 6315
+ 6316
+ 6317
+ 6318
+ 6319
+ 6320
+ 6321
+ 6322
+ 6323
+ 6324
+ 6325
+ 6326
+ 6327
+ 6328
+ 6329
+ 6330
+ 6331
+ 6332
+ 6333
+ 6334
+ 6335
+ 6336
+ 6337
+ 6338
+ 6339
+ 6340
+ 6341
+ 6342
+ 6343
+ 6344
+ 6345
+ 6346
+ 6347
+ 6348
+ 6349
+ 6350
+ 6351
+ 6352
+ 6353
+ 6354
+ 6355
+ 6356
+ 6357
+ 6358
+ 6359
+ 6360
+ 6361
+ 6362
+ 6363
+ 6364
+ 6365
+ 6366
+ 6367
+ 6368
+ 6369
+ 6370
+ 6371
+ 6372
+ 6373
+ 6374
+ 6375
+ 6376
+ 6377
+ 6378
+ 6379
+ 6380
+ 6381
+ 6382
+ 6383
+ 6384
+ 6385
+ 6386
+ 6387
+ 6388
+ 6389
+ 6390
+ 6391
+ 6392
+ 6393
+ 6394
+ 6395
+ 6396
+ 6397
+ 6398
+ 6399
+ 6400
+ 6401
+ 6402
+ 6403
+ 6404
+ 6405
+ 6406
+ 6407
+ 6408
+ 6409
+ 6410
+ 6411
+ 6412
+ 6413
+ 6414
+ 6415
+ 6416
+ 6417
+ 6418
+ 6419
+ 6420
+ 6421
+ 6422
+ 6423
+ 6424
+ 6425
+ 6426
+ 6427
+ 6428
+ 6429
+ 6430
+ 6431
+ 6432
+ 6433
+ 6434
+ 6435
+ 6436
+ 6437
+ 6438
+ 6439
+ 6440
+ 6441
+ 6442
+ 6443
+ 6444
+ 6445
+ 6446
+ 6447
+ 6448
+ 6449
+ 6450
+ 6451
+ 6452
+ 6453
+ 6454
+ 6455
+ 6456
+ 6457
+ 6458
+ 6459
+ 6460
+ 6461
+ 6462
+ 6463
+ 6464
+ 6465
+ 6466
+ 6467
+ 6468
+ 6469
+ 6470
+ 6471
+ 6472
+ 6473
+ 6474
+ 6475
+ 6476
+ 6477
+ 6478
+ 6479
+ 6480
+ 6481
+ 6482
+ 6483
+ 6484
+ 6485
+ 6486
+ 6487
+ 6488
+ 6489
+ 6490
+ 6491
+ 6492
+ 6493
+ 6494
+ 6495
+ 6496
+ 6497
+ 6498
+ 6499
+ 6500
+ 6501
+ 6502
+ 6503
+ 6504
+ 6505
+ 6506
+ 6507
+ 6508
+ 6509
+ 6510
+ 6511
+ 6512
+ 6513
+ 6514
+ 6515
+ 6516
+ 6517
+ 6518
+ 6519
+ 6520
+ 6521
+ 6522
+ 6523
+ 6524
+ 6525
+ 6526
+ 6527
+ 6528
+ 6529
+ 6530
+ 6531
+ 6532
+ 6533
+ 6534
+ 6535
+ 6536
+ 6537
+ 6538
+ 6539
+ 6540
+ 6541
+ 6542
+ 6543
+ 6544
+ 6545
+ 6546
+ 6547
+ 6548
+ 6549
+ 6550
+ 6551
+ 6552
+ 6553
+ 6554
+ 6555
+ 6556
+ 6557
+ 6558
+ 6559
+ 6560
+ 6561
+ 6562
+ 6563
+ 6564
+ 6565
+ 6566
+ 6567
+ 6568
+ 6569
+ 6570
+ 6571
+ 6572
+ 6573
+ 6574
+ 6575
+ 6576
+ 6577
+ 6578
+ 6579
+ 6580
+ 6581
+ 6582
+ 6583
+ 6584
+ 6585
+ 6586
+ 6587
+ 6588
+ 6589
+ 6590
+ 6591
+ 6592
+ 6593
+ 6594
+ 6595
+ 6596
+ 6597
+ 6598
+ 6599
+ 6600
+ 6601
+ 6602
+ 6603
+ 6604
+ 6605
+ 6606
+ 6607
+ 6608
+ 6609
+ 6610
+ 6611
+ 6612
+ 6613
+ 6614
+ 6615
+ 6616
+ 6617
+ 6618
+ 6619
+ 6620
+ 6621
+ 6622
+ 6623
+ 6624
+ 6625
+ 6626
+ 6627
+ 6628
+ 6629
+ 6630
+ 6631
+ 6632
+ 6633
+ 6634
+ 6635
+ 6636
+ 6637
+ 6638
+ 6639
+ 6640
+ 6641
+ 6642
+ 6643
+ 6644
+ 6645
+ 6646
+ 6647
+ 6648
+ 6649
+ 6650
+ 6651
+ 6652
+ 6653
+ 6654
+ 6655
+ 6656
+ 6657
+ 6658
+ 6659
+ 6660
+ 6661
+ 6662
+ 6663
+ 6664
+ 6665
+ 6666
+ 6667
+ 6668
+ 6669
+ 6670
+ 6671
+ 6672
+ 6673
+ 6674
+ 6675
+ 6676
+ 6677
+ 6678
+ 6679
+ 6680
+ 6681
+ 6682
+ 6683
+ 6684
+ 6685
+ 6686
+ 6687
+ 6688
+ 6689
+ 6690
+ 6691
+ 6692
+ 6693
+ 6694
+ 6695
+ 6696
+ 6697
+ 6698
+ 6699
+ 6700
+ 6701
+ 6702
+ 6703
+ 6704
+ 6705
+ 6706
+ 6707
+ 6708
+ 6709
+ 6710
+ 6711
+ 6712
+ 6713
+ 6714
+ 6715
+ 6716
+ 6717
+ 6718
+ 6719
+ 6720
+ 6721
+ 6722
+ 6723
+ 6724
+ 6725
+ 6726
+ 6727
+ 6728
+ 6729
+ 6730
+ 6731
+ 6732
+ 6733
+ 6734
+ 6735
+ 6736
+ 6737
+ 6738
+ 6739
+ 6740
+ 6741
+ 6742
+ 6743
+ 6744
+ 6745
+ 6746
+ 6747
+ 6748
+ 6749
+ 6750
+ 6751
+ 6752
+ 6753
+ 6754
+ 6755
+ 6756
+ 6757
+ 6758
+ 6759
+ 6760
+ 6761
+ 6762
+ 6763
+ 6764
+ 6765
+ 6766
+ 6767
+ 6768
+ 6769
+ 6770
+ 6771
+ 6772
+ 6773
+ 6774
+ 6775
+ 6776
+ 6777
+ 6778
+ 6779
+ 6780
+ 6781
+ 6782
+ 6783
+ 6784
+ 6785
+ 6786
+ 6787
+ 6788
+ 6789
+ 6790
+ 6791
+ 6792
+ 6793
+ 6794
+ 6795
+ 6796
+ 6797
+ 6798
+ 6799
+ 6800
+ 6801
+ 6802
+ 6803
+ 6804
+ 6805
+ 6806
+ 6807
+ 6808
+ 6809
+ 6810
+ 6811
+ 6812
+ 6813
+ 6814
+ 6815
+ 6816
+ 6817
+ 6818
+ 6819
+ 6820
+ 6821
+ 6822
+ 6823
+ 6824
+ 6825
+ 6826
+ 6827
+ 6828
+ 6829
+ 6830
+ 6831
+ 6832
+ 6833
+ 6834
+ 6835
+ 6836
+ 6837
+ 6838
+ 6839
+ 6840
+ 6841
+ 6842
+ 6843
+ 6844
+ 6845
+ 6846
+ 6847
+ 6848
+ 6849
+ 6850
+ 6851
+ 6852
+ 6853
+ 6854
+ 6855
+ 6856
+ 6857
+ 6858
+ 6859
+ 6860
+ 6861
+ 6862
+ 6863
+ 6864
+ 6865
+ 6866
+ 6867
+ 6868
+ 6869
+ 6870
+ 6871
+ 6872
+ 6873
+ 6874
+ 6875
+ 6876
+ 6877
+ 6878
+ 6879
+ 6880
+ 6881
+ 6882
+ 6883
+ 6884
+ 6885
+ 6886
+ 6887
+ 6888
+ 6889
+ 6890
+ 6891
+ 6892
+ 6893
+ 6894
+ 6895
+ 6896
+ 6897
+ 6898
+ 6899
+ 6900
+ 6901
+ 6902
+ 6903
+ 6904
+ 6905
+ 6906
+ 6907
+ 6908
+ 6909
+ 6910
+ 6911
+ 6912
+ 6913
+ 6914
+ 6915
+ 6916
+ 6917
+ 6918
+ 6919
+ 6920
+ 6921
+ 6922
+ 6923
+ 6924
+ 6925
+ 6926
+ 6927
+ 6928
+ 6929
+ 6930
+ 6931
+ 6932
+ 6933
+ 6934
+ 6935
+ 6936
+ 6937
+ 6938
+ 6939
+ 6940
+ 6941
+ 6942
+ 6943
+ 6944
+ 6945
+ 6946
+ 6947
+ 6948
+ 6949
+ 6950
+ 6951
+ 6952
+ 6953
+ 6954
+ 6955
+ 6956
+ 6957
+ 6958
+ 6959
+ 6960
+ 6961
+ 6962
+ 6963
+ 6964
+ 6965
+ 6966
+ 6967
+ 6968
+ 6969
+ 6970
+ 6971
+ 6972
+ 6973
+ 6974
+ 6975
+ 6976
+ 6977
+ 6978
+ 6979
+ 6980
+ 6981
+ 6982
+ 6983
+ 6984
+ 6985
+ 6986
+ 6987
+ 6988
+ 6989
+ 6990
+ 6991
+ 6992
+ 6993
+ 6994
+ 6995
+ 6996
+ 6997
+ 6998
+ 6999
+ 7000
+ 7001
+ 7002
+ 7003
+ 7004
+ 7005
+ 7006
+ 7007
+ 7008
+ 7009
+ 7010
+ 7011
+ 7012
+ 7013
+ 7014
+ 7015
+ 7016
+ 7017
+ 7018
+ 7019
+ 7020
+ 7021
+ 7022
+ 7023
+ 7024
+ 7025
+ 7026
+ 7027
+ 7028
+ 7029
+ 7030
+ 7031
+ 7032
+ 7033
+ 7034
+ 7035
+ 7036
+ 7037
+ 7038
+ 7039
+ 7040
+ 7041
+ 7042
+ 7043
+ 7044
+ 7045
+ 7046
+ 7047
+ 7048
+ 7049
+ 7050
+ 7051
+ 7052
+ 7053
+ 7054
+ 7055
+ 7056
+ 7057
+ 7058
+ 7059
+ 7060
+ 7061
+ 7062
+ 7063
+ 7064
+ 7065
+ 7066
+ 7067
+ 7068
+ 7069
+ 7070
+ 7071
+ 7072
+ 7073
+ 7074
+ 7075
+ 7076
+ 7077
+ 7078
+ 7079
+ 7080
+ 7081
+ 7082
+ 7083
+ 7084
+ 7085
+ 7086
+ 7087
+ 7088
+ 7089
+ 7090
+ 7091
+ 7092
+ 7093
+ 7094
+ 7095
+ 7096
+ 7097
+ 7098
+ 7099
+ 7100
+ 7101
+ 7102
+ 7103
+ 7104
+ 7105
+ 7106
+ 7107
+ 7108
+ 7109
+ 7110
+ 7111
+ 7112
+ 7113
+ 7114
+ 7115
+ 7116
+ 7117
+ 7118
+ 7119
+ 7120
+ 7121
+ 7122
+ 7123
+ 7124
+ 7125
+ 7126
+ 7127
+ 7128
+ 7129
+ 7130
+ 7131
+ 7132
+ 7133
+ 7134
+ 7135
+ 7136
+ 7137
+ 7138
+ 7139
+ 7140
+ 7141
+ 7142
+ 7143
+ 7144
+ 7145
+ 7146
+ 7147
+ 7148
+ 7149
+ 7150
+ 7151
+ 7152
+ 7153
+ 7154
+ 7155
+ 7156
+ 7157
+ 7158
+ 7159
+ 7160
+ 7161
+ 7162
+ 7163
+ 7164
+ 7165
+ 7166
+ 7167
+ 7168
+ 7169
+ 7170
+ 7171
+ 7172
+ 7173
+ 7174
+ 7175
+ 7176
+ 7177
+ 7178
+ 7179
+ 7180
+ 7181
+ 7182
+ 7183
+ 7184
+ 7185
+ 7186
+ 7187
+ 7188
+ 7189
+ 7190
+ 7191
+ 7192
+ 7193
+ 7194
+ 7195
+ 7196
+ 7197
+ 7198
+ 7199
+ 7200
+ 7201
+ 7202
+ 7203
+ 7204
+ 7205
+ 7206
+ 7207
+ 7208
+ 7209
+ 7210
+ 7211
+ 7212
+ 7213
+ 7214
+ 7215
+ 7216
+ 7217
+ 7218
+ 7219
+ 7220
+ 7221
+ 7222
+ 7223
+ 7224
+ 7225
+ 7226
+ 7227
+ 7228
+ 7229
+ 7230
+ 7231
+ 7232
+ 7233
+ 7234
+ 7235
+ 7236
+ 7237
+ 7238
+ 7239
+ 7240
+ 7241
+ 7242
+ 7243
+ 7244
+ 7245
+ 7246
+ 7247
+ 7248
+ 7249
+ 7250
+ 7251
+ 7252
+ 7253
+ 7254
+ 7255
+ 7256
+ 7257
+ 7258
+ 7259
+ 7260
+ 7261
+ 7262
+ 7263
+ 7264
+ 7265
+ 7266
+ 7267
+ 7268
+ 7269
+ 7270
+ 7271
+ 7272
+ 7273
+ 7274
+ 7275
+ 7276
+ 7277
+ 7278
+ 7279
+ 7280
+ 7281
+ 7282
+ 7283
+ 7284
+ 7285
+ 7286
+ 7287
+ 7288
+ 7289
+ 7290
+ 7291
+ 7292
+ 7293
+ 7294
+ 7295
+ 7296
+ 7297
+ 7298
+ 7299
+ 7300
+ 7301
+ 7302
+ 7303
+ 7304
+ 7305
+ 7306
+ 7307
+ 7308
+ 7309
+ 7310
+ 7311
+ 7312
+ 7313
+ 7314
+ 7315
+ 7316
+ 7317
+ 7318
+ 7319
+ 7320
+ 7321
+ 7322
+ 7323
+ 7324
+ 7325
+ 7326
+ 7327
+ 7328
+ 7329
+ 7330
+ 7331
+ 7332
+ 7333
+ 7334
+ 7335
+ 7336
+ 7337
+ 7338
+ 7339
+ 7340
+ 7341
+ 7342
+ 7343
+ 7344
+ 7345
+ 7346
+ 7347
+ 7348
+ 7349
+ 7350
+ 7351
+ 7352
+ 7353
+ 7354
+ 7355
+ 7356
+ 7357
+ 7358
+ 7359
+ 7360
+ 7361
+ 7362
+ 7363
+ 7364
+ 7365
+ 7366
+ 7367
+ 7368
+ 7369
+ 7370
+ 7371
+ 7372
+ 7373
+ 7374
+ 7375
+ 7376
+ 7377
+ 7378
+ 7379
+ 7380
+ 7381
+ 7382
+ 7383
+ 7384
+ 7385
+ 7386
+ 7387
+ 7388
+ 7389
+ 7390
+ 7391
+ 7392
+ 7393
+ 7394
+ 7395
+ 7396
+ 7397
+ 7398
+ 7399
+ 7400
+ 7401
+ 7402
+ 7403
+ 7404
+ 7405
+ 7406
+ 7407
+ 7408
+ 7409
+ 7410
+ 7411
+ 7412
+ 7413
+ 7414
+ 7415
+ 7416
+ 7417
+ 7418
+ 7419
+ 7420
+ 7421
+ 7422
+ 7423
+ 7424
+ 7425
+ 7426
+ 7427
+ 7428
+ 7429
+ 7430
+ 7431
+ 7432
+ 7433
+ 7434
+ 7435
+ 7436
+ 7437
+ 7438
+ 7439
+ 7440
+ 7441
+ 7442
+ 7443
+ 7444
+ 7445
+ 7446
+ 7447
+ 7448
+ 7449
+ 7450
+ 7451
+ 7452
+ 7453
+ 7454
+ 7455
+ 7456
+ 7457
+ 7458
+ 7459
+ 7460
+ 7461
+ 7462
+ 7463
+ 7464
+ 7465
+ 7466
+ 7467
+ 7468
+ 7469
+ 7470
+ 7471
+ 7472
+ 7473
+ 7474
+ 7475
+ 7476
+ 7477
+ 7478
+ 7479
+ 7480
+ 7481
+ 7482
+ 7483
+ 7484
+ 7485
+ 7486
+ 7487
+ 7488
+ 7489
+ 7490
+ 7491
+ 7492
+ 7493
+ 7494
+ 7495
+ 7496
+ 7497
+ 7498
+ 7499
+ 7500
+ 7501
+ 7502
+ 7503
+ 7504
+ 7505
+ 7506
+ 7507
+ 7508
+ 7509
+ 7510
+ 7511
+ 7512
+ 7513
+ 7514
+ 7515
+ 7516
+ 7517
+ 7518
+ 7519
+ 7520
+ 7521
+ 7522
+ 7523
+ 7524
+ 7525
+ 7526
+ 7527
+ 7528
+ 7529
+ 7530
+ 7531
+ 7532
+ 7533
+ 7534
+ 7535
+ 7536
+ 7537
+ 7538
+ 7539
+ 7540
+ 7541
+ 7542
+ 7543
+ 7544
+ 7545
+ 7546
+ 7547
+ 7548
+ 7549
+ 7550
+ 7551
+ 7552
+ 7553
+ 7554
+ 7555
+ 7556
+ 7557
+ 7558
+ 7559
+ 7560
+ 7561
+ 7562
+ 7563
+ 7564
+ 7565
+ 7566
+ 7567
+ 7568
+ 7569
+ 7570
+ 7571
+ 7572
+ 7573
+ 7574
+ 7575
+ 7576
+ 7577
+ 7578
+ 7579
+ 7580
+ 7581
+ 7582
+ 7583
+ 7584
+ 7585
+ 7586
+ 7587
+ 7588
+ 7589
+ 7590
+ 7591
+ 7592
+ 7593
+ 7594
+ 7595
+ 7596
+ 7597
+ 7598
+ 7599
+ 7600
+ 7601
+ 7602
+ 7603
+ 7604
+ 7605
+ 7606
+ 7607
+ 7608
+ 7609
+ 7610
+ 7611
+ 7612
+ 7613
+ 7614
+ 7615
+ 7616
+ 7617
+ 7618
+ 7619
+ 7620
+ 7621
+ 7622
+ 7623
+ 7624
+ 7625
+ 7626
+ 7627
+ 7628
+ 7629
+ 7630
+ 7631
+ 7632
+ 7633
+ 7634
+ 7635
+ 7636
+ 7637
+ 7638
+ 7639
+ 7640
+ 7641
+ 7642
+ 7643
+ 7644
+ 7645
+ 7646
+ 7647
+ 7648
+ 7649
+ 7650
+ 7651
+ 7652
+ 7653
+ 7654
+ 7655
+ 7656
+ 7657
+ 7658
+ 7659
+ 7660
+ 7661
+ 7662
+ 7663
+ 7664
+ 7665
+ 7666
+ 7667
+ 7668
+ 7669
+ 7670
+ 7671
+ 7672
+ 7673
+ 7674
+ 7675
+ 7676
+ 7677
+ 7678
+ 7679
+ 7680
+ 7681
+ 7682
+ 7683
+ 7684
+ 7685
+ 7686
+ 7687
+ 7688
+ 7689
+ 7690
+ 7691
+ 7692
+ 7693
+ 7694
+ 7695
+ 7696
+ 7697
+ 7698
+ 7699
+ 7700
+ 7701
+ 7702
+ 7703
+ 7704
+ 7705
+ 7706
+ 7707
+ 7708
+ 7709
+ 7710
+ 7711
+ 7712
+ 7713
+ 7714
+ 7715
+ 7716
+ 7717
+ 7718
+ 7719
+ 7720
+ 7721
+ 7722
+ 7723
+ 7724
+ 7725
+ 7726
+ 7727
+ 7728
+ 7729
+ 7730
+ 7731
+ 7732
+ 7733
+ 7734
+ 7735
+ 7736
+ 7737
+ 7738
+ 7739
+ 7740
+ 7741
+ 7742
+ 7743
+ 7744
+ 7745
+ 7746
+ 7747
+ 7748
+ 7749
+ 7750
+ 7751
+ 7752
+ 7753
+ 7754
+ 7755
+ 7756
+ 7757
+ 7758
+ 7759
+ 7760
+ 7761
+ 7762
+ 7763
+ 7764
+ 7765
+ 7766
+ 7767
+ 7768
+ 7769
+ 7770
+ 7771
+ 7772
+ 7773
+ 7774
+ 7775
+ 7776
+ 7777
+ 7778
+ 7779
+ 7780
+ 7781
+ 7782
+ 7783
+ 7784
+ 7785
+ 7786
+ 7787
+ 7788
+ 7789
+ 7790
+ 7791
+ 7792
+ 7793
+ 7794
+ 7795
+ 7796
+ 7797
+ 7798
+ 7799
+ 7800
+ 7801
+ 7802
+ 7803
+ 7804
+ 7805
+ 7806
+ 7807
+ 7808
+ 7809
+ 7810
+ 7811
+ 7812
+ 7813
+ 7814
+ 7815
+ 7816
+ 7817
+ 7818
+ 7819
+ 7820
+ 7821
+ 7822
+ 7823
+ 7824
+ 7825
+ 7826
+ 7827
+ 7828
+ 7829
+ 7830
+ 7831
+ 7832
+ 7833
+ 7834
+ 7835
+ 7836
+ 7837
+ 7838
+ 7839
+ 7840
+ 7841
+ 7842
+ 7843
+ 7844
+ 7845
+ 7846
+ 7847
+ 7848
+ 7849
+ 7850
+ 7851
+ 7852
+ 7853
+ 7854
+ 7855
+ 7856
+ 7857
+ 7858
+ 7859
+ 7860
+ 7861
+ 7862
+ 7863
+ 7864
+ 7865
+ 7866
+ 7867
+ 7868
+ 7869
+ 7870
+ 7871
+ 7872
+ 7873
+ 7874
+ 7875
+ 7876
+ 7877
+ 7878
+ 7879
+ 7880
+ 7881
+ 7882
+ 7883
+ 7884
+ 7885
+ 7886
+ 7887
+ 7888
+ 7889
+ 7890
+ 7891
+ 7892
+ 7893
+ 7894
+ 7895
+ 7896
+ 7897
+ 7898
+ 7899
+ 7900
+ 7901
+ 7902
+ 7903
+ 7904
+ 7905
+ 7906
+ 7907
+ 7908
+ 7909
+ 7910
+ 7911
+ 7912
+ 7913
+ 7914
+ 7915
+ 7916
+ 7917
+ 7918
+ 7919
+ 7920
+ 7921
+ 7922
+ 7923
+ 7924
+ 7925
+ 7926
+ 7927
+ 7928
+ 7929
+ 7930
+ 7931
+ 7932
+ 7933
+ 7934
+ 7935
+ 7936
+ 7937
+ 7938
+ 7939
+ 7940
+ 7941
+ 7942
+ 7943
+ 7944
+ 7945
+ 7946
+ 7947
+ 7948
+ 7949
+ 7950
+ 7951
+ 7952
+ 7953
+ 7954
+ 7955
+ 7956
+ 7957
+ 7958
+ 7959
+ 7960
+ 7961
+ 7962
+ 7963
+ 7964
+ 7965
+ 7966
+ 7967
+ 7968
+ 7969
+ 7970
+ 7971
+ 7972
+ 7973
+ 7974
+ 7975
+ 7976
+ 7977
+ 7978
+ 7979
+ 7980
+ 7981
+ 7982
+ 7983
+ 7984
+ 7985
+ 7986
+ 7987
+ 7988
+ 7989
+ 7990
+ 7991
+ 7992
+ 7993
+ 7994
+ 7995
+ 7996
+ 7997
+ 7998
+ 7999
+ 8000
+ 8001
+ 8002
+ 8003
+ 8004
+ 8005
+ 8006
+ 8007
+ 8008
+ 8009
+ 8010
+ 8011
+ 8012
+ 8013
+ 8014
+ 8015
+ 8016
+ 8017
+ 8018
+ 8019
+ 8020
+ 8021
+ 8022
+ 8023
+ 8024
+ 8025
+ 8026
+ 8027
+ 8028
+ 8029
+ 8030
+ 8031
+ 8032
+ 8033
+ 8034
+ 8035
+ 8036
+ 8037
+ 8038
+ 8039
+ 8040
+ 8041
+ 8042
+ 8043
+ 8044
+ 8045
+ 8046
+ 8047
+ 8048
+ 8049
+ 8050
+ 8051
+ 8052
+ 8053
+ 8054
+ 8055
+ 8056
+ 8057
+ 8058
+ 8059
+ 8060
+ 8061
+ 8062
+ 8063
+ 8064
+ 8065
+ 8066
+ 8067
+ 8068
+ 8069
+ 8070
+ 8071
+ 8072
+ 8073
+ 8074
+ 8075
+ 8076
+ 8077
+ 8078
+ 8079
+ 8080
+ 8081
+ 8082
+ 8083
+ 8084
+ 8085
+ 8086
+ 8087
+ 8088
+ 8089
+ 8090
+ 8091
+ 8092
+ 8093
+ 8094
+ 8095
+ 8096
+ 8097
+ 8098
+ 8099
+ 8100
+ 8101
+ 8102
+ 8103
+ 8104
+ 8105
+ 8106
+ 8107
+ 8108
+ 8109
+ 8110
+ 8111
+ 8112
+ 8113
+ 8114
+ 8115
+ 8116
+ 8117
+ 8118
+ 8119
+ 8120
+ 8121
+ 8122
+ 8123
+ 8124
+ 8125
+ 8126
+ 8127
+ 8128
+ 8129
+ 8130
+ 8131
+ 8132
+ 8133
+ 8134
+ 8135
+ 8136
+ 8137
+ 8138
+ 8139
+ 8140
+ 8141
+ 8142
+ 8143
+ 8144
+ 8145
+ 8146
+ 8147
+ 8148
+ 8149
+ 8150
+ 8151
+ 8152
+ 8153
+ 8154
+ 8155
+ 8156
+ 8157
+ 8158
+ 8159
+ 8160
+ 8161
+ 8162
+ 8163
+ 8164
+ 8165
+ 8166
+ 8167
+ 8168
+ 8169
+ 8170
+ 8171
+ 8172
+ 8173
+ 8174
+ 8175
+ 8176
+ 8177
+ 8178
+ 8179
+ 8180
+ 8181
+ 8182
+ 8183
+ 8184
+ 8185
+ 8186
+ 8187
+ 8188
+ 8189
+ 8190
+ 8191
+ 8192
+ 8193
+ 8194
+ 8195
+ 8196
+ 8197
+ 8198
+ 8199
+ 8200
+ 8201
+ 8202
+ 8203
+ 8204
+ 8205
+ 8206
+ 8207
+ 8208
+ 8209
+ 8210
+ 8211
+ 8212
+ 8213
+ 8214
+ 8215
+ 8216
+ 8217
+ 8218
+ 8219
+ 8220
+ 8221
+ 8222
+ 8223
+ 8224
+ 8225
+ 8226
+ 8227
+ 8228
+ 8229
+ 8230
+ 8231
+ 8232
+ 8233
+ 8234
+ 8235
+ 8236
+ 8237
+ 8238
+ 8239
+ 8240
+ 8241
+ 8242
+ 8243
+ 8244
+ 8245
+ 8246
+ 8247
+ 8248
+ 8249
+ 8250
+ 8251
+ 8252
+ 8253
+ 8254
+ 8255
+ 8256
+ 8257
+ 8258
+ 8259
+ 8260
+ 8261
+ 8262
+ 8263
+ 8264
+ 8265
+ 8266
+ 8267
+ 8268
+ 8269
+ 8270
+ 8271
+ 8272
+ 8273
+ 8274
+ 8275
+ 8276
+ 8277
+ 8278
+ 8279
+ 8280
+ 8281
+ 8282
+ 8283
+ 8284
+ 8285
+ 8286
+ 8287
+ 8288
+ 8289
+ 8290
+ 8291
+ 8292
+ 8293
+ 8294
+ 8295
+ 8296
+ 8297
+ 8298
+ 8299
+ 8300
+ 8301
+ 8302
+ 8303
+ 8304
+ 8305
+ 8306
+ 8307
+ 8308
+ 8309
+ 8310
+ 8311
+ 8312
+ 8313
+ 8314
+ 8315
+ 8316
+ 8317
+ 8318
+ 8319
+ 8320
+ 8321
+ 8322
+ 8323
+ 8324
+ 8325
+ 8326
+ 8327
+ 8328
+ 8329
+ 8330
+ 8331
+ 8332
+ 8333
+ 8334
+ 8335
+ 8336
+ 8337
+ 8338
+ 8339
+ 8340
+ 8341
+ 8342
+ 8343
+ 8344
+ 8345
+ 8346
+ 8347
+ 8348
+ 8349
+ 8350
+ 8351
+ 8352
+ 8353
+ 8354
+ 8355
+ 8356
+ 8357
+ 8358
+ 8359
+ 8360
+ 8361
+ 8362
+ 8363
+ 8364
+ 8365
+ 8366
+ 8367
+ 8368
+ 8369
+ 8370
+ 8371
+ 8372
+ 8373
+ 8374
+ 8375
+ 8376
+ 8377
+ 8378
+ 8379
+ 8380
+ 8381
+ 8382
+ 8383
+ 8384
+ 8385
+ 8386
+ 8387
+ 8388
+ 8389
+ 8390
+ 8391
+ 8392
+ 8393
+ 8394
+ 8395
+ 8396
+ 8397
+ 8398
+ 8399
+ 8400
+ 8401
+ 8402
+ 8403
+ 8404
+ 8405
+ 8406
+ 8407
+ 8408
+ 8409
+ 8410
+ 8411
+ 8412
+ 8413
+ 8414
+ 8415
+ 8416
+ 8417
+ 8418
+ 8419
+ 8420
+ 8421
+ 8422
+ 8423
+ 8424
+ 8425
+ 8426
+ 8427
+ 8428
+ 8429
+ 8430
+ 8431
+ 8432
+ 8433
+ 8434
+ 8435
+ 8436
+ 8437
+ 8438
+ 8439
+ 8440
+ 8441
+ 8442
+ 8443
+ 8444
+ 8445
+ 8446
+ 8447
+ 8448
+ 8449
+ 8450
+ 8451
+ 8452
+ 8453
+ 8454
+ 8455
+ 8456
+ 8457
+ 8458
+ 8459
+ 8460
+ 8461
+ 8462
+ 8463
+ 8464
+ 8465
+ 8466
+ 8467
+ 8468
+ 8469
+ 8470
+ 8471
+ 8472
+ 8473
+ 8474
+ 8475
+ 8476
+ 8477
+ 8478
+ 8479
+ 8480
+ 8481
+ 8482
+ 8483
+ 8484
+ 8485
+ 8486
+ 8487
+ 8488
+ 8489
+ 8490
+ 8491
+ 8492
+ 8493
+ 8494
+ 8495
+ 8496
+ 8497
+ 8498
+ 8499
+ 8500
+ 8501
+ 8502
+ 8503
+ 8504
+ 8505
+ 8506
+ 8507
+ 8508
+ 8509
+ 8510
+ 8511
+ 8512
+ 8513
+ 8514
+ 8515
+ 8516
+ 8517
+ 8518
+ 8519
+ 8520
+ 8521
+ 8522
+ 8523
+ 8524
+ 8525
+ 8526
+ 8527
+ 8528
+ 8529
+ 8530
+ 8531
+ 8532
+ 8533
+ 8534
+ 8535
+ 8536
+ 8537
+ 8538
+ 8539
+ 8540
+ 8541
+ 8542
+ 8543
+ 8544
+ 8545
+ 8546
+ 8547
+ 8548
+ 8549
+ 8550
+ 8551
+ 8552
+ 8553
+ 8554
+ 8555
+ 8556
+ 8557
+ 8558
+ 8559
+ 8560
+ 8561
+ 8562
+ 8563
+ 8564
+ 8565
+ 8566
+ 8567
+ 8568
+ 8569
+ 8570
+ 8571
+ 8572
+ 8573
+ 8574
+ 8575
+ 8576
+ 8577
+ 8578
+ 8579
+ 8580
+ 8581
+ 8582
+ 8583
+ 8584
+ 8585
+ 8586
+ 8587
+ 8588
+ 8589
+ 8590
+ 8591
+ 8592
+ 8593
+ 8594
+ 8595
+ 8596
+ 8597
+ 8598
+ 8599
+ 8600
+ 8601
+ 8602
+ 8603
+ 8604
+ 8605
+ 8606
+ 8607
+ 8608
+ 8609
+ 8610
+ 8611
+ 8612
+ 8613
+ 8614
+ 8615
+ 8616
+ 8617
+ 8618
+ 8619
+ 8620
+ 8621
+ 8622
+ 8623
+ 8624
+ 8625
+ 8626
+ 8627
+ 8628
+ 8629
+ 8630
+ 8631
+ 8632
+ 8633
+ 8634
+ 8635
+ 8636
+ 8637
+ 8638
+ 8639
+ 8640
+ 8641
+ 8642
+ 8643
+ 8644
+ 8645
+ 8646
+ 8647
+ 8648
+ 8649
+ 8650
+ 8651
+ 8652
+ 8653
+ 8654
+ 8655
+ 8656
+ 8657
+ 8658
+ 8659
+ 8660
+ 8661
+ 8662
+ 8663
+ 8664
+ 8665
+ 8666
+ 8667
+ 8668
+ 8669
+ 8670
+ 8671
+ 8672
+ 8673
+ 8674
+ 8675
+ 8676
+ 8677
+ 8678
+ 8679
+ 8680
+ 8681
+ 8682
+ 8683
+ 8684
+ 8685
+ 8686
+ 8687
+ 8688
+ 8689
+ 8690
+ 8691
+ 8692
+ 8693
+ 8694
+ 8695
+ 8696
+ 8697
+ 8698
+ 8699
+ 8700
+ 8701
+ 8702
+ 8703
+ 8704
+ 8705
+ 8706
+ 8707
+ 8708
+ 8709
+ 8710
+ 8711
+ 8712
+ 8713
+ 8714
+ 8715
+ 8716
+ 8717
+ 8718
+ 8719
+ 8720
+ 8721
+ 8722
+ 8723
+ 8724
+ 8725
+ 8726
+ 8727
+ 8728
+ 8729
+ 8730
+ 8731
+ 8732
+ 8733
+ 8734
+ 8735
+ 8736
+ 8737
+ 8738
+ 8739
+ 8740
+ 8741
+ 8742
+ 8743
+ 8744
+ 8745
+ 8746
+ 8747
+ 8748
+ 8749
+ 8750
+ 8751
+ 8752
+ 8753
+ 8754
+ 8755
+ 8756
+ 8757
+ 8758
+ 8759
+ 8760
+ 8761
+ 8762
+ 8763
+ 8764
+ 8765
+ 8766
+ 8767
+ 8768
+ 8769
+ 8770
+ 8771
+ 8772
+ 8773
+ 8774
+ 8775
+ 8776
+ 8777
+ 8778
+ 8779
+ 8780
+ 8781
+ 8782
+ 8783
+ 8784
+ 8785
+ 8786
+ 8787
+ 8788
+ 8789
+ 8790
+ 8791
+ 8792
+ 8793
+ 8794
+ 8795
+ 8796
+ 8797
+ 8798
+ 8799
+ 8800
+ 8801
+ 8802
+ 8803
+ 8804
+ 8805
+ 8806
+ 8807
+ 8808
+ 8809
+ 8810
+ 8811
+ 8812
+ 8813
+ 8814
+ 8815
+ 8816
+ 8817
+ 8818
+ 8819
+ 8820
+ 8821
+ 8822
+ 8823
+ 8824
+ 8825
+ 8826
+ 8827
+ 8828
+ 8829
+ 8830
+ 8831
+ 8832
+ 8833
+ 8834
+ 8835
+ 8836
+ 8837
+ 8838
+ 8839
+ 8840
+ 8841
+ 8842
+ 8843
+ 8844
+ 8845
+ 8846
+ 8847
+ 8848
+ 8849
+ 8850
+ 8851
+ 8852
+ 8853
+ 8854
+ 8855
+ 8856
+ 8857
+ 8858
+ 8859
+ 8860
+ 8861
+ 8862
+ 8863
+ 8864
+ 8865
+ 8866
+ 8867
+ 8868
+ 8869
+ 8870
+ 8871
+ 8872
+ 8873
+ 8874
+ 8875
+ 8876
+ 8877
+ 8878
+ 8879
+ 8880
+ 8881
+ 8882
+ 8883
+ 8884
+ 8885
+ 8886
+ 8887
+ 8888
+ 8889
+ 8890
+ 8891
+ 8892
+ 8893
+ 8894
+ 8895
+ 8896
+ 8897
+ 8898
+ 8899
+ 8900
+ 8901
+ 8902
+ 8903
+ 8904
+ 8905
+ 8906
+ 8907
+ 8908
+ 8909
+ 8910
+ 8911
+ 8912
+ 8913
+ 8914
+ 8915
+ 8916
+ 8917
+ 8918
+ 8919
+ 8920
+ 8921
+ 8922
+ 8923
+ 8924
+ 8925
+ 8926
+ 8927
+ 8928
+ 8929
+ 8930
+ 8931
+ 8932
+ 8933
+ 8934
+ 8935
+ 8936
+ 8937
+ 8938
+ 8939
+ 8940
+ 8941
+ 8942
+ 8943
+ 8944
+ 8945
+ 8946
+ 8947
+ 8948
+ 8949
+ 8950
+ 8951
+ 8952
+ 8953
+ 8954
+ 8955
+ 8956
+ 8957
+ 8958
+ 8959
+ 8960
+ 8961
+ 8962
+ 8963
+ 8964
+ 8965
+ 8966
+ 8967
+ 8968
+ 8969
+ 8970
+ 8971
+ 8972
+ 8973
+ 8974
+ 8975
+ 8976
+ 8977
+ 8978
+ 8979
+ 8980
+ 8981
+ 8982
+ 8983
+ 8984
+ 8985
+ 8986
+ 8987
+ 8988
+ 8989
+ 8990
+ 8991
+ 8992
+ 8993
+ 8994
+ 8995
+ 8996
+ 8997
+ 8998
+ 8999
+ 9000
+ 9001
+ 9002
+ 9003
+ 9004
+ 9005
+ 9006
+ 9007
+ 9008
+ 9009
+ 9010
+ 9011
+ 9012
+ 9013
+ 9014
+ 9015
+ 9016
+ 9017
+ 9018
+ 9019
+ 9020
+ 9021
+ 9022
+ 9023
+ 9024
+ 9025
+ 9026
+ 9027
+ 9028
+ 9029
+ 9030
+ 9031
+ 9032
+ 9033
+ 9034
+ 9035
+ 9036
+ 9037
+ 9038
+ 9039
+ 9040
+ 9041
+ 9042
+ 9043
+ 9044
+ 9045
+ 9046
+ 9047
+ 9048
+ 9049
+ 9050
+ 9051
+ 9052
+ 9053
+ 9054
+ 9055
+ 9056
+ 9057
+ 9058
+ 9059
+ 9060
+ 9061
+ 9062
+ 9063
+ 9064
+ 9065
+ 9066
+ 9067
+ 9068
+ 9069
+ 9070
+ 9071
+ 9072
+ 9073
+ 9074
+ 9075
+ 9076
+ 9077
+ 9078
+ 9079
+ 9080
+ 9081
+ 9082
+ 9083
+ 9084
+ 9085
+ 9086
+ 9087
+ 9088
+ 9089
+ 9090
+ 9091
+ 9092
+ 9093
+ 9094
+ 9095
+ 9096
+ 9097
+ 9098
+ 9099
+ 9100
+ 9101
+ 9102
+ 9103
+ 9104
+ 9105
+ 9106
+ 9107
+ 9108
+ 9109
+ 9110
+ 9111
+ 9112
+ 9113
+ 9114
+ 9115
+ 9116
+ 9117
+ 9118
+ 9119
+ 9120
+ 9121
+ 9122
+ 9123
+ 9124
+ 9125
+ 9126
+ 9127
+ 9128
+ 9129
+ 9130
+ 9131
+ 9132
+ 9133
+ 9134
+ 9135
+ 9136
+ 9137
+ 9138
+ 9139
+ 9140
+ 9141
+ 9142
+ 9143
+ 9144
+ 9145
+ 9146
+ 9147
+ 9148
+ 9149
+ 9150
+ 9151
+ 9152
+ 9153
+ 9154
+ 9155
+ 9156
+ 9157
+ 9158
+ 9159
+ 9160
+ 9161
+ 9162
+ 9163
+ 9164
+ 9165
+ 9166
+ 9167
+ 9168
+ 9169
+ 9170
+ 9171
+ 9172
+ 9173
+ 9174
+ 9175
+ 9176
+ 9177
+ 9178
+ 9179
+ 9180
+ 9181
+ 9182
+ 9183
+ 9184
+ 9185
+ 9186
+ 9187
+ 9188
+ 9189
+ 9190
+ 9191
+ 9192
+ 9193
+ 9194
+ 9195
+ 9196
+ 9197
+ 9198
+ 9199
+ 9200
+ 9201
+ 9202
+ 9203
+ 9204
+ 9205
+ 9206
+ 9207
+ 9208
+ 9209
+ 9210
+ 9211
+ 9212
+ 9213
+ 9214
+ 9215
+ 9216
+ 9217
+ 9218
+ 9219
+ 9220
+ 9221
+ 9222
+ 9223
+ 9224
+ 9225
+ 9226
+ 9227
+ 9228
+ 9229
+ 9230
+ 9231
+ 9232
+ 9233
+ 9234
+ 9235
+ 9236
+ 9237
+ 9238
+ 9239
+ 9240
+ 9241
+ 9242
+ 9243
+ 9244
+ 9245
+ 9246
+ 9247
+ 9248
+ 9249
+ 9250
+ 9251
+ 9252
+ 9253
+ 9254
+ 9255
+ 9256
+ 9257
+ 9258
+ 9259
+ 9260
+ 9261
+ 9262
+ 9263
+ 9264
+ 9265
+ 9266
+ 9267
+ 9268
+ 9269
+ 9270
+ 9271
+ 9272
+ 9273
+ 9274
+ 9275
+ 9276
+ 9277
+ 9278
+ 9279
+ 9280
+ 9281
+ 9282
+ 9283
+ 9284
+ 9285
+ 9286
+ 9287
+ 9288
+ 9289
+ 9290
+ 9291
+ 9292
+ 9293
+ 9294
+ 9295
+ 9296
+ 9297
+ 9298
+ 9299
+ 9300
+ 9301
+ 9302
+ 9303
+ 9304
+ 9305
+ 9306
+ 9307
+ 9308
+ 9309
+ 9310
+ 9311
+ 9312
+ 9313
+ 9314
+ 9315
+ 9316
+ 9317
+ 9318
+ 9319
+ 9320
+ 9321
+ 9322
+ 9323
+ 9324
+ 9325
+ 9326
+ 9327
+ 9328
+ 9329
+ 9330
+ 9331
+ 9332
+ 9333
+ 9334
+ 9335
+ 9336
+ 9337
+ 9338
+ 9339
+ 9340
+ 9341
+ 9342
+ 9343
+ 9344
+ 9345
+ 9346
+ 9347
+ 9348
+ 9349
+ 9350
+ 9351
+ 9352
+ 9353
+ 9354
+ 9355
+ 9356
+ 9357
+ 9358
+ 9359
+ 9360
+ 9361
+ 9362
+ 9363
+ 9364
+ 9365
+ 9366
+ 9367
+ 9368
+ 9369
+ 9370
+ 9371
+ 9372
+ 9373
+ 9374
+ 9375
+ 9376
+ 9377
+ 9378
+ 9379
+ 9380
+ 9381
+ 9382
+ 9383
+ 9384
+ 9385
+ 9386
+ 9387
+ 9388
+ 9389
+ 9390
+ 9391
+ 9392
+ 9393
+ 9394
+ 9395
+ 9396
+ 9397
+ 9398
+ 9399
+ 9400
+ 9401
+ 9402
+ 9403
+ 9404
+ 9405
+ 9406
+ 9407
+ 9408
+ 9409
+ 9410
+ 9411
+ 9412
+ 9413
+ 9414
+ 9415
+ 9416
+ 9417
+ 9418
+ 9419
+ 9420
+ 9421
+ 9422
+ 9423
+ 9424
+ 9425
+ 9426
+ 9427
+ 9428
+ 9429
+ 9430
+ 9431
+ 9432
+ 9433
+ 9434
+ 9435
+ 9436
+ 9437
+ 9438
+ 9439
+ 9440
+ 9441
+ 9442
+ 9443
+ 9444
+ 9445
+ 9446
+ 9447
+ 9448
+ 9449
+ 9450
+ 9451
+ 9452
+ 9453
+ 9454
+ 9455
+ 9456
+ 9457
+ 9458
+ 9459
+ 9460
+ 9461
+ 9462
+ 9463
+ 9464
+ 9465
+ 9466
+ 9467
+ 9468
+ 9469
+ 9470
+ 9471
+ 9472
+ 9473
+ 9474
+ 9475
+ 9476
+ 9477
+ 9478
+ 9479
+ 9480
+ 9481
+ 9482
+ 9483
+ 9484
+ 9485
+ 9486
+ 9487
+ 9488
+ 9489
+ 9490
+ 9491
+ 9492
+ 9493
+ 9494
+ 9495
+ 9496
+ 9497
+ 9498
+ 9499
+ 9500
+ 9501
+ 9502
+ 9503
+ 9504
+ 9505
+ 9506
+ 9507
+ 9508
+ 9509
+ 9510
+ 9511
+ 9512
+ 9513
+ 9514
+ 9515
+ 9516
+ 9517
+ 9518
+ 9519
+ 9520
+ 9521
+ 9522
+ 9523
+ 9524
+ 9525
+ 9526
+ 9527
+ 9528
+ 9529
+ 9530
+ 9531
+ 9532
+ 9533
+ 9534
+ 9535
+ 9536
+ 9537
+ 9538
+ 9539
+ 9540
+ 9541
+ 9542
+ 9543
+ 9544
+ 9545
+ 9546
+ 9547
+ 9548
+ 9549
+ 9550
+ 9551
+ 9552
+ 9553
+ 9554
+ 9555
+ 9556
+ 9557
+ 9558
+ 9559
+ 9560
+ 9561
+ 9562
+ 9563
+ 9564
+ 9565
+ 9566
+ 9567
+ 9568
+ 9569
+ 9570
+ 9571
+ 9572
+ 9573
+ 9574
+ 9575
+ 9576
+ 9577
+ 9578
+ 9579
+ 9580
+ 9581
+ 9582
+ 9583
+ 9584
+ 9585
+ 9586
+ 9587
+ 9588
+ 9589
+ 9590
+ 9591
+ 9592
+ 9593
+ 9594
+ 9595
+ 9596
+ 9597
+ 9598
+ 9599
+ 9600
+ 9601
+ 9602
+ 9603
+ 9604
+ 9605
+ 9606
+ 9607
+ 9608
+ 9609
+ 9610
+ 9611
+ 9612
+ 9613
+ 9614
+ 9615
+ 9616
+ 9617
+ 9618
+ 9619
+ 9620
+ 9621
+ 9622
+ 9623
+ 9624
+ 9625
+ 9626
+ 9627
+ 9628
+ 9629
+ 9630
+ 9631
+ 9632
+ 9633
+ 9634
+ 9635
+ 9636
+ 9637
+ 9638
+ 9639
+ 9640
+ 9641
+ 9642
+ 9643
+ 9644
+ 9645
+ 9646
+ 9647
+ 9648
+ 9649
+ 9650
+ 9651
+ 9652
+ 9653
+ 9654
+ 9655
+ 9656
+ 9657
+ 9658
+ 9659
+ 9660
+ 9661
+ 9662
+ 9663
+ 9664
+ 9665
+ 9666
+ 9667
+ 9668
+ 9669
+ 9670
+ 9671
+ 9672
+ 9673
+ 9674
+ 9675
+ 9676
+ 9677
+ 9678
+ 9679
+ 9680
+ 9681
+ 9682
+ 9683
+ 9684
+ 9685
+ 9686
+ 9687
+ 9688
+ 9689
+ 9690
+ 9691
+ 9692
+ 9693
+ 9694
+ 9695
+ 9696
+ 9697
+ 9698
+ 9699
+ 9700
+ 9701
+ 9702
+ 9703
+ 9704
+ 9705
+ 9706
+ 9707
+ 9708
+ 9709
+ 9710
+ 9711
+ 9712
+ 9713
+ 9714
+ 9715
+ 9716
+ 9717
+ 9718
+ 9719
+ 9720
+ 9721
+ 9722
+ 9723
+ 9724
+ 9725
+ 9726
+ 9727
+ 9728
+ 9729
+ 9730
+ 9731
+ 9732
+ 9733
+ 9734
+ 9735
+ 9736
+ 9737
+ 9738
+ 9739
+ 9740
+ 9741
+ 9742
+ 9743
+ 9744
+ 9745
+ 9746
+ 9747
+ 9748
+ 9749
+ 9750
+ 9751
+ 9752
+ 9753
+ 9754
+ 9755
+ 9756
+ 9757
+ 9758
+ 9759
+ 9760
+ 9761
+ 9762
+ 9763
+ 9764
+ 9765
+ 9766
+ 9767
+ 9768
+ 9769
+ 9770
+ 9771
+ 9772
+ 9773
+ 9774
+ 9775
+ 9776
+ 9777
+ 9778
+ 9779
+ 9780
+ 9781
+ 9782
+ 9783
+ 9784
+ 9785
+ 9786
+ 9787
+ 9788
+ 9789
+ 9790
+ 9791
+ 9792
+ 9793
+ 9794
+ 9795
+ 9796
+ 9797
+ 9798
+ 9799
+ 9800
+ 9801
+ 9802
+ 9803
+ 9804
+ 9805
+ 9806
+ 9807
+ 9808
+ 9809
+ 9810
+ 9811
+ 9812
+ 9813
+ 9814
+ 9815
+ 9816
+ 9817
+ 9818
+ 9819
+ 9820
+ 9821
+ 9822
+ 9823
+ 9824
+ 9825
+ 9826
+ 9827
+ 9828
+ 9829
+ 9830
+ 9831
+ 9832
+ 9833
+ 9834
+ 9835
+ 9836
+ 9837
+ 9838
+ 9839
+ 9840
+ 9841
+ 9842
+ 9843
+ 9844
+ 9845
+ 9846
+ 9847
+ 9848
+ 9849
+ 9850
+ 9851
+ 9852
+ 9853
+ 9854
+ 9855
+ 9856
+ 9857
+ 9858
+ 9859
+ 9860
+ 9861
+ 9862
+ 9863
+ 9864
+ 9865
+ 9866
+ 9867
+ 9868
+ 9869
+ 9870
+ 9871
+ 9872
+ 9873
+ 9874
+ 9875
+ 9876
+ 9877
+ 9878
+ 9879
+ 9880
+ 9881
+ 9882
+ 9883
+ 9884
+ 9885
+ 9886
+ 9887
+ 9888
+ 9889
+ 9890
+ 9891
+ 9892
+ 9893
+ 9894
+ 9895
+ 9896
+ 9897
+ 9898
+ 9899
+ 9900
+ 9901
+ 9902
+ 9903
+ 9904
+ 9905
+ 9906
+ 9907
+ 9908
+ 9909
+ 9910
+ 9911
+ 9912
+ 9913
+ 9914
+ 9915
+ 9916
+ 9917
+ 9918
+ 9919
+ 9920
+ 9921
+ 9922
+ 9923
+ 9924
+ 9925
+ 9926
+ 9927
+ 9928
+ 9929
+ 9930
+ 9931
+ 9932
+ 9933
+ 9934
+ 9935
+ 9936
+ 9937
+ 9938
+ 9939
+ 9940
+ 9941
+ 9942
+ 9943
+ 9944
+ 9945
+ 9946
+ 9947
+ 9948
+ 9949
+ 9950
+ 9951
+ 9952
+ 9953
+ 9954
+ 9955
+ 9956
+ 9957
+ 9958
+ 9959
+ 9960
+ 9961
+ 9962
+ 9963
+ 9964
+ 9965
+ 9966
+ 9967
+ 9968
+ 9969
+ 9970
+ 9971
+ 9972
+ 9973
+ 9974
+ 9975
+ 9976
+ 9977
+ 9978
+ 9979
+ 9980
+ 9981
+ 9982
+ 9983
+ 9984
+ 9985
+ 9986
+ 9987
+ 9988
+ 9989
+ 9990
+ 9991
+ 9992
+ 9993
+ 9994
+ 9995
+ 9996
+ 9997
+ 9998
+ 9999
+10000
+10001
+10002
+10003
+10004
+10005
+10006
+10007
+10008
+10009
+10010
+10011
+10012
+10013
+10014
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
+10032
+10033
+10034
+10035
+10036
+10037
+10038
+10039
+10040
+10041
+10042
+10043
+10044
+10045
+10046
+10047
+10048
+10049
+10050
+10051
+10052
+10053
+10054
+10055
+10056
+10057
+10058
+10059
+10060
+10061
+10062
+10063
+10064
+10065
+10066
+10067
+10068
+10069
+10070
+10071
+10072
+10073
+10074
+10075
+10076
+10077
+10078
+10079
+10080
+10081
+10082
+10083
+10084
+10085
+10086
+10087
+10088
+10089
+10090
+10091
+10092
+10093
+10094
+10095
+10096
+10097
+10098
+10099
+10100
+10101
+10102
+10103
+10104
+10105
+10106
+10107
+10108
+10109
+10110
+10111
+10112
+10113
+10114
+10115
+10116
+10117
+10118
+10119
+10120
+10121
+10122
+10123
+10124
+10125
+10126
+10127
+10128
+10129
+10130
+10131
+10132
+10133
+10134
+10135
+10136
+10137
+10138
+10139
+10140
+10141
+10142
+10143
+10144
+10145
+10146
+10147
+10148
+10149
+10150
+10151
+10152
+10153
+10154
+10155
+10156
+10157
+10158
+10159
+10160
+10161
+10162
+10163
+10164
+10165
+10166
+10167
+10168
+10169
+10170
+10171
+10172
+10173
+10174
+10175
+10176
+10177
+10178
+10179
+10180
+10181
+10182
+10183
+10184
+10185
+10186
+10187
+10188
+10189
+10190
+10191
+10192
+10193
+10194
+10195
+10196
+10197
+10198
+10199
+10200
+10201
+10202
+10203
+10204
+10205
+10206
+10207
+10208
+10209
+10210
+10211
+10212
+10213
+10214
+10215
+10216
+10217
+10218
+10219
+10220
+10221
+10222
+10223
+10224
+10225
+10226
+10227
+10228
+10229
+10230
+10231
+10232
+10233
+10234
+10235
+10236
+10237
+10238
+10239
+10240
+10241
+10242
+10243
+10244
+10245
+10246
+10247
+10248
+10249
+10250
+10251
+10252
+10253
+10254
+10255
+10256
+10257
+10258
+10259
+10260
+10261
+10262
+10263
+10264
+10265
+10266
+10267
+10268
+10269
+10270
+10271
+10272
+10273
+10274
+10275
+10276
+10277
+10278
+10279
+10280
+10281
+10282
+10283
+10284
+10285
+10286
+10287
+10288
+10289
+10290
+10291
+10292
+10293
+10294
+10295
+10296
+10297
+10298
+10299
+10300
+10301
+10302
+10303
+10304
+10305
+10306
+10307
+10308
+10309
+10310
+10311
+10312
+10313
+10314
+10315
+10316
+10317
+10318
+10319
+10320
+10321
+10322
+10323
+10324
+10325
+10326
+10327
+10328
+10329
+10330
+10331
+10332
+10333
+10334
+10335
+10336
+10337
+10338
+10339
+10340
+10341
+10342
+10343
+10344
+10345
+10346
+10347
+10348
+10349
+10350
+10351
+10352
+10353
+10354
+10355
+10356
+10357
+10358
+10359
+10360
+10361
+10362
+10363
+10364
+10365
+10366
+10367
+10368
+10369
+10370
+10371
+10372
+10373
+10374
+10375
+10376
+10377
+10378
+10379
+10380
+10381
+10382
+10383
+10384
+10385
+10386
+10387
+10388
+10389
+10390
+10391
+10392
+10393
+10394
+10395
+10396
+10397
+10398
+10399
+10400
+10401
+10402
+10403
+10404
+10405
+10406
+10407
+10408
+10409
+10410
+10411
+10412
+10413
+10414
+10415
+10416
+10417
+10418
+10419
+10420
+10421
+10422
+10423
+10424
+10425
+10426
+10427
+10428
+10429
+10430
+10431
+10432
+10433
+10434
+10435
+10436
+10437
+10438
+10439
+10440
+10441
+10442
+10443
+10444
+10445
+10446
+10447
+10448
+10449
+10450
+10451
+10452
+10453
+10454
+10455
+10456
+10457
+10458
+10459
+10460
+10461
+10462
+10463
+10464
+10465
+10466
+10467
+10468
+10469
+10470
+10471
+10472
+10473
+10474
+10475
+10476
+10477
+10478
+10479
+10480
+10481
+10482
+10483
+10484
+10485
+10486
+10487
+10488
+10489
+10490
+10491
+10492
+10493
+10494
+10495
+10496
+10497
+10498
+10499
+10500
+10501
+10502
+10503
+10504
+10505
+10506
+10507
+10508
+10509
+10510
+10511
+10512
+10513
+10514
+10515
+10516
+10517
+10518
+10519
+10520
+10521
+10522
+10523
+10524
+10525
+10526
+10527
+10528
+10529
+10530
+10531
+10532
+10533
+10534
+10535
+10536
+10537
+10538
+10539
+10540
+10541
+10542
+10543
+10544
+10545
+10546
+10547
+10548
+10549
+10550
+10551
+10552
+10553
+10554
+10555
+10556
+10557
+10558
+10559
+10560
+10561
+10562
+10563
+10564
+10565
+10566
+10567
+10568
+10569
+10570
+10571
+10572
+10573
+10574
+10575
+10576
+10577
+10578
+10579
+10580
+10581
+10582
+10583
+10584
+10585
+10586
+10587
+10588
+10589
+10590
+10591
+10592
+10593
+10594
+10595
+10596
+10597
+10598
+10599
+10600
+10601
+10602
+10603
+10604
+10605
+10606
+10607
+10608
+10609
+10610
+10611
+10612
+10613
+10614
+10615
+10616
+10617
+10618
+10619
+10620
+10621
+10622
+10623
+10624
+10625
+10626
+10627
+10628
+10629
+10630
+10631
+10632
+10633
+10634
+10635
+10636
+10637
+10638
+10639
+10640
+10641
+10642
+10643
+10644
+10645
+10646
+10647
+10648
+10649
+10650
+10651
+10652
+10653
+10654
+10655
+10656
+10657
+10658
+10659
+10660
+10661
+10662
+10663
+10664
+10665
+10666
+10667
+10668
+10669
+10670
+10671
+10672
+10673
+10674
+10675
+10676
+10677
+10678
+10679
+10680
+10681
+10682
+10683
+10684
+10685
+10686
+10687
+10688
+10689
+10690
+10691
+10692
+10693
+10694
+10695
+10696
+10697
+10698
+10699
+10700
+10701
+10702
+10703
+10704
+10705
+10706
+10707
+10708
+10709
+10710
+10711
+10712
+10713
+10714
+10715
+10716
+10717
+10718
+10719
+10720
+10721
+10722
+10723
+10724
+10725
+10726
+10727
+10728
+10729
+10730
+10731
+10732
+10733
+10734
+10735
+10736
+10737
+10738
+10739
+10740
+10741
+10742
+10743
+10744
+10745
+10746
+10747
+10748
+10749
+10750
+10751
+10752
+10753
+10754
+10755
+10756
+10757
+10758
+10759
+10760
+10761
+10762
+10763
+10764
+10765
+10766
+10767
+10768
+10769
+10770
+10771
+10772
+10773
+10774
+10775
+10776
+10777
+10778
+10779
+10780
+10781
+10782
+10783
+10784
+10785
+10786
+10787
+10788
+10789
+10790
+10791
+10792
+10793
+10794
+10795
+10796
+10797
+10798
+10799
+10800
+10801
+10802
+10803
+10804
+10805
+10806
+10807
+10808
+10809
+10810
+10811
+10812
+10813
+10814
+10815
+10816
+10817
+10818
+10819
+10820
+10821
+10822
+10823
+10824
+10825
+10826
+10827
+10828
+10829
+10830
+10831
+10832
+10833
+10834
+10835
+10836
+10837
+10838
+10839
+10840
+10841
+10842
+10843
+10844
+10845
+10846
+10847
+10848
+10849
+10850
+10851
+10852
+10853
+10854
+10855
+10856
+10857
+10858
+10859
+10860
+10861
+10862
+10863
+10864
+10865
+10866
+10867
+10868
+10869
+10870
+10871
+10872
+10873
+10874
+10875
+10876
+10877
+10878
+10879
+10880
+10881
+10882
+10883
+10884
+10885
+10886
+10887
+10888
+10889
+10890
+10891
+10892
+10893
+10894
+10895
+10896
+10897
+10898
+10899
+10900
+10901
+10902
+10903
+10904
+10905
+10906
+10907
+10908
+10909
+10910
+10911
+10912
+10913
+10914
+10915
+10916
+10917
+10918
+10919
+10920
+10921
+10922
+10923
+10924
+10925
+10926
+10927
+10928
+10929
+10930
+10931
+10932
+10933
+10934
+10935
+10936
+10937
+10938
+10939
+10940
+10941
+10942
+10943
+10944
+10945
+10946
+10947
+10948
+10949
+10950
+10951
+10952
+10953
+10954
+10955
+10956
+10957
+10958
+10959
+10960
+10961
+10962
+10963
+10964
+10965
+10966
+10967
+10968
+10969
+10970
+10971
+10972
+10973
+10974
+10975
+10976
+10977
+10978
+10979
+10980
+10981
+10982
+10983
+10984
+10985
+10986
+10987
+10988
+10989
+10990
+10991
+10992
+10993
+10994
+10995
+10996
+10997
+10998
+10999
+11000
+11001
+11002
+11003
+11004
+11005
+11006
+11007
+11008
+11009
+11010
+11011
+11012
+11013
+11014
+11015
+11016
+11017
+11018
+11019
+11020
+11021
+11022
+11023
+11024
+11025
+11026
+11027
+11028
+11029
+11030
+11031
+11032
+11033
+11034
+11035
+11036
+11037
+11038
+11039
+11040
+11041
+11042
+11043
+11044
+11045
+11046
+11047
+11048
+11049
+11050
+11051
+11052
+11053
+11054
+11055
+11056
+11057
+11058
+11059
+11060
+11061
+11062
+11063
+11064
+11065
+11066
+11067
+11068
+11069
+11070
+11071
+11072
+11073
+11074
+11075
+11076
+11077
+11078
+11079
+11080
+11081
+11082
+11083
+11084
+11085
+11086
+11087
+11088
+11089
+11090
+11091
+11092
+11093
+11094
+11095
+11096
+11097
+11098
+11099
+11100
+11101
+11102
+11103
+11104
+11105
+11106
+11107
+11108
+11109
+11110
+11111
+11112
+11113
+11114
+11115
+11116
+11117
+11118
+11119
+11120
+11121
+11122
+11123
+11124
+11125
+11126
+11127
+11128
+11129
+11130
+11131
+11132
+11133
+11134
+11135
+11136
+11137
+11138
+11139
+11140
+11141
+11142
+11143
+11144
+11145
+11146
+11147
+11148
+11149
+11150
+11151
+11152
+11153
+11154
+11155
+11156
+11157
+11158
+11159
+11160
+11161
+11162
+11163
+11164
+11165
+11166
+11167
+11168
+11169
+11170
+11171
+11172
+11173
+11174
+11175
+11176
+11177
+11178
+11179
+11180
+11181
+11182
+11183
+11184
+11185
+11186
+11187
+11188
+11189
+11190
+11191
+11192
+11193
+11194
+11195
+11196
+11197
+11198
+11199
+11200
+11201
+11202
+11203
+11204
+11205
+11206
+11207
+11208
+11209
+11210
+11211
+11212
+11213
+11214
+11215
+11216
+11217
+11218
+11219
+11220
+11221
+11222
+11223
+11224
+11225
+11226
+11227
+11228
+11229
+11230
+11231
+11232
+11233
+11234
+11235
+11236
+11237
+11238
+11239
+11240
+11241
+11242
+11243
+11244
+11245
+11246
+11247
+11248
+11249
+11250
+11251
+11252
+11253
+11254
+11255
+11256
+11257
+11258
+11259
+11260
+11261
+11262
+11263
+11264
+11265
+11266
+11267
+11268
+11269
+11270
+11271
+11272
+11273
+11274
+11275
+11276
+11277
+11278
+11279
+11280
+11281
+11282
+11283
+11284
+11285
+11286
+11287
+11288
+11289
+11290
+11291
+11292
+11293
+11294
+11295
+11296
+11297
+11298
+11299
+11300
+11301
+11302
+11303
+11304
+11305
+11306
+11307
+11308
+11309
+11310
+11311
+11312
+11313
+11314
+11315
+11316
+11317
+11318
+11319
+11320
+11321
+11322
+11323
+11324
+11325
+11326
+11327
+11328
+11329
+11330
+11331
+11332
+11333
+11334
+11335
+11336
+11337
+11338
+11339
+11340
+11341
+11342
+11343
+11344
+11345
+11346
+11347
+11348
+11349
+11350
+11351
+11352
+11353
+11354
+11355
+11356
+11357
+11358
+11359
+11360
+11361
+11362
+11363
+11364
+11365
+11366
+11367
+11368
+11369
+11370
+11371
+11372
+11373
+11374
+11375
+11376
+11377
+11378
+11379
+11380
+11381
+11382
+11383
+11384
+11385
+11386
+11387
+11388
+11389
+11390
+11391
+11392
+11393
+11394
+11395
+11396
+11397
+11398
+11399
+11400
+11401
+11402
+11403
+11404
+11405
+11406
+11407
+11408
+11409
+11410
+11411
+11412
+11413
+11414
+11415
+11416
+11417
+11418
+11419
+11420
+11421
+11422
+11423
+11424
+11425
+11426
+11427
+11428
+11429
+11430
+11431
+11432
+11433
+11434
+11435
+11436
+11437
+11438
+11439
+11440
+11441
+11442
+11443
+11444
+11445
+11446
+11447
+11448
+11449
+11450
+11451
+11452
+11453
+11454
+11455
+11456
+11457
+11458
+11459
+11460
+11461
+11462
+11463
+11464
+11465
+11466
+11467
+11468
+11469
+11470
+11471
+11472
+11473
+11474
+11475
+11476
+11477
+11478
+11479
+11480
+11481
+11482
+11483
+11484
+11485
+11486
+11487
+11488
+11489
+11490
+11491
+11492
+11493
+11494
+11495
+11496
+11497
+11498
+11499
+11500
+11501
+11502
+11503
+11504
+11505
+11506
+11507
+11508
+11509
+11510
+11511
+11512
+11513
+11514
+11515
+11516
+11517
+11518
+11519
+11520
+11521
+11522
+11523
+11524
+11525
+11526
+11527
+11528
+11529
+11530
+11531
+11532
+11533
+11534
+11535
+11536
+11537
+11538
+11539
+11540
+11541
+11542
+11543
+11544
+11545
+11546
+11547
+11548
+11549
+11550
+11551
+11552
+11553
+11554
+11555
+11556
+11557
+11558
+11559
+11560
+11561
+11562
+11563
+11564
+11565
+11566
+11567
+11568
+11569
+11570
+11571
+11572
+11573
+11574
+11575
+11576
+11577
+11578
+11579
+11580
+11581
+11582
+11583
+11584
+11585
+11586
+11587
+11588
+11589
+11590
+11591
+11592
+11593
+11594
+11595
+11596
+11597
+11598
+11599
+11600
+11601
+11602
+11603
+11604
+11605
+11606
+11607
+11608
+11609
+11610
+11611
+11612
+11613
+11614
+11615
+11616
+11617
+11618
+11619
+11620
+11621
+11622
+11623
+11624
+11625
+11626
+11627
+11628
+11629
+11630
+11631
+11632
+11633
+11634
+11635
+11636
+11637
+11638
+11639
+11640
+11641
+11642
+11643
+11644
+11645
+11646
+11647
+11648
+11649
+11650
+11651
+11652
+11653
+11654
+11655
+11656
+11657
+11658
+11659
+11660
+11661
+11662
+11663
+11664
+11665
+11666
+11667
+11668
+11669
+11670
+11671
+11672
+11673
+11674
+11675
+11676
+11677
+11678
+11679
+11680
+11681
+11682
+11683
+11684
+11685
+11686
+11687
+11688
+11689
+11690
+11691
+11692
+11693
+11694
+11695
+11696
+11697
+11698
+11699
+11700
+11701
+11702
+11703
+11704
+11705
+11706
+11707
+11708
+11709
+11710
+11711
+11712
+11713
+11714
+11715
+11716
+11717
+11718
+11719
+11720
+11721
+11722
+11723
+11724
+11725
+11726
+11727
+11728
+11729
+11730
+11731
+11732
+11733
+11734
+11735
+11736
+11737
+11738
+11739
+11740
+11741
+11742
+11743
+11744
+11745
+11746
+11747
+11748
+11749
+11750
+11751
+11752
+11753
+11754
+11755
+11756
+11757
+11758
+11759
+11760
+11761
+11762
+11763
+11764
+11765
+11766
+11767
+11768
+11769
+11770
+11771
+11772
+11773
+11774
+11775
+11776
+11777
+11778
+11779
+11780
+11781
+11782
+11783
+11784
+11785
+11786
+11787
+11788
+11789
+11790
+11791
+11792
+11793
+11794
+11795
+11796
+11797
+11798
+11799
+11800
+11801
+11802
+11803
+11804
+11805
+11806
+11807
+11808
+11809
+11810
+11811
+11812
+11813
+11814
+11815
+11816
+11817
+11818
+11819
+11820
+11821
+11822
+11823
+11824
+11825
+11826
+11827
+11828
+11829
+11830
+11831
+11832
+11833
+11834
+11835
+11836
+11837
+11838
+11839
+11840
+11841
+11842
+11843
+11844
+11845
+11846
+11847
+11848
+11849
+11850
+11851
+11852
+11853
+11854
+11855
+11856
+11857
+11858
+11859
+11860
+11861
+11862
+11863
+11864
+11865
+11866
+11867
+11868
+11869
+11870
+11871
+11872
+11873
+11874
+11875
+11876
+11877
+11878
+11879
+11880
+11881
+11882
+11883
+11884
+11885
+11886
+11887
+11888
+11889
+11890
+11891
+11892
+11893
+11894
+11895
+11896
+11897
+11898
+11899
+11900
+11901
+11902
+11903
+11904
+11905
+11906
+11907
+11908
+11909
+11910
+11911
+11912
+11913
+11914
+11915
+11916
+11917
+11918
+11919
+11920
+11921
+11922
+11923
+11924
+11925
+11926
+11927
+11928
+11929
+11930
+11931
+11932
+11933
+11934
+11935
+11936
+11937
+11938
+11939
+11940
+11941
+11942
+11943
+11944
+11945
+11946
+11947
+11948
+11949
+11950
+11951
+11952
+11953
+11954
+11955
+11956
+11957
+11958
+11959
+11960
+11961
+11962
+11963
+11964
+11965
+11966
+11967
+11968
+11969
+11970
+11971
+11972
+11973
+11974
+11975
+11976
+11977
+11978
+11979
+11980
+11981
+11982
+11983
+11984
+11985
+11986
+11987
+11988
+11989
+11990
+11991
+11992
+11993
+11994
+11995
+11996
+11997
+11998
+11999
+12000
+12001
+12002
+12003
+12004
+12005
+12006
+12007
+12008
+12009
+12010
+12011
+12012
+12013
+12014
+12015
+12016
+12017
+12018
+12019
+12020
+12021
+12022
+12023
+12024
+12025
+12026
+12027
+12028
+12029
+12030
+12031
+12032
+12033
+12034
+12035
+12036
+12037
+12038
+12039
+12040
+12041
+12042
+12043
+12044
+12045
+12046
+12047
+12048
+12049
+12050
+12051
+12052
+12053
+12054
+12055
+12056
+12057
+12058
+12059
+12060
+12061
+12062
+12063
+12064
+12065
+12066
+12067
+12068
+12069
+12070
+12071
+12072
+12073
+12074
+12075
+12076
+12077
+12078
+12079
+12080
+12081
+12082
+12083
+12084
+12085
+12086
+12087
+12088
+12089
+12090
+12091
+12092
+12093
+12094
+12095
+12096
+12097
+12098
+12099
+12100
+12101
+12102
+12103
+12104
+12105
+12106
+12107
+12108
+12109
+12110
+12111
+12112
+12113
+12114
+12115
+12116
+12117
+12118
+12119
+12120
+12121
+12122
+12123
+12124
+12125
+12126
+12127
+12128
+12129
+12130
+12131
+12132
+12133
+12134
+12135
+12136
+12137
+12138
+12139
+12140
+12141
+12142
+12143
+12144
+12145
+12146
+12147
+12148
+12149
+12150
+12151
+12152
+12153
+12154
+12155
+12156
+12157
+12158
+12159
+12160
+12161
+12162
+12163
+12164
+12165
+12166
+12167
+12168
+12169
+12170
+12171
+12172
+12173
+12174
+12175
+12176
+12177
+12178
+12179
+12180
+12181
+12182
+12183
+12184
+12185
+12186
+12187
+12188
+12189
+12190
+12191
+12192
+12193
+12194
+12195
+12196
+12197
+12198
+12199
+12200
+12201
+12202
+12203
+12204
+12205
+12206
+12207
+12208
+12209
+12210
+12211
+12212
+12213
+12214
+12215
+12216
+12217
+12218
+12219
+12220
+12221
+12222
+12223
+12224
+12225
+12226
+12227
+12228
+12229
+12230
+12231
+12232
+12233
+12234
+12235
+12236
+12237
+12238
+12239
+12240
+12241
+12242
+12243
+12244
+12245
+12246
+12247
+12248
+12249
+12250
+12251
+12252
+12253
+12254
+12255
+12256
+12257
+12258
+12259
+12260
+12261
+12262
+12263
+12264
+12265
+12266
+12267
+12268
+12269
+12270
+12271
+12272
+12273
+12274
+12275
+12276
+12277
+12278
+12279
+12280
+12281
+12282
+12283
+12284
+12285
+12286
+12287
+12288
+12289
+12290
+12291
+12292
+12293
+12294
+12295
+12296
+12297
+12298
+12299
+12300
+12301
+12302
+12303
+12304
+12305
+12306
+12307
+12308
+12309
+12310
+12311
+12312
+12313
+12314
+12315
+12316
+12317
+12318
+12319
+12320
+12321
+12322
+12323
+12324
+12325
+12326
+12327
+12328
+12329
+12330
+12331
+12332
+12333
+12334
+12335
+12336
+12337
+12338
+12339
+12340
+12341
+12342
+12343
+12344
+12345
+12346
+12347
+12348
+12349
+12350
+12351
+12352
+12353
+12354
+12355
+12356
+12357
+12358
+12359
+12360
+12361
+12362
+12363
+12364
+12365
+12366
+12367
+12368
+12369
+12370
+12371
+12372
+12373
+12374
+12375
+12376
+12377
+12378
+12379
+12380
+12381
+12382
+12383
+12384
+12385
+12386
+12387
+12388
+12389
+12390
+12391
+12392
+12393
+12394
+12395
+12396
+12397
+12398
+12399
+12400
+12401
+12402
+12403
+12404
+12405
+12406
+12407
+12408
+12409
+12410
+12411
+12412
+12413
+12414
+12415
+12416
+12417
+12418
+12419
+12420
+12421
+12422
+12423
+12424
+12425
+12426
+12427
+12428
+12429
+12430
+12431
+12432
+12433
+12434
+12435
+12436
+12437
+12438
+12439
+12440
+12441
+12442
+12443
+12444
+12445
+12446
+12447
+12448
+12449
+12450
+12451
+12452
+12453
+12454
+12455
+12456
+12457
+12458
+12459
+12460
+12461
+12462
+12463
+12464
+12465
+12466
+12467
+12468
+12469
+12470
+12471
+12472
+12473
+12474
+12475
+12476
+12477
+12478
+12479
+12480
+12481
+12482
+12483
+12484
+12485
+12486
+12487
+12488
+12489
+12490
+12491
+12492
+12493
+12494
+12495
+12496
+12497
+12498
+12499
+12500
+12501
+12502
+12503
+12504
+12505
+12506
+12507
+12508
+12509
+12510
+12511
+12512
+12513
+12514
+12515
+12516
+12517
+12518
+12519
+12520
+12521
+12522
+12523
+12524
+12525
+12526
+12527
+12528
+12529
+12530
+12531
+12532
+12533
+12534
+12535
+12536
+12537
+12538
+12539
+12540
+12541
+12542
+12543
+12544
+12545
+12546
+12547
+12548
+12549
+12550
+12551
+12552
+12553
+12554
+12555
+12556
+12557
+12558
+12559
+12560
+12561
+12562
+12563
+12564
+12565
+12566
+12567
+12568
+12569
+12570
+12571
+12572
+12573
+12574
+12575
+12576
+12577
+12578
+12579
+12580
+12581
+12582
+12583
+12584
+12585
+12586
+12587
+12588
+12589
+12590
+12591
+12592
+12593
+12594
+12595
+12596
+12597
+12598
+12599
+12600
+12601
+12602
+12603
+12604
+12605
+12606
+12607
+12608
+12609
+12610
+12611
+12612
+12613
+12614
+12615
+12616
+12617
+12618
+12619
+12620
+12621
+12622
+12623
+12624
+12625
+12626
+12627
+12628
+12629
+12630
+12631
+12632
+12633
+12634
+12635
+12636
+12637
+12638
+12639
+12640
+12641
+12642
+12643
+12644
+12645
+12646
+12647
+12648
+12649
+12650
+12651
+12652
+12653
+12654
+12655
+12656
+12657
+12658
+12659
+12660
+12661
+12662
+12663
+12664
+12665
+12666
+12667
+12668
+12669
+12670
+12671
+12672
+12673
+12674
+12675
+12676
+12677
+12678
+12679
+12680
+12681
+12682
+12683
+12684
+12685
+12686
+12687
+12688
+12689
+12690
+12691
+12692
+12693
+12694
+12695
+12696
+12697
+12698
+12699
+12700
+12701
+12702
+12703
+12704
+12705
+12706
+12707
+12708
+12709
+12710
+12711
+12712
+12713
+12714
+12715
+12716
+12717
+12718
+12719
+12720
+12721
+12722
+12723
+12724
+12725
+12726
+12727
+12728
+12729
+12730
+12731
+12732
+12733
+12734
+12735
+12736
+12737
+12738
+12739
+12740
+12741
+12742
+12743
+12744
+12745
+12746
+12747
+12748
+12749
+12750
+12751
+12752
+12753
+12754
+12755
+12756
+12757
+12758
+12759
+12760
+12761
+12762
+12763
+12764
+12765
+12766
+12767
+12768
+12769
+12770
+12771
+12772
+12773
+12774
+12775
+12776
+12777
+12778
+12779
+12780
+12781
+12782
+12783
+12784
+12785
+12786
+12787
+12788
+12789
+12790
+12791
+12792
+12793
+12794
+12795
+12796
+12797
+12798
+12799
+12800
+12801
+12802
+12803
+12804
+12805
+12806
+12807
+12808
+12809
+12810
+12811
+12812
+12813
+12814
+12815
+12816
+12817
+12818
+12819
+12820
+12821
+12822
+12823
+12824
+12825
+12826
+12827
+12828
+12829
+12830
+12831
+12832
+12833
+12834
+12835
+12836
+12837
+12838
+12839
+12840
+12841
+12842
+12843
+12844
+12845
+12846
+12847
+12848
+12849
+12850
+12851
+12852
+12853
+12854
+12855
+12856
+12857
+12858
+12859
+12860
+12861
+12862
+12863
+12864
+12865
+12866
+12867
+12868
+12869
+12870
+12871
+12872
+12873
+12874
+12875
+12876
+12877
+12878
+12879
+12880
+12881
+12882
+12883
+12884
+12885
+12886
+12887
+12888
+12889
+12890
+12891
+12892
+12893
+12894
+12895
+12896
+12897
+12898
+12899
+12900
+12901
+12902
+12903
+12904
+12905
+12906
+12907
+12908
+12909
+12910
+12911
+12912
+12913
+12914
+12915
+12916
+12917
+12918
+12919
+12920
+12921
+12922
+12923
+12924
+12925
+12926
+12927
+12928
+12929
+12930
+12931
+12932
+12933
+12934
+12935
+12936
+12937
+12938
+12939
+12940
+12941
+12942
+12943
+12944
+12945
+12946
+12947
+12948
+12949
+12950
+12951
+12952
+12953
+12954
+12955
+12956
+12957
+12958
+12959
+12960
+12961
+12962
+12963
+12964
+12965
+12966
+12967
+12968
+12969
+12970
+12971
+12972
+12973
+12974
+12975
+12976
+12977
+12978
+12979
+12980
+12981
+12982
+12983
+12984
+12985
+12986
+12987
+12988
+12989
+12990
+12991
+12992
+12993
+12994
+12995
+12996
+12997
+12998
+12999
+13000
+13001
+13002
+13003
+13004
+13005
+13006
+13007
+13008
+13009
+13010
+13011
+13012
+13013
+13014
+13015
+13016
+13017
+13018
+13019
+13020
+13021
+13022
+13023
+13024
+13025
+13026
+13027
+13028
+13029
+13030
+13031
+13032
+13033
+13034
+13035
+13036
+13037
+13038
+13039
+13040
+13041
+13042
+13043
+13044
+13045
+13046
+13047
+13048
+13049
+13050
+13051
+13052
+13053
+13054
+13055
+13056
+13057
+13058
+13059
+13060
+13061
+13062
+13063
+13064
+13065
+13066
+13067
+13068
+13069
+13070
+13071
+13072
+13073
+13074
+13075
+13076
+13077
+13078
+13079
+13080
+13081
+13082
+13083
+13084
+13085
+13086
+13087
+13088
+13089
+13090
+13091
+13092
+13093
+13094
+13095
+13096
+13097
+13098
+13099
+13100
+13101
+13102
+13103
+13104
+13105
+13106
+13107
+13108
+13109
+13110
+13111
+13112
+13113
+13114
+13115
+13116
+13117
+13118
+13119
+13120
+13121
+13122
+13123
+13124
+13125
+13126
+13127
+13128
+13129
+13130
+13131
+13132
+13133
+13134
+13135
+13136
+13137
+13138
+13139
+13140
+13141
+13142
+13143
+13144
+13145
+13146
+13147
+13148
+13149
+13150
+13151
+13152
+13153
+13154
+13155
+13156
+13157
+13158
+13159
+13160
+13161
+13162
+13163
+13164
+13165
+13166
+13167
+13168
+13169
+13170
+13171
+13172
+13173
+13174
+13175
+13176
+13177
+13178
+13179
+13180
+13181
+13182
+13183
+13184
+13185
+13186
+13187
+13188
+13189
+13190
+13191
+13192
+13193
+13194
+13195
+13196
+13197
+13198
+13199
+13200
+13201
+13202
+13203
+13204
+13205
+13206
+13207
+13208
+13209
+13210
+13211
+13212
+13213
+13214
+13215
+13216
+13217
+13218
+13219
+13220
+13221
+13222
+13223
+13224
+13225
+13226
+13227
+13228
+13229
+13230
+13231
+13232
+13233
+13234
+13235
+13236
+13237
+13238
+13239
+13240
+13241
+13242
+13243
+13244
+13245
+13246
+13247
+13248
+13249
+13250
+13251
+13252
+13253
+13254
+13255
+13256
+13257
+13258
+13259
+13260
+13261
+13262
+13263
+13264
+13265
+13266
+13267
+13268
+13269
+13270
+13271
+13272
+13273
+13274
+13275
+13276
+13277
+13278
+13279
+13280
+13281
+13282
+13283
+13284
+13285
+13286
+13287
+13288
+13289
+13290
+13291
+13292
+13293
+13294
+13295
+13296
+13297
+13298
+13299
+13300
+13301
+13302
+13303
+13304
+13305
+13306
+13307
+13308
+13309
+13310
+13311
+13312
+13313
+13314
+13315
+13316
+13317
+13318
+13319
+13320
+13321
+13322
+13323
+13324
+13325
+13326
+13327
+13328
+13329
+13330
+13331
+13332
+13333
+13334
+13335
+13336
+13337
+13338
+13339
+13340
+13341
+13342
+13343
+13344
+13345
+13346
+13347
+13348
+13349
+13350
+13351
+13352
+13353
+13354
+13355
+13356
+13357
+13358
+13359
+13360
+13361
+13362
+13363
+13364
+13365
+13366
+13367
+13368
+13369
+13370
+13371
+13372
+13373
+13374
+13375
+13376
+13377
+13378
+13379
+13380
+13381
+13382
+13383
+13384
+13385
+13386
+13387
+13388
+13389
+13390
+13391
+13392
+13393
+13394
+13395
+13396
+13397
+13398
+13399
+13400
+13401
+13402
+13403
+13404
+13405
+13406
+13407
+13408
+13409
+13410
+13411
+13412
+13413
+13414
+13415
+13416
+13417
+13418
+13419
+13420
+13421
+13422
+13423
+13424
+13425
+13426
+13427
+13428
+13429
+13430
+13431
+13432
+13433
+13434
+13435
+13436
+13437
+13438
+13439
+13440
+13441
+13442
+13443
+13444
+13445
+13446
+13447
+13448
+13449
+13450
+13451
+13452
+13453
+13454
+13455
+13456
+13457
+13458
+13459
+13460
+13461
+13462
+13463
+13464
+13465
+13466
+13467
+13468
+13469
+13470
+13471
+13472
+13473
+13474
+13475
+13476
+13477
+13478
+13479
+13480
+13481
+13482
+13483
+13484
+13485
+13486
+13487
+13488
+13489
+13490
+13491
+13492
+13493
+13494
+13495
+13496
+13497
+13498
+13499
+13500
+13501
+13502
+13503
+13504
+13505
+13506
+13507
+13508
+13509
+13510
+13511
+13512
+13513
+13514
+13515
+13516
+13517
+13518
+13519
+13520
+13521
+13522
+13523
+13524
+13525
+13526
+13527
+13528
+13529
+13530
+13531
+13532
+13533
+13534
+13535
+13536
+13537
+13538
+13539
+13540
+13541
+13542
+13543
+13544
+13545
+13546
+13547
+13548
+13549
+13550
+13551
+13552
+13553
+13554
+13555
+13556
+13557
+13558
+13559
+13560
+13561
+13562
+13563
+13564
+13565
+13566
+13567
+13568
+13569
+13570
+13571
+13572
+13573
+13574
+13575
+13576
+13577
+13578
+13579
+13580
+13581
+13582
+13583
+13584
+13585
+13586
+13587
+13588
+13589
+13590
+13591
+13592
+13593
+13594
+13595
+13596
+13597
+13598
+13599
+13600
+13601
+13602
+13603
+13604
+13605
+13606
+13607
+13608
+13609
+13610
+13611
+13612
+13613
+13614
+13615
+13616
+13617
+13618
+13619
+13620
+13621
+13622
+13623
+13624
+13625
+13626
+13627
+13628
+13629
+13630
+13631
+13632
+13633
+13634
+13635
+13636
+13637
+13638
+13639
+13640
+13641
+13642
+13643
+13644
+13645
+13646
+13647
+13648
+13649
+13650
+13651
+13652
+13653
+13654
+13655
+13656
+13657
+13658
+13659
+13660
+13661
+13662
+13663
+13664
+13665
+13666
+13667
+13668
+13669
+13670
+13671
+13672
+13673
+13674
+13675
+13676
+13677
+13678
+13679
+13680
+13681
+13682
+13683
+13684
+13685
+13686
+13687
+13688
+13689
+13690
+13691
+13692
+13693
+13694
+13695
+13696
+13697
+13698
+13699
+13700
+13701
+13702
+13703
+13704
+13705
+13706
+13707
+13708
+13709
+13710
+13711
+13712
+13713
+13714
+13715
+13716
+13717
+13718
+13719
+13720
+13721
+13722
+13723
+13724
+13725
+13726
+13727
+13728
+13729
+13730
+13731
+13732
+13733
+13734
+13735
+13736
+13737
+13738
+13739
+13740
+13741
+13742
+13743
+13744
+13745
+13746
+13747
+13748
+13749
+13750
+13751
+13752
+13753
+13754
+13755
+13756
+13757
+13758
+13759
+13760
+13761
+13762
+13763
+13764
+13765
+13766
+13767
+13768
+13769
+13770
+13771
+13772
+13773
+13774
+13775
+13776
+13777
+13778
+13779
+13780
+13781
+13782
+13783
+13784
+13785
+13786
+13787
+13788
+13789
+13790
+13791
+13792
+13793
+13794
+13795
+13796
+13797
+13798
+13799
+13800
+13801
+13802
+13803
+13804
+13805
+13806
+13807
+13808
+13809
+13810
+13811
+13812
+13813
+13814
+13815
+13816
+13817
+13818
+13819
+13820
+13821
+13822
+13823
+13824
+13825
+13826
+13827
+13828
+13829
+13830
+13831
+13832
+13833
+13834
+13835
+13836
+13837
+13838
+13839
+13840
+13841
+13842
+13843
+13844
+13845
+13846
+13847
+13848
+13849
+13850
+13851
+13852
+13853
+13854
+13855
+13856
+13857
+13858
+13859
+13860
+13861
+13862
+13863
+13864
+13865
+13866
+13867
+13868
+13869
+13870
+13871
+13872
+13873
+13874
+13875
+13876
+13877
+13878
+13879
+13880
+13881
+13882
+13883
+13884
+13885
+13886
+13887
+13888
+13889
+13890
+13891
+13892
+13893
+13894
+13895
+13896
+13897
+13898
+13899
+13900
+13901
+13902
+13903
+13904
+13905
+13906
+13907
+13908
+13909
+13910
+13911
+13912
+13913
+13914
+13915
+13916
+13917
+13918
+13919
+13920
+13921
+13922
+13923
+13924
+13925
+13926
+13927
+13928
+13929
+13930
+13931
+13932
+13933
+13934
+13935
+13936
+13937
+13938
+13939
+13940
+13941
+13942
+13943
+13944
+13945
+13946
+13947
+13948
+13949
+13950
+13951
+13952
+13953
+13954
+13955
+13956
+13957
+13958
+13959
+13960
+13961
+13962
+13963
+13964
+13965
+13966
+13967
+13968
+13969
+13970
+13971
+13972
+13973
+13974
+13975
+13976
+13977
+13978
+13979
+13980
+13981
+13982
+13983
+13984
+13985
+13986
+13987
+13988
+13989
+13990
+13991
+13992
+13993
+13994
+13995
+13996
+13997
+13998
+13999
+14000
+14001
+14002
+14003
+14004
+14005
+14006
+14007
+14008
+14009
+14010
+14011
+14012
+14013
+14014
+14015
+14016
+14017
+14018
+14019
+14020
+14021
+14022
+14023
+14024
+14025
+14026
+14027
+14028
+14029
+14030
+14031
+14032
+14033
+14034
+14035
+14036
+14037
+14038
+14039
+14040
+14041
+14042
+14043
+14044
+14045
+14046
+14047
+14048
+14049
+14050
+14051
+14052
+14053
+14054
+14055
+14056
+14057
+14058
+14059
+14060
+14061
+14062
+14063
+14064
+14065
+14066
+14067
+14068
+14069
+14070
+14071
+14072
+14073
+14074
+14075
+14076
+14077
+14078
+14079
+14080
+14081
+14082
+14083
+14084
+14085
+14086
+14087
+14088
+14089
+14090
+14091
+14092
+14093
+14094
+14095
+14096
+14097
+14098
+14099
+14100
+14101
+14102
+14103
+14104
+14105
+14106
+14107
+14108
+14109
+14110
+14111
+14112
+14113
+14114
+14115
+14116
+14117
+14118
+14119
+14120
+14121
+14122
+14123
+14124
+14125
+14126
+14127
+14128
+14129
+14130
+14131
+14132
+14133
+14134
+14135
+14136
+14137
+14138
+14139
+14140
+14141
+14142
+14143
+14144
+14145
+14146
+14147
+14148
+14149
+14150
+14151
+14152
+14153
+14154
+14155
+14156
+14157
+14158
+14159
+14160
+14161
+14162
+14163
+14164
+14165
+14166
+14167
+14168
+14169
+14170
+14171
+14172
+14173
+14174
+14175
+14176
+14177
+14178
+14179
+14180
+14181
+14182
+14183
+14184
+14185
+14186
+14187
+14188
+14189
+14190
+14191
+14192
+14193
+14194
+14195
+14196
+14197
+14198
+14199
+14200
+14201
+14202
+14203
+14204
+14205
+14206
+14207
+14208
+14209
+14210
+14211
+14212
+14213
+14214
+14215
+14216
+14217
+14218
+14219
+14220
+14221
+14222
+14223
+14224
+14225
+14226
+14227
+14228
+14229
+14230
+14231
+14232
+14233
+14234
+14235
+14236
+14237
+14238
+14239
+14240
+14241
+14242
+14243
+14244
+14245
+14246
+14247
+14248
+14249
+14250
+14251
+14252
+14253
+14254
+14255
+14256
+14257
+14258
+14259
+14260
+14261
+14262
+14263
+14264
+14265
+14266
+14267
+14268
+14269
+14270
+14271
+14272
+14273
+14274
+14275
+14276
+14277
+14278
+14279
+14280
+14281
+14282
+14283
+14284
+14285
+14286
+14287
+14288
+14289
+14290
+14291
+14292
+14293
+14294
+14295
+14296
+14297
+14298
+14299
+14300
+14301
+14302
+14303
+14304
+14305
+14306
+14307
+14308
+14309
+14310
+14311
+14312
+14313
+14314
+14315
+14316
+14317
+14318
+14319
+14320
+14321
+14322
+14323
+14324
+14325
+14326
+14327
+14328
+14329
+14330
+14331
+14332
+14333
+14334
+14335
+14336
+14337
+14338
+14339
+14340
+14341
+14342
+14343
+14344
+14345
+14346
+14347
+14348
+14349
+14350
+14351
+14352
+14353
+14354
+14355
+14356
+14357
+14358
+14359
+14360
+14361
+14362
+14363
+14364
+14365
+14366
+14367
+14368
+14369
+14370
+14371
+14372
+14373
+14374
+14375
+14376
+14377
+14378
+14379
+14380
+14381
+14382
+14383
+14384
+14385
+14386
+14387
+14388
+14389
+14390
+14391
+14392
+14393
+14394
+14395
+14396
+14397
+14398
+14399
+14400
+14401
+14402
+14403
+14404
+14405
+14406
+14407
+14408
+14409
+14410
+14411
+14412
+14413
+14414
+14415
+14416
+14417
+14418
+14419
+14420
+14421
+14422
+14423
+14424
+14425
+14426
+14427
+14428
+14429
+14430
+14431
+14432
+14433
+14434
+14435
+14436
+14437
+14438
+14439
+14440
+14441
+14442
+14443
+14444
+14445
+14446
+14447
+14448
+14449
+14450
+14451
+14452
+14453
+14454
+14455
+14456
+14457
+14458
+14459
+14460
+14461
+14462
+14463
+14464
+14465
+14466
+14467
+14468
+14469
+14470
+14471
+14472
+14473
+14474
+14475
+14476
+14477
+14478
+14479
+14480
+14481
+14482
+14483
+14484
+14485
+14486
+14487
+14488
+14489
+14490
+14491
+14492
+14493
+14494
+14495
+14496
+14497
+14498
+14499
+14500
+14501
+14502
+14503
+14504
+14505
+14506
+14507
+14508
+14509
+14510
+14511
+14512
+14513
+14514
+14515
+14516
+14517
+14518
+14519
+14520
+14521
+14522
+14523
+14524
+14525
+14526
+14527
+14528
+14529
+14530
+14531
+14532
+14533
+14534
+14535
+14536
+14537
+14538
+14539
+14540
+14541
+14542
+14543
+14544
+14545
+14546
+14547
+14548
+14549
+14550
+14551
+14552
+14553
+14554
+14555
+14556
+14557
+14558
+14559
+14560
+14561
+14562
+14563
+14564
+14565
+14566
+14567
+14568
+14569
+14570
+14571
+14572
+14573
+14574
+14575
+14576
+14577
+14578
+14579
+14580
+14581
+14582
+14583
+14584
+14585
+14586
+14587
+14588
+14589
+14590
+14591
+14592
+14593
+14594
+14595
+14596
+14597
+14598
+14599
+14600
+14601
+14602
+14603
+14604
+14605
+14606
+14607
+14608
+14609
+14610
+14611
+14612
+14613
+14614
+14615
+14616
+14617
+14618
+14619
+14620
+14621
+14622
+14623
+14624
+14625
+14626
+14627
+14628
+14629
+14630
+14631
+14632
+14633
+14634
+14635
+14636
+14637
+14638
+14639
+14640
+14641
+14642
+14643
+14644
+14645
+14646
+14647
+14648
+14649
+14650
+14651
+14652
+14653
+14654
+14655
+14656
+14657
+14658
+14659
+14660
+14661
+14662
+14663
+14664
+14665
+14666
+14667
+14668
+14669
+14670
+14671
+14672
+14673
+14674
+14675
+14676
+14677
+14678
+14679
+14680
+14681
+14682
+14683
+14684
+14685
+14686
+14687
+14688
+14689
+14690
+14691
+14692
+14693
+14694
+14695
+14696
+14697
+14698
+14699
+14700
+14701
+14702
+14703
+14704
+14705
+14706
+14707
+14708
+14709
+14710
+14711
+14712
+14713
+14714
+14715
+14716
+14717
+14718
+14719
+14720
+14721
+14722
+14723
+14724
+14725
+14726
+14727
+14728
+14729
+14730
+14731
+14732
+14733
+14734
+14735
+14736
+14737
+14738
+14739
+14740
+14741
+14742
+14743
+14744
+14745
+14746
+14747
+14748
+14749
+14750
+14751
+14752
+14753
+14754
+14755
+14756
+14757
+14758
+14759
+14760
+14761
+14762
+14763
+14764
+14765
+14766
+14767
+14768
+14769
+14770
+14771
+14772
+14773
+14774
+14775
+14776
+14777
+14778
+14779
+14780
+14781
+14782
+14783
+14784
+14785
+14786
+14787
+14788
+14789
+14790
+14791
+14792
+14793
+14794
+14795
+14796
+14797
+14798
+14799
+14800
+14801
+14802
+14803
+14804
+14805
+14806
+14807
+14808
+14809
+14810
+14811
+14812
+14813
+14814
+14815
+14816
+14817
+14818
+14819
+14820
+14821
+14822
+14823
+14824
+14825
+14826
+14827
+14828
+14829
+14830
+14831
+14832
+14833
+14834
+14835
+14836
+14837
+14838
+14839
+14840
+14841
+14842
+14843
+14844
+14845
+14846
+14847
+14848
+14849
+14850
+14851
+14852
+14853
+14854
+14855
+14856
+14857
+14858
+14859
+14860
+14861
+14862
+14863
+14864
+14865
+14866
+14867
+14868
+14869
+14870
+14871
+14872
+14873
+14874
+14875
+14876
+14877
+14878
+14879
+14880
+14881
+14882
+14883
+14884
+14885
+14886
+14887
+14888
+14889
+14890
+14891
+14892
+14893
+14894
+14895
+14896
+14897
+14898
+14899
+14900
+14901
+14902
+14903
+14904
+14905
+14906
+14907
+14908
+14909
+14910
+14911
+14912
+14913
+14914
+14915
+14916
+14917
+14918
+14919
+14920
+14921
+14922
+14923
+14924
+14925
+14926
+14927
+14928
+14929
+14930
+14931
+14932
+14933
+14934
+14935
+14936
+14937
+14938
+14939
+14940
+14941
+14942
+14943
+14944
+14945
+14946
+14947
+14948
+14949
+14950
+14951
+14952
+14953
+14954
+14955
+14956
+14957
+14958
+14959
+14960
+14961
+14962
+14963
+14964
+14965
+14966
+14967
+14968
+14969
+14970
+14971
+14972
+14973
+14974
+14975
+14976
+14977
+14978
+14979
+14980
+14981
+14982
+14983
+14984
+14985
+14986
+14987
+14988
+14989
+14990
+14991
+14992
+14993
+14994
+14995
+14996
+14997
+14998
+14999
+15000
+15001
+15002
+15003
+15004
+15005
+15006
+15007
+15008
+15009
+15010
+15011
+15012
+15013
+15014
+15015
+15016
+15017
+15018
+15019
+15020
+15021
+15022
+15023
+15024
+15025
+15026
+15027
+15028
+15029
+15030
+15031
+15032
+15033
+15034
+15035
+15036
+15037
+15038
+15039
+15040
+15041
+15042
+15043
+15044
+15045
+15046
+15047
+15048
+15049
+15050
+15051
+15052
+15053
+15054
+15055
+15056
+15057
+15058
+15059
+15060
+15061
+15062
+15063
+15064
+15065
+15066
+15067
+15068
+15069
+15070
+15071
+15072
+15073
+15074
+15075
+15076
+15077
+15078
+15079
+15080
+15081
+15082
+15083
+15084
+15085
+15086
+15087
+15088
+15089
+15090
+15091
+15092
+15093
+15094
+15095
+15096
+15097
+15098
+15099
+15100
+15101
+15102
+15103
+15104
+15105
+15106
+15107
+15108
+15109
+15110
+15111
+15112
+15113
+15114
+15115
+15116
+15117
+15118
+15119
+15120
+15121
+15122
+15123
+15124
+15125
+15126
+15127
+15128
+15129
+15130
+15131
+15132
+15133
+15134
+15135
+15136
+15137
+15138
+15139
+15140
+15141
+15142
+15143
+15144
+15145
+15146
+15147
+15148
+15149
+15150
+15151
+15152
+15153
+15154
+15155
+15156
+15157
+15158
+15159
+15160
+15161
+15162
+15163
+15164
+15165
+15166
+15167
+15168
+15169
+15170
+15171
+15172
+15173
+15174
+15175
+15176
+15177
+15178
+15179
+15180
+15181
+15182
+15183
+15184
+15185
+15186
+15187
+15188
+15189
+15190
+15191
+15192
+15193
+15194
+15195
+15196
+15197
+15198
+15199
+15200
+15201
+15202
+15203
+15204
+15205
+15206
+15207
+15208
+15209
+15210
+15211
+15212
+15213
+15214
+15215
+15216
+15217
+15218
+15219
+15220
+15221
+15222
+15223
+15224
+15225
+15226
+15227
+15228
+15229
+15230
+15231
+15232
+15233
+15234
+15235
+15236
+15237
+15238
+15239
+15240
+15241
+15242
+15243
+15244
+15245
+15246
+15247
+15248
+15249
+15250
+15251
+15252
+15253
+15254
+15255
+15256
+15257
+15258
+15259
+15260
+15261
+15262
+15263
+15264
+15265
+15266
+15267
+15268
+15269
+15270
+15271
+15272
+15273
+15274
+15275
+15276
+15277
+15278
+15279
+15280
+15281
+15282
+15283
+15284
+15285
+15286
+15287
+15288
+15289
+15290
+15291
+15292
+15293
+15294
+15295
+15296
+15297
+15298
+15299
+15300
+15301
+15302
+15303
+15304
+15305
+15306
+15307
+15308
+15309
+15310
+15311
+15312
+15313
+15314
+15315
+15316
+15317
+15318
+15319
+15320
+15321
+15322
+15323
+15324
+15325
+15326
+15327
+15328
+15329
+15330
+15331
+15332
+15333
+15334
+15335
+15336
+15337
+15338
+15339
+15340
+15341
+15342
+15343
+15344
+15345
+15346
+15347
+15348
+15349
+15350
+15351
+15352
+15353
+15354
+15355
+15356
+15357
+15358
+15359
+15360
+15361
+15362
+15363
+15364
+15365
+15366
+15367
+15368
+15369
+15370
+15371
+15372
+15373
+15374
+15375
+15376
+15377
+15378
+15379
+15380
+15381
+15382
+15383
+15384
+15385
+15386
+15387
+15388
+15389
+15390
+15391
+15392
+15393
+15394
+15395
+15396
+15397
+15398
+15399
+15400
+15401
+15402
+15403
+15404
+15405
+15406
+15407
+15408
+15409
+15410
+15411
+15412
+15413
+15414
+15415
+15416
+15417
+15418
+15419
+15420
+15421
+15422
+15423
+15424
+15425
+15426
+15427
+15428
+15429
+15430
+15431
+15432
+15433
+15434
+15435
+15436
+15437
+15438
+15439
+15440
+15441
+15442
+15443
+15444
+15445
+15446
+15447
+15448
+15449
+15450
+15451
+15452
+15453
+15454
+15455
+15456
+15457
+15458
+15459
+15460
+15461
+15462
+15463
+15464
+15465
+15466
+15467
+15468
+15469
+15470
+15471
+15472
+15473
+15474
+15475
+15476
+15477
+15478
+15479
+15480
+15481
+15482
+15483
+15484
+15485
+15486
+15487
+15488
+15489
+15490
+15491
+15492
+15493
+15494
+15495
+15496
+15497
+15498
+15499
+15500
+15501
+15502
+15503
+15504
+15505
+15506
+15507
+15508
+15509
+15510
+15511
+15512
+15513
+15514
+15515
+15516
+15517
+15518
+15519
+15520
+15521
+15522
+15523
+15524
+15525
+15526
+15527
+15528
+15529
+15530
+15531
+15532
+15533
+15534
+15535
+15536
+15537
+15538
+15539
+15540
+15541
+15542
+15543
+15544
+15545
+15546
+15547
+15548
+15549
+15550
+15551
+15552
+15553
+15554
+15555
+15556
+15557
+15558
+15559
+15560
+15561
+15562
+15563
+15564
+15565
+15566
+15567
+15568
+15569
+15570
+15571
+15572
+15573
+15574
+15575
+15576
+15577
+15578
+15579
+15580
+15581
+15582
+15583
+15584
+15585
+15586
+15587
+15588
+15589
+15590
+15591
+15592
+15593
+15594
+15595
+15596
+15597
+15598
+15599
+15600
+15601
+15602
+15603
+15604
+15605
+15606
+15607
+15608
+15609
+15610
+15611
+15612
+15613
+15614
+15615
+15616
+15617
+15618
+15619
+15620
+15621
+15622
+15623
+15624
+15625
+15626
+15627
+15628
+15629
+15630
+15631
+15632
+15633
+15634
+15635
+15636
+15637
+15638
+15639
+15640
+15641
+15642
+15643
+15644
+15645
+15646
+15647
+15648
+15649
+15650
+15651
+15652
+15653
+15654
+15655
+15656
+15657
+15658
+15659
+15660
+15661
+15662
+15663
+15664
+15665
+15666
+15667
+15668
+15669
+15670
+15671
+15672
+15673
+15674
+15675
+15676
+15677
+15678
+15679
+15680
+15681
+15682
+15683
+15684
+15685
+15686
+15687
+15688
+15689
+15690
+15691
+15692
+15693
+15694
+15695
+15696
+15697
+15698
+15699
+15700
+15701
+15702
+15703
+15704
+15705
+15706
+15707
+15708
+15709
+15710
+15711
+15712
+15713
+15714
+15715
+15716
+15717
+15718
+15719
+15720
+15721
+15722
+15723
+15724
+15725
+15726
+15727
+15728
+15729
+15730
+15731
+15732
+15733
+15734
+15735
+15736
+15737
+15738
+15739
+15740
+15741
+15742
+15743
+15744
+15745
+15746
+15747
+15748
+15749
+15750
+15751
+15752
+15753
+15754
+15755
+15756
+15757
+15758
+15759
+15760
+15761
+15762
+15763
+15764
+15765
+15766
+15767
+15768
+15769
+15770
+15771
+15772
+15773
+15774
+15775
+15776
+15777
+15778
+15779
+15780
+15781
+15782
+15783
+15784
+15785
+15786
+15787
+15788
+15789
+15790
+15791
+15792
+15793
+15794
+15795
+15796
+15797
+15798
+15799
+15800
+15801
+15802
+15803
+15804
+15805
+15806
+15807
+15808
+15809
+15810
+15811
+15812
+15813
+15814
+15815
+15816
+15817
+15818
+15819
+15820
+15821
+15822
+15823
+15824
+15825
+15826
+15827
+15828
+15829
+15830
+15831
+15832
+15833
+15834
+15835
+15836
+15837
+15838
+15839
+15840
+15841
+15842
+15843
+15844
+15845
+15846
+15847
+15848
+15849
+15850
+15851
+15852
+15853
+15854
+15855
+15856
+15857
+15858
+15859
+15860
+15861
+15862
+15863
+15864
+15865
+15866
+15867
+15868
+15869
+15870
+15871
+15872
+15873
+15874
+15875
+15876
+15877
+15878
+15879
+15880
+15881
+15882
+15883
+15884
+15885
+15886
+15887
+15888
+15889
+15890
+15891
+15892
+15893
+15894
+15895
+15896
+15897
+15898
+15899
+15900
+15901
+15902
+15903
+15904
+15905
+15906
+15907
+15908
+15909
+15910
+15911
+15912
+15913
+15914
+15915
+15916
+15917
+15918
+15919
+15920
+15921
+15922
+15923
+15924
+15925
+15926
+15927
+15928
+15929
+15930
+15931
+15932
+15933
+15934
+15935
+15936
+15937
+15938
+15939
+15940
+15941
+15942
+15943
+15944
+15945
+15946
+15947
+15948
+15949
+15950
+15951
+15952
+15953
+15954
+15955
+15956
+15957
+15958
+15959
+15960
+15961
+15962
+15963
+15964
+15965
+15966
+15967
+15968
+15969
+15970
+15971
+15972
+15973
+15974
+15975
+15976
+15977
+15978
+15979
+15980
+15981
+15982
+15983
+15984
+15985
+15986
+15987
+15988
+15989
+15990
+15991
+15992
+15993
+15994
+15995
+15996
+15997
+15998
+15999
+16000
+16001
+16002
+16003
+16004
+16005
+16006
+16007
+16008
+16009
+16010
+16011
+16012
+16013
+16014
+16015
+16016
+16017
+16018
+16019
+16020
+16021
+16022
+16023
+16024
+16025
+16026
+16027
+16028
+16029
+16030
+16031
+16032
+16033
+16034
+16035
+16036
+16037
+16038
+16039
+16040
+16041
+16042
+16043
+16044
+16045
+16046
+16047
+16048
+16049
+16050
+16051
+16052
+16053
+16054
+16055
+16056
+16057
+16058
+16059
+16060
+16061
+16062
+16063
+16064
+16065
+16066
+16067
+16068
+16069
+16070
+16071
+16072
+16073
+16074
+16075
+16076
+16077
+16078
+16079
+16080
+16081
+16082
+16083
+16084
+16085
+16086
+16087
+16088
+16089
+16090
+16091
+16092
+16093
+16094
+16095
+16096
+16097
+16098
+16099
+16100
+16101
+16102
+16103
+16104
+16105
+16106
+16107
+16108
+16109
+16110
+16111
+16112
+16113
+16114
+16115
+16116
+16117
+16118
+16119
+16120
+16121
+16122
+16123
+16124
+16125
+16126
+16127
+16128
+16129
+16130
+16131
+16132
+16133
+16134
+16135
+16136
+16137
+16138
+16139
+16140
+16141
+16142
+16143
+16144
+16145
+16146
+16147
+16148
+16149
+16150
+16151
+16152
+16153
+16154
+16155
+16156
+16157
+16158
+16159
+16160
+16161
+16162
+16163
+16164
+16165
+16166
+16167
+16168
+16169
+16170
+16171
+16172
+16173
+16174
+16175
+16176
+16177
+16178
+16179
+16180
+16181
+16182
+16183
+16184
+16185
+16186
+16187
+16188
+16189
+16190
+16191
+16192
+16193
+16194
+16195
+16196
+16197
+16198
+16199
+16200
+16201
+16202
+16203
+16204
+16205
+16206
+16207
+16208
+16209
+16210
+16211
+16212
+16213
+16214
+16215
+16216
+16217
+16218
+16219
+16220
+16221
+16222
+16223
+16224
+16225
+16226
+16227
+16228
+16229
+16230
+16231
+16232
+16233
+16234
+16235
+16236
+16237
+16238
+16239
+16240
+16241
+16242
+16243
+16244
+16245
+16246
+16247
+16248
+16249
+16250
+16251
+16252
+16253
+16254
+16255
+16256
+16257
+16258
+16259
+16260
+16261
+16262
+16263
+16264
+16265
+16266
+16267
+16268
+16269
+16270
+16271
+16272
+16273
+16274
+16275
+16276
+16277
+16278
+16279
+16280
+16281
+16282
+16283
+16284
+16285
+16286
+16287
+16288
+16289
+16290
+16291
+16292
+16293
+16294
+16295
+16296
+16297
+16298
+16299
+16300
+16301
+16302
+16303
+16304
+16305
+16306
+16307
+16308
+16309
+16310
+16311
+16312
+16313
+16314
+16315
+16316
+16317
+16318
+16319
+16320
+16321
+16322
+16323
+16324
+16325
+16326
+16327
+16328
+16329
+16330
+16331
+16332
+16333
+16334
+16335
+16336
+16337
+16338
+16339
+16340
+16341
+16342
+16343
+16344
+16345
+16346
+16347
+16348
+16349
+16350
+16351
+16352
+16353
+16354
+16355
+16356
+16357
+16358
+16359
+16360
+16361
+16362
+16363
+16364
+16365
+16366
+16367
+16368
+16369
+16370
+16371
+16372
+16373
+16374
+16375
+16376
+16377
+16378
+16379
+16380
+16381
+16382
+16383
+16384
+16385
+16386
+16387
+16388
+16389
+16390
+16391
+16392
+16393
+16394
+16395
+16396
+16397
+16398
+16399
+16400
+16401
+16402
+16403
+16404
+16405
+16406
+16407
+16408
+16409
+16410
+16411
+16412
+16413
+16414
+16415
+16416
+16417
+16418
+16419
+16420
+16421
+16422
+16423
+16424
+16425
+16426
+16427
+16428
+16429
+16430
+16431
+16432
+16433
+16434
+16435
+16436
+16437
+16438
+16439
+16440
+16441
+16442
+16443
+16444
+16445
+16446
+16447
+16448
+16449
+16450
+16451
+16452
+16453
+16454
+16455
+16456
+16457
+16458
+16459
+16460
+16461
+16462
+16463
+16464
+16465
+16466
+16467
+16468
+16469
+16470
+16471
+16472
+16473
+16474
+16475
+16476
+16477
+16478
+16479
+16480
+16481
+16482
+16483
+16484
+16485
+16486
+16487
+16488
+16489
+16490
+16491
+16492
+16493
+16494
+16495
+16496
+16497
+16498
+16499
+16500
+16501
+16502
+16503
+16504
+16505
+16506
+16507
+16508
+16509
+16510
+16511
+16512
+16513
+16514
+16515
+16516
+16517
+16518
+16519
+16520
+16521
+16522
+16523
+16524
+16525
+16526
+16527
+16528
+16529
+16530
+16531
+16532
+16533
+16534
+16535
+16536
+16537
+16538
+16539
+16540
+16541
+16542
+16543
+16544
+16545
+16546
+16547
+16548
+16549
+16550
+16551
+16552
+16553
+16554
+16555
+16556
+16557
+16558
+16559
+16560
+16561
+16562
+16563
+16564
+16565
+16566
+16567
+16568
+16569
+16570
+16571
+16572
+16573
+16574
+16575
+16576
+16577
+16578
+16579
+16580
+16581
+16582
+16583
+16584
+16585
+16586
+16587
+16588
+16589
+16590
+16591
+16592
+16593
+16594
+16595
+16596
+16597
+16598
+16599
+16600
+16601
+16602
+16603
+16604
+16605
+16606
+16607
+16608
+16609
+16610
+16611
+16612
+16613
+16614
+16615
+16616
+16617
+16618
+16619
+16620
+16621
+16622
+16623
+16624
+16625
+16626
+16627
+16628
+16629
+16630
+16631
+16632
+16633
+16634
+16635
+16636
+16637
+16638
+16639
+16640
+16641
+16642
+16643
+16644
+16645
+16646
+16647
+16648
+16649
+16650
+16651
+16652
+16653
+16654
+16655
+16656
+16657
+16658
+16659
+16660
+16661
+16662
+16663
+16664
+16665
+16666
+16667
+16668
+16669
+16670
+16671
+16672
+16673
+16674
+16675
+16676
+16677
+16678
+16679
+16680
+16681
+16682
+16683
+16684
+16685
+16686
+16687
+16688
+16689
+16690
+16691
+16692
+16693
+16694
+16695
+16696
+16697
+16698
+16699
+16700
+16701
+16702
+16703
+16704
+16705
+16706
+16707
+16708
+16709
+16710
+16711
+16712
+16713
+16714
+16715
+16716
+16717
+16718
+16719
+16720
+16721
+16722
+16723
+16724
+16725
+16726
+16727
+16728
+16729
+16730
+16731
+16732
+16733
+16734
+16735
+16736
+16737
+16738
+16739
+16740
+16741
+16742
+16743
+16744
+16745
+16746
+16747
+16748
+16749
+16750
+16751
+16752
+16753
+16754
+16755
+16756
+16757
+16758
+16759
+16760
+16761
+16762
+16763
+16764
+16765
+16766
+16767
+16768
+16769
+16770
+16771
+16772
+16773
+16774
+16775
+16776
+16777
+16778
+16779
+16780
+16781
+16782
+16783
+16784
+16785
+16786
+16787
+16788
+16789
+16790
+16791
+16792
+16793
+16794
+16795
+16796
+16797
+16798
+16799
+16800
+16801
+16802
+16803
+16804
+16805
+16806
+16807
+16808
+16809
+16810
+16811
+16812
+16813
+16814
+16815
+16816
+16817
+16818
+16819
+16820
+16821
+16822
+16823
+16824
+16825
+16826
+16827
+16828
+16829
+16830
+16831
+16832
+16833
+16834
+16835
+16836
+16837
+16838
+16839
+16840
+16841
+16842
+16843
+16844
+16845
+16846
+16847
+16848
+16849
+16850
+16851
+16852
+16853
+16854
+16855
+16856
+16857
+16858
+16859
+16860
+16861
+16862
+16863
+16864
+16865
+16866
+16867
+16868
+16869
+16870
+16871
+16872
+16873
+16874
+16875
+16876
+16877
+16878
+16879
+16880
+16881
+16882
+16883
+16884
+16885
+16886
+16887
+16888
+16889
+16890
+16891
+16892
+16893
+16894
+16895
+16896
+16897
+16898
+16899
+16900
+16901
+16902
+16903
+16904
+16905
+16906
+16907
+16908
+16909
+16910
+16911
+16912
+16913
+16914
+16915
+16916
+16917
+16918
+16919
+16920
+16921
+16922
+16923
+16924
+16925
+16926
+16927
+16928
+16929
+16930
+16931
+16932
+16933
+16934
+16935
+16936
+16937
+16938
+16939
+16940
+16941
+16942
+16943
+16944
+16945
+16946
+16947
+16948
+16949
+16950
+16951
+16952
+16953
+16954
+16955
+16956
+16957
+16958
+16959
+16960
+16961
+16962
+16963
+16964
+16965
+16966
+16967
+16968
+16969
+16970
+16971
+16972
+16973
+16974
+16975
+16976
+16977
+16978
+16979
+16980
+16981
+16982
+16983
+16984
+16985
+16986
+16987
+16988
+16989
+16990
+16991
+16992
+16993
+16994
+16995
+16996
+16997
+16998
+16999
+17000
+17001
+17002
+17003
+17004
+17005
+17006
+17007
+17008
+17009
+17010
+17011
+17012
+17013
+17014
+17015
+17016
+17017
+17018
+17019
+17020
+17021
+17022
+17023
+17024
+17025
+17026
+17027
+17028
+17029
+17030
+17031
+17032
+17033
+17034
+17035
+17036
+17037
+17038
+17039
+17040
+17041
+17042
+17043
+17044
+17045
+17046
+17047
+17048
+17049
+17050
+17051
+17052
+17053
+17054
+17055
+17056
+17057
+17058
+17059
+17060
+17061
+17062
+17063
+17064
+17065
+17066
+17067
+17068
+17069
+17070
+17071
+17072
+17073
+17074
+17075
+17076
+17077
+17078
+17079
+17080
+17081
+17082
+17083
+17084
+17085
+17086
+17087
+17088
+17089
+17090
+17091
+17092
+17093
+17094
+17095
+17096
+17097
+17098
+17099
+17100
+17101
+17102
+17103
+17104
+17105
+17106
+17107
+17108
+17109
+17110
+17111
+17112
+17113
+17114
+17115
+17116
+17117
+17118
+17119
+17120
+17121
+17122
+17123
+17124
+17125
+17126
+17127
+17128
+17129
+17130
+17131
+17132
+17133
+17134
+17135
+17136
+17137
+17138
+17139
+17140
+17141
+17142
+17143
+17144
+17145
+17146
+17147
+17148
+17149
+17150
+17151
+17152
+17153
+17154
+17155
+17156
+17157
+17158
+17159
+17160
+17161
+17162
+17163
+17164
+17165
+17166
+17167
+17168
+17169
+17170
+17171
+17172
+17173
+17174
+17175
+17176
+17177
+17178
+17179
+17180
+17181
+17182
+17183
+17184
+17185
+17186
+17187
+17188
+17189
+17190
+17191
+17192
+17193
+17194
+17195
+17196
+17197
+17198
+17199
+17200
+17201
+17202
+17203
+17204
+17205
+17206
+17207
+17208
+17209
+17210
+17211
+17212
+17213
+17214
+17215
+17216
+17217
+17218
+17219
+17220
+17221
+17222
+17223
+17224
+17225
+17226
+17227
+17228
+17229
+17230
+17231
+17232
+17233
+17234
+17235
+17236
+17237
+17238
+17239
+17240
+17241
+17242
+17243
+17244
+17245
+17246
+17247
+17248
+17249
+17250
+17251
+17252
+17253
+17254
+17255
+17256
+17257
+17258
+17259
+17260
+17261
+17262
+17263
+17264
+17265
+17266
+17267
+17268
+17269
+17270
+17271
+17272
+17273
+17274
+17275
+17276
+17277
+17278
+17279
+17280
+17281
+17282
+17283
+17284
+17285
+17286
+17287
+17288
+17289
+17290
+17291
+17292
+17293
+17294
+17295
+17296
+17297
+17298
+17299
+17300
+17301
+17302
+17303
+17304
+17305
+17306
+17307
+17308
+17309
+17310
+17311
+17312
+17313
+17314
+17315
+17316
+17317
+17318
+17319
+17320
+17321
+17322
+17323
+17324
+17325
+17326
+17327
+17328
+17329
+17330
+17331
+17332
+17333
+17334
+17335
+17336
+17337
+17338
+17339
+17340
+17341
+17342
+17343
+17344
+17345
+17346
+17347
+17348
+17349
+17350
+17351
+17352
+17353
+17354
+17355
+17356
+17357
+17358
+17359
+17360
+17361
+17362
+17363
+17364
+17365
+17366
+17367
+17368
+17369
+17370
+17371
+17372
+17373
+17374
+17375
+17376
+17377
+17378
+17379
+17380
+17381
+17382
+17383
+17384
+17385
+17386
+17387
+17388
+17389
+17390
+17391
+17392
+17393
+17394
+17395
+17396
+17397
+17398
+17399
+17400
+17401
+17402
+17403
+17404
+17405
+17406
+17407
+17408
+17409
+17410
+17411
+17412
+17413
+17414
+17415
+17416
+17417
+17418
+17419
+17420
+17421
+17422
+17423
+17424
+17425
+17426
+17427
+17428
+17429
+17430
+17431
+17432
+17433
+17434
+17435
+17436
+17437
+17438
+17439
+17440
+17441
+17442
+17443
+17444
+17445
+17446
+17447
+17448
+17449
+17450
+17451
+17452
+17453
+17454
+17455
+17456
+17457
+17458
+17459
+17460
+17461
+17462
+17463
+17464
+17465
+17466
+17467
+17468
+17469
+17470
+17471
+17472
+17473
+17474
+17475
+17476
+17477
+17478
+17479
+17480
+17481
+17482
+17483
+17484
+17485
+17486
+17487
+17488
+17489
+17490
+17491
+17492
+17493
+17494
+17495
+17496
+17497
+17498
+17499
+17500
+17501
+17502
+17503
+17504
+17505
+17506
+17507
+17508
+17509
+17510
+17511
+17512
+17513
+17514
+17515
+17516
+17517
+17518
+17519
+17520
+17521
+17522
+17523
+17524
+17525
+17526
+17527
+17528
+17529
+17530
+17531
+17532
+17533
+17534
+17535
+17536
+17537
+17538
+17539
+17540
+17541
+17542
+17543
+17544
+17545
+17546
+17547
+17548
+17549
+17550
+17551
+17552
+17553
+17554
+17555
+17556
+17557
+17558
+17559
+17560
+17561
+17562
+17563
+17564
+17565
+17566
+17567
+17568
+17569
+17570
+17571
+17572
+17573
+17574
+17575
+17576
+17577
+17578
+17579
+17580
+17581
+17582
+17583
+17584
+17585
+17586
+17587
+17588
+17589
+17590
+17591
+17592
+17593
+17594
+17595
+17596
+17597
+17598
+17599
+17600
+17601
+17602
+17603
+17604
+17605
+17606
+17607
+17608
+17609
+17610
+17611
+17612
+17613
+17614
+17615
+17616
+17617
+17618
+17619
+17620
+17621
+17622
+17623
+17624
+17625
+17626
+17627
+17628
+17629
+17630
+17631
+17632
+17633
+17634
+17635
+17636
+17637
+17638
+17639
+17640
+17641
+17642
+17643
+17644
+17645
+17646
+17647
+17648
+17649
+17650
+17651
+17652
+17653
+17654
+17655
+17656
+17657
+17658
+17659
+17660
+17661
+17662
+17663
+17664
+17665
+17666
+17667
+17668
+17669
+17670
+17671
+17672
+17673
+17674
+17675
+17676
+17677
+17678
+17679
+17680
+17681
+17682
+17683
+17684
+17685
+17686
+17687
+17688
+17689
+17690
+17691
+17692
+17693
+17694
+17695
+17696
+17697
+17698
+17699
+17700
+17701
+17702
+17703
+17704
+17705
+17706
+17707
+17708
+17709
+17710
+17711
+17712
+17713
+17714
+17715
+17716
+17717
+17718
+17719
+17720
+17721
+17722
+17723
+17724
+17725
+17726
+17727
+17728
+17729
+17730
+17731
+17732
+17733
+17734
+17735
+17736
+17737
+17738
+17739
+17740
+17741
+17742
+17743
+17744
+17745
+17746
+17747
+17748
+17749
+17750
+17751
+17752
+17753
+17754
+17755
+17756
+17757
+17758
+17759
+17760
+17761
+17762
+17763
+17764
+17765
+17766
+17767
+17768
+17769
+17770
+17771
+17772
+17773
+17774
+17775
+17776
+17777
+17778
+17779
+17780
+17781
+17782
+17783
+17784
+17785
+17786
+17787
+17788
+17789
+17790
+17791
+17792
+17793
+17794
+17795
+17796
+17797
+17798
+17799
+17800
+17801
+17802
+17803
+17804
+17805
+17806
+17807
+17808
+17809
+17810
+17811
+17812
+17813
+17814
+17815
+17816
+17817
+17818
+17819
+17820
+17821
+17822
+17823
+17824
+17825
+17826
+17827
+17828
+17829
+17830
+17831
+17832
+17833
+17834
+17835
+17836
+17837
+17838
+17839
+17840
+17841
+17842
+17843
+17844
+17845
+17846
+17847
+17848
+17849
+17850
+17851
+17852
+17853
+17854
+17855
+17856
+17857
+17858
+17859
+17860
+17861
+17862
+17863
+17864
+17865
+17866
+17867
+17868
+17869
+17870
+17871
+17872
+17873
+17874
+17875
+17876
+17877
+17878
+17879
+17880
+17881
+17882
+17883
+17884
+17885
+17886
+17887
+17888
+17889
+17890
+17891
+17892
+17893
+17894
+17895
+17896
+17897
+17898
+17899
+17900
+17901
+17902
+17903
+17904
+17905
+17906
+17907
+17908
+17909
+17910
+17911
+17912
+17913
+17914
+17915
+17916
+17917
+17918
+17919
+17920
+17921
+17922
+17923
+17924
+17925
+17926
+17927
+17928
+17929
+17930
+17931
+17932
+17933
+17934
+17935
+17936
+17937
+17938
+17939
+17940
+17941
+17942
+17943
+17944
+17945
+17946
+17947
+17948
+17949
+17950
+17951
+17952
+17953
+17954
+17955
+17956
+17957
+17958
+17959
+17960
+17961
+17962
+17963
+17964
+17965
+17966
+17967
+17968
+17969
+17970
+17971
+17972
+17973
+17974
+17975
+17976
+17977
+17978
+17979
+17980
+17981
+17982
+17983
+17984
+17985
+17986
+17987
+17988
+17989
+17990
+17991
+17992
+17993
+17994
+17995
+17996
+17997
+17998
+17999
+18000
+18001
+18002
+18003
+18004
+18005
+18006
+18007
+18008
+18009
+18010
+18011
+18012
+18013
+18014
+18015
+18016
+18017
+18018
+18019
+18020
+18021
+18022
+18023
+18024
+18025
+18026
+18027
+18028
+18029
+18030
+18031
+18032
+18033
+18034
+18035
+18036
+18037
+18038
+18039
+18040
+18041
+18042
+18043
+18044
+18045
+18046
+18047
+18048
+18049
+18050
+18051
+18052
+18053
+18054
+18055
+18056
+18057
+18058
+18059
+18060
+18061
+18062
+18063
+18064
+18065
+18066
+18067
+18068
+18069
+18070
+18071
+18072
+18073
+18074
+18075
+18076
+18077
+18078
+18079
+18080
+18081
+18082
+18083
+18084
+18085
+18086
+18087
+18088
+18089
+18090
+18091
+18092
+18093
+18094
+18095
+18096
+18097
+18098
+18099
+18100
+18101
+18102
+18103
+18104
+18105
+18106
+18107
+18108
+18109
+18110
+18111
+18112
+18113
+18114
+18115
+18116
+18117
+18118
+18119
+18120
+18121
+18122
+18123
+18124
+18125
+18126
+18127
+18128
+18129
+18130
+18131
+18132
+18133
+18134
+18135
+18136
+18137
+18138
+18139
+18140
+18141
+18142
+18143
+18144
+18145
+18146
+18147
+18148
+18149
+18150
+18151
+18152
+18153
+18154
+18155
+18156
+18157
+18158
+18159
+18160
+18161
+18162
+18163
+18164
+18165
+18166
+18167
+18168
+18169
+18170
+18171
+18172
+18173
+18174
+18175
+18176
+18177
+18178
+18179
+18180
+18181
+18182
+18183
+18184
+18185
+18186
+18187
+18188
+18189
+18190
+18191
+18192
+18193
+18194
+18195
+18196
+18197
+18198
+18199
+18200
+18201
+18202
+18203
+18204
+18205
+18206
+18207
+18208
+18209
+18210
+18211
+18212
+18213
+18214
+18215
+18216
+18217
+18218
+18219
+18220
+18221
+18222
+18223
+18224
+18225
+18226
+18227
+18228
+18229
+18230
+18231
+18232
+18233
+18234
+18235
+18236
+18237
+18238
+18239
+18240
+18241
+18242
+18243
+18244
+18245
+18246
+18247
+18248
+18249
+18250
+18251
+18252
+18253
+18254
+18255
+18256
+18257
+18258
+18259
+18260
+18261
+18262
+18263
+18264
+18265
+18266
+18267
+18268
+18269
+18270
+18271
+18272
+18273
+18274
+18275
+18276
+18277
+18278
+18279
+18280
+18281
+18282
+18283
+18284
+18285
+18286
+18287
+18288
+18289
+18290
+18291
+18292
+18293
+18294
+18295
+18296
+18297
+18298
+18299
+18300
+18301
+18302
+18303
+18304
+18305
+18306
+18307
+18308
+18309
+18310
+18311
+18312
+18313
+18314
+18315
+18316
+18317
+18318
+18319
+18320
+18321
+18322
+18323
+18324
+18325
+18326
+18327
+18328
+18329
+18330
+18331
+18332
+18333
+18334
+18335
+18336
+18337
+18338
+18339
+18340
+18341
+18342
+18343
+18344
+18345
+18346
+18347
+18348
+18349
+18350
+18351
+18352
+18353
+18354
+18355
+18356
+18357
+18358
+18359
+18360
+18361
+18362
+18363
+18364
+18365
+18366
+18367
+18368
+18369
+18370
+18371
+18372
+18373
+18374
+18375
+18376
+18377
+18378
+18379
+18380
+18381
+18382
+18383
+18384
+18385
+18386
+18387
+18388
+18389
+18390
+18391
+18392
+18393
+18394
+18395
+18396
+18397
+18398
+18399
+18400
+18401
+18402
+18403
+18404
+18405
+18406
+18407
+18408
+18409
+18410
+18411
+18412
+18413
+18414
+18415
+18416
+18417
+18418
+18419
+18420
+18421
+18422
+18423
+18424
+18425
+18426
+18427
+18428
+18429
+18430
+18431
+18432
+18433
+18434
+18435
+18436
+18437
+18438
+18439
+18440
+18441
+18442
+18443
+18444
+18445
+18446
+18447
+18448
+18449
+18450
+18451
+18452
+18453
+18454
+18455
+18456
+18457
+18458
+18459
+18460
+18461
+18462
+18463
+18464
+18465
+18466
+18467
+18468
+18469
+18470
+18471
+18472
+18473
+18474
+18475
+18476
+18477
+18478
+18479
+18480
+18481
+18482
+18483
+18484
+18485
+18486
+18487
+18488
+18489
+18490
+18491
+18492
+18493
+18494
+18495
+18496
+18497
+18498
+18499
+18500
+18501
+18502
+18503
+18504
+18505
+18506
+18507
+18508
+18509
+18510
+18511
+18512
+18513
+18514
+18515
+18516
+18517
+18518
+18519
+18520
+18521
+18522
+18523
+18524
+18525
+18526
+18527
+18528
+18529
+18530
+18531
+18532
+18533
+18534
+18535
+18536
+18537
+18538
+18539
+18540
+18541
+18542
+18543
+18544
+18545
+18546
+18547
+18548
+18549
+18550
+18551
+18552
+18553
+18554
+18555
+18556
+18557
+18558
+18559
+18560
+18561
+18562
+18563
+18564
+18565
+18566
+18567
+18568
+18569
+18570
+18571
+18572
+18573
+18574
+18575
+18576
+18577
+18578
+18579
+18580
+18581
+18582
+18583
+18584
+18585
+18586
+18587
+18588
+18589
+18590
+18591
+18592
+18593
+18594
+18595
+18596
+18597
+18598
+18599
+18600
+18601
+18602
+18603
+18604
+18605
+18606
+18607
+18608
+18609
+18610
+18611
+18612
+18613
+18614
+18615
+18616
+18617
+18618
+18619
+18620
+18621
+18622
+18623
+18624
+18625
+18626
+18627
+18628
+18629
+18630
+18631
+18632
+18633
+18634
+18635
+18636
+18637
+18638
+18639
+18640
+18641
+18642
+18643
+18644
+18645
+18646
+18647
+18648
+18649
+18650
+18651
+18652
+18653
+18654
+18655
+18656
+18657
+18658
+18659
+18660
+18661
+18662
+18663
+18664
+18665
+18666
+18667
+18668
+18669
+18670
+18671
+18672
+18673
+18674
+18675
+18676
+18677
+18678
+18679
+18680
+18681
+18682
+18683
+18684
+18685
+18686
+18687
+18688
+18689
+18690
+18691
+18692
+18693
+18694
+18695
+18696
+18697
+18698
+18699
+18700
+18701
+18702
+18703
+18704
+18705
+18706
+18707
+18708
+18709
+18710
+18711
+18712
+18713
+18714
+18715
+18716
+18717
+18718
+18719
+18720
+18721
+18722
+18723
+18724
+18725
+18726
+18727
+18728
+18729
+18730
+18731
+18732
+18733
+18734
+18735
+18736
+18737
+18738
+18739
+18740
+18741
+18742
+18743
+18744
+18745
+18746
+18747
+18748
+18749
+18750
+18751
+18752
+18753
+18754
+18755
+18756
+18757
+18758
+18759
+18760
+18761
+18762
+18763
+18764
+18765
+18766
+18767
+18768
+18769
+18770
+18771
+18772
+18773
+18774
+18775
+18776
+18777
+18778
+18779
+18780
+18781
+18782
+18783
+18784
+18785
+18786
+18787
+18788
+18789
+18790
+18791
+18792
+18793
+18794
+18795
+18796
+18797
+18798
+18799
+18800
+18801
+18802
+18803
+18804
+18805
+18806
+18807
+18808
+18809
+18810
+18811
+18812
+18813
+18814
+18815
+18816
+18817
+18818
+18819
+18820
+18821
+18822
+18823
+18824
+18825
+18826
+18827
+18828
+18829
+18830
+18831
+18832
+18833
+18834
+18835
+18836
+18837
+18838
+18839
+18840
+18841
+18842
+18843
+18844
+18845
+18846
+18847
+18848
+18849
+18850
+18851
+18852
+18853
+18854
+18855
+18856
+18857
+18858
+18859
+18860
+18861
+18862
+18863
+18864
+18865
+18866
+18867
+18868
+18869
+18870
+18871
+18872
+18873
+18874
+18875
+18876
+18877
+18878
+18879
+18880
+18881
+18882
+18883
+18884
+18885
+18886
+18887
+18888
+18889
+18890
+18891
+18892
+18893
+18894
+18895
+18896
+18897
+18898
+18899
+18900
+18901
+18902
+18903
+18904
+18905
+18906
+18907
+18908
+18909
+18910
+18911
+18912
+18913
+18914
+18915
+18916
+18917
+18918
+18919
+18920
+18921
+18922
+18923
+18924
+18925
+18926
+18927
+18928
+18929
+18930
+18931
+18932
+18933
+18934
+18935
+18936
+18937
+18938
+18939
+18940
+18941
+18942
+18943
+18944
+18945
+18946
+18947
+18948
+18949
+18950
+18951
+18952
+18953
+18954
+18955
+18956
+18957
+18958
+18959
+18960
+18961
+18962
+18963
+18964
+18965
+18966
+18967
+18968
+18969
+18970
+18971
+18972
+18973
+18974
+18975
+18976
+18977
+18978
+18979
+18980
+18981
+18982
+18983
+18984
+18985
+18986
+18987
+18988
+18989
+18990
+18991
+18992
+18993
+18994
+18995
+18996
+18997
+18998
+18999
+19000
+19001
+19002
+19003
+19004
+19005
+19006
+19007
+19008
+19009
+19010
+19011
+19012
+19013
+19014
+19015
+19016
+19017
+19018
+19019
+19020
+19021
+19022
+19023
+19024
+19025
+19026
+19027
+19028
+19029
+19030
+19031
+19032
+19033
+19034
+19035
+19036
+19037
+19038
+19039
+19040
+19041
+19042
+19043
+19044
+19045
+19046
+19047
+19048
+19049
+19050
+19051
+19052
+19053
+19054
+19055
+19056
+19057
+19058
+19059
+19060
+19061
+19062
+19063
+19064
+19065
+19066
+19067
+19068
+19069
+19070
+19071
+19072
+19073
+19074
+19075
+19076
+19077
+19078
+19079
+19080
+19081
+19082
+19083
+19084
+19085
+19086
+19087
+19088
+19089
+19090
+19091
+19092
+19093
+19094
+19095
+19096
+19097
+19098
+19099
+19100
+19101
+19102
+19103
+19104
+19105
+19106
+19107
+19108
+19109
+19110
+19111
+19112
+19113
+19114
+19115
+19116
+19117
+19118
+19119
+19120
+19121
+19122
+19123
+19124
+19125
+19126
+19127
+19128
+19129
+19130
+19131
+19132
+19133
+19134
+19135
+19136
+19137
+19138
+19139
+19140
+19141
+19142
+19143
+19144
+19145
+19146
+19147
+19148
+19149
+19150
+19151
+19152
+19153
+19154
+19155
+19156
+19157
+19158
+19159
+19160
+19161
+19162
+19163
+19164
+19165
+19166
+19167
+19168
+19169
+19170
+19171
+19172
+19173
+19174
+19175
+19176
+19177
+19178
+19179
+19180
+19181
+19182
+19183
+19184
+19185
+19186
+19187
+19188
+19189
+19190
+19191
+19192
+19193
+19194
+19195
+19196
+19197
+19198
+19199
+19200
+19201
+19202
+19203
+19204
+19205
+19206
+19207
+19208
+19209
+19210
+19211
+19212
+19213
+19214
+19215
+19216
+19217
+19218
+19219
+19220
+19221
+19222
+19223
+19224
+19225
+19226
+19227
+19228
+19229
+19230
+19231
+19232
+19233
+19234
+19235
+19236
+19237
+19238
+19239
+19240
+19241
+19242
+19243
+19244
+19245
+19246
+19247
+19248
+19249
+19250
+19251
+19252
+19253
+19254
+19255
+19256
+19257
+19258
+19259
+19260
+19261
+19262
+19263
+19264
+19265
+19266
+19267
+19268
+19269
+19270
+19271
+19272
+19273
+19274
+19275
+19276
+19277
+19278
+19279
+19280
+19281
+19282
+19283
+19284
+19285
+19286
+19287
+19288
+19289
+19290
+19291
+19292
+19293
+19294
+19295
+19296
+19297
+19298
+19299
+19300
+19301
+19302
+19303
+19304
+19305
+19306
+19307
+19308
+19309
+19310
+19311
+19312
+19313
+19314
+19315
+19316
+19317
+19318
+19319
+19320
+19321
+19322
+19323
+19324
+19325
+19326
+19327
+19328
+19329
+19330
+19331
+19332
+19333
+19334
+19335
+19336
+19337
+19338
+19339
+19340
+19341
+19342
+19343
+19344
+19345
+19346
+19347
+19348
+19349
+19350
+19351
+19352
+19353
+19354
+19355
+19356
+19357
+19358
+19359
+19360
+19361
+19362
+19363
+19364
+19365
+19366
+19367
+19368
+19369
+19370
+19371
+19372
+19373
+19374
+19375
+19376
+19377
+19378
+19379
+19380
+19381
+19382
+19383
+19384
+19385
+19386
+19387
+19388
+19389
+19390
+19391
+19392
+19393
+19394
+19395
+19396
+19397
+19398
+19399
+19400
+19401
+19402
+19403
+19404
+19405
+19406
+19407
+19408
+19409
+19410
+19411
+19412
+19413
+19414
+19415
+19416
+19417
+19418
+19419
+19420
+19421
+19422
+19423
+19424
+19425
+19426
+19427
+19428
+19429
+19430
+19431
+19432
+19433
+19434
+19435
+19436
+19437
+19438
+19439
+19440
+19441
+19442
+19443
+19444
+19445
+19446
+19447
+19448
+19449
+19450
+19451
+19452
+19453
+19454
+19455
+19456
+19457
+19458
+19459
+19460
+19461
+19462
+19463
+19464
+19465
+19466
+19467
+19468
+19469
+19470
+19471
+19472
+19473
+19474
+19475
+19476
+19477
+19478
+19479
+19480
+19481
+19482
+19483
+19484
+19485
+19486
+19487
+19488
+19489
+19490
+19491
+19492
+19493
+19494
+19495
+19496
+19497
+19498
+19499
+19500
+19501
+19502
+19503
+19504
+19505
+19506
+19507
+19508
+19509
+19510
+19511
+19512
+19513
+19514
+19515
+19516
+19517
+19518
+19519
+19520
+19521
+19522
+19523
+19524
+19525
+19526
+19527
+19528
+19529
+19530
+19531
+19532
+19533
+19534
+19535
+19536
+19537
+19538
+19539
+19540
+19541
+19542
+19543
+19544
+19545
+19546
+19547
+19548
+19549
+19550
+19551
+19552
+19553
+19554
+19555
+19556
+19557
+19558
+19559
+19560
+19561
+19562
+19563
+19564
+19565
+19566
+19567
+19568
+19569
+19570
+19571
+19572
+19573
+19574
+19575
+19576
+19577
+19578
+19579
+19580
+19581
+19582
+19583
+19584
+19585
+19586
+19587
+19588
+19589
+19590
+19591
+19592
+19593
+19594
+19595
+19596
+19597
+19598
+19599
+19600
+19601
+19602
+19603
+19604
+19605
+19606
+19607
+19608
+19609
+19610
+19611
+19612
+19613
+19614
+19615
+19616
+19617
+19618
+19619
+19620
+19621
+19622
+19623
+19624
+19625
+19626
+19627
+19628
+19629
+19630
+19631
+19632
+19633
+19634
+19635
+19636
+19637
+19638
+19639
+19640
+19641
+19642
+19643
+19644
+19645
+19646
+19647
+19648
+19649
+19650
+19651
+19652
+19653
+19654
+19655
+19656
+19657
+19658
+19659
+19660
+19661
+19662
+19663
+19664
+19665
+19666
+19667
+19668
+19669
+19670
+19671
+19672
+19673
+19674
+19675
+19676
+19677
+19678
+19679
+19680
+19681
+19682
+19683
+19684
+19685
+19686
+19687
+19688
+19689
+19690
+19691
+19692
+19693
+19694
+19695
+19696
+19697
+19698
+19699
+19700
+19701
+19702
+19703
+19704
+19705
+19706
+19707
+19708
+19709
+19710
+19711
+19712
+19713
+19714
+19715
+19716
+19717
+19718
+19719
+19720
+19721
+19722
+19723
+19724
+19725
+19726
+19727
+19728
+19729
+19730
+19731
+19732
+19733
+19734
+19735
+19736
+19737
+19738
+19739
+19740
+19741
+19742
+19743
+19744
+19745
+19746
+19747
+19748
+19749
+19750
+19751
+19752
+19753
+19754
+19755
+19756
+19757
+19758
+19759
+19760
+19761
+19762
+19763
+19764
+19765
+19766
+19767
+19768
+19769
+19770
+19771
+19772
+19773
+19774
+19775
+19776
+19777
+19778
+19779
+19780
+19781
+19782
+19783
+19784
+19785
+19786
+19787
+19788
+19789
+19790
+19791
+19792
+19793
+19794
+19795
+19796
+19797
+19798
+19799
+19800
+19801
+19802
+19803
+19804
+19805
+19806
+19807
+19808
+19809
+19810
+19811
+19812
+19813
+19814
+19815
+19816
+19817
+19818
+19819
+19820
+19821
+19822
+19823
+19824
+19825
+19826
+19827
+19828
+19829
+19830
+19831
+19832
+19833
+19834
+19835
+19836
+19837
+19838
+19839
+19840
+19841
+19842
+19843
+19844
+19845
+19846
+19847
+19848
+19849
+19850
+19851
+19852
+19853
+19854
+19855
+19856
+19857
+19858
+19859
+19860
+19861
+19862
+19863
+19864
+19865
+19866
+19867
+19868
+19869
+19870
+19871
+19872
+19873
+19874
+19875
+19876
+19877
+19878
+19879
+19880
+19881
+19882
+19883
+19884
+19885
+19886
+19887
+19888
+19889
+19890
+19891
+19892
+19893
+19894
+19895
+19896
+19897
+19898
+19899
+19900
+19901
+19902
+19903
+19904
+19905
+19906
+19907
+19908
+19909
+19910
+19911
+19912
+19913
+19914
+19915
+19916
+19917
+19918
+19919
+19920
+19921
+19922
+19923
+19924
+19925
+19926
+19927
+19928
+19929
+19930
+19931
+19932
+19933
+19934
+19935
+19936
+19937
+19938
+19939
+19940
+19941
+19942
+19943
+19944
+19945
+19946
+19947
+19948
+19949
+19950
+19951
+19952
+19953
+19954
+19955
+19956
+19957
+19958
+19959
+19960
+19961
+19962
+19963
+19964
+19965
+19966
+19967
+19968
+19969
+19970
+19971
+19972
+19973
+19974
+19975
+19976
+19977
+19978
+19979
+19980
+19981
+19982
+19983
+19984
+19985
+19986
+19987
+19988
+19989
+19990
+19991
+19992
+19993
+19994
+19995
+19996
+19997
+19998
+19999
+20000
+20001
+20002
+20003
+20004
+20005
+20006
+20007
+20008
+20009
+20010
+20011
+20012
+20013
+20014
+20015
+20016
+20017
+20018
+20019
+20020
+20021
+20022
+20023
+20024
+20025
+20026
+20027
+20028
+20029
+20030
+20031
+20032
+20033
+20034
+20035
+20036
+20037
+20038
+20039
+20040
+20041
+20042
+20043
+20044
+20045
+20046
+20047
+20048
+20049
+20050
+20051
+20052
+20053
+20054
+20055
+20056
+20057
+20058
+20059
+20060
+20061
+20062
+20063
+20064
+20065
+20066
+20067
+20068
+20069
+20070
+20071
+20072
+20073
+20074
+20075
+20076
+20077
+20078
+20079
+20080
+20081
+20082
+20083
+20084
+20085
+20086
+20087
+20088
+20089
+20090
+20091
+20092
+20093
+20094
+20095
+20096
+20097
+20098
+20099
+20100
+20101
+20102
+20103
+20104
+20105
+20106
+20107
+20108
+20109
+20110
+20111
+20112
+20113
+20114
+20115
+20116
+20117
+20118
+20119
+20120
+20121
+20122
+20123
+20124
+20125
+20126
+20127
+20128
+20129
+20130
+20131
+20132
+20133
+20134
+20135
+20136
+20137
+20138
+20139
+20140
+20141
+20142
+20143
+20144
+20145
+20146
+20147
+20148
+20149
+20150
+20151
+20152
+20153
+20154
+20155
+20156
+20157
+20158
+20159
+20160
+20161
+20162
+20163
+20164
+20165
+20166
+20167
+20168
+20169
+20170
+20171
+20172
+20173
+20174
+20175
+20176
+20177
+20178
+20179
+20180
+20181
+20182
+20183
+20184
+20185
+20186
+20187
+20188
+20189
+20190
+20191
+20192
+20193
+20194
+20195
+20196
+20197
+20198
+20199
+20200
+20201
+20202
+20203
+20204
+20205
+20206
+20207
+20208
+20209
+20210
+20211
+20212
+20213
+20214
+20215
+20216
+20217
+20218
+20219
+20220
+20221
+20222
+20223
+20224
+20225
+20226
+20227
+20228
+20229
+20230
+20231
+20232
+20233
+20234
+20235
+20236
+20237
+20238
+20239
+20240
+20241
+20242
+20243
+20244
+20245
+20246
+20247
+20248
+20249
+20250
+20251
+20252
+20253
+20254
+20255
+20256
+20257
+20258
+20259
+20260
+20261
+20262
+20263
+20264
+20265
+20266
+20267
+20268
+20269
+20270
+20271
+20272
+20273
+20274
+20275
+20276
+20277
+20278
+20279
+20280
+20281
+20282
+20283
+20284
+20285
+20286
+20287
+20288
+20289
+20290
+20291
+20292
+20293
+20294
+20295
+20296
+20297
+20298
+20299
+20300
+20301
+20302
+20303
+20304
+20305
+20306
+20307
+20308
+20309
+20310
+20311
+20312
+20313
+20314
+20315
+20316
+20317
+20318
+20319
+20320
+20321
+20322
+20323
+20324
+20325
+20326
+20327
+20328
+20329
+20330
+20331
+20332
+20333
+20334
+20335
+20336
+20337
+20338
+20339
+20340
+20341
+20342
+20343
+20344
+20345
+20346
+20347
+20348
+20349
+20350
+20351
+20352
+20353
+20354
+20355
+20356
+20357
+20358
+20359
+20360
+20361
+20362
+20363
+20364
+20365
+20366
+20367
+20368
+20369
+20370
+20371
+20372
+20373
+20374
+20375
+20376
+20377
+20378
+20379
+20380
+20381
+20382
+20383
+20384
+20385
+20386
+20387
+20388
+20389
+20390
+20391
+20392
+20393
+20394
+20395
+20396
+20397
+20398
+20399
+20400
+20401
+20402
+20403
+20404
+20405
+20406
+20407
+20408
+20409
+20410
+20411
+20412
+20413
+20414
+20415
+20416
+20417
+20418
+20419
+20420
+20421
+20422
+20423
+20424
+20425
+20426
+20427
+20428
+20429
+20430
+20431
+20432
+20433
+20434
+20435
+20436
+20437
+20438
+20439
+20440
+20441
+20442
+20443
+20444
+20445
+20446
+20447
+20448
+20449
+20450
+20451
+20452
+20453
+20454
+20455
+20456
+20457
+20458
+20459
+20460
+20461
+20462
+20463
+20464
+20465
+20466
+20467
+20468
+20469
+20470
+20471
+20472
+20473
+20474
+20475
+20476
+20477
+20478
+20479
+20480
+20481
+20482
+20483
+20484
+20485
+20486
+20487
+20488
+20489
+20490
+20491
+20492
+20493
+20494
+20495
+20496
+20497
+20498
+20499
+20500
+20501
+20502
+20503
+20504
+20505
+20506
+20507
+20508
+20509
+20510
+20511
+20512
+20513
+20514
+20515
+20516
+20517
+20518
+20519
+20520
+20521
+20522
+20523
+20524
+20525
+20526
+20527
+20528
+20529
+20530
+20531
+20532
+20533
+20534
+20535
+20536
+20537
+20538
+20539
+20540
+20541
+20542
+20543
+20544
+20545
+20546
+20547
+20548
+20549
+20550
+20551
+20552
+20553
+20554
+20555
+20556
+20557
+20558
+20559
+20560
+20561
+20562
+20563
+20564
+20565
+20566
+20567
+20568
+20569
+20570
+20571
+20572
+20573
+20574
+20575
+20576
+20577
+20578
+20579
+20580
+20581
+20582
+20583
+20584
+20585
+20586
+20587
+20588
+20589
+20590
+20591
+20592
+20593
+20594
+20595
+20596
+20597
+20598
+20599
+20600
+20601
+20602
+20603
+20604
+20605
+20606
+20607
+20608
+20609
+20610
+20611
+20612
+20613
+20614
+20615
+20616
+20617
+20618
+20619
+20620
+20621
+20622
+20623
+20624
+20625
+20626
+20627
+20628
+20629
+20630
+20631
+20632
+20633
+20634
+20635
+20636
+20637
+20638
+20639
+20640
+20641
+20642
+20643
+20644
+20645
+20646
+20647
+20648
+20649
+20650
+20651
+20652
+20653
+20654
+20655
+20656
+20657
+20658
+20659
+20660
+20661
+20662
+20663
+20664
+20665
+20666
+20667
+20668
+20669
+20670
+20671
+20672
+20673
+20674
+20675
+20676
+20677
+20678
+20679
+20680
+20681
+20682
+20683
+20684
+20685
+20686
+20687
+20688
+20689
+20690
+20691
+20692
+20693
+20694
+20695
+20696
+20697
+20698
+20699
+20700
+20701
+20702
+20703
+20704
+20705
+20706
+20707
+20708
+20709
+20710
+20711
+20712
+20713
+20714
+20715
+20716
+20717
+20718
+20719
+20720
+20721
+20722
+20723
+20724
+20725
+20726
+20727
+20728
+20729
+20730
+20731
+20732
+20733
+20734
+20735
+20736
+20737
+20738
+20739
+20740
+20741
+20742
+20743
+20744
+20745
+20746
+20747
+20748
+20749
+20750
+20751
+20752
+20753
+20754
+20755
+20756
+20757
+20758
+20759
+20760
+20761
+20762
+20763
+20764
+20765
+20766
+20767
+20768
+20769
+20770
+20771
+20772
+20773
+20774
+20775
+20776
+20777
+20778
+20779
+20780
+20781
+20782
+20783
+20784
+20785
+20786
+20787
+20788
+20789
+20790
+20791
+20792
+20793
+20794
+20795
+20796
+20797
+20798
+20799
+20800
+20801
+20802
+20803
+20804
+20805
+20806
+20807
+20808
+20809
+20810
+20811
+20812
+20813
+20814
+20815
+20816
+20817
+20818
+20819
+20820
+20821
+20822
+20823
+20824
+20825
+20826
+20827
+20828
+20829
+20830
+20831
+20832
+20833
+20834
+20835
+20836
+20837
+20838
+20839
+20840
+20841
+20842
+20843
+20844
+20845
+20846
+20847
+20848
+20849
+20850
+20851
+20852
+20853
+20854
+20855
+20856
+20857
+20858
+20859
+20860
+20861
+20862
+20863
+20864
+20865
+20866
+20867
+20868
+20869
+20870
+20871
+20872
+20873
+20874
+20875
+20876
+20877
+20878
+20879
+20880
+20881
+20882
+20883
+20884
+20885
+20886
+20887
+20888
+20889
+20890
+20891
+20892
+20893
+20894
+20895
+20896
+20897
+20898
+20899
+20900
+20901
+20902
+20903
+20904
+20905
+20906
+20907
+20908
+20909
+20910
+20911
+20912
+20913
+20914
+20915
+20916
+20917
+20918
+20919
+20920
+20921
+20922
+20923
+20924
+20925
+20926
+20927
+20928
+20929
+20930
+20931
+20932
+20933
+20934
+20935
+20936
+20937
+20938
+20939
+20940
+20941
+20942
+20943
+20944
+20945
+20946
+20947
+20948
+20949
+20950
+20951
+20952
+20953
+20954
+20955
+20956
+20957
+20958
+20959
+20960
+20961
+20962
+20963
+20964
+20965
+20966
+20967
+20968
+20969
+20970
+20971
+20972
+20973
+20974
+20975
+20976
+20977
+20978
+20979
+20980
+20981
+20982
+20983
+20984
+20985
+20986
+20987
+20988
+20989
+20990
+20991
+20992
+20993
+20994
+20995
+20996
+20997
+20998
+20999
+21000
+21001
+21002
+21003
+21004
+21005
+21006
+21007
+21008
+21009
+21010
+21011
+21012
+21013
+21014
+21015
+21016
+21017
+21018
+21019
+21020
+21021
+21022
+21023
+21024
+21025
+21026
+21027
+21028
+21029
+21030
+21031
+21032
+21033
+21034
+21035
+21036
+21037
+21038
+21039
+21040
+21041
+21042
+21043
+21044
+21045
+21046
+21047
+21048
+21049
+21050
+21051
+21052
+21053
+21054
+21055
+21056
+21057
+21058
+21059
+21060
+21061
+21062
+21063
+21064
+21065
+21066
+21067
+21068
+21069
+21070
+21071
+21072
+21073
+21074
+21075
+21076
+21077
+21078
+21079
+21080
+21081
+21082
+21083
+21084
+21085
+21086
+21087
+21088
+21089
+21090
+21091
+21092
+21093
+21094
+21095
+21096
+21097
+21098
+21099
+21100
+21101
+21102
+21103
+21104
+21105
+21106
+21107
+21108
+21109
+21110
+21111
+21112
+21113
+21114
+21115
+21116
+21117
+21118
+21119
+21120
+21121
+21122
+21123
+21124
+21125
+21126
+21127
+21128
+21129
+21130
+21131
+21132
+21133
+21134
+21135
+21136
+21137
+21138
+21139
+21140
+21141
+21142
+21143
+21144
+21145
+21146
+21147
+21148
+21149
+21150
+21151
+21152
+21153
+21154
+21155
+21156
+21157
+21158
+21159
+21160
+21161
+21162
+21163
+21164
+21165
+21166
+21167
+21168
+21169
+21170
+21171
+21172
+21173
+21174
+21175
+21176
+21177
+21178
+21179
+21180
+21181
+21182
+21183
+21184
+21185
+21186
+21187
+21188
+21189
+21190
+21191
+21192
+21193
+21194
+21195
+21196
+21197
+21198
+21199
+21200
+21201
+21202
+21203
+21204
+21205
+21206
+21207
+21208
+21209
+21210
+21211
+21212
+21213
+21214
+21215
+21216
+21217
+21218
+21219
+21220
+21221
+21222
+21223
+21224
+21225
+21226
+21227
+21228
+21229
+21230
+21231
+21232
+21233
+21234
+21235
+21236
+21237
+21238
+21239
+21240
+21241
+21242
+21243
+21244
+21245
+21246
+21247
+21248
+21249
+21250
+21251
+21252
+21253
+21254
+21255
+21256
+21257
+21258
+21259
+21260
+21261
+21262
+21263
+21264
+21265
+21266
+21267
+21268
+21269
+21270
+21271
+21272
+21273
+21274
+21275
+21276
+21277
+21278
+21279
+21280
+21281
+21282
+21283
+21284
+21285
+21286
+21287
+21288
+21289
+21290
+21291
+21292
+21293
+21294
+21295
+21296
+21297
+21298
+21299
+21300
+21301
+21302
+21303
+21304
+21305
+21306
+21307
+21308
+21309
+21310
+21311
+21312
+21313
+21314
+21315
+21316
+21317
+21318
+21319
+21320
+21321
+21322
+21323
+21324
+21325
+21326
+21327
+21328
+21329
+21330
+21331
+21332
+21333
+21334
+21335
+21336
+21337
+21338
+21339
+21340
+21341
+21342
+21343
+21344
+21345
+21346
+21347
+21348
+21349
+21350
+21351
+21352
+21353
+21354
+21355
+21356
+21357
+21358
+21359
+21360
+21361
+21362
+21363
+21364
+21365
+21366
+21367
+21368
+21369
+21370
+21371
+21372
+21373
+21374
+21375
+21376
+21377
+21378
+21379
+21380
+21381
+21382
+21383
+21384
+21385
+21386
+21387
+21388
+21389
+21390
+21391
+21392
+21393
+21394
+21395
+21396
+21397
+21398
+21399
+21400
+21401
+21402
+21403
+21404
+21405
+21406
+21407
+21408
+21409
+21410
+21411
+21412
+21413
+21414
+21415
+21416
+21417
+21418
+21419
+21420
+21421
+21422
+21423
+21424
+21425
+21426
+21427
+21428
+21429
+21430
+21431
+21432
+21433
+21434
+21435
+21436
+21437
+21438
+21439
+21440
+21441
+21442
+21443
+21444
+21445
+21446
+21447
+21448
+21449
+21450
+21451
+21452
+21453
+21454
+21455
+21456
+21457
+21458
+21459
+21460
+21461
+21462
+21463
+21464
+21465
+21466
+21467
+21468
+21469
+21470
+21471
+21472
+21473
+21474
+21475
+21476
+21477
+21478
+21479
+21480
+21481
+21482
+21483
+21484
+21485
+21486
+21487
+21488
+21489
+21490
+21491
+21492
+21493
+21494
+21495
+21496
+21497
+21498
+21499
+21500
+21501
+21502
+21503
+21504
+21505
+21506
+21507
+21508
+21509
+21510
+21511
+21512
+21513
+21514
+21515
+21516
+21517
+21518
+21519
+21520
+21521
+21522
+21523
+21524
+21525
+21526
+21527
+21528
+21529
+21530
+21531
+21532
+21533
+21534
+21535
+21536
+21537
+21538
+21539
+21540
+21541
+21542
+21543
+21544
+21545
+21546
+21547
+21548
+21549
+21550
+21551
+21552
+21553
+21554
+21555
+21556
+21557
+21558
+21559
+21560
+21561
+21562
+21563
+21564
+21565
+21566
+21567
+21568
+21569
+21570
+21571
+21572
+21573
+21574
+21575
+21576
+21577
+21578
+21579
+21580
+21581
+21582
+21583
+21584
+21585
+21586
+21587
+21588
+21589
+21590
+21591
+21592
+21593
+21594
+21595
+21596
+21597
+21598
+21599
+21600
+21601
+21602
+21603
+21604
+21605
+21606
+21607
+21608
+21609
+21610
+21611
+21612
+21613
+21614
+21615
+21616
+21617
+21618
+21619
+21620
+21621
+21622
+21623
+21624
+21625
+21626
+21627
+21628
+21629
+21630
+21631
+21632
+21633
+21634
+21635
+21636
+21637
+21638
+21639
+21640
+21641
+21642
+21643
+21644
+21645
+21646
+21647
+21648
+21649
+21650
+21651
+21652
+21653
+21654
+21655
+21656
+21657
+21658
+21659
+21660
+21661
+21662
+21663
+21664
+21665
+21666
+21667
+21668
+21669
+21670
+21671
+21672
+21673
+21674
+21675
+21676
+21677
+21678
+21679
+21680
+21681
+21682
+21683
+21684
+21685
+21686
+21687
+21688
+21689
+21690
+21691
+21692
+21693
+21694
+21695
+21696
+21697
+21698
+21699
+21700
+21701
+21702
+21703
+21704
+21705
+21706
+21707
+21708
+21709
+21710
+21711
+21712
+21713
+21714
+21715
+21716
+21717
+21718
+21719
+21720
+21721
+21722
+21723
+21724
+21725
+21726
+21727
+21728
+21729
+21730
+21731
+21732
+21733
+21734
+21735
+21736
+21737
+21738
+21739
+21740
+21741
+21742
+21743
+21744
+21745
+21746
+21747
+21748
+21749
+21750
+21751
+21752
+21753
+21754
+21755
+21756
+21757
+21758
+21759
+21760
+21761
+21762
+21763
+21764
+21765
+21766
+21767
+21768
+21769
+21770
+21771
+21772
+21773
+21774
+21775
+21776
+21777
+21778
+21779
+21780
+21781
+21782
+21783
+21784
+21785
+21786
+21787
+21788
+21789
+21790
+21791
+21792
+21793
+21794
+21795
+21796
+21797
+21798
+21799
+21800
+21801
+21802
+21803
+21804
+21805
+21806
+21807
+21808
+21809
+21810
+21811
+21812
+21813
+21814
+21815
+21816
+21817
+21818
+21819
+21820
+21821
+21822
+21823
+21824
+21825
+21826
+21827
+21828
+21829
+21830
+21831
+21832
+21833
+21834
+21835
+21836
+21837
+21838
+21839
+21840
+21841
+21842
+21843
+21844
+21845
+21846
+21847
+21848
+21849
+21850
+21851
+21852
+21853
+21854
+21855
+21856
+21857
+21858
+21859
+21860
+21861
+21862
+21863
+21864
+21865
+21866
+21867
+21868
+21869
+21870
+21871
+21872
+21873
+21874
+21875
+21876
+21877
+21878
+21879
+21880
+21881
+21882
+21883
+21884
+21885
+21886
+21887
+21888
+21889
+21890
+21891
+21892
+21893
+21894
+21895
+21896
+21897
+21898
+21899
+21900
+21901
+21902
+21903
+21904
+21905
+21906
+21907
+21908
+21909
+21910
+21911
+21912
+21913
+21914
+21915
+21916
+21917
+21918
+21919
+21920
+21921
+21922
+21923
+21924
+21925
+21926
+21927
+21928
+21929
+21930
+21931
+21932
+21933
+21934
+21935
+21936
+21937
+21938
+21939
+21940
+21941
+21942
+21943
+21944
+21945
+21946
+21947
+21948
+21949
+21950
+21951
+21952
+21953
+21954
+21955
+21956
+21957
+21958
+21959
+21960
+21961
+21962
+21963
+21964
+21965
+21966
+21967
+21968
+21969
+21970
+21971
+21972
+21973
+21974
+21975
+21976
+21977
+21978
+21979
+21980
+21981
+21982
+21983
+21984
+21985
+21986
+21987
+21988
+21989
+21990
+21991
+21992
+21993
+21994
+21995
+21996
+21997
+21998
+21999
+22000
+22001
+22002
+22003
+22004
+22005
+22006
+22007
+22008
+22009
+22010
+22011
+22012
+22013
+22014
+22015
+22016
+22017
+22018
+22019
+22020
+22021
+22022
+22023
+22024
+22025
+22026
+22027
+22028
+22029
+22030
+22031
+22032
+22033
+22034
+22035
+22036
+22037
+22038
+22039
+22040
+22041
+22042
+22043
+22044
+22045
+22046
+22047
+22048
+22049
+22050
+22051
+22052
+22053
+22054
+22055
+22056
+22057
+22058
+22059
+22060
+22061
+22062
+22063
+22064
+22065
+22066
+22067
+22068
+22069
+22070
+22071
+22072
+22073
+22074
+22075
+22076
+22077
+22078
+22079
+22080
+22081
+22082
+22083
+22084
+22085
+22086
+22087
+22088
+22089
+22090
+22091
+22092
+22093
+22094
+22095
+22096
+22097
+22098
+22099
+22100
+22101
+22102
+22103
+22104
+22105
+22106
+22107
+22108
+22109
+22110
+22111
+22112
+22113
+22114
+22115
+22116
+22117
+22118
+22119
+22120
+22121
+22122
+22123
+22124
+22125
+22126
+22127
+22128
+22129
+22130
+22131
+22132
+22133
+22134
+22135
+22136
+22137
+22138
+22139
+22140
+22141
+22142
+22143
+22144
+22145
+22146
+22147
+22148
+22149
+22150
+22151
+22152
+22153
+22154
+22155
+22156
+22157
+22158
+22159
+22160
+22161
+22162
+22163
+22164
+22165
+22166
+22167
+22168
+22169
+22170
+22171
+22172
+22173
+22174
+22175
+22176
+22177
+22178
+22179
+22180
+22181
+22182
+22183
+22184
+22185
+22186
+22187
+22188
+22189
+22190
+22191
+22192
+22193
+22194
+22195
+22196
+22197
+22198
+22199
+22200
+22201
+22202
+22203
+22204
+22205
+22206
+22207
+22208
+22209
+22210
+22211
+22212
+22213
+22214
+22215
+22216
+22217
+22218
+22219
+22220
+22221
+22222
+22223
+22224
+22225
+22226
+22227
+22228
+22229
+22230
+22231
+22232
+22233
+22234
+22235
+22236
+22237
+22238
+22239
+22240
+22241
+22242
+22243
+22244
+22245
+22246
+22247
+22248
+22249
+22250
+22251
+22252
+22253
+22254
+22255
+22256
+22257
+22258
+22259
+22260
+22261
+22262
+22263
+22264
+22265
+22266
+22267
+22268
+22269
+22270
+22271
+22272
+22273
+22274
+22275
+22276
+22277
+22278
+22279
+22280
+22281
+22282
+22283
+22284
+22285
+22286
+22287
+22288
+22289
+22290
+22291
+22292
+22293
+22294
+22295
+22296
+22297
+22298
+22299
+22300
+22301
+22302
+22303
+22304
+22305
+22306
+22307
+22308
+22309
+22310
+22311
+22312
+22313
+22314
+22315
+22316
+22317
+22318
+22319
+22320
+22321
+22322
+22323
+22324
+22325
+22326
+22327
+22328
+22329
+22330
+22331
+22332
+22333
+22334
+22335
+22336
+22337
+22338
+22339
+22340
+22341
+22342
+22343
+22344
+22345
+22346
+22347
+22348
+22349
+22350
+22351
+22352
+22353
+22354
+22355
+22356
+22357
+22358
+22359
+22360
+22361
+22362
+22363
+22364
+22365
+22366
+22367
+22368
+22369
+22370
+22371
+22372
+22373
+22374
+22375
+22376
+22377
+22378
+22379
+22380
+22381
+22382
+22383
+22384
+22385
+22386
+22387
+22388
+22389
+22390
+22391
+22392
+22393
+22394
+22395
+22396
+22397
+22398
+22399
+22400
+22401
+22402
+22403
+22404
+22405
+22406
+22407
+22408
+22409
+22410
+22411
+22412
+22413
+22414
+22415
+22416
+22417
+22418
+22419
+22420
+22421
+22422
+22423
+22424
+22425
+22426
+22427
+22428
+22429
+22430
+22431
+22432
+22433
+22434
+22435
+22436
+22437
+22438
+22439
+22440
+22441
+22442
+22443
+22444
+22445
+22446
+22447
+22448
+22449
+22450
+22451
+22452
+22453
+22454
+22455
+22456
+22457
+22458
+22459
+22460
+22461
+22462
+22463
+22464
+22465
+22466
+22467
+22468
+22469
+22470
+22471
+22472
+22473
+22474
+22475
+22476
+22477
+22478
+22479
+22480
+22481
+22482
+22483
+22484
+22485
+22486
+22487
+22488
+22489
+22490
+22491
+22492
+22493
+22494
+22495
+22496
+22497
+22498
+22499
+22500
+22501
+22502
+22503
+22504
+22505
+22506
+22507
+22508
+22509
+22510
+22511
+22512
+22513
+22514
+22515
+22516
+22517
+22518
+22519
+22520
+22521
+22522
+22523
+22524
+22525
+22526
+22527
+22528
+22529
+22530
+22531
+22532
+22533
+22534
+22535
+22536
+22537
+22538
+22539
+22540
+22541
+22542
+22543
+22544
+22545
+22546
+22547
+22548
+22549
+22550
+22551
+22552
+22553
+22554
+22555
+22556
+22557
+22558
+22559
+22560
+22561
+22562
+22563
+22564
+22565
+22566
+22567
+22568
+22569
+22570
+22571
+22572
+22573
+22574
+22575
+22576
+22577
+22578
+22579
+22580
+22581
+22582
+22583
+22584
+22585
+22586
+22587
+22588
+22589
+22590
+22591
+22592
+22593
+22594
+22595
+22596
+22597
+22598
+22599
+22600
+22601
+22602
+22603
+22604
+22605
+22606
+22607
+22608
+22609
+22610
+22611
+22612
+22613
+22614
+22615
+22616
+22617
+22618
+22619
+22620
+22621
+22622
+22623
+22624
+22625
+22626
+22627
+22628
+22629
+22630
+22631
+22632
+22633
+22634
+22635
+22636
+22637
+22638
+22639
+22640
+22641
+22642
+22643
+22644
+22645
+22646
+22647
+22648
+22649
+22650
+22651
+22652
+22653
+22654
+22655
+22656
+22657
+22658
+22659
+22660
+22661
+22662
+22663
+22664
+22665
+22666
+22667
+22668
+22669
+22670
+22671
+22672
+22673
+22674
+22675
+22676
+22677
+22678
+22679
+22680
+22681
+22682
+22683
+22684
+22685
+22686
+22687
+22688
+22689
+22690
+22691
+22692
+22693
+22694
+22695
+22696
+22697
+22698
+22699
+22700
+22701
+22702
+22703
+22704
+22705
+22706
+22707
+22708
+22709
+22710
+22711
+22712
+22713
+22714
+22715
+22716
+22717
+22718
+22719
+22720
+22721
+22722
+22723
+22724
+22725
+22726
+22727
+22728
+22729
+22730
+22731
+22732
+22733
+22734
+22735
+22736
+22737
+22738
+22739
+22740
+22741
+22742
+22743
+22744
+22745
+22746
+22747
+22748
+22749
+22750
+22751
+22752
+22753
+22754
+22755
+22756
+22757
+22758
+22759
+22760
+22761
+22762
+22763
+22764
+22765
+22766
+22767
+22768
+22769
+22770
+22771
+22772
+22773
+22774
+22775
+22776
+22777
+22778
+22779
+22780
+22781
+22782
+22783
+22784
+22785
+22786
+22787
+22788
+22789
+22790
+22791
+22792
+22793
+22794
+22795
+22796
+22797
+22798
+22799
+22800
+22801
+22802
+22803
+22804
+22805
+22806
+22807
+22808
+22809
+22810
+22811
+22812
+22813
+22814
+22815
+22816
+22817
+22818
+22819
+22820
+22821
+22822
+22823
+22824
+22825
+22826
+22827
+22828
+22829
+22830
+22831
+22832
+22833
+22834
+22835
+22836
+22837
+22838
+22839
+22840
+22841
+22842
+22843
+22844
+22845
+22846
+22847
+22848
+22849
+22850
+22851
+22852
+22853
+22854
+22855
+22856
+22857
+22858
+22859
+22860
+22861
+22862
+22863
+22864
+22865
+22866
+22867
+22868
+22869
+22870
+22871
+22872
+22873
+22874
+22875
+22876
+22877
+22878
+22879
+22880
+22881
+22882
+22883
+22884
+22885
+22886
+22887
+22888
+22889
+22890
+22891
+22892
+22893
+22894
+22895
+22896
+22897
+22898
+22899
+22900
+22901
+22902
+22903
+22904
+22905
+22906
+22907
+22908
+22909
+22910
+22911
+22912
+22913
+22914
+22915
+22916
+22917
+22918
+22919
+22920
+22921
+22922
+22923
+22924
+22925
+22926
+22927
+22928
+22929
+22930
+22931
+22932
+22933
+22934
+22935
+22936
+22937
+22938
+22939
+22940
+22941
+22942
+22943
+22944
+22945
+22946
+22947
+22948
+22949
+22950
+22951
+22952
+22953
+22954
+22955
+22956
+22957
+22958
+22959
+22960
+22961
+22962
+22963
+22964
+22965
+22966
+22967
+22968
+22969
+22970
+22971
+22972
+22973
+22974
+22975
+22976
+22977
+22978
+22979
+22980
+22981
+22982
+22983
+22984
+22985
+22986
+22987
+22988
+22989
+22990
+22991
+22992
+22993
+22994
+22995
+22996
+22997
+22998
+22999
+23000
+23001
+23002
+23003
+23004
+23005
+23006
+23007
+23008
+23009
+23010
+23011
+23012
+23013
+23014
+23015
+23016
+23017
+23018
+23019
+23020
+23021
+23022
+23023
+23024
+23025
+23026
+23027
+23028
+23029
+23030
+23031
+23032
+23033
+23034
+23035
+23036
+23037
+23038
+23039
+23040
+23041
+23042
+23043
+23044
+23045
+23046
+23047
+23048
+23049
+23050
+23051
+23052
+23053
+23054
+23055
+23056
+23057
+23058
+23059
+23060
+23061
+23062
+23063
+23064
+23065
+23066
+23067
+23068
+23069
+23070
+23071
+23072
+23073
+23074
+23075
+23076
+23077
+23078
+23079
+23080
+23081
+23082
+23083
+23084
+23085
+23086
+23087
+23088
+23089
+23090
+23091
+23092
+23093
+23094
+23095
+23096
+23097
+23098
+23099
+23100
+23101
+23102
+23103
+23104
+23105
+23106
+23107
+23108
+23109
+23110
+23111
+23112
+23113
+23114
+23115
+23116
+23117
+23118
+23119
+23120
+23121
+23122
+23123
+23124
+23125
+23126
+23127
+23128
+23129
+23130
+23131
+23132
+23133
+23134
+23135
+23136
+23137
+23138
+23139
+23140
+23141
+23142
+23143
+23144
+23145
+23146
+23147
+23148
+23149
+23150
+23151
+23152
+23153
+23154
+23155
+23156
+23157
+23158
+23159
+23160
+23161
+23162
+23163
+23164
+23165
+23166
+23167
+23168
+23169
+23170
+23171
+23172
+23173
+23174
+23175
+23176
+23177
+23178
+23179
+23180
+23181
+23182
+23183
+23184
+23185
+23186
+23187
+23188
+23189
+23190
+23191
+23192
+23193
+23194
+23195
+23196
+23197
+23198
+23199
+23200
+23201
+23202
+23203
+23204
+23205
+23206
+23207
+23208
+23209
+23210
+23211
+23212
+23213
+23214
+23215
+23216
+23217
+23218
+23219
+23220
+23221
+23222
+23223
+23224
+23225
+23226
+23227
+23228
+23229
+23230
+23231
+23232
+23233
+23234
+23235
+23236
+23237
+23238
+23239
+23240
+23241
+23242
+23243
+23244
+23245
+23246
+23247
+23248
+23249
+23250
+23251
+23252
+23253
+23254
+23255
+23256
+23257
+23258
+23259
+23260
+23261
+23262
+23263
+23264
+23265
+23266
+23267
+23268
+23269
+23270
+23271
+23272
+23273
+23274
+23275
+23276
+23277
+23278
+23279
+23280
+23281
+23282
+23283
+23284
+23285
+23286
+23287
+23288
+23289
+23290
+23291
+23292
+23293
+23294
+23295
+23296
+23297
+23298
+23299
+23300
+23301
+23302
+23303
+23304
+23305
+23306
+23307
+23308
+23309
+23310
+23311
+23312
+23313
+23314
+23315
+23316
+23317
+23318
+23319
+23320
+23321
+23322
+23323
+23324
+23325
+23326
+23327
+23328
+23329
+23330
+23331
+23332
+23333
+23334
+23335
+23336
+23337
+23338
+23339
+23340
+23341
+23342
+23343
+23344
+23345
+23346
+23347
+23348
+23349
+23350
+23351
+23352
+23353
+23354
+23355
+23356
+23357
+23358
+23359
+23360
+23361
+23362
+23363
+23364
+23365
+23366
+23367
+23368
+23369
+23370
+23371
+23372
+23373
+23374
+23375
+23376
+23377
+23378
+23379
+23380
+23381
+23382
+23383
+23384
+23385
+23386
+23387
+23388
+23389
+23390
+23391
+23392
+23393
+23394
+23395
+23396
+23397
+23398
+23399
+23400
+23401
+23402
+23403
+23404
+23405
+23406
+23407
+23408
+23409
+23410
+23411
+23412
+23413
+23414
+23415
+23416
+23417
+23418
+23419
+23420
+23421
+23422
+23423
+23424
+23425
+23426
+23427
+23428
+23429
+23430
+23431
+23432
+23433
+23434
+23435
+23436
+23437
+23438
+23439
+23440
+23441
+23442
+23443
+23444
+23445
+23446
+23447
+23448
+23449
+23450
+23451
+23452
+23453
+23454
+23455
+23456
+23457
+23458
+23459
+23460
+23461
+23462
+23463
+23464
+23465
+23466
+23467
+23468
+23469
+23470
+23471
+23472
+23473
+23474
+23475
+23476
+23477
+23478
+23479
+23480
+23481
+23482
+23483
+23484
+23485
+23486
+23487
+23488
+23489
+23490
+23491
+23492
+23493
+23494
+23495
+23496
+23497
+23498
+23499
+23500
+23501
+23502
+23503
+23504
+23505
+23506
+23507
+23508
+23509
+23510
+23511
+23512
+23513
+23514
+23515
+23516
+23517
+23518
+23519
+23520
+23521
+23522
+23523
+23524
+23525
+23526
+23527
+23528
+23529
+23530
+23531
+23532
+23533
+23534
+23535
+23536
+23537
+23538
+23539
+23540
+23541
+23542
+23543
+23544
+23545
+23546
+23547
+23548
+23549
+23550
+23551
+23552
+23553
+23554
+23555
+23556
+23557
+23558
+23559
+23560
+23561
+23562
+23563
+23564
+23565
+23566
+23567
+23568
+23569
+23570
+23571
+23572
+23573
+23574
+23575
+23576
+23577
+23578
+23579
+23580
+23581
+23582
+23583
+23584
+23585
+23586
+23587
+23588
+23589
+23590
+23591
+23592
+23593
+23594
+23595
+23596
+23597
+23598
+23599
+23600
+23601
+23602
+23603
+23604
+23605
+23606
+23607
+23608
+23609
+23610
+23611
+23612
+23613
+23614
+23615
+23616
+23617
+23618
+23619
+23620
+23621
+23622
+23623
+23624
+23625
+23626
+23627
+23628
+23629
+23630
+23631
+23632
+23633
+23634
+23635
+23636
+23637
+23638
+23639
+23640
+23641
+23642
+23643
+23644
+23645
+23646
+23647
+23648
+23649
+23650
+23651
+23652
+23653
+23654
+23655
+23656
+23657
+23658
+23659
+23660
+23661
+23662
+23663
+23664
+23665
+23666
+23667
+23668
+23669
+23670
+23671
+23672
+23673
+23674
+23675
+23676
+23677
+23678
+23679
+23680
+23681
+23682
+23683
+23684
+23685
+23686
+23687
+23688
+23689
+23690
+23691
+23692
+23693
+23694
+23695
+23696
+23697
+23698
+23699
+23700
+23701
+23702
+23703
+23704
+23705
+23706
+23707
+23708
+23709
+23710
+23711
+23712
+23713
+23714
+23715
+23716
+23717
+23718
+23719
+23720
+23721
+23722
+23723
+23724
+23725
+23726
+23727
+23728
+23729
+23730
+23731
+23732
+23733
+23734
+23735
+23736
+23737
+23738
+23739
+23740
+23741
+23742
+23743
+23744
+23745
+23746
+23747
+23748
+23749
+23750
+23751
+23752
+23753
+23754
+23755
+23756
+23757
+23758
+23759
+23760
+23761
+23762
+23763
+23764
+23765
+23766
+23767
+23768
+23769
+23770
+23771
+23772
+23773
+23774
+23775
+23776
+23777
+23778
+23779
+23780
+23781
+23782
+23783
+23784
+23785
+23786
+23787
+23788
+23789
+23790
+23791
+23792
+23793
+23794
+23795
+23796
+23797
+23798
+23799
+23800
+23801
+23802
+23803
+23804
+23805
+23806
+23807
+23808
+23809
+23810
+23811
+23812
+23813
+23814
+23815
+23816
+23817
+23818
+23819
+23820
+23821
+23822
+23823
+23824
+23825
+23826
+23827
+23828
+23829
+23830
+23831
+23832
+23833
+23834
+23835
+23836
+23837
+23838
+23839
+23840
+23841
+23842
+23843
+23844
+23845
+23846
+23847
+23848
+23849
+23850
+23851
+23852
+23853
+23854
+23855
+23856
+23857
+23858
+23859
+23860
+23861
+23862
+23863
+23864
+23865
+23866
+23867
+23868
+23869
+23870
+23871
+23872
+23873
+23874
+23875
+23876
+23877
+23878
+23879
+23880
+23881
+23882
+23883
+23884
+23885
+23886
+23887
+23888
+23889
+23890
+23891
+23892
+23893
+23894
+23895
+23896
+23897
+23898
+23899
+23900
+23901
+23902
+23903
+23904
+23905
+23906
+23907
+23908
+23909
+23910
+23911
+23912
+23913
+23914
+23915
+23916
+23917
+23918
+23919
+23920
+23921
+23922
+23923
+23924
+23925
+23926
+23927
+23928
+23929
+23930
+23931
+23932
+23933
+23934
+23935
+23936
+23937
+23938
+23939
+23940
+23941
+23942
+23943
+23944
+23945
+23946
+23947
+23948
+23949
+23950
+23951
+23952
+23953
+23954
+23955
+23956
+23957
+23958
+23959
+23960
+23961
+23962
+23963
+23964
+23965
+23966
+23967
+23968
+23969
+23970
+23971
+23972
+23973
+23974
+23975
+23976
+23977
+23978
+23979
+23980
+23981
+23982
+23983
+23984
+23985
+23986
+23987
+23988
+23989
+23990
+23991
+23992
+23993
+23994
+23995
+23996
+23997
+23998
+23999
+24000
+24001
+24002
+24003
+24004
+24005
+24006
+24007
+24008
+24009
+24010
+24011
+24012
+24013
+24014
+24015
+24016
+24017
+24018
+24019
+24020
+24021
+24022
+24023
+24024
+24025
+24026
+24027
+24028
+24029
+24030
+24031
+24032
+24033
+24034
+24035
+24036
+24037
+24038
+24039
+24040
+24041
+24042
+24043
+24044
+24045
+24046
+24047
+24048
+24049
+24050
+24051
+24052
+24053
+24054
+24055
+24056
+24057
+24058
+24059
+24060
+24061
+24062
+24063
+24064
+24065
+24066
+24067
+24068
+24069
+24070
+24071
+24072
+24073
+24074
+24075
+24076
+24077
+24078
+24079
+24080
+24081
+24082
+24083
+24084
+24085
+24086
+24087
+24088
+24089
+24090
+24091
+24092
+24093
+24094
+24095
+24096
+24097
+24098
+24099
+24100
+24101
+24102
+24103
+24104
+24105
+24106
+24107
+24108
+24109
+24110
+24111
+24112
+24113
+24114
+24115
+24116
+24117
+24118
+24119
+24120
+24121
+24122
+24123
+24124
+24125
+24126
+24127
+24128
+24129
+24130
+24131
+24132
+24133
+24134
+24135
+24136
+24137
+24138
+24139
+24140
+24141
+24142
+24143
+24144
+24145
+24146
+24147
+24148
+24149
+24150
+24151
+24152
+24153
+24154
+24155
+24156
+24157
+24158
+24159
+24160
+24161
+24162
+24163
+24164
+24165
+24166
+24167
+24168
+24169
+24170
+24171
+24172
+24173
+24174
+24175
+24176
+24177
+24178
+24179
+24180
+24181
+24182
+24183
+24184
+24185
+24186
+24187
+24188
+24189
+24190
+24191
+24192
+24193
+24194
+24195
+24196
+24197
+24198
+24199
+24200
+24201
+24202
+24203
+24204
+24205
+24206
+24207
+24208
+24209
+24210
+24211
+24212
+24213
+24214
+24215
+24216
+24217
+24218
+24219
+24220
+24221
+24222
+24223
+24224
+24225
+24226
+24227
+24228
+24229
+24230
+24231
+24232
+24233
+24234
+24235
+24236
+24237
+24238
+24239
+24240
+24241
+24242
+24243
+24244
+24245
+24246
+24247
+24248
+24249
+24250
+24251
+24252
+24253
+24254
+24255
+24256
+24257
+24258
+24259
+24260
+24261
+24262
+24263
+24264
+24265
+24266
+24267
+24268
+24269
+24270
+24271
+24272
+24273
+24274
+24275
+24276
+24277
+24278
+24279
+24280
+24281
+24282
+24283
+24284
+24285
+24286
+24287
+24288
+24289
+24290
+24291
+24292
+24293
+24294
+24295
+24296
+24297
+24298
+24299
+24300
+24301
+24302
+24303
+24304
+24305
+24306
+24307
+24308
+24309
+24310
+24311
+24312
+24313
+24314
+24315
+24316
+24317
+24318
+24319
+24320
+24321
+24322
+24323
+24324
+24325
+24326
+24327
+24328
+24329
+24330
+24331
+24332
+24333
+24334
+24335
+24336
+24337
+24338
+24339
+24340
+24341
+24342
+24343
+24344
+24345
+24346
+24347
+24348
+24349
+24350
+24351
+24352
+24353
+24354
+24355
+24356
+24357
+24358
+24359
+24360
+24361
+24362
+24363
+24364
+24365
+24366
+24367
+24368
+24369
+24370
+24371
+24372
+24373
+24374
+24375
+24376
+24377
+24378
+24379
+24380
+24381
+24382
+24383
+24384
+24385
+24386
+24387
+24388
+24389
+24390
+24391
+24392
+24393
+24394
+24395
+24396
+24397
+24398
+24399
+24400
+24401
+24402
+24403
+24404
+24405
+24406
+24407
+24408
+24409
+24410
+24411
+24412
+24413
+24414
+24415
+24416
+24417
+24418
+24419
+24420
+24421
+24422
+24423
+24424
+24425
+24426
+24427
+24428
+24429
+24430
+24431
+24432
+24433
+24434
+24435
+24436
+24437
+24438
+24439
+24440
+24441
+24442
+24443
+24444
+24445
+24446
+24447
+24448
+24449
+24450
+24451
+24452
+24453
+24454
+24455
+24456
+24457
+24458
+24459
+24460
+24461
+24462
+24463
+24464
+24465
+24466
+24467
+24468
+24469
+24470
+24471
+24472
+24473
+24474
+24475
+24476
+24477
+24478
+24479
+24480
+24481
+24482
+24483
+24484
+24485
+24486
+24487
+24488
+24489
+24490
+24491
+24492
+24493
+24494
+24495
+24496
+24497
+24498
+24499
+24500
+24501
+24502
+24503
+24504
+24505
+24506
+24507
+24508
+24509
+24510
+24511
+24512
+24513
+24514
+24515
+24516
+24517
+24518
+24519
+24520
+24521
+24522
+24523
+24524
+24525
+24526
+24527
+24528
+24529
+24530
+24531
+24532
+24533
+24534
+24535
+24536
+24537
+24538
+24539
+24540
+24541
+24542
+24543
+24544
+24545
+24546
+24547
+24548
+24549
+24550
+24551
+24552
+24553
+24554
+24555
+24556
+24557
+24558
+24559
+24560
+24561
+24562
+24563
+24564
+24565
+24566
+24567
+24568
+24569
+24570
+24571
+24572
+24573
+24574
+24575
+24576
+24577
+24578
+24579
+24580
+24581
+24582
+24583
+24584
+24585
+24586
+24587
+24588
+24589
+24590
+24591
+24592
+24593
+24594
+24595
+24596
+24597
+24598
+24599
+24600
+24601
+24602
+24603
+24604
+24605
+24606
+24607
+24608
+24609
+24610
+24611
+24612
+24613
+24614
+24615
+24616
+24617
+24618
+24619
+24620
+24621
+24622
+24623
+24624
+24625
+24626
+24627
+24628
+24629
+24630
+24631
+24632
+24633
+24634
+24635
+24636
+24637
+24638
+24639
+24640
+24641
+24642
+24643
+24644
+24645
+24646
+24647
+24648
+24649
+24650
+24651
+24652
+24653
+24654
+24655
+24656
+24657
+24658
+24659
+24660
+24661
+24662
+24663
+24664
+24665
+24666
+24667
+24668
+24669
+24670
+24671
+24672
+24673
+24674
+24675
+24676
+24677
+24678
+24679
+24680
+24681
+24682
+24683
+24684
+24685
+24686
+24687
+24688
+24689
+24690
+24691
+24692
+24693
+24694
+24695
+24696
+24697
+24698
+24699
+24700
+24701
+24702
+24703
+24704
+24705
+24706
+24707
+24708
+24709
+24710
+24711
+24712
+24713
+24714
+24715
+24716
+24717
+24718
+24719
+24720
+24721
+24722
+24723
+24724
+24725
+24726
+24727
+24728
+24729
+24730
+24731
+24732
+24733
+24734
+24735
+24736
+24737
+24738
+24739
+24740
+24741
+24742
+24743
+24744
+24745
+24746
+24747
+24748
+24749
+24750
+24751
+24752
+24753
+24754
+24755
+24756
+24757
+24758
+24759
+24760
+24761
+24762
+24763
+24764
+24765
+24766
+24767
+24768
+24769
+24770
+24771
+24772
+24773
+24774
+24775
+24776
+24777
+24778
+24779
+24780
+24781
+24782
+24783
+24784
+24785
+24786
+24787
+24788
+24789
+24790
+24791
+24792
+24793
+24794
+24795
+24796
+24797
+24798
+24799
+24800
+24801
+24802
+24803
+24804
+24805
+24806
+24807
+24808
+24809
+24810
+24811
+24812
+24813
+24814
+24815
+24816
+24817
+24818
+24819
+24820
+24821
+24822
+24823
+24824
+24825
+24826
+24827
+24828
+24829
+24830
+24831
+24832
+24833
+24834
+24835
+24836
+24837
+24838
+24839
+24840
+24841
+24842
+24843
+24844
+24845
+24846
+24847
+24848
+24849
+24850
+24851
+24852
+24853
+24854
+24855
+24856
+24857
+24858
+24859
+24860
+24861
+24862
+24863
+24864
+24865
+24866
+24867
+24868
+24869
+24870
+24871
+24872
+24873
+24874
+24875
+24876
+24877
+24878
+24879
+24880
+24881
+24882
+24883
+24884
+24885
+24886
+24887
+24888
+24889
+24890
+24891
+24892
+24893
+24894
+24895
+24896
+24897
+24898
+24899
+24900
+24901
+24902
+24903
+24904
+24905
+24906
+24907
+24908
+24909
+24910
+24911
+24912
+24913
+24914
+24915
+24916
+24917
+24918
+24919
+24920
+24921
+24922
+24923
+24924
+24925
+24926
+24927
+24928
+24929
+24930
+24931
+24932
+24933
+24934
+24935
+24936
+24937
+24938
+24939
+24940
+24941
+24942
+24943
+24944
+24945
+24946
+24947
+24948
+24949
+24950
+24951
+24952
+24953
+24954
+24955
+24956
+24957
+24958
+24959
+24960
+24961
+24962
+24963
+24964
+24965
+24966
+24967
+24968
+24969
+24970
+24971
+24972
+24973
+24974
+24975
+24976
+24977
+24978
+24979
+24980
+24981
+24982
+24983
+24984
+24985
+24986
+24987
+24988
+24989
+24990
+24991
+24992
+24993
+24994
+24995
+24996
+24997
+24998
+24999
+25000
+25001
+25002
+25003
+25004
+25005
+25006
+25007
+25008
+25009
+25010
+25011
+25012
+25013
+25014
+25015
+25016
+25017
+25018
+25019
+25020
+25021
+25022
+25023
+25024
+25025
+25026
+25027
+25028
+25029
+25030
+25031
+25032
+25033
+25034
+25035
+25036
+25037
+25038
+25039
+25040
+25041
+25042
+25043
+25044
+25045
+25046
+25047
+25048
+25049
+25050
+25051
+25052
+25053
+25054
+25055
+25056
+25057
+25058
+25059
+25060
+25061
+25062
+25063
+25064
+25065
+25066
+25067
+25068
+25069
+25070
+25071
+25072
+25073
+25074
+25075
+25076
+25077
+25078
+25079
+25080
+25081
+25082
+25083
+25084
+25085
+25086
+25087
+25088
+25089
+25090
+25091
+25092
+25093
+25094
+25095
+25096
+25097
+25098
+25099
+25100
+25101
+25102
+25103
+25104
+25105
+25106
+25107
+25108
+25109
+25110
+25111
+25112
+25113
+25114
+25115
+25116
+25117
+25118
+25119
+25120
+25121
+25122
+25123
+25124
+25125
+25126
+25127
+25128
+25129
+25130
+25131
+25132
+25133
+25134
+25135
+25136
+25137
+25138
+25139
+25140
+25141
+25142
+25143
+25144
+25145
+25146
+25147
+25148
+25149
+25150
+25151
+25152
+25153
+25154
+25155
+25156
+25157
+25158
+25159
+25160
+25161
+25162
+25163
+25164
+25165
+25166
+25167
+25168
+25169
+25170
+25171
+25172
+25173
+25174
+25175
+25176
+25177
+25178
+25179
+25180
+25181
+25182
+25183
+25184
+25185
+25186
+25187
+25188
+25189
+25190
+25191
+25192
+25193
+25194
+25195
+25196
+25197
+25198
+25199
+25200
+25201
+25202
+25203
+25204
+25205
+25206
+25207
+25208
+25209
+25210
+25211
+25212
+25213
+25214
+25215
+25216
+25217
+25218
+25219
+25220
+25221
+25222
+25223
+25224
+25225
+25226
+25227
+25228
+25229
+25230
+25231
+25232
+25233
+25234
+25235
+25236
+25237
+25238
+25239
+25240
+25241
+25242
+25243
+25244
+25245
+25246
+25247
+25248
+25249
+25250
+25251
+25252
+25253
+25254
+25255
+25256
+25257
+25258
+25259
+25260
+25261
+25262
+25263
+25264
+25265
+25266
+25267
+25268
+25269
+25270
+25271
+25272
+25273
+25274
+25275
+25276
+25277
+25278
+25279
+25280
+25281
+25282
+25283
+25284
+25285
+25286
+25287
+25288
+25289
+25290
+25291
+25292
+25293
+25294
+25295
+25296
+25297
+25298
+25299
+25300
+25301
+25302
+25303
+25304
+25305
+25306
+25307
+25308
+25309
+25310
+25311
+25312
+25313
+25314
+25315
+25316
+25317
+25318
+25319
+25320
+25321
+25322
+25323
+25324
+25325
+25326
+25327
+25328
+25329
+25330
+25331
+25332
+25333
+25334
+25335
+25336
+25337
+25338
+25339
+25340
+25341
+25342
+25343
+25344
+25345
+25346
+25347
+25348
+25349
+25350
+25351
+25352
+25353
+25354
+25355
+25356
+25357
+25358
+25359
+25360
+25361
+25362
+25363
+25364
+25365
+25366
+25367
+25368
+25369
+25370
+25371
+25372
+25373
+25374
+25375
+25376
+25377
+25378
+25379
+25380
+25381
+25382
+25383
+25384
+25385
+25386
+25387
+25388
+25389
+25390
+25391
+25392
+25393
+25394
+25395
+25396
+25397
+25398
+25399
+25400
+25401
+25402
+25403
+25404
+25405
+25406
+25407
+25408
+25409
+25410
+25411
+25412
+25413
+25414
+25415
+25416
+25417
+25418
+25419
+25420
+25421
+25422
+25423
+25424
+25425
+25426
+25427
+25428
+25429
+25430
+25431
+25432
+25433
+25434
+25435
+25436
+25437
+25438
+25439
+25440
+25441
+25442
+25443
+25444
+25445
+25446
+25447
+25448
+25449
+25450
+25451
+25452
+25453
+25454
+25455
+25456
+25457
+25458
+25459
+25460
+25461
+25462
+25463
+25464
+25465
+25466
+25467
+25468
+25469
+25470
+25471
+25472
+25473
+25474
+25475
+25476
+25477
+25478
+25479
+25480
+25481
+25482
+25483
+25484
+25485
+25486
+25487
+25488
+25489
+25490
+25491
+25492
+25493
+25494
+25495
+25496
+25497
+25498
+25499
+25500
+25501
+25502
+25503
+25504
+25505
+25506
+25507
+25508
+25509
+25510
+25511
+25512
+25513
+25514
+25515
+25516
+25517
+25518
+25519
+25520
+25521
+25522
+25523
+25524
+25525
+25526
+25527
+25528
+25529
+25530
+25531
+25532
+25533
+25534
+25535
+25536
+25537
+25538
+25539
+25540
+25541
+25542
+25543
+25544
+25545
+25546
+25547
+25548
+25549
+25550
+25551
+25552
+25553
+25554
+25555
+25556
+25557
+25558
+25559
+25560
+25561
+25562
+25563
+25564
+25565
+25566
+25567
+25568
+25569
+25570
+25571
+25572
+25573
+25574
+25575
+25576
+25577
+25578
+25579
+25580
+25581
+25582
+25583
+25584
+25585
+25586
+25587
+25588
+25589
+25590
+25591
+25592
+25593
+25594
+25595
+25596
+25597
+25598
+25599
+25600
+25601
+25602
+25603
+25604
+25605
+25606
+25607
+25608
+25609
+25610
+25611
+25612
+25613
+25614
+25615
+25616
+25617
+25618
+25619
+25620
+25621
+25622
+25623
+25624
+25625
+25626
+25627
+25628
+25629
+25630
+25631
+25632
+25633
+25634
+25635
+25636
+25637
+25638
+25639
+25640
+25641
+25642
+25643
+25644
+25645
+25646
+25647
+25648
+25649
+25650
+25651
+25652
+25653
+25654
+25655
+25656
+25657
+25658
+25659
+25660
+25661
+25662
+25663
+25664
+25665
+25666
+25667
+25668
+25669
+25670
+25671
+25672
+25673
+25674
+25675
+25676
+25677
+25678
+25679
+25680
+25681
+25682
+25683
+25684
+25685
+25686
+25687
+25688
+25689
+25690
+25691
+25692
+25693
+25694
+25695
+25696
+25697
+25698
+25699
+25700
+25701
+25702
+25703
+25704
+25705
+25706
+25707
+25708
+25709
+25710
+25711
+25712
+25713
+25714
+25715
+25716
+25717
+25718
+25719
+25720
+25721
+25722
+25723
+25724
+25725
+25726
+25727
+25728
+25729
+25730
+25731
+25732
+25733
+25734
+25735
+25736
+25737
+25738
+25739
+25740
+25741
+25742
+25743
+25744
+25745
+25746
+25747
+25748
+25749
+25750
+25751
+25752
+25753
+25754
+25755
+25756
+25757
+25758
+25759
+25760
+25761
+25762
+25763
+25764
+25765
+25766
+25767
+25768
+25769
+25770
+25771
+25772
+25773
+25774
+25775
+25776
+25777
+25778
+25779
+25780
+25781
+25782
+25783
+25784
+25785
+25786
+25787
+25788
+25789
+25790
+25791
+25792
+25793
+25794
+25795
+25796
+25797
+25798
+25799
+25800
+25801
+25802
+25803
+25804
+25805
+25806
+25807
+25808
+25809
+25810
+25811
+25812
+25813
+25814
+25815
+25816
+25817
+25818
+25819
+25820
+25821
+25822
+25823
+25824
+25825
+25826
+25827
+25828
+25829
+25830
+25831
+25832
+25833
+25834
+25835
+25836
+25837
+25838
+25839
+25840
+25841
+25842
+25843
+25844
+25845
+25846
+25847
+25848
+25849
+25850
+25851
+25852
+25853
+25854
+25855
+25856
+25857
+25858
+25859
+25860
+25861
+25862
+25863
+25864
+25865
+25866
+25867
+25868
+25869
+25870
+25871
+25872
+25873
+25874
+25875
+25876
+25877
+25878
+25879
+25880
+25881
+25882
+25883
+25884
+25885
+25886
+25887
+25888
+25889
+25890
+25891
+25892
+25893
+25894
+25895
+25896
+25897
+25898
+25899
+25900
+25901
+25902
+25903
+25904
+25905
+25906
+25907
+25908
+25909
+25910
+25911
+25912
+25913
+25914
+25915
+25916
+25917
+25918
+25919
+25920
+25921
+25922
+25923
+25924
+25925
+25926
+25927
+25928
+25929
+25930
+25931
+25932
+25933
+25934
+25935
+25936
+25937
+25938
+25939
+25940
+25941
+25942
+25943
+25944
+25945
+25946
+25947
+25948
+25949
+25950
+25951
+25952
+25953
+25954
+25955
+25956
+25957
+25958
+25959
+25960
+25961
+25962
+25963
+25964
+25965
+25966
+25967
+25968
+25969
+25970
+25971
+25972
+25973
+25974
+25975
+25976
+25977
+25978
+25979
+25980
+25981
+25982
+25983
+25984
+25985
+25986
+25987
+25988
+25989
+25990
+25991
+25992
+25993
+25994
+25995
+25996
+25997
+25998
+25999
+26000
+26001
+26002
+26003
+26004
+26005
+26006
+26007
+26008
+26009
+26010
+26011
+26012
+26013
+26014
+26015
+26016
+26017
+26018
+26019
+26020
+26021
+26022
+26023
+26024
+26025
+26026
+26027
+26028
+26029
+26030
+26031
+26032
+26033
+26034
+26035
+26036
+26037
+26038
+26039
+26040
+26041
+26042
+26043
+26044
+26045
+26046
+26047
+26048
+26049
+26050
+26051
+26052
+26053
+26054
+26055
+26056
+26057
+26058
+26059
+26060
+26061
+26062
+26063
+26064
+26065
+26066
+26067
+26068
+26069
+26070
+26071
+26072
+26073
+26074
+26075
+26076
+26077
+26078
+26079
+26080
+26081
+26082
+26083
+26084
+26085
+26086
+26087
+26088
+26089
+26090
+26091
+26092
+26093
+26094
+26095
+26096
+26097
+26098
+26099
+26100
+26101
+26102
+26103
+26104
+26105
+26106
+26107
+26108
+26109
+26110
+26111
+26112
+26113
+26114
+26115
+26116
+26117
+26118
+26119
+26120
+26121
+26122
+26123
+26124
+26125
+26126
+26127
+26128
+26129
+26130
+26131
+26132
+26133
+26134
+26135
+26136
+26137
+26138
+26139
+26140
+26141
+26142
+26143
+26144
+26145
+26146
+26147
+26148
+26149
+26150
+26151
+26152
+26153
+26154
+26155
+26156
+26157
+26158
+26159
+26160
+26161
+26162
+26163
+26164
+26165
+26166
+26167
+26168
+26169
+26170
+26171
+26172
+26173
+26174
+26175
+26176
+26177
+26178
+26179
+26180
+26181
+26182
+26183
+26184
+26185
+26186
+26187
+26188
+26189
+26190
+26191
+26192
+26193
+26194
+26195
+26196
+26197
+26198
+26199
+26200
+26201
+26202
+26203
+26204
+26205
+26206
+26207
+26208
+26209
+26210
+26211
+26212
+26213
+26214
+26215
+26216
+26217
+26218
+26219
+26220
+26221
+26222
+26223
+26224
+26225
+26226
+26227
+26228
+26229
+26230
+26231
+26232
+26233
+26234
+26235
+26236
+26237
+26238
+26239
+26240
+26241
+26242
+26243
+26244
+26245
+26246
+26247
+26248
+26249
+26250
+26251
+26252
+26253
+26254
+26255
+26256
+26257
+26258
+26259
+26260
+26261
+26262
+26263
+26264
+26265
+26266
+26267
+26268
+26269
+26270
+26271
+26272
+26273
+26274
+26275
+26276
+26277
+26278
+26279
+26280
+26281
+26282
+26283
+26284
+26285
+26286
+26287
+26288
+26289
+26290
+26291
+26292
+26293
+26294
+26295
+26296
+26297
+26298
+26299
+26300
+26301
+26302
+26303
+26304
+26305
+26306
+26307
+26308
+26309
+26310
+26311
+26312
+26313
+26314
+26315
+26316
+26317
+26318
+26319
+26320
+26321
+26322
+26323
+26324
+26325
+26326
+26327
+26328
+26329
+26330
+26331
+26332
+26333
+26334
+26335
+26336
+26337
+26338
+26339
+26340
+26341
+26342
+26343
+26344
+26345
+26346
+26347
+26348
+26349
+26350
+26351
+26352
+26353
+26354
+26355
+26356
+26357
+26358
+26359
+26360
+26361
+26362
+26363
+26364
+26365
+26366
+26367
+26368
+26369
+26370
+26371
+26372
+26373
+26374
+26375
+26376
+26377
+26378
+26379
+26380
+26381
+26382
+26383
+26384
+26385
+26386
+26387
+26388
+26389
+26390
+26391
+26392
+26393
+26394
+26395
+26396
+26397
+26398
+26399
+26400
+26401
+26402
+26403
+26404
+26405
+26406
+26407
+26408
+26409
+26410
+26411
+26412
+26413
+26414
+26415
+26416
+26417
+26418
+26419
+26420
+26421
+26422
+26423
+26424
+26425
+26426
+26427
+26428
+26429
+26430
+26431
+26432
+26433
+26434
+26435
+26436
+26437
+26438
+26439
+26440
+26441
+26442
+26443
+26444
+26445
+26446
+26447
+26448
+26449
+26450
+26451
+26452
+26453
+26454
+26455
+26456
+26457
+26458
+26459
+26460
+26461
+26462
+26463
+26464
+26465
+26466
+26467
+26468
+26469
+26470
+26471
+26472
+26473
+26474
+26475
+26476
+26477
+26478
+26479
+26480
+26481
+26482
+26483
+26484
+26485
+26486
+26487
+26488
+26489
+26490
+26491
+26492
+26493
+26494
+26495
+26496
+26497
+26498
+26499
+26500
+26501
+26502
+26503
+26504
+26505
+26506
+26507
+26508
+26509
+26510
+26511
+26512
+26513
+26514
+26515
+26516
+26517
+26518
+26519
+26520
+26521
+26522
+26523
+26524
+26525
+26526
+26527
+26528
+26529
+26530
+26531
+26532
+26533
+26534
+26535
+26536
+26537
+26538
+26539
+26540
+26541
+26542
+26543
+26544
+26545
+26546
+26547
+26548
+26549
+26550
+26551
+26552
+26553
+26554
+26555
+26556
+26557
+26558
+26559
+26560
+26561
+26562
+26563
+26564
+26565
+26566
+26567
+26568
+26569
+26570
+26571
+26572
+26573
+26574
+26575
+26576
+26577
+26578
+26579
+26580
+26581
+26582
+26583
+26584
+26585
+26586
+26587
+26588
+26589
+26590
+26591
+26592
+26593
+26594
+26595
+26596
+26597
+26598
+26599
+26600
+26601
+26602
+26603
+26604
+26605
+26606
+26607
+26608
+26609
+26610
+26611
+26612
+26613
+26614
+26615
+26616
+26617
+26618
+26619
+26620
+26621
+26622
+26623
+26624
+26625
+26626
+26627
+26628
+26629
+26630
+26631
+26632
+26633
+26634
+26635
+26636
+26637
+26638
+26639
+26640
+26641
+26642
+26643
+26644
+26645
+26646
+26647
+26648
+26649
+26650
+26651
+26652
+26653
+26654
+26655
+26656
+26657
+26658
+26659
+26660
+26661
+26662
+26663
+26664
+26665
+26666
+26667
+26668
+26669
+26670
+26671
+26672
+26673
+26674
+26675
+26676
+26677
+26678
+26679
+26680
+26681
+26682
+26683
+26684
+26685
+26686
+26687
+26688
+26689
+26690
+26691
+26692
+26693
+26694
+26695
+26696
+26697
+26698
+26699
+26700
+26701
+26702
+26703
+26704
+26705
+26706
+26707
+26708
+26709
+26710
+26711
+26712
+26713
+26714
+26715
+26716
+26717
+26718
+26719
+26720
+26721
+26722
+26723
+26724
+26725
+26726
+26727
+26728
+26729
+26730
+26731
+26732
+26733
+26734
+26735
+26736
+26737
+26738
+26739
+26740
+26741
+26742
+26743
+26744
+26745
+26746
+26747
+26748
+26749
+26750
+26751
+26752
+26753
+26754
+26755
+26756
+26757
+26758
+26759
+26760
+26761
+26762
+26763
+26764
+26765
+26766
+26767
+26768
+26769
+26770
+26771
+26772
+26773
+26774
+26775
+26776
+26777
+26778
+26779
+26780
+26781
+26782
+26783
+26784
+26785
+26786
+26787
+26788
+26789
+26790
+26791
+26792
+26793
+26794
+26795
+26796
+26797
+26798
+26799
+26800
+26801
+26802
+26803
+26804
+26805
+26806
+26807
+26808
+26809
+26810
+26811
+26812
+26813
+26814
+26815
+26816
+26817
+26818
+26819
+26820
+26821
+26822
+26823
+26824
+26825
+26826
+26827
+26828
+26829
+26830
+26831
+26832
+26833
+26834
+26835
+26836
+26837
+26838
+26839
+26840
+26841
+26842
+26843
+26844
+26845
+26846
+26847
+26848
+26849
+26850
+26851
+26852
+26853
+26854
+26855
+26856
+26857
+26858
+26859
+26860
+26861
+26862
+26863
+26864
+26865
+26866
+26867
+26868
+26869
+26870
+26871
+26872
+26873
+26874
+26875
+26876
+26877
+26878
+26879
+26880
+26881
+26882
+26883
+26884
+26885
+26886
+26887
+26888
+26889
+26890
+26891
+26892
+26893
+26894
+26895
+26896
+26897
+26898
+26899
+26900
+26901
+26902
+26903
+26904
+26905
+26906
+26907
+26908
+26909
+26910
+26911
+26912
+26913
+26914
+26915
+26916
+26917
+26918
+26919
+26920
+26921
+26922
+26923
+26924
+26925
+26926
+26927
+26928
+26929
+26930
+26931
+26932
+26933
+26934
+26935
+26936
+26937
+26938
+26939
+26940
+26941
+26942
+26943
+26944
+26945
+26946
+26947
+26948
+26949
+26950
+26951
+26952
+26953
+26954
+26955
+26956
+26957
+26958
+26959
+26960
+26961
+26962
+26963
+26964
+26965
+26966
+26967
+26968
+26969
+26970
+26971
+26972
+26973
+26974
+26975
+26976
+26977
+26978
+26979
+26980
+26981
+26982
+26983
+26984
+26985
+26986
+26987
+26988
+26989
+26990
+26991
+26992
+26993
+26994
+26995
+26996
+26997
+26998
+26999
+27000
+27001
+27002
+27003
+27004
+27005
+27006
+27007
+27008
+27009
+27010
+27011
+27012
+27013
+27014
+27015
+27016
+27017
+27018
+27019
+27020
+27021
+27022
+27023
+27024
+27025
+27026
+27027
+27028
+27029
+27030
+27031
+27032
+27033
+27034
+27035
+27036
+27037
+27038
+27039
+27040
+27041
+27042
+27043
+27044
+27045
+27046
+27047
+27048
+27049
+27050
+27051
+27052
+27053
+27054
+27055
+27056
+27057
+27058
+27059
+27060
+27061
+27062
+27063
+27064
+27065
+27066
+27067
+27068
+27069
+27070
+27071
+27072
+27073
+27074
+27075
+27076
+27077
+27078
+27079
+27080
+27081
+27082
+27083
+27084
+27085
+27086
+27087
+27088
+27089
+27090
+27091
+27092
+27093
+27094
+27095
+27096
+27097
+27098
+27099
+27100
+27101
+27102
+27103
+27104
+27105
+27106
+27107
+27108
+27109
+27110
+27111
+27112
+27113
+27114
+27115
+27116
+27117
+27118
+27119
+27120
+27121
+27122
+27123
+27124
+27125
+27126
+27127
+27128
+27129
+27130
+27131
+27132
+27133
+27134
+27135
+27136
+27137
+27138
+27139
+27140
+27141
+27142
+27143
+27144
+27145
+27146
+27147
+27148
+27149
+27150
+27151
+27152
+27153
+27154
+27155
+27156
+27157
+27158
+27159
+27160
+27161
+27162
+27163
+27164
+27165
+27166
+27167
+27168
+27169
+27170
+27171
+27172
+27173
+27174
+27175
+27176
+27177
+27178
+27179
+27180
+27181
+27182
+27183
+27184
+27185
+27186
+27187
+27188
+27189
+27190
+27191
+27192
+27193
+27194
+27195
+27196
+27197
+27198
+27199
+27200
+27201
+27202
+27203
+27204
+27205
+27206
+27207
+27208
+27209
+27210
+27211
+27212
+27213
+27214
+27215
+27216
+27217
+27218
+27219
+27220
+27221
+27222
+27223
+27224
+27225
+27226
+27227
+27228
+27229
+27230
+27231
+27232
+27233
+27234
+27235
+27236
+27237
+27238
+27239
+27240
+27241
+27242
+27243
+27244
+27245
+27246
+27247
+27248
+27249
+27250
+27251
+27252
+27253
+27254
+27255
+27256
+27257
+27258
+27259
+27260
+27261
+27262
+27263
+27264
+27265
+27266
+27267
+27268
+27269
+27270
+27271
+27272
+27273
+27274
+27275
+27276
+27277
+27278
+27279
+27280
+27281
+27282
+27283
+27284
+27285
+27286
+27287
+27288
+27289
+27290
+27291
+27292
+27293
+27294
+27295
+27296
+27297
+27298
+27299
+27300
+27301
+27302
+27303
+27304
+27305
+27306
+27307
+27308
+27309
+27310
+27311
+27312
+27313
+27314
+27315
+27316
+27317
+27318
+27319
+27320
+27321
+27322
+27323
+27324
+27325
+27326
+27327
+27328
+27329
+27330
+27331
+27332
+27333
+27334
+27335
+27336
+27337
+27338
+27339
+27340
+27341
+27342
+27343
+27344
+27345
+27346
+27347
+27348
+27349
+27350
+27351
+27352
+27353
+27354
+27355
+27356
+27357
+27358
+27359
+27360
+27361
+27362
+27363
+27364
+27365
+27366
+27367
+27368
+27369
+27370
+27371
+27372
+27373
+27374
+27375
+27376
+27377
+27378
+27379
+27380
+27381
+27382
+27383
+27384
+27385
+27386
+27387
+27388
+27389
+27390
+27391
+27392
+27393
+27394
+27395
+27396
+27397
+27398
+27399
+27400
+27401
+27402
+27403
+27404
+27405
+27406
+27407
+27408
+27409
+27410
+27411
+27412
+27413
+27414
+27415
+27416
+27417
+27418
+27419
+27420
+27421
+27422
+27423
+27424
+27425
+27426
+27427
+27428
+27429
+27430
+27431
+27432
+27433
+27434
+27435
+27436
+27437
+27438
+27439
+27440
+27441
+27442
+27443
+27444
+27445
+27446
+27447
+27448
+27449
+27450
+27451
+27452
+27453
+27454
+27455
+27456
+27457
+27458
+27459
+27460
+27461
+27462
+27463
+27464
+27465
+27466
+27467
+27468
+27469
+27470
+27471
+27472
+27473
+27474
+27475
+27476
+27477
+27478
+27479
+27480
+27481
+27482
+27483
+27484
+27485
+27486
+27487
+27488
+27489
+27490
+27491
+27492
+27493
+27494
+27495
+27496
+27497
+27498
+27499
+27500
+27501
+27502
+27503
+27504
+27505
+27506
+27507
+27508
+27509
+27510
+27511
+27512
+27513
+27514
+27515
+27516
+27517
+27518
+27519
+27520
+27521
+27522
+27523
+27524
+27525
+27526
+27527
+27528
+27529
+27530
+27531
+27532
+27533
+27534
+27535
+27536
+27537
+27538
+27539
+27540
+27541
+27542
+27543
+27544
+27545
+27546
+27547
+27548
+27549
+27550
+27551
+27552
+27553
+27554
+27555
+27556
+27557
+27558
+27559
+27560
+27561
+27562
+27563
+27564
+27565
+27566
+27567
+27568
+27569
+27570
+27571
+27572
+27573
+27574
+27575
+27576
+27577
+27578
+27579
+27580
+27581
+27582
+27583
+27584
+27585
+27586
+27587
+27588
+27589
+27590
+27591
+27592
+27593
+27594
+27595
+27596
+27597
+27598
+27599
+27600
+27601
+27602
+27603
+27604
+27605
+27606
+27607
+27608
+27609
+27610
+27611
+27612
+27613
+27614
+27615
+27616
+27617
+27618
+27619
+27620
+27621
+27622
+27623
+27624
+27625
+27626
+27627
+27628
+27629
+27630
+27631
+27632
+27633
+27634
+27635
+27636
+27637
+27638
+27639
+27640
+27641
+27642
+27643
+27644
+27645
+27646
+27647
+27648
+27649
+27650
+27651
+27652
+27653
+27654
+27655
+27656
+27657
+27658
+27659
+27660
+27661
+27662
+27663
+27664
+27665
+27666
+27667
+27668
+27669
+27670
+27671
+27672
+27673
+27674
+27675
+27676
+27677
+27678
+27679
+27680
+27681
+27682
+27683
+27684
+27685
+27686
+27687
+27688
+27689
+27690
+27691
+27692
+27693
+27694
+27695
+27696
+27697
+27698
+27699
+27700
+27701
+27702
+27703
+27704
+27705
+27706
+27707
+27708
+27709
+27710
+27711
+27712
+27713
+27714
+27715
+27716
+27717
+27718
+27719
+27720
+27721
+27722
+27723
+27724
+27725
+27726
+27727
+27728
+27729
+27730
+27731
+27732
+27733
+27734
+27735
+27736
+27737
+27738
+27739
+27740
+27741
+27742
+27743
+27744
+27745
+27746
+27747
+27748
+27749
+27750
+27751
+27752
+27753
+27754
+27755
+27756
+27757
+27758
+27759
+27760
+27761
+27762
+27763
+27764
+27765
+27766
+27767
+27768
+27769
+27770
+27771
+27772
+27773
+27774
+27775
+27776
+27777
+27778
+27779
+27780
+27781
+27782
+27783
+27784
+27785
+27786
+27787
+27788
+27789
+27790
+27791
+27792
+27793
+27794
+27795
+27796
+27797
+27798
+27799
+27800
+27801
+27802
+27803
+27804
+27805
+27806
+27807
+27808
+27809
+27810
+27811
+27812
+27813
+27814
+27815
+27816
+27817
+27818
+27819
+27820
+27821
+27822
+27823
+27824
+27825
+27826
+27827
+27828
+27829
+27830
+27831
+27832
+27833
+27834
+27835
+27836
+27837
+27838
+27839
+27840
+27841
+27842
+27843
+27844
+27845
+27846
+27847
+27848
+27849
+27850
+27851
+27852
+27853
+27854
+27855
+27856
+27857
+27858
+27859
+27860
+27861
+27862
+27863
+27864
+27865
+27866
+27867
+27868
+27869
+27870
+27871
+27872
+27873
+27874
+27875
+27876
+27877
+27878
+27879
+27880
+27881
+27882
+27883
+27884
+27885
+27886
+27887
+27888
+27889
+27890
+27891
+27892
+27893
+27894
+27895
+27896
+27897
+27898
+27899
+27900
+27901
+27902
+27903
+27904
+27905
+27906
+27907
+27908
+27909
+27910
+27911
+27912
+27913
+27914
+27915
+27916
+27917
+27918
+27919
+27920
+27921
+27922
+27923
+27924
+27925
+27926
+27927
+27928
+27929
+27930
+27931
+27932
+27933
+27934
+27935
+27936
+27937
+27938
+27939
+27940
+27941
+27942
+27943
+27944
+27945
+27946
+27947
+27948
+27949
+27950
+27951
+27952
+27953
+27954
+27955
+27956
+27957
+27958
+27959
+27960
+27961
+27962
+27963
+27964
+27965
+27966
+27967
+27968
+27969
+27970
+27971
+27972
+27973
+27974
+27975
+27976
+27977
+27978
+27979
+27980
+27981
+27982
+27983
+27984
+27985
+27986
+27987
+27988
+27989
+27990
+27991
+27992
+27993
+27994
+27995
+27996
+27997
+27998
+27999
+28000
+28001
+28002
+28003
+28004
+28005
+28006
+28007
+28008
+28009
+28010
+28011
+28012
+28013
+28014
+28015
+28016
+28017
+28018
+28019
+28020
+28021
+28022
+28023
+28024
+28025
+28026
+28027
+28028
+28029
+28030
+28031
+28032
+28033
+28034
+28035
+28036
+28037
+28038
+28039
+28040
+28041
+28042
+28043
+28044
+28045
+28046
+28047
+28048
+28049
+28050
+28051
+28052
+28053
+28054
+28055
+28056
+28057
+28058
+28059
+28060
+28061
+28062
+28063
+28064
+28065
+28066
+28067
+28068
+28069
+28070
+28071
+28072
+28073
+28074
+28075
+28076
+28077
+28078
+28079
+28080
+28081
+28082
+28083
+28084
+28085
+28086
+28087
+28088
+28089
+28090
+28091
+28092
+28093
+28094
+28095
+28096
+28097
+28098
+28099
+28100
+28101
+28102
+28103
+28104
+28105
+28106
+28107
+28108
+28109
+28110
+28111
+28112
+28113
+28114
+28115
+28116
+28117
+28118
+28119
+28120
+28121
+28122
+28123
+28124
+28125
+28126
+28127
+28128
+28129
+28130
+28131
+28132
+28133
+28134
+28135
+28136
+28137
+28138
+28139
+28140
+28141
+28142
+28143
+28144
+28145
+28146
+28147
+28148
+28149
+28150
+28151
+28152
+28153
+28154
+28155
+28156
+28157
+28158
+28159
+28160
+28161
+28162
+28163
+28164
+28165
+28166
+28167
+28168
+28169
+28170
+28171
+28172
+28173
+28174
+28175
+28176
+28177
+28178
+28179
+28180
+28181
+28182
+28183
+28184
+28185
+28186
+28187
+28188
+28189
+28190
+28191
+28192
+28193
+28194
+28195
+28196
+28197
+28198
+28199
+28200
+28201
+28202
+28203
+28204
+28205
+28206
+28207
+28208
+28209
+28210
+28211
+28212
+28213
+28214
+28215
+28216
+28217
+28218
+28219
+28220
+28221
+28222
+28223
+28224
+28225
+28226
+28227
+28228
+28229
+28230
+28231
+28232
+28233
+28234
+28235
+28236
+28237
+28238
+28239
+28240
+28241
+28242
+28243
+28244
+28245
+28246
+28247
+28248
+28249
+28250
+28251
+28252
+28253
+28254
+28255
+28256
+28257
+28258
+28259
+28260
+28261
+28262
+28263
+28264
+28265
+28266
+28267
+28268
+28269
+28270
+28271
+28272
+28273
+28274
+28275
+28276
+28277
+28278
+28279
+28280
+28281
+28282
+28283
+28284
+28285
+28286
+28287
+28288
+28289
+28290
+28291
+28292
+28293
+28294
+28295
+28296
+28297
+28298
+28299
+28300
+28301
+28302
+28303
+28304
+28305
+28306
+28307
+28308
+28309
+28310
+28311
+28312
+28313
+28314
+28315
+28316
+28317
+28318
+28319
+28320
+28321
+28322
+28323
+28324
+28325
+28326
+28327
+28328
+28329
+28330
+28331
+28332
+28333
+28334
+28335
+28336
+28337
+28338
+28339
+28340
+28341
+28342
+28343
+28344
+28345
+28346
+28347
+28348
+28349
+28350
+28351
+28352
+28353
+28354
+28355
+28356
+28357
+28358
+28359
+28360
+28361
+28362
+28363
+28364
+28365
+28366
+28367
+28368
+28369
+28370
+28371
+28372
+28373
+28374
+28375
+28376
+28377
+28378
+28379
+28380
+28381
+28382
+28383
+28384
+28385
+28386
+28387
+28388
+28389
+28390
+28391
+28392
+28393
+28394
+28395
+28396
+28397
+28398
+28399
+28400
+28401
+28402
+28403
+28404
+28405
+28406
+28407
+28408
+28409
+28410
+28411
+28412
+28413
+28414
+28415
+28416
+28417
+28418
+28419
+28420
+28421
+28422
+28423
+28424
+28425
+28426
+28427
+28428
+28429
+28430
+28431
+28432
+28433
+28434
+28435
+28436
+28437
+28438
+28439
+28440
+28441
+28442
+28443
+28444
+28445
+28446
+28447
+28448
+28449
+28450
+28451
+28452
+28453
+28454
+28455
+28456
+28457
+28458
+28459
+28460
+28461
+28462
+28463
+28464
+28465
+28466
+28467
+28468
+28469
+28470
+28471
+28472
+28473
+28474
+28475
+28476
+28477
+28478
+28479
+28480
+28481
+28482
+28483
+28484
+28485
+28486
+28487
+28488
+28489
+28490
+28491
+28492
+28493
+28494
+28495
+28496
+28497
+28498
+28499
+28500
+28501
+28502
+28503
+28504
+28505
+28506
+28507
+28508
+28509
+28510
+28511
+28512
+28513
+28514
+28515
+28516
+28517
+28518
+28519
+28520
+28521
+28522
+28523
+28524
+28525
+28526
+28527
+28528
+28529
+28530
+28531
+28532
+28533
+28534
+28535
+28536
+28537
+28538
+28539
+28540
+28541
+28542
+28543
+28544
+28545
+28546
+28547
+28548
+28549
+28550
+28551
+28552
+28553
+28554
+28555
+28556
+28557
+28558
+28559
+28560
+28561
+28562
+28563
+28564
+28565
+28566
+28567
+28568
+28569
+28570
+28571
+28572
+28573
+28574
+28575
+28576
+28577
+28578
+28579
+28580
+28581
+28582
+28583
+28584
+28585
+28586
+28587
+28588
+28589
+28590
+28591
+28592
+28593
+28594
+28595
+28596
+28597
+28598
+28599
+28600
+28601
+28602
+28603
+28604
+28605
+28606
+28607
+28608
+28609
+28610
+28611
+28612
+28613
+28614
+28615
+28616
+28617
+28618
+28619
+28620
+28621
+28622
+28623
+28624
+28625
+28626
+28627
+28628
+28629
+28630
+28631
+28632
+28633
+28634
+28635
+28636
+28637
+28638
+28639
+28640
+28641
+28642
+28643
+28644
+28645
+28646
+28647
+28648
+28649
+28650
+28651
+28652
+28653
+28654
+28655
+28656
+28657
+28658
+28659
+28660
+28661
+28662
+28663
+28664
+28665
+28666
+28667
+28668
+28669
+28670
+28671
+28672
+28673
+28674
+28675
+28676
+28677
+28678
+28679
+28680
+28681
+28682
+28683
+28684
+28685
+28686
+28687
+28688
+28689
+28690
+28691
+28692
+28693
+28694
+28695
+28696
+28697
+28698
+28699
+28700
+28701
+28702
+28703
+28704
+28705
+28706
+28707
+28708
+28709
+28710
+28711
+28712
+28713
+28714
+28715
+28716
+28717
+28718
+28719
+28720
+28721
+28722
+28723
+28724
+28725
+28726
+28727
+28728
+28729
+28730
+28731
+28732
+28733
+28734
+28735
+28736
+28737
+28738
+28739
+28740
+28741
+28742
+28743
+28744
+28745
+28746
+28747
+28748
+28749
+28750
+28751
+28752
+28753
+28754
+28755
+28756
+28757
+28758
+28759
+28760
+28761
+28762
+28763
+28764
+28765
+28766
+28767
+28768
+28769
+28770
+28771
+28772
+28773
+28774
+28775
+28776
+28777
+28778
+28779
+28780
+28781
+28782
+28783
+28784
+28785
+28786
+28787
+28788
+28789
+28790
+28791
+28792
+28793
+28794
+28795
+28796
+28797
+28798
+28799
+28800
+28801
+28802
+28803
+28804
+28805
+28806
+28807
+28808
+28809
+28810
+28811
+28812
+28813
+28814
+28815
+28816
+28817
+28818
+28819
+28820
+28821
+28822
+28823
+28824
+28825
+28826
+28827
+28828
+28829
+28830
+28831
+28832
+28833
+28834
+28835
+28836
+28837
+28838
+28839
+28840
+28841
+28842
+28843
+28844
+28845
+28846
+28847
+28848
+28849
+28850
+28851
+28852
+28853
+28854
+28855
+28856
+28857
+28858
+28859
+28860
+28861
+28862
+28863
+28864
+28865
+28866
+28867
+28868
+28869
+28870
+28871
+28872
+28873
+28874
+28875
+28876
+28877
+28878
+28879
+28880
+28881
+28882
+28883
+28884
+28885
+28886
+28887
+28888
+28889
+28890
+28891
+28892
+28893
+28894
+28895
+28896
+28897
+28898
+28899
+28900
+28901
+28902
+28903
+28904
+28905
+28906
+28907
+28908
+28909
+28910
+28911
+28912
+28913
+28914
+28915
+28916
+28917
+28918
+28919
+28920
+28921
+28922
+28923
+28924
+28925
+28926
+28927
+28928
+28929
+28930
+28931
+28932
+28933
+28934
+28935
+28936
+28937
+28938
+28939
+28940
+28941
+28942
+28943
+28944
+28945
+28946
+28947
+28948
+28949
+28950
+28951
+28952
+28953
+28954
+28955
+28956
+28957
+28958
+28959
+28960
+28961
+28962
+28963
+28964
+28965
+28966
+28967
+28968
+28969
+28970
+28971
+28972
+28973
+28974
+28975
+28976
+28977
+28978
+28979
+28980
+28981
+28982
+28983
+28984
+28985
+28986
+28987
+28988
+28989
+28990
+28991
+28992
+28993
+28994
+28995
+28996
+28997
+28998
+28999
+29000
+29001
+29002
+29003
+29004
+29005
+29006
+29007
+29008
+29009
+29010
+29011
+29012
+29013
+29014
+29015
+29016
+29017
+29018
+29019
+29020
+29021
+29022
+29023
+29024
+29025
+29026
+29027
+29028
+29029
+29030
+29031
+29032
+29033
+29034
+29035
+29036
+29037
+29038
+29039
+29040
+29041
+29042
+29043
+29044
+29045
+29046
+29047
+29048
+29049
+29050
+29051
+29052
+29053
+29054
+29055
+29056
+29057
+29058
+29059
+29060
+29061
+29062
+29063
+29064
+29065
+29066
+29067
+29068
+29069
+29070
+29071
+29072
+29073
+29074
+29075
+29076
+29077
+29078
+29079
+29080
+29081
+29082
+29083
+29084
+29085
+29086
+29087
+29088
+29089
+29090
+29091
+29092
+29093
+29094
+29095
+29096
+29097
+29098
+29099
+29100
+29101
+29102
+29103
+29104
+29105
+29106
+29107
+29108
+29109
+29110
+29111
+29112
+29113
+29114
+29115
+29116
+29117
+29118
+29119
+29120
+29121
+29122
+29123
+29124
+29125
+29126
+29127
+29128
+29129
+29130
+29131
+29132
+29133
+29134
+29135
+29136
+29137
+29138
+29139
+29140
+29141
+29142
+29143
+29144
+29145
+29146
+29147
+29148
+29149
+29150
+29151
+29152
+29153
+29154
+29155
+29156
+29157
+29158
+29159
+29160
+29161
+29162
+29163
+29164
+29165
+29166
+29167
+29168
+29169
+29170
+29171
+29172
+29173
+29174
+29175
+29176
+29177
+29178
+29179
+29180
+29181
+29182
+29183
+29184
+29185
+29186
+29187
+29188
+29189
+29190
+29191
+29192
+29193
+29194
+29195
+29196
+29197
+29198
+29199
+29200
+29201
+29202
+29203
+29204
+29205
+29206
+29207
+29208
+29209
+29210
+29211
+29212
+29213
+29214
+29215
+29216
+29217
+29218
+29219
+29220
+29221
+29222
+29223
+29224
+29225
+29226
+29227
+29228
+29229
+29230
+29231
+29232
+29233
+29234
+29235
+29236
+29237
+29238
+29239
+29240
+29241
+29242
+29243
+29244
+29245
+29246
+29247
+29248
+29249
+29250
+29251
+29252
+29253
+29254
+29255
+29256
+29257
+29258
+29259
+29260
+29261
+29262
+29263
+29264
+29265
+29266
+29267
+29268
+29269
+29270
+29271
+29272
+29273
+29274
+29275
+29276
+29277
+29278
+29279
+29280
+29281
+29282
+29283
+29284
+29285
+29286
+29287
+29288
+29289
+29290
+29291
+29292
+29293
+29294
+29295
+29296
+29297
+29298
+29299
+29300
+29301
+29302
+29303
+29304
+29305
+29306
+29307
+29308
+29309
+29310
+29311
+29312
+29313
+29314
+29315
+29316
+29317
+29318
+29319
+29320
+29321
+29322
+29323
+29324
+29325
+29326
+29327
+29328
+29329
+29330
+29331
+29332
+29333
+29334
+29335
+29336
+29337
+29338
+29339
+29340
+29341
+29342
+29343
+29344
+29345
+29346
+29347
+29348
+29349
+29350
+29351
+29352
+29353
+29354
+29355
+29356
+29357
+29358
+29359
+29360
+29361
+29362
+29363
+29364
+29365
+29366
+29367
+29368
+29369
+29370
+29371
+29372
+29373
+29374
+29375
+29376
+29377
+29378
+29379
+29380
+29381
+29382
+29383
+29384
+29385
+29386
+29387
+29388
+29389
+29390
+29391
+29392
+29393
+29394
+29395
+29396
+29397
+29398
+29399
+29400
+29401
+29402
+29403
+29404
+29405
+29406
+29407
+29408
+29409
+29410
+29411
+29412
+29413
+29414
+29415
+29416
+29417
+29418
+29419
+29420
+29421
+29422
+29423
+29424
+29425
+29426
+29427
+29428
+29429
+29430
+29431
+29432
+29433
+29434
+29435
+29436
+29437
+29438
+29439
+29440
+29441
+29442
+29443
+29444
+29445
+29446
+29447
+29448
+29449
+29450
+29451
+29452
+29453
+29454
+29455
+29456
+29457
+29458
+29459
+29460
+29461
+29462
+29463
+29464
+29465
+29466
+29467
+29468
+29469
+29470
+29471
+29472
+29473
+29474
+29475
+29476
+29477
+29478
+29479
+29480
+29481
+29482
+29483
+29484
+29485
+29486
+29487
+29488
+29489
+29490
+29491
+29492
+29493
+29494
+29495
+29496
+29497
+29498
+29499
+29500
+29501
+29502
+29503
+29504
+29505
+29506
+29507
+29508
+29509
+29510
+29511
+29512
+29513
+29514
+29515
+29516
+29517
+29518
+29519
+29520
+29521
+29522
+29523
+29524
+29525
+29526
+29527
+29528
+29529
+29530
+29531
+29532
+29533
+29534
+29535
+29536
+29537
+29538
+29539
+29540
+29541
+29542
+29543
+29544
+29545
+29546
+29547
+29548
+29549
+29550
+29551
+29552
+29553
+29554
+29555
+29556
+29557
+29558
+29559
+29560
+29561
+29562
+29563
+29564
+29565
+29566
+29567
+29568
+29569
+29570
+29571
+29572
+29573
+29574
+29575
+29576
+29577
+29578
+29579
+29580
+29581
+29582
+29583
+29584
+29585
+29586
+29587
+29588
+29589
+29590
+29591
+29592
+29593
+29594
+29595
+29596
+29597
+29598
+29599
+29600
+29601
+29602
+29603
+29604
+29605
+29606
+29607
+29608
+29609
+29610
+29611
+29612
+29613
+29614
+29615
+29616
+29617
+29618
+29619
+29620
+29621
+29622
+29623
+29624
+29625
+29626
+29627
+29628
+29629
+29630
+29631
+29632
+29633
+29634
+29635
+29636
+29637
+29638
+29639
+29640
+29641
+29642
+29643
+29644
+29645
+29646
+29647
+29648
+29649
+29650
+29651
+29652
+29653
+29654
+29655
+29656
+29657
+29658
+29659
+29660
+29661
+29662
+29663
+29664
+29665
+29666
+29667
+29668
+29669
+29670
+29671
+29672
+29673
+29674
+29675
+29676
+29677
+29678
+29679
+29680
+29681
+29682
+29683
+29684
+29685
+29686
+29687
+29688
+29689
+29690
+29691
+29692
+29693
+29694
+29695
+29696
+29697
+29698
+29699
+29700
+29701
+29702
+29703
+29704
+29705
+29706
+29707
+29708
+29709
+29710
+29711
+29712
+29713
+29714
+29715
+29716
+29717
+29718
+29719
+29720
+29721
+29722
+29723
+29724
+29725
+29726
+29727
+29728
+29729
+29730
+29731
+29732
+29733
+29734
+29735
+29736
+29737
+29738
+29739
+29740
+29741
+29742
+29743
+29744
+29745
+29746
+29747
+29748
+29749
+29750
+29751
+29752
+29753
+29754
+29755
+29756
+29757
+29758
+29759
+29760
+29761
+29762
+29763
+29764
+29765
+29766
+29767
+29768
+29769
+29770
+29771
+29772
+29773
+29774
+29775
+29776
+29777
+29778
+29779
+29780
+29781
+29782
+29783
+29784
+29785
+29786
+29787
+29788
+29789
+29790
+29791
+29792
+29793
+29794
+29795
+29796
+29797
+29798
+29799
+29800
+29801
+29802
+29803
+29804
+29805
+29806
+29807
+29808
+29809
+29810
+29811
+29812
+29813
+29814
+29815
+29816
+29817
+29818
+29819
+29820
+29821
+29822
+29823
+29824
+29825
+29826
+29827
+29828
+29829
+29830
+29831
+29832
+29833
+29834
+29835
+29836
+29837
+29838
+29839
+29840
+29841
+29842
+29843
+29844
+29845
+29846
+29847
+29848
+29849
+29850
+29851
+29852
+29853
+29854
+29855
+29856
+29857
+29858
+29859
+29860
+29861
+29862
+29863
+29864
+29865
+29866
+29867
+29868
+29869
+29870
+29871
+29872
+29873
+29874
+29875
+29876
+29877
+29878
+29879
+29880
+29881
+29882
+29883
+29884
+29885
+29886
+29887
+29888
+29889
+29890
+29891
+29892
+29893
+29894
+29895
+29896
+29897
+29898
+29899
+29900
+29901
+29902
+29903
+29904
+29905
+29906
+29907
+29908
+29909
+29910
+29911
+29912
+29913
+29914
+29915
+29916
+29917
+29918
+29919
+29920
+29921
+29922
+29923
+29924
+29925
+29926
+29927
+29928
+29929
+29930
+29931
+29932
+29933
+29934
+29935
+29936
+29937
+29938
+29939
+29940
+29941
+29942
+29943
+29944
+29945
+29946
+29947
+29948
+29949
+29950
+29951
+29952
+29953
+29954
+29955
+29956
+29957
+29958
+29959
+29960
+29961
+29962
+29963
+29964
+29965
+29966
+29967
+29968
+29969
+29970
+29971
+29972
+29973
+29974
+29975
+29976
+29977
+29978
+29979
+29980
+29981
+29982
+29983
+29984
+29985
+29986
+29987
+29988
+29989
+29990
+29991
+29992
+29993
+29994
+29995
+29996
+29997
+29998
+29999
+30000
+30001
+30002
+30003
+30004
+30005
+30006
+30007
+30008
+30009
+30010
+30011
+30012
+30013
+30014
+30015
+30016
+30017
+30018
+30019
+30020
+30021
+30022
+30023
+30024
+30025
+30026
+30027
+30028
+30029
+30030
+30031
+30032
+30033
+30034
+30035
+30036
+30037
+30038
+30039
+30040
+30041
+30042
+30043
+30044
+30045
+30046
+30047
+30048
+30049
+30050
+30051
+30052
+30053
+30054
+30055
+30056
+30057
+30058
+30059
+30060
+30061
+30062
+30063
+30064
+30065
+30066
+30067
+30068
+30069
+30070
+30071
+30072
+30073
+30074
+30075
+30076
+30077
+30078
+30079
+30080
+30081
+30082
+30083
+30084
+30085
+30086
+30087
+30088
+30089
+30090
+30091
+30092
+30093
+30094
+30095
+30096
+30097
+30098
+30099
+30100
+30101
+30102
+30103
+30104
+30105
+30106
+30107
+30108
+30109
+30110
+30111
+30112
+30113
+30114
+30115
+30116
+30117
+30118
+30119
+30120
+30121
+30122
+30123
+30124
+30125
+30126
+30127
+30128
+30129
+30130
+30131
+30132
+30133
+30134
+30135
+30136
+30137
+30138
+30139
+30140
+30141
+30142
+30143
+30144
+30145
+30146
+30147
+30148
+30149
+30150
+30151
+30152
+30153
+30154
+30155
+30156
+30157
+30158
+30159
+30160
+30161
+30162
+30163
+30164
+30165
+30166
+30167
+30168
+30169
+30170
+30171
+30172
+30173
+30174
+30175
+30176
+30177
+30178
+30179
+30180
+30181
+30182
+30183
+30184
+30185
+30186
+30187
+30188
+30189
+30190
+30191
+30192
+30193
+30194
+30195
+30196
+30197
+30198
+30199
+30200
+30201
+30202
+30203
+30204
+30205
+30206
+30207
+30208
+30209
+30210
+30211
+30212
+30213
+30214
+30215
+30216
+30217
+30218
+30219
+30220
+30221
+30222
+30223
+30224
+30225
+30226
+30227
+30228
+30229
+30230
+30231
+30232
+30233
+30234
+30235
+30236
+30237
+30238
+30239
+30240
+30241
+30242
+30243
+30244
+30245
+30246
+30247
+30248
+30249
+30250
+30251
+30252
+30253
+30254
+30255
+30256
+30257
+30258
+30259
+30260
+30261
+30262
+30263
+30264
+30265
+30266
+30267
+30268
+30269
+30270
+30271
+30272
+30273
+30274
+30275
+30276
+30277
+30278
+30279
+30280
+30281
+30282
+30283
+30284
+30285
+30286
+30287
+30288
+30289
+30290
+30291
+30292
+30293
+30294
+30295
+30296
+30297
+30298
+30299
+30300
+30301
+30302
+30303
+30304
+30305
+30306
+30307
+30308
+30309
+30310
+30311
+30312
+30313
+30314
+30315
+30316
+30317
+30318
+30319
+30320
+30321
+30322
+30323
+30324
+30325
+30326
+30327
+30328
+30329
+30330
+30331
+30332
+30333
+30334
+30335
+30336
+30337
+30338
+30339
+30340
+30341
+30342
+30343
+30344
+30345
+30346
+30347
+30348
+30349
+30350
+30351
+30352
+30353
+30354
+30355
+30356
+30357
+30358
+30359
+30360
+30361
+30362
+30363
+30364
+30365
+30366
+30367
+30368
+30369
+30370
+30371
+30372
+30373
+30374
+30375
+30376
+30377
+30378
+30379
+30380
+30381
+30382
+30383
+30384
+30385
+30386
+30387
+30388
+30389
+30390
+30391
+30392
+30393
+30394
+30395
+30396
+30397
+30398
+30399
+30400
+30401
+30402
+30403
+30404
+30405
+30406
+30407
+30408
+30409
+30410
+30411
+30412
+30413
+30414
+30415
+30416
+30417
+30418
+30419
+30420
+30421
+30422
+30423
+30424
+30425
+30426
+30427
+30428
+30429
+30430
+30431
+30432
+30433
+30434
+30435
+30436
+30437
+30438
+30439
+30440
+30441
+30442
+30443
+30444
+30445
+30446
+30447
+30448
+30449
+30450
+30451
+30452
+30453
+30454
+30455
+30456
+30457
+30458
+30459
+30460
+30461
+30462
+30463
+30464
+30465
+30466
+30467
+30468
+30469
+30470
+30471
+30472
+30473
+30474
+30475
+30476
+30477
+30478
+30479
+30480
+30481
+30482
+30483
+30484
+30485
+30486
+30487
+30488
+30489
+30490
+30491
+30492
+30493
+30494
+30495
+30496
+30497
+30498
+30499
+30500
+30501
+30502
+30503
+30504
+30505
+30506
+30507
+30508
+30509
+30510
+30511
+30512
+30513
+30514
+30515
+30516
+30517
+30518
+30519
+30520
+30521
+30522
+30523
+30524
+30525
+30526
+30527
+30528
+30529
+30530
+30531
+30532
+30533
+30534
+30535
+30536
+30537
+30538
+30539
+30540
+30541
+30542
+30543
+30544
+30545
+30546
+30547
+30548
+30549
+30550
+30551
+30552
+30553
+30554
+30555
+30556
+30557
+30558
+30559
+30560
+30561
+30562
+30563
+30564
+30565
+30566
+30567
+30568
+30569
+30570
+30571
+30572
+30573
+30574
+30575
+30576
+30577
+30578
+30579
+30580
+30581
+30582
+30583
+30584
+30585
+30586
+30587
+30588
+30589
+30590
+30591
+30592
+30593
+30594
+30595
+30596
+30597
+30598
+30599
+30600
+30601
+30602
+30603
+30604
+30605
+30606
+30607
+30608
+30609
+30610
+30611
+30612
+30613
+30614
+30615
+30616
+30617
+30618
+30619
+30620
+30621
+30622
+30623
+30624
+30625
+30626
+30627
+30628
+30629
+30630
+30631
+30632
+30633
+30634
+30635
+30636
+30637
+30638
+30639
+30640
+30641
+30642
+30643
+30644
+30645
+30646
+30647
+30648
+30649
+30650
+30651
+30652
+30653
+30654
+30655
+30656
+30657
+30658
+30659
+30660
+30661
+30662
+30663
+30664
+30665
+30666
+30667
+30668
+30669
+30670
+30671
+30672
+30673
+30674
+30675
+30676
+30677
+30678
+30679
+30680
+30681
+30682
+30683
+30684
+30685
+30686
+30687
+30688
+30689
+30690
+30691
+30692
+30693
+30694
+30695
+30696
+30697
+30698
+30699
+30700
+30701
+30702
+30703
+30704
+30705
+30706
+30707
+30708
+30709
+30710
+30711
+30712
+30713
+30714
+30715
+30716
+30717
+30718
+30719
+30720
+30721
+30722
+30723
+30724
+30725
+30726
+30727
+30728
+30729
+30730
+30731
+30732
+30733
+30734
+30735
+30736
+30737
+30738
+30739
+30740
+30741
+30742
+30743
+30744
+30745
+30746
+30747
+30748
+30749
+30750
+30751
+30752
+30753
+30754
+30755
+30756
+30757
+30758
+30759
+30760
+30761
+30762
+30763
+30764
+30765
+30766
+30767
+30768
+30769
+30770
+30771
+30772
+30773
+30774
+30775
+30776
+30777
+30778
+30779
+30780
+30781
+30782
+30783
+30784
+30785
+30786
+30787
+30788
+30789
+30790
+30791
+30792
+30793
+30794
+30795
+30796
+30797
+30798
+30799
+30800
+30801
+30802
+30803
+30804
+30805
+30806
+30807
+30808
+30809
+30810
+30811
+30812
+30813
+30814
+30815
+30816
+30817
+30818
+30819
+30820
+30821
+30822
+30823
+30824
+30825
+30826
+30827
+30828
+30829
+30830
+30831
+30832
+30833
+30834
+30835
+30836
+30837
+30838
+30839
+30840
+30841
+30842
+30843
+30844
+30845
+30846
+30847
+30848
+30849
+30850
+30851
+30852
+30853
+30854
+30855
+30856
+30857
+30858
+30859
+30860
+30861
+30862
+30863
+30864
+30865
+30866
+30867
+30868
+30869
+30870
+30871
+30872
+30873
+30874
+30875
+30876
+30877
+30878
+30879
+30880
+30881
+30882
+30883
+30884
+30885
+30886
+30887
+30888
+30889
+30890
+30891
+30892
+30893
+30894
+30895
+30896
+30897
+30898
+30899
+30900
+30901
+30902
+30903
+30904
+30905
+30906
+30907
+30908
+30909
+30910
+30911
+30912
+30913
+30914
+30915
+30916
+30917
+30918
+30919
+30920
+30921
+30922
+30923
+30924
+30925
+30926
+30927
+30928
+30929
+30930
+30931
+30932
+30933
+30934
+30935
+30936
+30937
+30938
+30939
+30940
+30941
+30942
+30943
+30944
+30945
+30946
+30947
+30948
+30949
+30950
+30951
+30952
+30953
+30954
+30955
+30956
+30957
+30958
+30959
+30960
+30961
+30962
+30963
+30964
+30965
+30966
+30967
+30968
+30969
+30970
+30971
+30972
+30973
+30974
+30975
+30976
+30977
+30978
+30979
+30980
+30981
+30982
+30983
+30984
+30985
+30986
+30987
+30988
+30989
+30990
+30991
+30992
+30993
+30994
+30995
+30996
+30997
+30998
+30999
+31000
+31001
+31002
+31003
+31004
+31005
+31006
+31007
+31008
+31009
+31010
+31011
+31012
+31013
+31014
+31015
+31016
+31017
+31018
+31019
+31020
+31021
+31022
+31023
+31024
+31025
+31026
+31027
+31028
+31029
+31030
+31031
+31032
+31033
+31034
+31035
+31036
+31037
+31038
+31039
+31040
+31041
+31042
+31043
+31044
+31045
+31046
+31047
+31048
+31049
+31050
+31051
+31052
+31053
+31054
+31055
+31056
+31057
+31058
+31059
+31060
+31061
+31062
+31063
+31064
+31065
+31066
+31067
+31068
+31069
+31070
+31071
+31072
+31073
+31074
+31075
+31076
+31077
+31078
+31079
+31080
+31081
+31082
+31083
+31084
+31085
+31086
+31087
+31088
+31089
+31090
+31091
+31092
+31093
+31094
+31095
+31096
+31097
+31098
+31099
+31100
+31101
+31102
+31103
+31104
+31105
+31106
+31107
+31108
+31109
+31110
+31111
+31112
+31113
+31114
+31115
+31116
+31117
+31118
+31119
+31120
+31121
+31122
+31123
+31124
+31125
+31126
+31127
+31128
+31129
+31130
+31131
+31132
+31133
+31134
+31135
+31136
+31137
+31138
+31139
+31140
+31141
+31142
+31143
+31144
+31145
+31146
+31147
+31148
+31149
+31150
+31151
+31152
+31153
+31154
+31155
+31156
+31157
+31158
+31159
+31160
+31161
+31162
+31163
+31164
+31165
+31166
+31167
+31168
+31169
+31170
+31171
+31172
+31173
+31174
+31175
+31176
+31177
+31178
+31179
+31180
+31181
+31182
+31183
+31184
+31185
+31186
+31187
+31188
+31189
+31190
+31191
+31192
+31193
+31194
+31195
+31196
+31197
+31198
+31199
+31200
+31201
+31202
+31203
+31204
+31205
+31206
+31207
+31208
+31209
+31210
+31211
+31212
+31213
+31214
+31215
+31216
+31217
+31218
+31219
+31220
+31221
+31222
+31223
+31224
+31225
+31226
+31227
+31228
+31229
+31230
+31231
+31232
+31233
+31234
+31235
+31236
+31237
+31238
+31239
+31240
+31241
+31242
+31243
+31244
+31245
+31246
+31247
+31248
+31249
+31250
+31251
+31252
+31253
+31254
+31255
+31256
+31257
+31258
+31259
+31260
+31261
+31262
+31263
+31264
+31265
+31266
+31267
+31268
+31269
+31270
+31271
+31272
+31273
+31274
+31275
+31276
+31277
+31278
+31279
+31280
+31281
+31282
+31283
+31284
+31285
+31286
+31287
+31288
+31289
+31290
+31291
+31292
+31293
+31294
+31295
+31296
+31297
+31298
+31299
+31300
+31301
+31302
+31303
+31304
+31305
+31306
+31307
+31308
+31309
+31310
+31311
+31312
+31313
+31314
+31315
+31316
+31317
+31318
+31319
+31320
+31321
+31322
+31323
+31324
+31325
+31326
+31327
+31328
+31329
+31330
+31331
+31332
+31333
+31334
+31335
+31336
+31337
+31338
+31339
+31340
+31341
+31342
+31343
+31344
+31345
+31346
+31347
+31348
+31349
+31350
+31351
+31352
+31353
+31354
+31355
+31356
+31357
+31358
+31359
+31360
+31361
+31362
+31363
+31364
+31365
+31366
+31367
+31368
+31369
+31370
+31371
+31372
+31373
+31374
+31375
+31376
+31377
+31378
+31379
+31380
+31381
+31382
+31383
+31384
+31385
+31386
+31387
+31388
+31389
+31390
+31391
+31392
+31393
+31394
+31395
+31396
+31397
+31398
+31399
+31400
+31401
+31402
+31403
+31404
+31405
+31406
+31407
+31408
+31409
+31410
+31411
+31412
+31413
+31414
+31415
+31416
+31417
+31418
+31419
+31420
+31421
+31422
+31423
+31424
+31425
+31426
+31427
+31428
+31429
+31430
+31431
+31432
+31433
+31434
+31435
+31436
+31437
+31438
+31439
+31440
+31441
+31442
+31443
+31444
+31445
+31446
+31447
+31448
+31449
+31450
+31451
+31452
+31453
+31454
+31455
+31456
+31457
+31458
+31459
+31460
+31461
+31462
+31463
+31464
+31465
+31466
+31467
+31468
+31469
+31470
+31471
+31472
+31473
+31474
+31475
+31476
+31477
+31478
+31479
+31480
+31481
+31482
+31483
+31484
+31485
+31486
+31487
+31488
+31489
+31490
+31491
+31492
+31493
+31494
+31495
+31496
+31497
+31498
+31499
+31500
+31501
+31502
+31503
+31504
+31505
+31506
+31507
+31508
+31509
+31510
+31511
+31512
+31513
+31514
+31515
+31516
+31517
+31518
+31519
+31520
+31521
+31522
+31523
+31524
+31525
+31526
+31527
+31528
+31529
+31530
+31531
+31532
+31533
+31534
+31535
+31536
+31537
+31538
+31539
+31540
+31541
+31542
+31543
+31544
+31545
+31546
+31547
+31548
+31549
+31550
+31551
+31552
+31553
+31554
+31555
+31556
+31557
+31558
+31559
+31560
+31561
+31562
+31563
+31564
+31565
+31566
+31567
+31568
+31569
+31570
+31571
+31572
+31573
+31574
+31575
+31576
+31577
+31578
+31579
+31580
+31581
+31582
+31583
+31584
+31585
+31586
+31587
+31588
+31589
+31590
+31591
+31592
+31593
+31594
+31595
+31596
+31597
+31598
+31599
+31600
+31601
+31602
+31603
+31604
+31605
+31606
+31607
+31608
+31609
+31610
+31611
+31612
+31613
+31614
+31615
+31616
+31617
+31618
+31619
+31620
+31621
+31622
+31623
+31624
+31625
+31626
+31627
+31628
+31629
+31630
+31631
+31632
+31633
+31634
+31635
+31636
+31637
+31638
+31639
+31640
+31641
+31642
+31643
+31644
+31645
+31646
+31647
+31648
+31649
+31650
+31651
+31652
+31653
+31654
+31655
+31656
+31657
+31658
+31659
+31660
+31661
+31662
+31663
+31664
+31665
+31666
+31667
+31668
+31669
+31670
+31671
+31672
+31673
+31674
+31675
+31676
+31677
+31678
+31679
+31680
+31681
+31682
+31683
+31684
+31685
+31686
+31687
+31688
+31689
+31690
+31691
+31692
+31693
+31694
+31695
+31696
+31697
+31698
+31699
+31700
+31701
+31702
+31703
+31704
+31705
+31706
+31707
+31708
+31709
+31710
+31711
+31712
+31713
+31714
+31715
+31716
+31717
+31718
+31719
+31720
+31721
+31722
+31723
+31724
+31725
+31726
+31727
+31728
+31729
+31730
+31731
+31732
+31733
+31734
+31735
+31736
+31737
+31738
+31739
+31740
+31741
+31742
+31743
+31744
+31745
+31746
+31747
+31748
+31749
+31750
+31751
+31752
+31753
+31754
+31755
+31756
+31757
+31758
+31759
+31760
+31761
+31762
+31763
+31764
+31765
+31766
+31767
+31768
+31769
+31770
+31771
+31772
+31773
+31774
+31775
+31776
+31777
+31778
+31779
+31780
+31781
+31782
+31783
+31784
+31785
+31786
+31787
+31788
+31789
+31790
+31791
+31792
+31793
+31794
+31795
+31796
+31797
+31798
+31799
+31800
+31801
+31802
+31803
+31804
+31805
+31806
+31807
+31808
+31809
+31810
+31811
+31812
+31813
+31814
+31815
+31816
+31817
+31818
+31819
+31820
+31821
+31822
+31823
+31824
+31825
+31826
+31827
+31828
+31829
+31830
+31831
+31832
+31833
+31834
+31835
+31836
+31837
+31838
+31839
+31840
+31841
+31842
+31843
+31844
+31845
+31846
+31847
+31848
+31849
+31850
+31851
+31852
+31853
+31854
+31855
+31856
+31857
+31858
+31859
+31860
+31861
+31862
+31863
+31864
+31865
+31866
+31867
+31868
+31869
+31870
+31871
+31872
+31873
+31874
+31875
+31876
+31877
+31878
+31879
+31880
+31881
+31882
+31883
+31884
+31885
+31886
+31887
+31888
+31889
+31890
+31891
+31892
+31893
+31894
+31895
+31896
+31897
+31898
+31899
+31900
+31901
+31902
+31903
+31904
+31905
+31906
+31907
+31908
+31909
+31910
+31911
+31912
+31913
+31914
+31915
+31916
+31917
+31918
+31919
+31920
+31921
+31922
+31923
+31924
+31925
+31926
+31927
+31928
+31929
+31930
+31931
+31932
+31933
+31934
+31935
+31936
+31937
+31938
+31939
+31940
+31941
+31942
+31943
+31944
+31945
+31946
+31947
+31948
+31949
+31950
+31951
+31952
+31953
+31954
+31955
+31956
+31957
+31958
+31959
+31960
+31961
+31962
+31963
+31964
+31965
+31966
+31967
+31968
+31969
+31970
+31971
+31972
+31973
+31974
+31975
+31976
+31977
+31978
+31979
+31980
+31981
+31982
+31983
+31984
+31985
+31986
+31987
+31988
+31989
+31990
+31991
+31992
+31993
+31994
+31995
+31996
+31997
+31998
+31999
+32000
+32001
+32002
+32003
+32004
+32005
+32006
+32007
+32008
+32009
+32010
+32011
+32012
+32013
+32014
+32015
+32016
+32017
+32018
+32019
+32020
+32021
+32022
+32023
+32024
+32025
+32026
+32027
+32028
+32029
+32030
+32031
+32032
+32033
+32034
+32035
+32036
+32037
+32038
+32039
+32040
+32041
+32042
+32043
+32044
+32045
+32046
+32047
+32048
+32049
+32050
+32051
+32052
+32053
+32054
+32055
+32056
+32057
+32058
+32059
+32060
+32061
+32062
+32063
+32064
+32065
+32066
+32067
+32068
+32069
+32070
+32071
+32072
+32073
+32074
+32075
+32076
+32077
+32078
+32079
+32080
+32081
+32082
+32083
+32084
+32085
+32086
+32087
+32088
+32089
+32090
+32091
+32092
+32093
+32094
+32095
+32096
+32097
+32098
+32099
+32100
+32101
+32102
+32103
+32104
+32105
+32106
+32107
+32108
+32109
+32110
+32111
+32112
+32113
+32114
+32115
+32116
+32117
+32118
+32119
+32120
+32121
+32122
+32123
+32124
+32125
+32126
+32127
+32128
+32129
+32130
+32131
+32132
+32133
+32134
+32135
+32136
+32137
+32138
+32139
+32140
+32141
+32142
+32143
+32144
+32145
+32146
+32147
+32148
+32149
+32150
+32151
+32152
+32153
+32154
+32155
+32156
+32157
+32158
+32159
+32160
+32161
+32162
+32163
+32164
+32165
+32166
+32167
+32168
+32169
+32170
+32171
+32172
+32173
+32174
+32175
+32176
+32177
+32178
+32179
+32180
+32181
+32182
+32183
+32184
+32185
+32186
+32187
+32188
+32189
+32190
+32191
+32192
+32193
+32194
+32195
+32196
+32197
+32198
+32199
+32200
+32201
+32202
+32203
+32204
+32205
+32206
+32207
+32208
+32209
+32210
+32211
+32212
+32213
+32214
+32215
+32216
+32217
+32218
+32219
+32220
+32221
+32222
+32223
+32224
+32225
+32226
+32227
+32228
+32229
+32230
+32231
+32232
+32233
+32234
+32235
+32236
+32237
+32238
+32239
+32240
+32241
+32242
+32243
+32244
+32245
+32246
+32247
+32248
+32249
+32250
+32251
+32252
+32253
+32254
+32255
+32256
+32257
+32258
+32259
+32260
+32261
+32262
+32263
+32264
+32265
+32266
+32267
+32268
+32269
+32270
+32271
+32272
+32273
+32274
+32275
+32276
+32277
+32278
+32279
+32280
+32281
+32282
+32283
+32284
+32285
+32286
+32287
+32288
+32289
+32290
+32291
+32292
+32293
+32294
+32295
+32296
+32297
+32298
+32299
+32300
+32301
+32302
+32303
+32304
+32305
+32306
+32307
+32308
+32309
+32310
+32311
+32312
+32313
+32314
+32315
+32316
+32317
+32318
+32319
+32320
+32321
+32322
+32323
+32324
+32325
+32326
+32327
+32328
+32329
+32330
+32331
+32332
+32333
+32334
+32335
+32336
+32337
+32338
+32339
+32340
+32341
+32342
+32343
+32344
+32345
+32346
+32347
+32348
+32349
+32350
+32351
+32352
+32353
+32354
+32355
+32356
+32357
+32358
+32359
+32360
+32361
+32362
+32363
+32364
+32365
+32366
+32367
+32368
+32369
+32370
+32371
+32372
+32373
+32374
+32375
+32376
+32377
+32378
+32379
+32380
+32381
+32382
+32383
+32384
+32385
+32386
+32387
+32388
+32389
+32390
+32391
+32392
+32393
+32394
+32395
+32396
+32397
+32398
+32399
+32400
+32401
+32402
+32403
+32404
+32405
+32406
+32407
+32408
+32409
+32410
+32411
+32412
+32413
+32414
+32415
+32416
+32417
+32418
+32419
+32420
+32421
+32422
+32423
+32424
+32425
+32426
+32427
+32428
+32429
+32430
+32431
+32432
+32433
+32434
+32435
+32436
+32437
+32438
+32439
+32440
+32441
+32442
+32443
+32444
+32445
+32446
+32447
+32448
+32449
+32450
+32451
+32452
+32453
+32454
+32455
+32456
+32457
+32458
+32459
+32460
+32461
+32462
+32463
+32464
+32465
+32466
+32467
+32468
+32469
+32470
+32471
+32472
+32473
+32474
+32475
+32476
+32477
+32478
+32479
+32480
+32481
+32482
+32483
+32484
+32485
+32486
+32487
+32488
+32489
+32490
+32491
+32492
+32493
+32494
+32495
+32496
+32497
+32498
+32499
+32500
+32501
+32502
+32503
+32504
+32505
+32506
+32507
+32508
+32509
+32510
+32511
+32512
+32513
+32514
+32515
+32516
+32517
+32518
+32519
+32520
+32521
+32522
+32523
+32524
+32525
+32526
+32527
+32528
+32529
+32530
+32531
+32532
+32533
+32534
+32535
+32536
+32537
+32538
+32539
+32540
+32541
+32542
+32543
+32544
+32545
+32546
+32547
+32548
+32549
+32550
+32551
+32552
+32553
+32554
+32555
+32556
+32557
+32558
+32559
+32560
+32561
+32562
+32563
+32564
+32565
+32566
+32567
+32568
+32569
+32570
+32571
+32572
+32573
+32574
+32575
+32576
+32577
+32578
+32579
+32580
+32581
+32582
+32583
+32584
+32585
+32586
+32587
+32588
+32589
+32590
+32591
+32592
+32593
+32594
+32595
+32596
+32597
+32598
+32599
+32600
+32601
+32602
+32603
+32604
+32605
+32606
+32607
+32608
+32609
+32610
+32611
+32612
+32613
+32614
+32615
+32616
+32617
+32618
+32619
+32620
+32621
+32622
+32623
+32624
+32625
+32626
+32627
+32628
+32629
+32630
+32631
+32632
+32633
+32634
+32635
+32636
+32637
+32638
+32639
+32640
+32641
+32642
+32643
+32644
+32645
+32646
+32647
+32648
+32649
+32650
+32651
+32652
+32653
+32654
+32655
+32656
+32657
+32658
+32659
+32660
+32661
+32662
+32663
+32664
+32665
+32666
+32667
+32668
+32669
+32670
+32671
+32672
+32673
+32674
+32675
+32676
+32677
+32678
+32679
+32680
+32681
+32682
+32683
+32684
+32685
+32686
+32687
+32688
+32689
+32690
+32691
+32692
+32693
+32694
+32695
+32696
+32697
+32698
+32699
+32700
+32701
+32702
+32703
+32704
+32705
+32706
+32707
+32708
+32709
+32710
+32711
+32712
+32713
+32714
+32715
+32716
+32717
+32718
+32719
+32720
+32721
+32722
+32723
+32724
+32725
+32726
+32727
+32728
+32729
+32730
+32731
+32732
+32733
+32734
+32735
+32736
+32737
+32738
+32739
+32740
+32741
+32742
+32743
+32744
+32745
+32746
+32747
+32748
+32749
+32750
+32751
+32752
+32753
+32754
+32755
+32756
+32757
+32758
+32759
+32760
+32761
+32762
+32763
+32764
+32765
+32766
+32767
+32768
+32769
+32770
+32771
+32772
+32773
+32774
+32775
+32776
+32777
+32778
+32779
+32780
+32781
+32782
+32783
+32784
+32785
+32786
+32787
+32788
+32789
+32790
+32791
+32792
+32793
+32794
+32795
+32796
+32797
+32798
+32799
+32800
+32801
+32802
+32803
+32804
+32805
+32806
+32807
+32808
+32809
+32810
+32811
+32812
+32813
+32814
+32815
+32816
+32817
+32818
+32819
+32820
+32821
+32822
+32823
+32824
+32825
+32826
+32827
+32828
+32829
+32830
+32831
+32832
+32833
+32834
+32835
+32836
+32837
+32838
+32839
+32840
+32841
+32842
+32843
+32844
+32845
+32846
+32847
+32848
+32849
+32850
+32851
+32852
+32853
+32854
+32855
+32856
+32857
+32858
+32859
+32860
+32861
+32862
+32863
+32864
+32865
+32866
+32867
+32868
+32869
+32870
+32871
+32872
+32873
+32874
+32875
+32876
+32877
+32878
+32879
+32880
+32881
+32882
+32883
+32884
+32885
+32886
+32887
+32888
+32889
+32890
+32891
+32892
+32893
+32894
+32895
+32896
+32897
+32898
+32899
+32900
+32901
+32902
+32903
+32904
+32905
+32906
+32907
+32908
+32909
+32910
+32911
+32912
+32913
+32914
+32915
+32916
+32917
+32918
+32919
+32920
+32921
+32922
+32923
+32924
+32925
+32926
+32927
+32928
+32929
+32930
+32931
+32932
+32933
+32934
+32935
+32936
+32937
+32938
+32939
+32940
+32941
+32942
+32943
+32944
+32945
+32946
+32947
+32948
+32949
+32950
+32951
+32952
+32953
+32954
+32955
+32956
+32957
+32958
+32959
+32960
+32961
+32962
+32963
+32964
+32965
+32966
+32967
+32968
+32969
+32970
+32971
+32972
+32973
+32974
+32975
+32976
+32977
+32978
+32979
+32980
+32981
+32982
+32983
+32984
+32985
+32986
+32987
+32988
+32989
+32990
+32991
+32992
+32993
+32994
+32995
+32996
+32997
+32998
+32999
+33000
+33001
+33002
+33003
+33004
+33005
+33006
+33007
+33008
+33009
+33010
+33011
+33012
+33013
+33014
+33015
+33016
+33017
+33018
+33019
+33020
+33021
+33022
+33023
+33024
+33025
+33026
+33027
+33028
+33029
+33030
+33031
+33032
+33033
+33034
+33035
+33036
+33037
+33038
+33039
+33040
+33041
+33042
+33043
+33044
+33045
+33046
+33047
+33048
+33049
+33050
+33051
+33052
+33053
+33054
+33055
+33056
+33057
+33058
+33059
+33060
+33061
+33062
+33063
+33064
+33065
+33066
+33067
+33068
+33069
+33070
+33071
+33072
+33073
+33074
+33075
+33076
+33077
+33078
+33079
+33080
+33081
+33082
+33083
+33084
+33085
+33086
+33087
+33088
+33089
+33090
+33091
+33092
+33093
+33094
+33095
+33096
+33097
+33098
+33099
+33100
+33101
+33102
+33103
+33104
+33105
+33106
+33107
+33108
+33109
+33110
+33111
+33112
+33113
+33114
+33115
+33116
+33117
+33118
+33119
+33120
+33121
+33122
+33123
+33124
+33125
+33126
+33127
+33128
+33129
+33130
+33131
+33132
+33133
+33134
+33135
+33136
+33137
+33138
+33139
+33140
+33141
+33142
+33143
+33144
+33145
+33146
+33147
+33148
+33149
+33150
+33151
+33152
+33153
+33154
+33155
+33156
+33157
+33158
+33159
+33160
+33161
+33162
+33163
+33164
+33165
+33166
+33167
+33168
+33169
+33170
+33171
+33172
+33173
+33174
+33175
+33176
+33177
+33178
+33179
+33180
+33181
+33182
+33183
+33184
+33185
+33186
+33187
+33188
+33189
+33190
+33191
+33192
+33193
+33194
+33195
+33196
+33197
+33198
+33199
+33200
+33201
+33202
+33203
+33204
+33205
+33206
+33207
+33208
+33209
+33210
+33211
+33212
+33213
+33214
+33215
+33216
+33217
+33218
+33219
+33220
+33221
+33222
+33223
+33224
+33225
+33226
+33227
+33228
+33229
+33230
+33231
+33232
+33233
+33234
+33235
+33236
+33237
+33238
+33239
+33240
+33241
+33242
+33243
+33244
+33245
+33246
+33247
+33248
+33249
+33250
+33251
+33252
+33253
+33254
+33255
+33256
+33257
+33258
+33259
+33260
+33261
+33262
+33263
+33264
+33265
+33266
+33267
+33268
+33269
+33270
+33271
+33272
+33273
+33274
+33275
+33276
+33277
+33278
+33279
+33280
+33281
+33282
+33283
+33284
+33285
+33286
+33287
+33288
+33289
+33290
+33291
+33292
+33293
+33294
+33295
+33296
+33297
+33298
+33299
+33300
+33301
+33302
+33303
+33304
+33305
+33306
+33307
+33308
+33309
+33310
+33311
+33312
+33313
+33314
+33315
+33316
+33317
+33318
+33319
+33320
+33321
+33322
+33323
+33324
+33325
+33326
+33327
+33328
+33329
+33330
+33331
+33332
+33333
+33334
+33335
+33336
+33337
+33338
+33339
+33340
+33341
+33342
+33343
+33344
+33345
+33346
+33347
+33348
+33349
+33350
+33351
+33352
+33353
+33354
+33355
+33356
+33357
+33358
+33359
+33360
+33361
+33362
+33363
+33364
+33365
+33366
+33367
+33368
+33369
+33370
+33371
+33372
+33373
+33374
+33375
+33376
+33377
+33378
+33379
+33380
+33381
+33382
+33383
+33384
+33385
+33386
+33387
+33388
+33389
+33390
+33391
+33392
+33393
+33394
+33395
+33396
+33397
+33398
+33399
+33400
+33401
+33402
+33403
+33404
+33405
+33406
+33407
+33408
+33409
+33410
+33411
+33412
+33413
+33414
+33415
+33416
+33417
+33418
+33419
+33420
+33421
+33422
+33423
+33424
+33425
+33426
+33427
+33428
+33429
+33430
+33431
+33432
+33433
+33434
+33435
+33436
+33437
+33438
+33439
+33440
+33441
+33442
+33443
+33444
+33445
+33446
+33447
+33448
+33449
+33450
+33451
+33452
+33453
+33454
+33455
+33456
+33457
+33458
+33459
+33460
+33461
+33462
+33463
+33464
+33465
+33466
+33467
+33468
+33469
+33470
+33471
+33472
+33473
+33474
+33475
+33476
+33477
+33478
+33479
+33480
+33481
+33482
+33483
+33484
+33485
+33486
+33487
+33488
+33489
+33490
+33491
+33492
+33493
+33494
+33495
+33496
+33497
+33498
+33499
+33500
+33501
+33502
+33503
+33504
+33505
+33506
+33507
+33508
+33509
+33510
+33511
+33512
+33513
+33514
+33515
+33516
+33517
+33518
+33519
+33520
+33521
+33522
+33523
+33524
+33525
+33526
+33527
+33528
+33529
+33530
+33531
+33532
+33533
+33534
+33535
+33536
+33537
+33538
+33539
+33540
+33541
+33542
+33543
+33544
+33545
+33546
+33547
+33548
+33549
+33550
+33551
+33552
+33553
+33554
+33555
+33556
+33557
+33558
+33559
+33560
+33561
+33562
+33563
+33564
+33565
+33566
+33567
+33568
+33569
+33570
+33571
+33572
+33573
+33574
+33575
+33576
+33577
+33578
+33579
+33580
+33581
+33582
+33583
+33584
+33585
+33586
+33587
+33588
+33589
+33590
+33591
+33592
+33593
+33594
+33595
+33596
+33597
+33598
+33599
+33600
+33601
+33602
+33603
+33604
+33605
+33606
+33607
+33608
+33609
+33610
+33611
+33612
+33613
+33614
+33615
+33616
+33617
+33618
+33619
+33620
+33621
+33622
+33623
+33624
+33625
+33626
+33627
+33628
+33629
+33630
+33631
+33632
+33633
+33634
+33635
+33636
+33637
+33638
+33639
+33640
+33641
+33642
+33643
+33644
+33645
+33646
+33647
+33648
+33649
+33650
+33651
+33652
+33653
+33654
+33655
+33656
+33657
+33658
+33659
+33660
+33661
+33662
+33663
+33664
+33665
+33666
+33667
+33668
+33669
+33670
+33671
+33672
+33673
+33674
+33675
+33676
+33677
+33678
+33679
+33680
+33681
+33682
+33683
+33684
+33685
+33686
+33687
+33688
+33689
+33690
+33691
+33692
+33693
+33694
+33695
+33696
+33697
+33698
+33699
+33700
+33701
+33702
+33703
+33704
+33705
+33706
+33707
+33708
+33709
+33710
+33711
+33712
+33713
+33714
+33715
+33716
+33717
+33718
+33719
+33720
+33721
+33722
+33723
+33724
+33725
+33726
+33727
+33728
+33729
+33730
+33731
+33732
+33733
+33734
+33735
+33736
+33737
+33738
+33739
+33740
+33741
+33742
+33743
+33744
+33745
+33746
+33747
+33748
+33749
+33750
+33751
+33752
+33753
+33754
+33755
+33756
+33757
+33758
+33759
+33760
+33761
+33762
+33763
+33764
+33765
+33766
+33767
+33768
+33769
+33770
+33771
+33772
+33773
+33774
+33775
+33776
+33777
+33778
+33779
+33780
+33781
+33782
+33783
+33784
+33785
+33786
+33787
+33788
+33789
+33790
+33791
+33792
+33793
+33794
+33795
+33796
+33797
+33798
+33799
+33800
+33801
+33802
+33803
+33804
+33805
+33806
+33807
+33808
+33809
+33810
+33811
+33812
+33813
+33814
+33815
+33816
+33817
+33818
+33819
+33820
+33821
+33822
+33823
+33824
+33825
+33826
+33827
+33828
+33829
+33830
+33831
+33832
+33833
+33834
+33835
+33836
+33837
+33838
+33839
+33840
+33841
+33842
+33843
+33844
+33845
+33846
+33847
+33848
+33849
+33850
+33851
+33852
+33853
+33854
+33855
+33856
+33857
+33858
+33859
+33860
+33861
+33862
+33863
+33864
+33865
+33866
+33867
+33868
+33869
+33870
+33871
+33872
+33873
+33874
+33875
+33876
+33877
+33878
+33879
+33880
+33881
+33882
+33883
+33884
+33885
+33886
+33887
+33888
+33889
+33890
+33891
+33892
+33893
+33894
+33895
+33896
+33897
+33898
+33899
+33900
+33901
+33902
+33903
+33904
+33905
+33906
+33907
+33908
+33909
+33910
+33911
+33912
+33913
+33914
+33915
+33916
+33917
+33918
+33919
+33920
+33921
+33922
+33923
+33924
+33925
+33926
+33927
+33928
+33929
+33930
+33931
+33932
+33933
+33934
+33935
+33936
+33937
+33938
+33939
+33940
+33941
+33942
+33943
+33944
+33945
+33946
+33947
+33948
+33949
+33950
+33951
+33952
+33953
+33954
+33955
+33956
+33957
+33958
+33959
+33960
+33961
+33962
+33963
+33964
+33965
+33966
+33967
+33968
+33969
+33970
+33971
+33972
+33973
+33974
+33975
+33976
+33977
+33978
+33979
+33980
+33981
+33982
+33983
+33984
+33985
+33986
+33987
+33988
+33989
+33990
+33991
+33992
+33993
+33994
+33995
+33996
+33997
+33998
+33999
+34000
+34001
+34002
+34003
+34004
+34005
+34006
+34007
+34008
+34009
+34010
+34011
+34012
+34013
+34014
+34015
+34016
+34017
+34018
+34019
+34020
+34021
+34022
+34023
+34024
+34025
+34026
+34027
+34028
+34029
+34030
+34031
+34032
+34033
+34034
+34035
+34036
+34037
+34038
+34039
+34040
+34041
+34042
+34043
+34044
+34045
+34046
+34047
+34048
+34049
+34050
+34051
+34052
+34053
+34054
+34055
+34056
+34057
+34058
+34059
+34060
+34061
+34062
+34063
+34064
+34065
+34066
+34067
+34068
+34069
+34070
+34071
+34072
+34073
+34074
+34075
+34076
+34077
+34078
+34079
+34080
+34081
+34082
+34083
+34084
+34085
+34086
+34087
+34088
+34089
+34090
+34091
+34092
+34093
+34094
+34095
+34096
+34097
+34098
+34099
+34100
+34101
+34102
+34103
+34104
+34105
+34106
+34107
+34108
+34109
+34110
+34111
+34112
+34113
+34114
+34115
+34116
+34117
+34118
+34119
+34120
+34121
+34122
+34123
+34124
+34125
+34126
+34127
+34128
+34129
+34130
+34131
+34132
+34133
+34134
+34135
+34136
+34137
+34138
+34139
+34140
+34141
+34142
+34143
+34144
+34145
+34146
+34147
+34148
+34149
+34150
+34151
+34152
+34153
+34154
+34155
+34156
+34157
+34158
+34159
+34160
+34161
+34162
+34163
+34164
+34165
+34166
+34167
+34168
+34169
+34170
+34171
+34172
+34173
+34174
+34175
+34176
+34177
+34178
+34179
+34180
+34181
+34182
+34183
+34184
+34185
+34186
+34187
+34188
+34189
+34190
+34191
+34192
+34193
+34194
+34195
+34196
+34197
+34198
+34199
+34200
+34201
+34202
+34203
+34204
+34205
+34206
+34207
+34208
+34209
+34210
+34211
+34212
+34213
+34214
+34215
+34216
+34217
+34218
+34219
+34220
+34221
+34222
+34223
+34224
+34225
+34226
+34227
+34228
+34229
+34230
+34231
+34232
+34233
+34234
+34235
+34236
+34237
+34238
+34239
+34240
+34241
+34242
+34243
+34244
+34245
+34246
+34247
+34248
+34249
+34250
+34251
+34252
+34253
+34254
+34255
+34256
+34257
+34258
+34259
+34260
+34261
+34262
+34263
+34264
+34265
+34266
+34267
+34268
+34269
+34270
+34271
+34272
+34273
+34274
+34275
+34276
+34277
+34278
+34279
+34280
+34281
+34282
+34283
+34284
+34285
+34286
+34287
+34288
+34289
+34290
+34291
+34292
+34293
+34294
+34295
+34296
+34297
+34298
+34299
+34300
+34301
+34302
+34303
+34304
+34305
+34306
+34307
+34308
+34309
+34310
+34311
+34312
+34313
+34314
+34315
+34316
+34317
+34318
+34319
+34320
+34321
+34322
+34323
+34324
+34325
+34326
+34327
+34328
+34329
+34330
+34331
+34332
+34333
+34334
+34335
+34336
+34337
+34338
+34339
+34340
+34341
+34342
+34343
+34344
+34345
+34346
+34347
+34348
+34349
+34350
+34351
+34352
+34353
+34354
+34355
+34356
+34357
+34358
+34359
+34360
+34361
+34362
+34363
+34364
+34365
+34366
+34367
+34368
+34369
+34370
+34371
+34372
+34373
+34374
+34375
+34376
+34377
+34378
+34379
+34380
+34381
+34382
+34383
+34384
+34385
+34386
+34387
+34388
+34389
+34390
+34391
+34392
+34393
+34394
+34395
+34396
+34397
+34398
+34399
+34400
+34401
+34402
+34403
+34404
+34405
+34406
+34407
+34408
+34409
+34410
+34411
+34412
+34413
+34414
+34415
+34416
+34417
+34418
+34419
+34420
+34421
+34422
+34423
+34424
+34425
+34426
+34427
+34428
+34429
+34430
+34431
+34432
+34433
+34434
+34435
+34436
+34437
+34438
+34439
+34440
+34441
+34442
+34443
+34444
+34445
+34446
+34447
+34448
+34449
+34450
+34451
+34452
+34453
+34454
+34455
+34456
+34457
+34458
+34459
+34460
+34461
+34462
+34463
+34464
+34465
+34466
+34467
+34468
+34469
+34470
+34471
+34472
+34473
+34474
+34475
+34476
+34477
+34478
+34479
+34480
+34481
+34482
+34483
+34484
+34485
+34486
+34487
+34488
+34489
+34490
+34491
+34492
+34493
+34494
+34495
+34496
+34497
+34498
+34499
+34500
+34501
+34502
+34503
+34504
+34505
+34506
+34507
+34508
+34509
+34510
+34511
+34512
+34513
+34514
+34515
+34516
+34517
+34518
+34519
+34520
+34521
+34522
+34523
+34524
+34525
+34526
+34527
+34528
+34529
+34530
+34531
+34532
+34533
+34534
+34535
+34536
+34537
+34538
+34539
+34540
+34541
+34542
+34543
+34544
+34545
+34546
+34547
+34548
+34549
+34550
+34551
+34552
+34553
+34554
+34555
+34556
+34557
+34558
+34559
+34560
+34561
+34562
+34563
+34564
+34565
+34566
+34567
+34568
+34569
+34570
+34571
+34572
+34573
+34574
+34575
+34576
+34577
+34578
+34579
+34580
+34581
+34582
+34583
+34584
+34585
+34586
+34587
+34588
+34589
+34590
+34591
+34592
+34593
+34594
+34595
+34596
+34597
+34598
+34599
+34600
+34601
+34602
+34603
+34604
+34605
+34606
+34607
+34608
+34609
+34610
+34611
+34612
+34613
+34614
+34615
+34616
+34617
+34618
+34619
+34620
+34621
+34622
+34623
+34624
+34625
+34626
+34627
+34628
+34629
+34630
+34631
+34632
+34633
+34634
+34635
+34636
+34637
+34638
+34639
+34640
+34641
+34642
+34643
+34644
+34645
+34646
+34647
+34648
+34649
+34650
+34651
+34652
+34653
+34654
+34655
+34656
+34657
+34658
+34659
+34660
+34661
+34662
+34663
+34664
+34665
+34666
+34667
+34668
+34669
+34670
+34671
+34672
+34673
+34674
+34675
+34676
+34677
+34678
+34679
+34680
+34681
+34682
+34683
+34684
+34685
+34686
+34687
+34688
+34689
+34690
+34691
+34692
+34693
+34694
+34695
+34696
+34697
+34698
+34699
+34700
+34701
+34702
+34703
+34704
+34705
+34706
+34707
+34708
+34709
+34710
+34711
+34712
+34713
+34714
+34715
+34716
+34717
+34718
+34719
+34720
+34721
+34722
+34723
+34724
+34725
+34726
+34727
+34728
+34729
+34730
+34731
+34732
+34733
+34734
+34735
+34736
+34737
+34738
+34739
+34740
+34741
+34742
+34743
+34744
+34745
+34746
+34747
+34748
+34749
+34750
+34751
+34752
+34753
+34754
+34755
+34756
+34757
+34758
+34759
+34760
+34761
+34762
+34763
+34764
+34765
+34766
+34767
+34768
+34769
+34770
+34771
+34772
+34773
+34774
+34775
+34776
+34777
+34778
+34779
+34780
+34781
+34782
+34783
+34784
+34785
+34786
+34787
+34788
+34789
+34790
+34791
+34792
+34793
+34794
+34795
+34796
+34797
+34798
+34799
+34800
+34801
+34802
+34803
+34804
+34805
+34806
+34807
+34808
+34809
+34810
+34811
+34812
+34813
+34814
+34815
+34816
+34817
+34818
+34819
+34820
+34821
+34822
+34823
+34824
+34825
+34826
+34827
+34828
+34829
+34830
+34831
+34832
+34833
+34834
+34835
+34836
+34837
+34838
+34839
+34840
+34841
+34842
+34843
+34844
+34845
+34846
+34847
+34848
+34849
+34850
+34851
+34852
+34853
+34854
+34855
+34856
+34857
+34858
+34859
+34860
+34861
+34862
+34863
+34864
+34865
+34866
+34867
+34868
+34869
+34870
+34871
+34872
+34873
+34874
+34875
+34876
+34877
+34878
+34879
+34880
+34881
+34882
+34883
+34884
+34885
+34886
+34887
+34888
+34889
+34890
+34891
+34892
+34893
+34894
+34895
+34896
+34897
+34898
+34899
+34900
+34901
+34902
+34903
+34904
+34905
+34906
+34907
+34908
+34909
+34910
+34911
+34912
+34913
+34914
+34915
+34916
+34917
+34918
+34919
+34920
+34921
+34922
+34923
+34924
+34925
+34926
+34927
+34928
+34929
+34930
+34931
+34932
+34933
+34934
+34935
+34936
+34937
+34938
+34939
+34940
+34941
+34942
+34943
+34944
+34945
+34946
+34947
+34948
+34949
+34950
+34951
+34952
+34953
+34954
+34955
+34956
+34957
+34958
+34959
+34960
+34961
+34962
+34963
+34964
+34965
+34966
+34967
+34968
+34969
+34970
+34971
+34972
+34973
+34974
+34975
+34976
+34977
+34978
+34979
+34980
+34981
+34982
+34983
+34984
+34985
+34986
+34987
+34988
+34989
+34990
+34991
+34992
+34993
+34994
+34995
+34996
+34997
+34998
+34999
+35000
+35001
+35002
+35003
+35004
+35005
+35006
+35007
+35008
+35009
+35010
+35011
+35012
+35013
+35014
+35015
+35016
+35017
+35018
+35019
+35020
+35021
+35022
+35023
+35024
+35025
+35026
+35027
+35028
+35029
+35030
+35031
+35032
+35033
+35034
+35035
+35036
+35037
+35038
+35039
+35040
+35041
+35042
+35043
+35044
+35045
+35046
+35047
+35048
+35049
+35050
+35051
+35052
+35053
+35054
+35055
+35056
+35057
+35058
+35059
+35060
+35061
+35062
+35063
+35064
+35065
+35066
+35067
+35068
+35069
+35070
+35071
+35072
+35073
+35074
+35075
+35076
+35077
+35078
+35079
+35080
+35081
+35082
+35083
+35084
+35085
+35086
+35087
+35088
+35089
+35090
+35091
+35092
+35093
+35094
+35095
+35096
+35097
+35098
+35099
+35100
+35101
+35102
+35103
+35104
+35105
+35106
+35107
+35108
+35109
+35110
+35111
+35112
+35113
+35114
+35115
+35116
+35117
+35118
+35119
+35120
+35121
+35122
+35123
+35124
+35125
+35126
+35127
+35128
+35129
+35130
+35131
+35132
+35133
+35134
+35135
+35136
+35137
+35138
+35139
+35140
+35141
+35142
+35143
+35144
+35145
+35146
+35147
+35148
+35149
+35150
+35151
+35152
+35153
+35154
+35155
+35156
+35157
+35158
+35159
+35160
+35161
+35162
+35163
+35164
+35165
+35166
+35167
+35168
+35169
+35170
+35171
+35172
+35173
+35174
+35175
+35176
+35177
+35178
+35179
+35180
+35181
+35182
+35183
+35184
+35185
+35186
+35187
+35188
+35189
+35190
+35191
+35192
+35193
+35194
+35195
+35196
+35197
+35198
+35199
+35200
+35201
+35202
+35203
+35204
+35205
+35206
+35207
+35208
+35209
+35210
+35211
+35212
+35213
+35214
+35215
+35216
+35217
+35218
+35219
+35220
+35221
+35222
+35223
+35224
+35225
+35226
+35227
+35228
+35229
+35230
+35231
+35232
+35233
+35234
+35235
+35236
+35237
+35238
+35239
+35240
+35241
+35242
+35243
+35244
+35245
+35246
+35247
+35248
+35249
+35250
+35251
+35252
+35253
+35254
+35255
+35256
+35257
+35258
+35259
+35260
+35261
+35262
+35263
+35264
+35265
+35266
+35267
+35268
+35269
+35270
+35271
+35272
+35273
+35274
+35275
+35276
+35277
+35278
+35279
+35280
+35281
+35282
+35283
+35284
+35285
+35286
+35287
+35288
+35289
+35290
+35291
+35292
+35293
+35294
+35295
+35296
+35297
+35298
+35299
+35300
+35301
+35302
+35303
+35304
+35305
+35306
+35307
+35308
+35309
+35310
+35311
+35312
+35313
+35314
+35315
+35316
+35317
+35318
+35319
+35320
+35321
+35322
+35323
+35324
+35325
+35326
+35327
+35328
+35329
+35330
+35331
+35332
+35333
+35334
+35335
+35336
+35337
+35338
+35339
+35340
+35341
+35342
+35343
+35344
+35345
+35346
+35347
+35348
+35349
+35350
+35351
+35352
+35353
+35354
+35355
+35356
+35357
+35358
+35359
+35360
+35361
+35362
+35363
+35364
+35365
+35366
+35367
+35368
+35369
+35370
+35371
+35372
+35373
+35374
+35375
+35376
+35377
+35378
+35379
+35380
+35381
+35382
+35383
+35384
+35385
+35386
+35387
+35388
+35389
+35390
+35391
+35392
+35393
+35394
+35395
+35396
+35397
+35398
+35399
+35400
+35401
+35402
+35403
+35404
+35405
+35406
+35407
+35408
+35409
+35410
+35411
+35412
+35413
+35414
+35415
+35416
+35417
+35418
+35419
+35420
+35421
+35422
+35423
+35424
+35425
+35426
+35427
+35428
+35429
+35430
+35431
+35432
+35433
+35434
+35435
+35436
+35437
+35438
+35439
+35440
+35441
+35442
+35443
+35444
+35445
+35446
+35447
+35448
+35449
+35450
+35451
+35452
+35453
+35454
+35455
+35456
+35457
+35458
+35459
+35460
+35461
+35462
+35463
+35464
+35465
+35466
+35467
+35468
+35469
+35470
+35471
+35472
+35473
+35474
+35475
+35476
+35477
+35478
+35479
+35480
+35481
+35482
+35483
+35484
+35485
+35486
+35487
+35488
+35489
+35490
+35491
+35492
+35493
+35494
+35495
+35496
+35497
+35498
+35499
+35500
+35501
+35502
+35503
+35504
+35505
+35506
+35507
+35508
+35509
+35510
+35511
+35512
+35513
+35514
+35515
+35516
+35517
+35518
+35519
+35520
+35521
+35522
+35523
+35524
+35525
+35526
+35527
+35528
+35529
+35530
+35531
+35532
+35533
+35534
+35535
+35536
+35537
+35538
+35539
+35540
+35541
+35542
+35543
+35544
+35545
+35546
+35547
+35548
+35549
+35550
+35551
+35552
+35553
+35554
+35555
+35556
+35557
+35558
+35559
+35560
+35561
+35562
+35563
+35564
+35565
+35566
+35567
+35568
+35569
+35570
+35571
+35572
+35573
+35574
+35575
+35576
+35577
+35578
+35579
+35580
+35581
+35582
+35583
+35584
+35585
+35586
+35587
+35588
+35589
+35590
+35591
+35592
+35593
+35594
+35595
+35596
+35597
+35598
+35599
+35600
+35601
+35602
+35603
+35604
+35605
+35606
+35607
+35608
+35609
+35610
+35611
+35612
+35613
+35614
+35615
+35616
+35617
+35618
+35619
+35620
+35621
+35622
+35623
+35624
+35625
+35626
+35627
+35628
+35629
+35630
+35631
+35632
+35633
+35634
+35635
+35636
+35637
+35638
+35639
+35640
+35641
+35642
+35643
+35644
+35645
+35646
+35647
+35648
+35649
+35650
+35651
+35652
+35653
+35654
+35655
+35656
+35657
+35658
+35659
+35660
+35661
+35662
+35663
+35664
+35665
+35666
+35667
+35668
+35669
+35670
+35671
+35672
+35673
+35674
+35675
+35676
+35677
+35678
+35679
+35680
+35681
+35682
+35683
+35684
+35685
+35686
+35687
+35688
+35689
+35690
+35691
+35692
+35693
+35694
+35695
+35696
+35697
+35698
+35699
+35700
+35701
+35702
+35703
+35704
+35705
+35706
+35707
+35708
+35709
+35710
+35711
+35712
+35713
+35714
+35715
+35716
+35717
+35718
+35719
+35720
+35721
+35722
+35723
+35724
+35725
+35726
+35727
+35728
+35729
+35730
+35731
+35732
+35733
+35734
+35735
+35736
+35737
+35738
+35739
+35740
+35741
+35742
+35743
+35744
+35745
+35746
+35747
+35748
+35749
+35750
+35751
+35752
+35753
+35754
+35755
+35756
+35757
+35758
+35759
+35760
+35761
+35762
+35763
+35764
+35765
+35766
+35767
+35768
+35769
+35770
+35771
+35772
+35773
+35774
+35775
+35776
+35777
+35778
+35779
+35780
+35781
+35782
+35783
+35784
+35785
+35786
+35787
+35788
+35789
+35790
+35791
+35792
+35793
+35794
+35795
+35796
+35797
+35798
+35799
+35800
+35801
+35802
+35803
+35804
+35805
+35806
+35807
+35808
+35809
+35810
+35811
+35812
+35813
+35814
+35815
+35816
+35817
+35818
+35819
+35820
+35821
+35822
+35823
+35824
+35825
+35826
+35827
+35828
+35829
+35830
+35831
+35832
+35833
+35834
+35835
+35836
+35837
+35838
+35839
+35840
+35841
+35842
+35843
+35844
+35845
+35846
+35847
+35848
+35849
+35850
+35851
+35852
+35853
+35854
+35855
+35856
+35857
+35858
+35859
+35860
+35861
+35862
+35863
+35864
+35865
+35866
+35867
+35868
+35869
+35870
+35871
+35872
+35873
+35874
+35875
+35876
+35877
+35878
+35879
+35880
+35881
+35882
+35883
+35884
+35885
+35886
+35887
+35888
+35889
+35890
+35891
+35892
+35893
+35894
+35895
+35896
+35897
+35898
+35899
+35900
+35901
+35902
+35903
+35904
+35905
+35906
+35907
+35908
+35909
+35910
+35911
+35912
+35913
+35914
+35915
+35916
+35917
+35918
+35919
+35920
+35921
+35922
+35923
+35924
+35925
+35926
+35927
+35928
+35929
+35930
+35931
+35932
+35933
+35934
+35935
+35936
+35937
+35938
+35939
+35940
+35941
+35942
+35943
+35944
+35945
+35946
+35947
+35948
+35949
+35950
+35951
+35952
+35953
+35954
+35955
+35956
+35957
+35958
+35959
+35960
+35961
+35962
+35963
+35964
+35965
+35966
+35967
+35968
+35969
+35970
+35971
+35972
+35973
+35974
+35975
+35976
+35977
+35978
+35979
+35980
+35981
+35982
+35983
+35984
+35985
+35986
+35987
+35988
+35989
+35990
+35991
+35992
+35993
+35994
+35995
+35996
+35997
+35998
+35999
+36000
+36001
+36002
+36003
+36004
+36005
+36006
+36007
+36008
+36009
+36010
+36011
+36012
+36013
+36014
+36015
+36016
+36017
+36018
+36019
+36020
+36021
+36022
+36023
+36024
+36025
+36026
+36027
+36028
+36029
+36030
+36031
+36032
+36033
+36034
+36035
+36036
+36037
+36038
+36039
+36040
+36041
+36042
+36043
+36044
+36045
+36046
+36047
+36048
+36049
+36050
+36051
+36052
+36053
+36054
+36055
+36056
+36057
+36058
+36059
+36060
+36061
+36062
+36063
+36064
+36065
+36066
+36067
+36068
+36069
+36070
+36071
+36072
+36073
+36074
+36075
+36076
+36077
+36078
+36079
+36080
+36081
+36082
+36083
+36084
+36085
+36086
+36087
+36088
+36089
+36090
+36091
+36092
+36093
+36094
+36095
+36096
+36097
+36098
+36099
+36100
+36101
+36102
+36103
+36104
+36105
+36106
+36107
+36108
+36109
+36110
+36111
+36112
+36113
+36114
+36115
+36116
+36117
+36118
+36119
+36120
+36121
+36122
+36123
+36124
+36125
+36126
+36127
+36128
+36129
+36130
+36131
+36132
+36133
+36134
+36135
+36136
+36137
+36138
+36139
+36140
+36141
+36142
+36143
+36144
+36145
+36146
+36147
+36148
+36149
+36150
+36151
+36152
+36153
+36154
+36155
+36156
+36157
+36158
+36159
+36160
+36161
+36162
+36163
+36164
+36165
+36166
+36167
+36168
+36169
+36170
+36171
+36172
+36173
+36174
+36175
+36176
+36177
+36178
+36179
+36180
+36181
+36182
+36183
+36184
+36185
+36186
+36187
+36188
+36189
+36190
+36191
+36192
+36193
+36194
+36195
+36196
+36197
+36198
+36199
+36200
+36201
+36202
+36203
+36204
+36205
+36206
+36207
+36208
+36209
+36210
+36211
+36212
+36213
+36214
+36215
+36216
+36217
+36218
+36219
+36220
+36221
+36222
+36223
+36224
+36225
+36226
+36227
+36228
+36229
+36230
+36231
+36232
+36233
+36234
+36235
+36236
+36237
+36238
+36239
+36240
+36241
+36242
+36243
+36244
+36245
+36246
+36247
+36248
+36249
+36250
+36251
+36252
+36253
+36254
+36255
+36256
+36257
+36258
+36259
+36260
+36261
+36262
+36263
+36264
+36265
+36266
+36267
+36268
+36269
+36270
+36271
+36272
+36273
+36274
+36275
+36276
+36277
+36278
+36279
+36280
+36281
+36282
+36283
+36284
+36285
+36286
+36287
+36288
+36289
+36290
+36291
+36292
+36293
+36294
+36295
+36296
+36297
+36298
+36299
+36300
+36301
+36302
+36303
+36304
+36305
+36306
+36307
+36308
+36309
+36310
+36311
+36312
+36313
+36314
+36315
+36316
+36317
+36318
+36319
+36320
+36321
+36322
+36323
+36324
+36325
+36326
+36327
+36328
+36329
+36330
+36331
+36332
+36333
+36334
+36335
+36336
+36337
+36338
+36339
+36340
+36341
+36342
+36343
+36344
+36345
+36346
+36347
+36348
+36349
+36350
+36351
+36352
+36353
+36354
+36355
+36356
+36357
+36358
+36359
+36360
+36361
+36362
+36363
+36364
+36365
+36366
+36367
+36368
+36369
+36370
+36371
+36372
+36373
+36374
+36375
+36376
+36377
+36378
+36379
+36380
+36381
+36382
+36383
+36384
+36385
+36386
+36387
+36388
+36389
+36390
+36391
+36392
+36393
+36394
+36395
+36396
+36397
+36398
+36399
+36400
+36401
+36402
+36403
+36404
+36405
+36406
+36407
+36408
+36409
+36410
+36411
+36412
+36413
+36414
+36415
+36416
+36417
+36418
+36419
+36420
+36421
+36422
+36423
+36424
+36425
+36426
+36427
+36428
+36429
+36430
+36431
+36432
+36433
+36434
+36435
+36436
+36437
+36438
+36439
+36440
+36441
+36442
+36443
+36444
+36445
+36446
+36447
+36448
+36449
+36450
+36451
+36452
+36453
+36454
+36455
+36456
+36457
+36458
+36459
+36460
+36461
+36462
+36463
+36464
+36465
+36466
+36467
+36468
+36469
+36470
+36471
+36472
+36473
+36474
+36475
+36476
+36477
+36478
+36479
+36480
+36481
+36482
+36483
+36484
+36485
+36486
+36487
+36488
+36489
+36490
+36491
+36492
+36493
+36494
+36495
+36496
+36497
+36498
+36499
+36500
+36501
+36502
+36503
+36504
+36505
+36506
+36507
+36508
+36509
+36510
+36511
+36512
+36513
+36514
+36515
+36516
+36517
+36518
+36519
+36520
+36521
+36522
+36523
+36524
+36525
+36526
+36527
+36528
+36529
+36530
+36531
+36532
+36533
+36534
+36535
+36536
+36537
+36538
+36539
+36540
+36541
+36542
+36543
+36544
+36545
+36546
+36547
+36548
+36549
+36550
+36551
+36552
+36553
+36554
+36555
+36556
+36557
+36558
+36559
+36560
+36561
+36562
+36563
+36564
+36565
+36566
+36567
+36568
+36569
+36570
+36571
+36572
+36573
+36574
+36575
+36576
+36577
+36578
+36579
+36580
+36581
+36582
+36583
+36584
+36585
+36586
+36587
+36588
+36589
+36590
+36591
+36592
+36593
+36594
+36595
+36596
+36597
+36598
+36599
+36600
+36601
+36602
+36603
+36604
+36605
+36606
+36607
+36608
+36609
+36610
+36611
+36612
+36613
+36614
+36615
+36616
+36617
+36618
+36619
+36620
+36621
+36622
+36623
+36624
+36625
+36626
+36627
+36628
+36629
+36630
+36631
+36632
+36633
+36634
+36635
+36636
+36637
+36638
+36639
+36640
+36641
+36642
+36643
+36644
+36645
+36646
+36647
+36648
+36649
+36650
+36651
+36652
+36653
+36654
+36655
+36656
+36657
+36658
+36659
+36660
+36661
+36662
+36663
+36664
+36665
+36666
+36667
+36668
+36669
+36670
+36671
+36672
+36673
+36674
+36675
+36676
+36677
+36678
+36679
+36680
+36681
+36682
+36683
+36684
+36685
+36686
+36687
+36688
+36689
+36690
+36691
+36692
+36693
+36694
+36695
+36696
+36697
+36698
+36699
+36700
+36701
+36702
+36703
+36704
+36705
+36706
+36707
+36708
+36709
+36710
+36711
+36712
+36713
+36714
+36715
+36716
+36717
+36718
+36719
+36720
+36721
+36722
+36723
+36724
+36725
+36726
+36727
+36728
+36729
+36730
+36731
+36732
+36733
+36734
+36735
+36736
+36737
+36738
+36739
+36740
+36741
+36742
+36743
+36744
+36745
+36746
+36747
+36748
+36749
+36750
+36751
+36752
+36753
+36754
+36755
+36756
+36757
+36758
+36759
+36760
+36761
+36762
+36763
+36764
+36765
+36766
+36767
+36768
+36769
+36770
+36771
+36772
+36773
+36774
+36775
+36776
+36777
+36778
+36779
+36780
+36781
+36782
+36783
+36784
+36785
+36786
+36787
+36788
+36789
+36790
+36791
+36792
+36793
+36794
+36795
+36796
+36797
+36798
+36799
+36800
+36801
+36802
+36803
+36804
+36805
+36806
+36807
+36808
+36809
+36810
+36811
+36812
+36813
+36814
+36815
+36816
+36817
+36818
+36819
+36820
+36821
+36822
+36823
+36824
+36825
+36826
+36827
+36828
+36829
+36830
+36831
+36832
+36833
+36834
+36835
+36836
+36837
+36838
+36839
+36840
+36841
+36842
+36843
+36844
+36845
+36846
+36847
+36848
+36849
+36850
+36851
+36852
+36853
+36854
+36855
+36856
+36857
+36858
+36859
+36860
+36861
+36862
+36863
+36864
+36865
+36866
+36867
+36868
+36869
+36870
+36871
+36872
+36873
+36874
+36875
+36876
+36877
+36878
+36879
+36880
+36881
+36882
+36883
+36884
+36885
+36886
+36887
+36888
+36889
+36890
+36891
+36892
+36893
+36894
+36895
+36896
+36897
+36898
+36899
+36900
+36901
+36902
+36903
+36904
+36905
+36906
+36907
+36908
+36909
+36910
+36911
+36912
+36913
+36914
+36915
+36916
+36917
+36918
+36919
+36920
+36921
+36922
+36923
+36924
+36925
+36926
+36927
+36928
+36929
+36930
+36931
+36932
+36933
+36934
+36935
+36936
+36937
+36938
+36939
+36940
+36941
+36942
+36943
+36944
+36945
+36946
+36947
+36948
+36949
+36950
+36951
+36952
+36953
+36954
+36955
+36956
+36957
+36958
+36959
+36960
+36961
+36962
+36963
+36964
+36965
+36966
+36967
+36968
+36969
+36970
+36971
+36972
+36973
+36974
+36975
+36976
+36977
+36978
+36979
+36980
+36981
+36982
+36983
+36984
+36985
+36986
+36987
+36988
+36989
+36990
+36991
+36992
+36993
+36994
+36995
+36996
+36997
+36998
+36999
+37000
+37001
+37002
+37003
+37004
+37005
+37006
+37007
+37008
+37009
+37010
+37011
+37012
+37013
+37014
+37015
+37016
+37017
+37018
+37019
+37020
+37021
+37022
+37023
+37024
+37025
+37026
+37027
+37028
+37029
+37030
+37031
+37032
+37033
+37034
+37035
+37036
+37037
+37038
+37039
+37040
+37041
+37042
+37043
+37044
+37045
+37046
+37047
+37048
+37049
+37050
+37051
+37052
+37053
+37054
+37055
+37056
+37057
+37058
+37059
+37060
+37061
+37062
+37063
+37064
+37065
+37066
+37067
+37068
+37069
+37070
+37071
+37072
+37073
+37074
+37075
+37076
+37077
+37078
+37079
+37080
+37081
+37082
+37083
+37084
+37085
+37086
+37087
+37088
+37089
+37090
+37091
+37092
+37093
+37094
+37095
+37096
+37097
+37098
+37099
+37100
+37101
+37102
+37103
+37104
+37105
+37106
+37107
+37108
+37109
+37110
+37111
+37112
+37113
+37114
+37115
+37116
+37117
+37118
+37119
+37120
+37121
+37122
+37123
+37124
+37125
+37126
+37127
+37128
+37129
+37130
+37131
+37132
+37133
+37134
+37135
+37136
+37137
+37138
+37139
+37140
+37141
+37142
+37143
+37144
+37145
+37146
+37147
+37148
+37149
+37150
+37151
+37152
+37153
+37154
+37155
+37156
+37157
+37158
+37159
+37160
+37161
+37162
+37163
+37164
+37165
+37166
+37167
+37168
+37169
+37170
+37171
+37172
+37173
+37174
+37175
+37176
+37177
+37178
+37179
+37180
+37181
+37182
+37183
+37184
+37185
+37186
+37187
+37188
+37189
+37190
+37191
+37192
+37193
+37194
+37195
+37196
+37197
+37198
+37199
+37200
+37201
+37202
+37203
+37204
+37205
+37206
+37207
+37208
+37209
+37210
+37211
+37212
+37213
+37214
+37215
+37216
+37217
+37218
+37219
+37220
+37221
+37222
+37223
+37224
+37225
+37226
+37227
+37228
+37229
+37230
+37231
+37232
+37233
+37234
+37235
+37236
+37237
+37238
+37239
+37240
+37241
+37242
+37243
+37244
+37245
+37246
+37247
+37248
+37249
+37250
+37251
+37252
+37253
+37254
+37255
+37256
+37257
+37258
+37259
+37260
+37261
+37262
+37263
+37264
+37265
+37266
+37267
+37268
+37269
+37270
+37271
+37272
+37273
+37274
+37275
+37276
+37277
+37278
+37279
+37280
+37281
+37282
+37283
+37284
+37285
+37286
+37287
+37288
+37289
+37290
+37291
+37292
+37293
+37294
+37295
+37296
+37297
+37298
+37299
+37300
+37301
+37302
+37303
+37304
+37305
+37306
+37307
+37308
+37309
+37310
+37311
+37312
+37313
+37314
+37315
+37316
+37317
+37318
+37319
+37320
+37321
+37322
+37323
+37324
+37325
+37326
+37327
+37328
+37329
+37330
+37331
+37332
+37333
+37334
+37335
+37336
+37337
+37338
+37339
+37340
+37341
+37342
+37343
+37344
+37345
+37346
+37347
+37348
+37349
+37350
+37351
+37352
+37353
+37354
+37355
+37356
+37357
+37358
+37359
+37360
+37361
+37362
+37363
+37364
+37365
+37366
+37367
+37368
+37369
+37370
+37371
+37372
+37373
+37374
+37375
+37376
+37377
+37378
+37379
+37380
+37381
+37382
+37383
+37384
+37385
+37386
+37387
+37388
+37389
+37390
+37391
+37392
+37393
+37394
+37395
+37396
+37397
+37398
+37399
+37400
+37401
+37402
+37403
+37404
+37405
+37406
+37407
+37408
+37409
+37410
+37411
+37412
+37413
+37414
+37415
+37416
+37417
+37418
+37419
+37420
+37421
+37422
+37423
+37424
+37425
+37426
+37427
+37428
+37429
+37430
+37431
+37432
+37433
+37434
+37435
+37436
+37437
+37438
+37439
+37440
+37441
+37442
+37443
+37444
+37445
+37446
+37447
+37448
+37449
+37450
+37451
+37452
+37453
+37454
+37455
+37456
+37457
+37458
+37459
+37460
+37461
+37462
+37463
+37464
+37465
+37466
+37467
+37468
+37469
+37470
+37471
+37472
+37473
+37474
+37475
+37476
+37477
+37478
+37479
+37480
+37481
+37482
+37483
+37484
+37485
+37486
+37487
+37488
+37489
+37490
+37491
+37492
+37493
+37494
+37495
+37496
+37497
+37498
+37499
+37500
+37501
+37502
+37503
+37504
+37505
+37506
+37507
+37508
+37509
+37510
+37511
+37512
+37513
+37514
+37515
+37516
+37517
+37518
+37519
+37520
+37521
+37522
+37523
+37524
+37525
+37526
+37527
+37528
+37529
+37530
+37531
+37532
+37533
+37534
+37535
+37536
+37537
+37538
+37539
+37540
+37541
+37542
+37543
+37544
+37545
+37546
+37547
+37548
+37549
+37550
+37551
+37552
+37553
+37554
+37555
+37556
+37557
+37558
+37559
+37560
+37561
+37562
+37563
+37564
+37565
+37566
+37567
+37568
+37569
+37570
+37571
+37572
+37573
+37574
+37575
+37576
+37577
+37578
+37579
+37580
+37581
+37582
+37583
+37584
+37585
+37586
+37587
+37588
+37589
+37590
+37591
+37592
+37593
+37594
+37595
+37596
+37597
+37598
+37599
+37600
+37601
+37602
+37603
+37604
+37605
+37606
+37607
+37608
+37609
+37610
+37611
+37612
+37613
+37614
+37615
+37616
+37617
+37618
+37619
+37620
+37621
+37622
+37623
+37624
+37625
+37626
+37627
+37628
+37629
+37630
+37631
+37632
+37633
+37634
+37635
+37636
+37637
+37638
+37639
+37640
+37641
+37642
+37643
+37644
+37645
+37646
+37647
+37648
+37649
+37650
+37651
+37652
+37653
+37654
+37655
+37656
+37657
+37658
+37659
+37660
+37661
+37662
+37663
+37664
+37665
+37666
+37667
+37668
+37669
+37670
+37671
+37672
+37673
+37674
+37675
+37676
+37677
+37678
+37679
+37680
+37681
+37682
+37683
+37684
+37685
+37686
+37687
+37688
+37689
+37690
+37691
+37692
+37693
+37694
+37695
+37696
+37697
+37698
+37699
+37700
+37701
+37702
+37703
+37704
+37705
+37706
+37707
+37708
+37709
+37710
+37711
+37712
+37713
+37714
+37715
+37716
+37717
+37718
+37719
+37720
+37721
+37722
+37723
+37724
+37725
+37726
+37727
+37728
+37729
+37730
+37731
+37732
+37733
+37734
+37735
+37736
+37737
+37738
+37739
+37740
+37741
+37742
+37743
+37744
+37745
+37746
+37747
+37748
+37749
+37750
+37751
+37752
+37753
+37754
+37755
+37756
+37757
+37758
+37759
+37760
+37761
+37762
+37763
+37764
+37765
+37766
+37767
+37768
+37769
+37770
+37771
+37772
+37773
+37774
+37775
+37776
+37777
+37778
+37779
+37780
+37781
+37782
+37783
+37784
+37785
+37786
+37787
+37788
+37789
+37790
+37791
+37792
+37793
+37794
+37795
+37796
+37797
+37798
+37799
+37800
+37801
+37802
+37803
+37804
+37805
+37806
+37807
+37808
+37809
+37810
+37811
+37812
+37813
+37814
+37815
+37816
+37817
+37818
+37819
+37820
+37821
+37822
+37823
+37824
+37825
+37826
+37827
+37828
+37829
+37830
+37831
+37832
+37833
+37834
+37835
+37836
+37837
+37838
+37839
+37840
+37841
+37842
+37843
+37844
+37845
+37846
+37847
+37848
+37849
+37850
+37851
+37852
+37853
+37854
+37855
+37856
+37857
+37858
+37859
+37860
+37861
+37862
+37863
+37864
+37865
+37866
+37867
+37868
+37869
+37870
+37871
+37872
+37873
+37874
+37875
+37876
+37877
+37878
+37879
+37880
+37881
+37882
+37883
+37884
+37885
+37886
+37887
+37888
+37889
+37890
+37891
+37892
+37893
+37894
+37895
+37896
+37897
+37898
+37899
+37900
+37901
+37902
+37903
+37904
+37905
+37906
+37907
+37908
+37909
+37910
+37911
+37912
+37913
+37914
+37915
+37916
+37917
+37918
+37919
+37920
+37921
+37922
+37923
+37924
+37925
+37926
+37927
+37928
+37929
+37930
+37931
+37932
+37933
+37934
+37935
+37936
+37937
+37938
+37939
+37940
+37941
+37942
+37943
+37944
+37945
+37946
+37947
+37948
+37949
+37950
+37951
+37952
+37953
+37954
+37955
+37956
+37957
+37958
+37959
+37960
+37961
+37962
+37963
+37964
+37965
+37966
+37967
+37968
+37969
+37970
+37971
+37972
+37973
+37974
+37975
+37976
+37977
+37978
+37979
+37980
+37981
+37982
+37983
+37984
+37985
+37986
+37987
+37988
+37989
+37990
+37991
+37992
+37993
+37994
+37995
+37996
+37997
+37998
+37999
+38000
+38001
+38002
+38003
+38004
+38005
+38006
+38007
+38008
+38009
+38010
+38011
+38012
+38013
+38014
+38015
+38016
+38017
+38018
+38019
+38020
+38021
+38022
+38023
+38024
+38025
+38026
+38027
+38028
+38029
+38030
+38031
+38032
+38033
+38034
+38035
+38036
+38037
+38038
+38039
+38040
+38041
+38042
+38043
+38044
+38045
+38046
+38047
+38048
+38049
+38050
+38051
+38052
+38053
+38054
+38055
+38056
+38057
+38058
+38059
+38060
+38061
+38062
+38063
+38064
+38065
+38066
+38067
+38068
+38069
+38070
+38071
+38072
+38073
+38074
+38075
+38076
+38077
+38078
+38079
+38080
+38081
+38082
+38083
+38084
+38085
+38086
+38087
+38088
+38089
+38090
+38091
+38092
+38093
+38094
+38095
+38096
+38097
+38098
+38099
+38100
+38101
+38102
+38103
+38104
+38105
+38106
+38107
+38108
+38109
+38110
+38111
+38112
+38113
+38114
+38115
+38116
+38117
+38118
+38119
+38120
+38121
+38122
+38123
+38124
+38125
+38126
+38127
+38128
+38129
+38130
+38131
+38132
+38133
+38134
+38135
+38136
+38137
+38138
+38139
+38140
+38141
+38142
+38143
+38144
+38145
+38146
+38147
+38148
+38149
+38150
+38151
+38152
+38153
+38154
+38155
+38156
+38157
+38158
+38159
+38160
+38161
+38162
+38163
+38164
+38165
+38166
+38167
+38168
+38169
+38170
+38171
+38172
+38173
+38174
+38175
+38176
+38177
+38178
+38179
+38180
+38181
+38182
+38183
+38184
+38185
+38186
+38187
+38188
+38189
+38190
+38191
+38192
+38193
+38194
+38195
+38196
+38197
+38198
+38199
+38200
+38201
+38202
+38203
+38204
+38205
+38206
+38207
+38208
+38209
+38210
+38211
+38212
+38213
+38214
+38215
+38216
+38217
+38218
+38219
+38220
+38221
+38222
+38223
+38224
+38225
+38226
+38227
+38228
+38229
+38230
+38231
+38232
+38233
+38234
+38235
+38236
+38237
+38238
+38239
+38240
+38241
+38242
+38243
+38244
+38245
+38246
+38247
+38248
+38249
+38250
+38251
+38252
+38253
+38254
+38255
+38256
+38257
+38258
+38259
+38260
+38261
+38262
+38263
+38264
+38265
+38266
+38267
+38268
+38269
+38270
+38271
+38272
+38273
+38274
+38275
+38276
+38277
+38278
+38279
+38280
+38281
+38282
+38283
+38284
+38285
+38286
+38287
+38288
+38289
+38290
+38291
+38292
+38293
+38294
+38295
+38296
+38297
+38298
+38299
+38300
+38301
+38302
+38303
+38304
+38305
+38306
+38307
+38308
+38309
+38310
+38311
+38312
+38313
+38314
+38315
+38316
+38317
+38318
+38319
+38320
+38321
+38322
+38323
+38324
+38325
+38326
+38327
+38328
+38329
+38330
+38331
+38332
+38333
+38334
+38335
+38336
+38337
+38338
+38339
+38340
+38341
+38342
+38343
+38344
+38345
+38346
+38347
+38348
+38349
+38350
+38351
+38352
+38353
+38354
+38355
+38356
+38357
+38358
+38359
+38360
+38361
+38362
+38363
+38364
+38365
+38366
+38367
+38368
+38369
+38370
+38371
+38372
+38373
+38374
+38375
+38376
+38377
+38378
+38379
+38380
+38381
+38382
+38383
+38384
+38385
+38386
+38387
+38388
+38389
+38390
+38391
+38392
+38393
+38394
+38395
+38396
+38397
+38398
+38399
+38400
+38401
+38402
+38403
+38404
+38405
+38406
+38407
+38408
+38409
+38410
+38411
+38412
+38413
+38414
+38415
+38416
+38417
+38418
+38419
+38420
+38421
+38422
+38423
+38424
+38425
+38426
+38427
+38428
+38429
+38430
+38431
+38432
+38433
+38434
+38435
+38436
+38437
+38438
+38439
+38440
+38441
+38442
+38443
+38444
+38445
+38446
+38447
+38448
+38449
+38450
+38451
+38452
+38453
+38454
+38455
+38456
+38457
+38458
+38459
+38460
+38461
+38462
+38463
+38464
+38465
+38466
+38467
+38468
+38469
+38470
+38471
+38472
+38473
+38474
+38475
+38476
+38477
+38478
+38479
+38480
+38481
+38482
+38483
+38484
+38485
+38486
+38487
+38488
+38489
+38490
+38491
+38492
+38493
+38494
+38495
+38496
+38497
+38498
+38499
+38500
+38501
+38502
+38503
+38504
+38505
+38506
+38507
+38508
+38509
+38510
+38511
+38512
+38513
+38514
+38515
+38516
+38517
+38518
+38519
+38520
+38521
+38522
+38523
+38524
+38525
+38526
+38527
+38528
+38529
+38530
+38531
+38532
+38533
+38534
+38535
+38536
+38537
+38538
+38539
+38540
+38541
+38542
+38543
+38544
+38545
+38546
+38547
+38548
+38549
+38550
+38551
+38552
+38553
+38554
+38555
+38556
+38557
+38558
+38559
+38560
+38561
+38562
+38563
+38564
+38565
+38566
+38567
+38568
+38569
+38570
+38571
+38572
+38573
+38574
+38575
+38576
+38577
+38578
+38579
+38580
+38581
+38582
+38583
+38584
+38585
+38586
+38587
+38588
+38589
+38590
+38591
+38592
+38593
+38594
+38595
+38596
+38597
+38598
+38599
+38600
+38601
+38602
+38603
+38604
+38605
+38606
+38607
+38608
+38609
+38610
+38611
+38612
+38613
+38614
+38615
+38616
+38617
+38618
+38619
+38620
+38621
+38622
+38623
+38624
+38625
+38626
+38627
+38628
+38629
+38630
+38631
+38632
+38633
+38634
+38635
+38636
+38637
+38638
+38639
+38640
+38641
+38642
+38643
+38644
+38645
+38646
+38647
+38648
+38649
+38650
+38651
+38652
+38653
+38654
+38655
+38656
+38657
+38658
+38659
+38660
+38661
+38662
+38663
+38664
+38665
+38666
+38667
+38668
+38669
+38670
+38671
+38672
+38673
+38674
+38675
+38676
+38677
+38678
+38679
+38680
+38681
+38682
+38683
+38684
+38685
+38686
+38687
+38688
+38689
+38690
+38691
+38692
+38693
+38694
+38695
+38696
+38697
+38698
+38699
+38700
+38701
+38702
+38703
+38704
+38705
+38706
+38707
+38708
+38709
+38710
+38711
+38712
+38713
+38714
+38715
+38716
+38717
+38718
+38719
+38720
+38721
+38722
+38723
+38724
+38725
+38726
+38727
+38728
+38729
+38730
+38731
+38732
+38733
+38734
+38735
+38736
+38737
+38738
+38739
+38740
+38741
+38742
+38743
+38744
+38745
+38746
+38747
+38748
+38749
+38750
+38751
+38752
+38753
+38754
+38755
+38756
+38757
+38758
+38759
+38760
+38761
+38762
+38763
+38764
+38765
+38766
+38767
+38768
+38769
+38770
+38771
+38772
+38773
+38774
+38775
+38776
+38777
+38778
+38779
+38780
+38781
+38782
+38783
+38784
+38785
+38786
+38787
+38788
+38789
+38790
+38791
+38792
+38793
+38794
+38795
+38796
+38797
+38798
+38799
+38800
+38801
+38802
+38803
+38804
+38805
+38806
+38807
+38808
+38809
+38810
+38811
+38812
+38813
+38814
+38815
+38816
+38817
+38818
+38819
+38820
+38821
+38822
+38823
+38824
+38825
+38826
+38827
+38828
+38829
+38830
+38831
+38832
+38833
+38834
+38835
+38836
+38837
+38838
+38839
+38840
+38841
+38842
+38843
+38844
+38845
+38846
+38847
+38848
+38849
+38850
+38851
+38852
+38853
+38854
+38855
+38856
+38857
+38858
+38859
+38860
+38861
+38862
+38863
+38864
+38865
+38866
+38867
+38868
+38869
+38870
+38871
+38872
+38873
+38874
+38875
+38876
+38877
+38878
+38879
+38880
+38881
+38882
+38883
+38884
+38885
+38886
+38887
+38888
+38889
+38890
+38891
+38892
+38893
+38894
+38895
+38896
+38897
+38898
+38899
+38900
+38901
+38902
+38903
+38904
+38905
+38906
+38907
+38908
+38909
+38910
+38911
+38912
+38913
+38914
+38915
+38916
+38917
+38918
+38919
+38920
+38921
+38922
+38923
+38924
+38925
+38926
+38927
+38928
+38929
+38930
+38931
+38932
+38933
+38934
+38935
+38936
+38937
+38938
+38939
+38940
+38941
+38942
+38943
+38944
+38945
+38946
+38947
+38948
+38949
+38950
+38951
+38952
+38953
+38954
+38955
+38956
+38957
+38958
+38959
+38960
+38961
+38962
+38963
+38964
+38965
+38966
+38967
+38968
+38969
+38970
+38971
+38972
+38973
+38974
+38975
+38976
+38977
+38978
+38979
+38980
+38981
+38982
+38983
+38984
+38985
+38986
+38987
+38988
+38989
+38990
+38991
+38992
+38993
+38994
+38995
+38996
+38997
+38998
+38999
+39000
+39001
+39002
+39003
+39004
+39005
+39006
+39007
+39008
+39009
+39010
+39011
+39012
+39013
+39014
+39015
+39016
+39017
+39018
+39019
+39020
+39021
+39022
+39023
+39024
+39025
+39026
+39027
+39028
+39029
+39030
+39031
+39032
+39033
+39034
+39035
+39036
+39037
+39038
+39039
+39040
+39041
+39042
+39043
+39044
+39045
+39046
+39047
+39048
+39049
+39050
+39051
+39052
+39053
+39054
+39055
+39056
+39057
+39058
+39059
+39060
+39061
+39062
+39063
+39064
+39065
+39066
+39067
+39068
+39069
+39070
+39071
+39072
+39073
+39074
+39075
+39076
+39077
+39078
+39079
+39080
+39081
+39082
+39083
+39084
+39085
+39086
+39087
+39088
+39089
+39090
+39091
+39092
+39093
+39094
+39095
+39096
+39097
+39098
+39099
+39100
+39101
+39102
+39103
+39104
+39105
+39106
+39107
+39108
+39109
+39110
+39111
+39112
+39113
+39114
+39115
+39116
+39117
+39118
+39119
+39120
+39121
+39122
+39123
+39124
+39125
+39126
+39127
+39128
+39129
+39130
+39131
+39132
+39133
+39134
+39135
+39136
+39137
+39138
+39139
+39140
+39141
+39142
+39143
+39144
+39145
+39146
+39147
+39148
+39149
+39150
+39151
+39152
+39153
+39154
+39155
+39156
+39157
+39158
+39159
+39160
+39161
+39162
+39163
+39164
+39165
+39166
+39167
+39168
+39169
+39170
+39171
+39172
+39173
+39174
+39175
+39176
+39177
+39178
+39179
+39180
+39181
+39182
+39183
+39184
+39185
+39186
+39187
+39188
+39189
+39190
+39191
+39192
+39193
+39194
+39195
+39196
+39197
+39198
+39199
+39200
+39201
+39202
+39203
+39204
+39205
+39206
+39207
+39208
+39209
+39210
+39211
+39212
+39213
+39214
+39215
+39216
+39217
+39218
+39219
+39220
+39221
+39222
+39223
+39224
+39225
+39226
+39227
+39228
+39229
+39230
+39231
+39232
+39233
+39234
+39235
+39236
+39237
+39238
+39239
+39240
+39241
+39242
+39243
+39244
+39245
+39246
+39247
+39248
+39249
+39250
+39251
+39252
+39253
+39254
+39255
+39256
+39257
+39258
+39259
+39260
+39261
+39262
+39263
+39264
+39265
+39266
+39267
+39268
+39269
+39270
+39271
+39272
+39273
+39274
+39275
+39276
+39277
+39278
+39279
+39280
+39281
+39282
+39283
+39284
+39285
+39286
+39287
+39288
+39289
+39290
+39291
+39292
+39293
+39294
+39295
+39296
+39297
+39298
+39299
+39300
+39301
+39302
+39303
+39304
+39305
+39306
+39307
+39308
+39309
+39310
+39311
+39312
+39313
+39314
+39315
+39316
+39317
+39318
+39319
+39320
+39321
+39322
+39323
+39324
+39325
+39326
+39327
+39328
+39329
+39330
+39331
+39332
+39333
+39334
+39335
+39336
+39337
+39338
+39339
+39340
+39341
+39342
+39343
+39344
+39345
+39346
+39347
+39348
+39349
+39350
+39351
+39352
+39353
+39354
+39355
+39356
+39357
+39358
+39359
+39360
+39361
+39362
+39363
+39364
+39365
+39366
+39367
+39368
+39369
+39370
+39371
+39372
+39373
+39374
+39375
+39376
+39377
+39378
+39379
+39380
+39381
+39382
+39383
+39384
+39385
+39386
+39387
+39388
+39389
+39390
+39391
+39392
+39393
+39394
+39395
+39396
+39397
+39398
+39399
+39400
+39401
+39402
+39403
+39404
+39405
+39406
+39407
+39408
+39409
+39410
+39411
+39412
+39413
+39414
+39415
+39416
+39417
+39418
+39419
+39420
+39421
+39422
+39423
+39424
+39425
+39426
+39427
+39428
+39429
+39430
+39431
+39432
+39433
+39434
+39435
+39436
+39437
+39438
+39439
+39440
+39441
+39442
+39443
+39444
+39445
+39446
+39447
+39448
+39449
+39450
+39451
+39452
+39453
+39454
+39455
+39456
+39457
+39458
+39459
+39460
+39461
+39462
+39463
+39464
+39465
+39466
+39467
+39468
+39469
+39470
+39471
+39472
+39473
+39474
+39475
+39476
+39477
+39478
+39479
+39480
+39481
+39482
+39483
+39484
+39485
+39486
+39487
+39488
+39489
+39490
+39491
+39492
+39493
+39494
+39495
+39496
+39497
+39498
+39499
+39500
+39501
+39502
+39503
+39504
+39505
+39506
+39507
+39508
+39509
+39510
+39511
+39512
+39513
+39514
+39515
+39516
+39517
+39518
+39519
+39520
+39521
+39522
+39523
+39524
+39525
+39526
+39527
+39528
+39529
+39530
+39531
+39532
+39533
+39534
+39535
+39536
+39537
+39538
+39539
+39540
+39541
+39542
+39543
+39544
+39545
+39546
+39547
+39548
+39549
+39550
+39551
+39552
+39553
+39554
+39555
+39556
+39557
+39558
+39559
+39560
+39561
+39562
+39563
+39564
+39565
+39566
+39567
+39568
+39569
+39570
+39571
+39572
+39573
+39574
+39575
+39576
+39577
+39578
+39579
+39580
+39581
+39582
+39583
+39584
+39585
+39586
+39587
+39588
+39589
+39590
+39591
+39592
+39593
+39594
+39595
+39596
+39597
+39598
+39599
+39600
+39601
+39602
+39603
+39604
+39605
+39606
+39607
+39608
+39609
+39610
+39611
+39612
+39613
+39614
+39615
+39616
+39617
+39618
+39619
+39620
+39621
+39622
+39623
+39624
+39625
+39626
+39627
+39628
+39629
+39630
+39631
+39632
+39633
+39634
+39635
+39636
+39637
+39638
+39639
+39640
+39641
+39642
+39643
+39644
+39645
+39646
+39647
+39648
+39649
+39650
+39651
+39652
+39653
+39654
+39655
+39656
+39657
+39658
+39659
+39660
+39661
+39662
+
+

+(* This generated code requires the following version of MenhirLib: *)
+
+let () =
+  MenhirLib.StaticVersion.require_20230608
+
+module MenhirBasics = struct
+  
+  exception Error
+  
+  let _eRR =
+    fun _s ->
+      raise Error
+  
+  type token = 
+    | XOROP
+    | XORASSIGN
+    | WRAPSUBOP
+    | WRAPSUBASSIGN
+    | WRAPPOWOP
+    | WRAPPOWASSIGN
+    | WRAPMULOP
+    | WRAPMULASSIGN
+    | WRAPADDOP
+    | WRAPADDASSIGN
+    | WITH
+    | WHILE
+    | VAR
+    | UNDERSCORE
+    | TYPE
+    | TRY
+    | TO_CANDID
+    | THROW
+    | TEXT of (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 38 "mo_frontend/parser.ml"
+  )
+    | SYSTEM
+    | SWITCH
+    | SUBOP
+    | SUB
+    | STABLE
+    | SHROP
+    | SHRASSIGN
+    | SHLOP
+    | SHLASSIGN
+    | SHARED
+    | SEMICOLON_EOL
+    | SEMICOLON
+    | RPAR
+    | ROTROP
+    | ROTRASSIGN
+    | ROTLOP
+    | ROTLASSIGN
+    | RETURN
+    | RCURLY
+    | RBRACKET
+    | QUEST
+    | QUERY
+    | PUBLIC
+    | PRIVATE
+    | PRIM
+    | POWOP
+    | POWASSIGN
+    | PLUSASSIGN
+    | PIPE
+    | OROP
+    | ORASSIGN
+    | OR
+    | OLD
+    | OBJECT
+    | NULL
+    | NOT
+    | NEQOP
+    | NAT of (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 80 "mo_frontend/parser.ml"
+  )
+    | MULOP
+    | MULASSIGN
+    | MODULE
+    | MODOP
+    | MODASSIGN
+    | MINUSASSIGN
+    | LTOP
+    | LT
+    | LPAR
+    | LOOP
+    | LET
+    | LEOP
+    | LCURLY
+    | LBRACKET
+    | LABEL
+    | INVARIANT
+    | IN
+    | IMPORT
+    | IMPLIES
+    | IGNORE
+    | IF
+    | ID of (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 106 "mo_frontend/parser.ml"
+  )
+    | HASH
+    | GTOP
+    | GT
+    | GEOP
+    | FUNC
+    | FROM_CANDID
+    | FOR
+    | FLOAT of (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 118 "mo_frontend/parser.ml"
+  )
+    | FLEXIBLE
+    | EQOP
+    | EQ
+    | EOF
+    | ELSE
+    | DOT_NUM of (
+# 233 "mo_frontend/parser.mly"
+      (string)
+# 128 "mo_frontend/parser.ml"
+  )
+    | DOT
+    | DO
+    | DIVOP
+    | DIVASSIGN
+    | DISALLOWED
+    | DEBUG_SHOW
+    | DEBUG
+    | CONTINUE
+    | COMPOSITE
+    | COMMA
+    | COLON
+    | CLASS
+    | CHAR of (
+# 236 "mo_frontend/parser.mly"
+      (Mo_values.Value.unicode)
+# 145 "mo_frontend/parser.ml"
+  )
+    | CATCH
+    | CATASSIGN
+    | CASE
+    | BREAK
+    | BOOL of (
+# 237 "mo_frontend/parser.mly"
+      (bool)
+# 154 "mo_frontend/parser.ml"
+  )
+    | BANG
+    | AWAITSTAR
+    | AWAIT
+    | ASYNCSTAR
+    | ASYNC
+    | ASSIGN
+    | ASSERT
+    | ARROW
+    | ANDOP
+    | ANDASSIGN
+    | AND
+    | ADDOP
+    | ACTOR
+  
+end
+
+include MenhirBasics
+
+# 1 "mo_frontend/assertions.mly"
+  
+
+let verification_syntax_error at code msg =
+  Diag.add_msg (Option.get !Parser_lib.msg_store)
+    (Diag.error_message at code "verification syntax" msg)
+
+(* Verification mode only *)
+
+let (&&&) cond (action : Mo_def.Syntax.exp) =
+  if not cond then
+    verification_syntax_error
+      action.Source.at
+      "M0181" "verification assertions not permitted in normal mode";
+  action
+
+let is_verification () =
+  match !Parser_lib.mode with
+  | None -> assert false
+  | Some mode -> mode.Lexer_lib.verification
+
+
+# 196 "mo_frontend/parser.ml"
+
+# 1 "mo_frontend/parser.mly"
+  
+open Mo_def
+open Mo_types
+open Mo_values
+
+open Syntax
+open Source
+open Operator
+open Parser_lib
+
+
+(* Position handling *)
+
+let position_to_pos position =
+  { file = position.Lexing.pos_fname;
+    line = position.Lexing.pos_lnum;
+    column = position.Lexing.pos_cnum - position.Lexing.pos_bol
+  }
+
+let positions_to_region position1 position2 =
+  { left = position_to_pos position1;
+    right = position_to_pos position2
+  }
+
+let at (startpos, endpos) = positions_to_region startpos endpos
+
+let syntax_error at code msg =
+  Diag.add_msg (Option.get !msg_store)
+    (Diag.error_message at code "syntax" msg)
+
+(* Helpers *)
+
+let scope_bind x at =
+  { var = Type.scope_var x @@ at;
+    sort = Type.Scope @@ at;
+    bound = PrimT "Any" @! at
+  } @= at
+
+let ensure_scope_bind var tbs =
+  match tbs with
+  | tb::_ when tb.it.sort.it = Type.Scope -> tbs
+  | _ -> scope_bind var no_region :: tbs
+
+let ensure_async_typ t_opt =
+  match t_opt with
+  | None -> t_opt
+  | Some { it = AsyncT _; _} -> t_opt
+  | Some t -> Some (AsyncT(Type.Fut, scopeT no_region, t) @! no_region)
+
+let funcT (sort, tbs, t1, t2) =
+  match sort.it, t2.it with
+  | Type.Local, AsyncT _ -> FuncT (sort, ensure_scope_bind "" tbs, t1, t2)
+  | Type.Shared _, _ -> FuncT (sort, ensure_scope_bind "" tbs, t1, t2)
+  | _ -> FuncT(sort, tbs, t1, t2)
+
+
+let dup_var x = VarE (x.it @@ x.at) @? x.at
+
+let name_exp e =
+  match e.it with
+  | VarE x -> [], e, dup_var x
+  | _ ->
+    let x = anon_id "val" e.at @@ e.at in
+    [LetD (VarP x @! x.at, e, None) @? e.at], dup_var x, dup_var x
+
+let assign_op lhs rhs_f at =
+  let ds, lhs', rhs' =
+    match lhs.it with
+    | VarE x -> [], lhs, dup_var x
+    | DotE (e1, x) ->
+      let ds, ex11, ex12 = name_exp e1 in
+      ds, DotE (ex11, x) @? lhs.at, DotE (ex12, x.it @@ x.at) @? lhs.at
+    | IdxE (e1, e2) ->
+      let ds1, ex11, ex12 = name_exp e1 in
+      let ds2, ex21, ex22 = name_exp e2 in
+      ds1 @ ds2, IdxE (ex11, ex21) @? lhs.at, IdxE (ex12, ex22) @? lhs.at
+    | _ ->
+      name_exp lhs
+  in
+  let e = AssignE (lhs', rhs_f rhs') @? at in
+  match ds with
+  | [] -> e
+  | ds -> BlockE (ds @ [ExpD e @? e.at]) @? at
+
+let annot_exp e = function
+  | None -> e
+  | Some t -> AnnotE(e, t) @? span t.at e.at
+
+let annot_pat p = function
+  | None -> p
+  | Some t -> AnnotP(p, t) @! span t.at p.at
+
+
+let rec normalize_let p e =
+    match p.it with
+    | AnnotP(p', t) -> p', AnnotE(e, t) @? p.at
+    | ParP p' -> normalize_let p' e
+    | _ -> (p, e)
+
+let let_or_exp named x e' at =
+  if named
+  then LetD(VarP(x) @! at, e' @? at, None) @? at
+       (* If you change the above regions,
+          modify is_sugared_func_or_module to match *)
+  else ExpD(e' @? at) @? at
+
+let is_sugared_func_or_module dec = match dec.it with
+  | LetD({it = VarP _; _} as pat, exp, None) ->
+    dec.at = pat.at && pat.at = exp.at &&
+    (match exp.it with
+    | ObjBlockE (sort, _, _) ->
+      sort.it = Type.Module
+    | FuncE _ ->
+      true
+    | _ -> false
+    )
+  | _ -> false
+
+
+let func_exp f s tbs p t_opt is_sugar e =
+  match s.it, t_opt, e with
+  | Type.Local, Some {it = AsyncT _; _}, {it = AsyncE _; _}
+  | Type.Shared _, _, _ ->
+    FuncE(f, s, ensure_scope_bind "" tbs, p, t_opt, is_sugar, e)
+  | _ ->
+    FuncE(f, s, tbs, p, t_opt, is_sugar, e)
+
+let desugar_func_body sp x t_opt (is_sugar, e) =
+  if not is_sugar then
+    false, e (* body declared as EQ e *)
+  else (* body declared as immediate block *)
+    match sp.it, t_opt with
+    | _, Some {it = AsyncT (s, _, _); _} ->
+      true, asyncE s (scope_bind x.it e.at) e
+    | Type.Shared _, (None | Some { it = TupT []; _}) ->
+      true, ignore_asyncE (scope_bind x.it e.at) e
+    | _, _ -> (true, e)
+
+let share_typ t =
+  match t.it with
+  | FuncT ({it = Type.Local; _} as s, tbs, t1, t2) ->
+    { t with it = funcT ({s with it = Type.Shared Type.Write}, tbs, t1, t2)}
+  | _ -> t
+
+let share_typfield' = function
+  | TypF (c, tps, t) -> TypF (c, tps, t)
+  | ValF (x, t, m) -> ValF (x, share_typ t, m)
+
+let share_typfield (tf : typ_field) = { tf with it = share_typfield' tf.it }
+
+let share_exp e =
+  match e.it with
+  | FuncE (x, ({it = Type.Local; _} as sp), tbs, p,
+    ((None | Some { it = TupT []; _ }) as t_opt), true, e) ->
+    func_exp x {sp with it = Type.Shared (Type.Write, WildP @! sp.at)} tbs p t_opt true (ignore_asyncE (scope_bind x e.at) e) @? e.at
+  | FuncE (x, ({it = Type.Local; _} as sp), tbs, p, t_opt, s, e) ->
+    func_exp x {sp with it = Type.Shared (Type.Write, WildP @! sp.at)} tbs p t_opt s e @? e.at
+  | _ -> e
+
+let share_dec d =
+  match d.it with
+  | LetD (p, e, f) -> LetD (p, share_exp e, f) @? d.at
+  | _ -> d
+
+let share_stab stab_opt dec =
+  match stab_opt with
+  | None ->
+    (match dec.it with
+     | VarD _
+     | LetD _ ->
+       Some (Flexible @@ dec.at)
+     | _ -> None)
+  | _ -> stab_opt
+
+let ensure_system_cap (df : dec_field) =
+  match df.it.dec.it with
+    | LetD ({ it = VarP { it = "preupgrade" | "postupgrade"; _}; _} as pat, ({ it = FuncE (x, sp, tbs, p, t_opt, s, e); _ } as value), other) ->
+      let it = LetD (pat, { value with it = FuncE (x, sp, ensure_scope_bind "" tbs, p, t_opt, s, e) }, other) in
+      { df with it = { df.it with dec = { df.it.dec with it } } }
+    | _ -> df
+
+let share_dec_field (df : dec_field) =
+  match df.it.vis.it with
+  | Public _ ->
+    {df with it = {df.it with
+      dec = share_dec df.it.dec;
+      stab = share_stab df.it.stab df.it.dec}}
+  | System -> ensure_system_cap df
+  | _ when is_sugared_func_or_module (df.it.dec) ->
+    {df with it =
+       {df.it with stab =
+          match df.it.stab with
+          | None -> Some (Flexible @@ df.it.dec.at)
+          | some -> some}
+    }
+  | _ -> df
+
+and objblock s ty dec_fields =
+  List.iter (fun df ->
+    match df.it.vis.it, df.it.dec.it with
+    | Public _, ClassD (_, id, _, _, _, _, _, _) when is_anon_id id ->
+      syntax_error df.it.dec.at "M0158" "a public class cannot be anonymous, please provide a name"
+    | _ -> ()) dec_fields;
+  ObjBlockE(s, ty, dec_fields)
+
+
+# 405 "mo_frontend/parser.ml"
+
+module Tables = struct
+  
+  include MenhirBasics
+  
+  let token2terminal : token -> int =
+    fun _tok ->
+      match _tok with
+      | ACTOR ->
+          124
+      | ADDOP ->
+          123
+      | AND ->
+          122
+      | ANDASSIGN ->
+          121
+      | ANDOP ->
+          120
+      | ARROW ->
+          119
+      | ASSERT ->
+          118
+      | ASSIGN ->
+          117
+      | ASYNC ->
+          116
+      | ASYNCSTAR ->
+          115
+      | AWAIT ->
+          114
+      | AWAITSTAR ->
+          113
+      | BANG ->
+          112
+      | BOOL _ ->
+          111
+      | BREAK ->
+          110
+      | CASE ->
+          109
+      | CATASSIGN ->
+          108
+      | CATCH ->
+          107
+      | CHAR _ ->
+          106
+      | CLASS ->
+          105
+      | COLON ->
+          104
+      | COMMA ->
+          103
+      | COMPOSITE ->
+          102
+      | CONTINUE ->
+          101
+      | DEBUG ->
+          100
+      | DEBUG_SHOW ->
+          99
+      | DISALLOWED ->
+          98
+      | DIVASSIGN ->
+          97
+      | DIVOP ->
+          96
+      | DO ->
+          95
+      | DOT ->
+          94
+      | DOT_NUM _ ->
+          93
+      | ELSE ->
+          92
+      | EOF ->
+          91
+      | EQ ->
+          90
+      | EQOP ->
+          89
+      | FLEXIBLE ->
+          88
+      | FLOAT _ ->
+          87
+      | FOR ->
+          86
+      | FROM_CANDID ->
+          85
+      | FUNC ->
+          84
+      | GEOP ->
+          83
+      | GT ->
+          82
+      | GTOP ->
+          81
+      | HASH ->
+          80
+      | ID _ ->
+          79
+      | IF ->
+          78
+      | IGNORE ->
+          77
+      | IMPLIES ->
+          76
+      | IMPORT ->
+          75
+      | IN ->
+          74
+      | INVARIANT ->
+          73
+      | LABEL ->
+          72
+      | LBRACKET ->
+          71
+      | LCURLY ->
+          70
+      | LEOP ->
+          69
+      | LET ->
+          68
+      | LOOP ->
+          67
+      | LPAR ->
+          66
+      | LT ->
+          65
+      | LTOP ->
+          64
+      | MINUSASSIGN ->
+          63
+      | MODASSIGN ->
+          62
+      | MODOP ->
+          61
+      | MODULE ->
+          60
+      | MULASSIGN ->
+          59
+      | MULOP ->
+          58
+      | NAT _ ->
+          57
+      | NEQOP ->
+          56
+      | NOT ->
+          55
+      | NULL ->
+          54
+      | OBJECT ->
+          53
+      | OLD ->
+          52
+      | OR ->
+          51
+      | ORASSIGN ->
+          50
+      | OROP ->
+          49
+      | PIPE ->
+          48
+      | PLUSASSIGN ->
+          47
+      | POWASSIGN ->
+          46
+      | POWOP ->
+          45
+      | PRIM ->
+          44
+      | PRIVATE ->
+          43
+      | PUBLIC ->
+          42
+      | QUERY ->
+          41
+      | QUEST ->
+          40
+      | RBRACKET ->
+          39
+      | RCURLY ->
+          38
+      | RETURN ->
+          37
+      | ROTLASSIGN ->
+          36
+      | ROTLOP ->
+          35
+      | ROTRASSIGN ->
+          34
+      | ROTROP ->
+          33
+      | RPAR ->
+          32
+      | SEMICOLON ->
+          31
+      | SEMICOLON_EOL ->
+          30
+      | SHARED ->
+          29
+      | SHLASSIGN ->
+          28
+      | SHLOP ->
+          27
+      | SHRASSIGN ->
+          26
+      | SHROP ->
+          25
+      | STABLE ->
+          24
+      | SUB ->
+          23
+      | SUBOP ->
+          22
+      | SWITCH ->
+          21
+      | SYSTEM ->
+          20
+      | TEXT _ ->
+          19
+      | THROW ->
+          18
+      | TO_CANDID ->
+          17
+      | TRY ->
+          16
+      | TYPE ->
+          15
+      | UNDERSCORE ->
+          14
+      | VAR ->
+          13
+      | WHILE ->
+          12
+      | WITH ->
+          11
+      | WRAPADDASSIGN ->
+          10
+      | WRAPADDOP ->
+          9
+      | WRAPMULASSIGN ->
+          8
+      | WRAPMULOP ->
+          7
+      | WRAPPOWASSIGN ->
+          6
+      | WRAPPOWOP ->
+          5
+      | WRAPSUBASSIGN ->
+          4
+      | WRAPSUBOP ->
+          3
+      | XORASSIGN ->
+          2
+      | XOROP ->
+          1
+  
+  and error_terminal =
+    0
+  
+  and token2value : token -> Obj.t =
+    fun _tok ->
+      match _tok with
+      | ACTOR ->
+          Obj.repr ()
+      | ADDOP ->
+          Obj.repr ()
+      | AND ->
+          Obj.repr ()
+      | ANDASSIGN ->
+          Obj.repr ()
+      | ANDOP ->
+          Obj.repr ()
+      | ARROW ->
+          Obj.repr ()
+      | ASSERT ->
+          Obj.repr ()
+      | ASSIGN ->
+          Obj.repr ()
+      | ASYNC ->
+          Obj.repr ()
+      | ASYNCSTAR ->
+          Obj.repr ()
+      | AWAIT ->
+          Obj.repr ()
+      | AWAITSTAR ->
+          Obj.repr ()
+      | BANG ->
+          Obj.repr ()
+      | BOOL _v ->
+          Obj.repr _v
+      | BREAK ->
+          Obj.repr ()
+      | CASE ->
+          Obj.repr ()
+      | CATASSIGN ->
+          Obj.repr ()
+      | CATCH ->
+          Obj.repr ()
+      | CHAR _v ->
+          Obj.repr _v
+      | CLASS ->
+          Obj.repr ()
+      | COLON ->
+          Obj.repr ()
+      | COMMA ->
+          Obj.repr ()
+      | COMPOSITE ->
+          Obj.repr ()
+      | CONTINUE ->
+          Obj.repr ()
+      | DEBUG ->
+          Obj.repr ()
+      | DEBUG_SHOW ->
+          Obj.repr ()
+      | DISALLOWED ->
+          Obj.repr ()
+      | DIVASSIGN ->
+          Obj.repr ()
+      | DIVOP ->
+          Obj.repr ()
+      | DO ->
+          Obj.repr ()
+      | DOT ->
+          Obj.repr ()
+      | DOT_NUM _v ->
+          Obj.repr _v
+      | ELSE ->
+          Obj.repr ()
+      | EOF ->
+          Obj.repr ()
+      | EQ ->
+          Obj.repr ()
+      | EQOP ->
+          Obj.repr ()
+      | FLEXIBLE ->
+          Obj.repr ()
+      | FLOAT _v ->
+          Obj.repr _v
+      | FOR ->
+          Obj.repr ()
+      | FROM_CANDID ->
+          Obj.repr ()
+      | FUNC ->
+          Obj.repr ()
+      | GEOP ->
+          Obj.repr ()
+      | GT ->
+          Obj.repr ()
+      | GTOP ->
+          Obj.repr ()
+      | HASH ->
+          Obj.repr ()
+      | ID _v ->
+          Obj.repr _v
+      | IF ->
+          Obj.repr ()
+      | IGNORE ->
+          Obj.repr ()
+      | IMPLIES ->
+          Obj.repr ()
+      | IMPORT ->
+          Obj.repr ()
+      | IN ->
+          Obj.repr ()
+      | INVARIANT ->
+          Obj.repr ()
+      | LABEL ->
+          Obj.repr ()
+      | LBRACKET ->
+          Obj.repr ()
+      | LCURLY ->
+          Obj.repr ()
+      | LEOP ->
+          Obj.repr ()
+      | LET ->
+          Obj.repr ()
+      | LOOP ->
+          Obj.repr ()
+      | LPAR ->
+          Obj.repr ()
+      | LT ->
+          Obj.repr ()
+      | LTOP ->
+          Obj.repr ()
+      | MINUSASSIGN ->
+          Obj.repr ()
+      | MODASSIGN ->
+          Obj.repr ()
+      | MODOP ->
+          Obj.repr ()
+      | MODULE ->
+          Obj.repr ()
+      | MULASSIGN ->
+          Obj.repr ()
+      | MULOP ->
+          Obj.repr ()
+      | NAT _v ->
+          Obj.repr _v
+      | NEQOP ->
+          Obj.repr ()
+      | NOT ->
+          Obj.repr ()
+      | NULL ->
+          Obj.repr ()
+      | OBJECT ->
+          Obj.repr ()
+      | OLD ->
+          Obj.repr ()
+      | OR ->
+          Obj.repr ()
+      | ORASSIGN ->
+          Obj.repr ()
+      | OROP ->
+          Obj.repr ()
+      | PIPE ->
+          Obj.repr ()
+      | PLUSASSIGN ->
+          Obj.repr ()
+      | POWASSIGN ->
+          Obj.repr ()
+      | POWOP ->
+          Obj.repr ()
+      | PRIM ->
+          Obj.repr ()
+      | PRIVATE ->
+          Obj.repr ()
+      | PUBLIC ->
+          Obj.repr ()
+      | QUERY ->
+          Obj.repr ()
+      | QUEST ->
+          Obj.repr ()
+      | RBRACKET ->
+          Obj.repr ()
+      | RCURLY ->
+          Obj.repr ()
+      | RETURN ->
+          Obj.repr ()
+      | ROTLASSIGN ->
+          Obj.repr ()
+      | ROTLOP ->
+          Obj.repr ()
+      | ROTRASSIGN ->
+          Obj.repr ()
+      | ROTROP ->
+          Obj.repr ()
+      | RPAR ->
+          Obj.repr ()
+      | SEMICOLON ->
+          Obj.repr ()
+      | SEMICOLON_EOL ->
+          Obj.repr ()
+      | SHARED ->
+          Obj.repr ()
+      | SHLASSIGN ->
+          Obj.repr ()
+      | SHLOP ->
+          Obj.repr ()
+      | SHRASSIGN ->
+          Obj.repr ()
+      | SHROP ->
+          Obj.repr ()
+      | STABLE ->
+          Obj.repr ()
+      | SUB ->
+          Obj.repr ()
+      | SUBOP ->
+          Obj.repr ()
+      | SWITCH ->
+          Obj.repr ()
+      | SYSTEM ->
+          Obj.repr ()
+      | TEXT _v ->
+          Obj.repr _v
+      | THROW ->
+          Obj.repr ()
+      | TO_CANDID ->
+          Obj.repr ()
+      | TRY ->
+          Obj.repr ()
+      | TYPE ->
+          Obj.repr ()
+      | UNDERSCORE ->
+          Obj.repr ()
+      | VAR ->
+          Obj.repr ()
+      | WHILE ->
+          Obj.repr ()
+      | WITH ->
+          Obj.repr ()
+      | WRAPADDASSIGN ->
+          Obj.repr ()
+      | WRAPADDOP ->
+          Obj.repr ()
+      | WRAPMULASSIGN ->
+          Obj.repr ()
+      | WRAPMULOP ->
+          Obj.repr ()
+      | WRAPPOWASSIGN ->
+          Obj.repr ()
+      | WRAPPOWOP ->
+          Obj.repr ()
+      | WRAPSUBASSIGN ->
+          Obj.repr ()
+      | WRAPSUBOP ->
+          Obj.repr ()
+      | XORASSIGN ->
+          Obj.repr ()
+      | XOROP ->
+          Obj.repr ()
+  
+  and default_reduction =
+    (16, "\002\004\000\000\000\000\001\170\001\144\001\139\001\141\000\000\000\000\001\142\001\143\001\140\001\180\000\000\001\179\000\000\000\000\000\000\000\000\000\000\001\152\000\000\001\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002+\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\233\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\000\000\000\000\000\000\002(\000\000\000\000\000\000\000\000\000\000\002/\002*\002,\002'\0022\000\000\000\000\000\000\000\000\002\022\002\023\002\005\000\000\000\000\000\000\000\000\002\006\000\000\001\230\000\000\002\b\000\000\001\182\001\155\002$\002-\002\"\000\000\000\000\000\000\000\000\002!\000\000\000\000\002 \000\000\002&\000\000\002%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0024\000\000\0021\000\000\000\000\000\000\000\000\000\000\001\248\000\000\001\247\001\254\000\000\001\253\000\000\000\000\001\241\000\000\001\240\000\000\0025\000\000\002)\000\000\000\000\002\025\000\000\000\000\000\000\000\000\002\024\000\000\002.\000\000\000\000\001\138\000\000\000\000\000\000\000\000\002\031\000\000\000\000\000\000\000\000\002\030\000\000\000\000\002\029\000\000\000\000\000\000\000\000\000\000\000\000\001\244\000\000\002#\0023\000\000\000\000\000\000\000\000\000\000\000\000\002\028\000\000\000\000\000\000\000\000\002\027\000\000\000\000\002\026\000\000\000\000\000\000\001\171\000\000\000\000\001\166\001\176\001\172\000\000\001\178\001\161\001\174\000\000\000\000\001\162\000\000\000\000\001\165\000\000\001\167\000\000\000\000\001\223\000\000\001\222\001\177\000\000\001\173\000\000\000\000\001\219\000\000\001\148\000\000\001\130\001\131\000\000\001\156\000\000\000\000\001\216\000\000\001\215\000\001\002\004\000\000\000\000\000\000\000\000\001J\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001H\001F\001N\001G\001\145\000\000\000\000\000\000\000\000\000\000\000\000\001E\000\000\000\000\000\000\000\000\000\000\001\168\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0029\0028\0027\000\000\002\001\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\000\012\000\r\000o\000\000\000\000\000\000\000\000\000n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000l\000\000\000\000\000\000\000\000\000k\000\000\000\000\000j\000\000\000\000\000m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\000\000\000\000\000\000\000\000\000z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000x\000\000\000\000\000\000\000\000\000w\000\000\000\000\000v\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\000\000\000\001\188\000\000\001\187\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000<\000\000\000\000\000\000\000\000\000;\000\000\000\000\000:\000\000\000\000\000=\000\000\000\000\000\023\000\000\000\000\000\000\000\000\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000K\000\000\000\000\000\000\000\000\000J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000G\000\000\000\000\000F\000\000\000\000\000I\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001s\000\000\000\000\000\000\000\000\001{\001u\000\000\000\000\000\000\000\000\000\000\001\136\000\000\001\134\000\000\001\133\000\000\000\000\000\000\001D\000\000\001i\001Y\000\000\000\000\001m\000\000\001j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001C\000\000\000\000\001d\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0016\0015\000\000\000\000\001p\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135\000\000\000\000\000\000\000\000\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\131\000\000\000\000\000\130\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147\000\000\000\000\000\000\000\000\000\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\143\000\000\000\000\000\142\000\000\000\000\000\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0003\001\129\000\000\000\000\000\000\000\000\0002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000/\000\000\000\000\000.\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~\000\000\000\000\000\000\000\000\000}\000\000\000\000\000|\000\000\000\000\000\127\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\141\000\000\000\000\000\000\000\000\000\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\138\000\000\000\000\000\000\000\000\000\137\000\000\000\000\000\136\000\000\000\000\000\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0009\000\000\000\000\000\000\000\000\0008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\000\000\000\000\000\0005\000\000\000\000\0004\000\000\000\000\0007\000\000\000\000\001(\001\150\000\000\000\000\000\000\001\005\001\004\000\007\000\000\001n\000\000\000\000\000\248\000\000\000\000\000\247\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001f\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000E\000\000\000\000\000\000\000\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000\000\000\000\000\000A\000\000\000\000\000@\000\000\000\000\000C\001l\000\000\000\000\000\025\000\153\000\000\000\000\000\000\001B\001P\000\149\001=\001$\000\000\000\000\000\183\000\000\000\000\000\193\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001#\000\218\000\150\001>\000\217\001A\000\000\001\"\000\000\000\000\000\000\0017\000\000\001:\000\000\000\000\000\000\001;\000\000\0018\000\000\0019\001&\000\000\000\151\001?\000\000\000\000\000\000\000\000\001\026\000\152\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\000\000\001\023\000\000\001\022\000\000\000\000\000\000\001\020\000\000\000\000\000\000\001\028\000\000\001\027\000\000\001\030\000\000\001\029\000\000\001\019\000\000\001\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\001\016\000\000\001\018\000\000\001\015\000\000\000\000\000\000\000\210\000\000\001\017\000\000\001\031\000\000\001\r\000\000\001\024\000\233\000\000\000\000\000\000\000\228\000\000\000\163\000\000\000\230\000\000\000\000\000\000\000\229\000\000\000\000\000\000\000\227\000\000\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\234\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\236\000\000\000\159\000\000\000\226\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\223\000\000\000\000\000\000\000\225\000\000\000\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\000\000\000\180\000\000\000\238\000\000\000\220\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\000\001S\001T\000\000\001U\001W\000\000\001V\001\006\000\000\001\t\000\000\000\000\000\000\001\n\000\000\001\007\000\000\001\b\000\245\000\241\000\242\000\243\000\244\000\249\001%\000\000\000\000\001\002\001*\000\000\000\000\0013\001\128\000!\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\000\000\000\000\000\000\000\000\000\029\000\000\000\000\000\028\000\000\000\000\000\031\000\000\000\000\000\251\001\003\000\246\000\000\000\000\001\001\000\000\000\000\001,\000\000\001R\000\000\000\000\001\209\000\000\001Q\000\000\000\000\000\000\001X\000\000\001O\000\000\000\000\001\202\001\011\0014\000\000\001\\\001]\000\000\001^\001`\000\000\001_\001}\001\127\001e\001'\000\019\000\240\000\000\000\000\0012\000\000\001[\000\000\001Z\001g\000\253\001<\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\b\000\016\000\014\000\015\000\000\000\000\001\195\000\000\001\194\000-\000\000\000\000\000\000\000\000\000,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000\000\000\000\000\000\000\000\000)\000\000\000\000\000(\000\000\000\000\000+\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000\000\000h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000f\000\000\000\000\000\000\000\000\000e\000\000\000\000\000d\000\000\000\000\000g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\000\000\000\000\000\000\000\000\000t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000r\000\000\000\000\000\000\000\000\000q\000\000\000\000\000p\000\000\000\000\000s\001!\000\018\000\000\001\146\000\000\000\000\001\199\000\000\001\198\000W\000\000\000\000\000\000\000\000\000V\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000T\000\000\000\000\000\000\000\000\000S\000\000\000\000\000R\000\000\000\000\000U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000c\000\000\000\000\000\000\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\000\000\000\000\000\000\000\000\000_\000\000\000\000\000^\000\000\000\000\000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000#\000\000\000\000\000\"\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000N\000\000\000\000\000\000\000\000\000M\000\000\000\000\000L\000\000\000\000\000O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000\000\000\000\000\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Z\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000X\000\000\000\000\000[\000\000\001o\000\000\000\000\000\000\000\n\000\252\000\255\000\t\000\000\001/\000\216\000\000\000\000\000\000\000\215\000\000\001K\000\000\000\000\000\000\000\000\001M\000\000\000\000\001\251\000\000\000\000\001\206\000\000\001\205\000\000\001\250\000\000\000\000\000\000\001L\000\000\000\000\001\184\001k\001.\000\000\000\000\000\000\000\000\001a\001y\001|\001x\001t\001v\001h\000\000\001-\000\148\000\000\0010\000\000\001~\001z\001w\000\000\001\157\000\002\002\004\000\000\000\000\000\000\001\158\000\000\000\000\001\191\000\000\000\000\001\212\000\003\002\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\237\000\000\001\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\227\000\000\001\226\000\000\001\159\000\004")
+  
+  and error =
+    (125, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\000\132\000\000\000\000\144\b\128@@\000\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000B@\016\016\000H\004@0 \000\004 \002\000\000\016\000\000\000\002@\000\000\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001 \000\000\000\128\000\016\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000B@\000\016\000H\004@0 \000\004 \002\000\000\000\000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\001\000\004\000\000\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\001\128\000\000\198\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\012` \000\000\000\000\000\000\000\000\000\000\128\000\000#\001\000\000\000\000\000\000\000\000\000$\006@ C\024\b\000\000\016\000\192@\000\000\000\000 \000\000\024\192@\000\000\000\000\000\000\000\016\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\n\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\b\000\000\0020\016\000\000\000\000\000\000\002\128\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\128\000\128\025\000\129\012` \000\000@\003\001\000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\198\002\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\016\000\000\004` \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\001\016\b\016F\002\000\000\000\0000\016\000\000\000\000\b\128@\1300\016\000\000\000\001\128\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\223\236\255\255\159\255\255\255_\254\247\255\246\255\240\000\000\000@\012\128@\1340\018\000\000 \001\128\191\247\251?\255\231\255\255\223\215\255\188\255\253\191\252\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000@\000\b\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\022\000\255`x|\145\244\147\186z\243\147\2557\163\128\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\025\000\129\012`$\000\000@\003\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000 \000\000\b\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000 \000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\b\000\000\000\000\000\000\000\000\016\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000`@\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000c\001\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\0020\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000`@\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\001\024\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\0000 \001\000\000\000\000\000\000\000\000\002\000\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000\000\012\b\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000\000\000\024\016\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000 \000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\016\000\000\000\000\000\000\000\000\000\000\000\001@\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000P\000\000 \000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\140\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\128\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\016\000\002\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\128\000\000#\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\017\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\001\0002\001\002\024\192@\000\000\128\006\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\000\004\000\000\000 \024\000\018\000\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000\000\002\000\000@\000\000\000\000\000\004\000\000\128\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\004\128\200\004\bc\001\000\000\002\000\024\b\000\000\000\004\000\000\128\000\000\000\000\000\b\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\004\000\000\001\024\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\002\000\000\000\140\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\003\131d\143\164\157\195\199\144\1591\189\028\000\000\000\012\b\000\000\000\000\000\000\128\000\000\000\b\000B@\000\016\000H\004@0 \000\004 \002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\132\000\224\128\004\144\b\136@H\000h@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\t\000\000\000\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\128\004\000\000\b\000\b\000 \000\000\128\004$\000\001\000\004\128D\003\002\000\000B\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000d\002\0041\128\128\000\001\000\012\004\000\000\000\014\b\000@\000\000\128\000\128\006\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\004\000\000\000\000\000\000`\000\000\128\004$\001\001\000\004\128D\003\002\000\000B\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`pL\144\244\147\184x\241\017\2307\161\176\007\251\002\002d\135\164\157\203\199\136\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'r\241\226#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w/\030\"<\198\2446\000\255`@L\144\244\147\184x\241\017\2307\161\176\001)\000\000D\129\160\145\128\194\128\b\016\128\r\128\tH\000\002$\r\004\140\006\020\000@\132\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\003\000\127\176$&HzI\220<x\b\243\027\208\192\000\132\000\000\002\000\144\b\128@@\000\b@\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002Bd\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\003\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\b\000\003\131\000\016\000\000\000\000\024\001\016\000 \000\000\000 \006@ C\024\b\000\000\016\000\192@\002\000\000\224\192\004\000\000\000\000\006\000D\000\b\192\031\236\b\t\146\030\146w\015\030\002|\198\2446\000% \000\b\1444\0180\024P\001\002\016\001\176\001)\000\000D\129\160\145\128\194\128\b\016\128\r\128\tH\000\002$\r\004\140\006\020\000@\132\000l\000J@\000\017 h$`0\160\002\004 \003`\002R\000\000\137\003A#\001\133\000\016!\000\027\000\018\144\000\004H\026\t\024\012(\000\129\b\000\216\003\255\129!2C\210N\225\227\192G\152\222\134\192\031\236\b\t\146\030\146w\015\030\002|\198\2446\000% \000\b\1444\0180\024P\001\002\016\001\128\003\b\000\001\004\001 \017\128\128\128\000\016\128\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000`@\000\000\000\000\000\004\000\016\000\000\000\000\000\003\002\000\000\000\000\000\000 \000\000\000\003\000\127\176 &HzI\220<x\b\243\027\208\192\000\132\000\000\002\000\144\b\128@@\000\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\132\000\000\000\000\144\b\128@@\000\b@\000\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000!\000\000\000\128$\002 \016\016\000\002\016\0000\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\003\000\127\176$&HzI\220<x\b\243\027\208\192\000\132\000\000\016\001\146\b\000B@\000\152@\002\000\004 \000\000\000\012\144@\002\018\000\000\194\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\004\000\000 \000\004\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000B\000\000\000\000H\012\000  \000\004 \000\000\000\b\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\001\128?\250\016\027\228=$\238\030>\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\161\0012C\210N\225\227\224G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1431\189\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\224\000B\000\000\000\000\201\004\000! \000\012 \001\000\000\000\000\000\000\004\b\000\000\b\000\000@\000\b\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\016\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\016\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\004\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 1\000\128\144\000P\128\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\012\001\254\192\128\217!\233'p\241\224#\204oC`\015\246\004\004\201\015I;\135\143\001>cz\027\000\127\176 &HzI\220<x\t\243\027\208\192\000\132\000\000\002\000\144\b\128@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000@\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\176\007\251\002\002\228\135\164\157\195\199\128\1431\189\r\128/\216\016\023$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000@ \004\000\024\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006\000\016\016\000\002\016\000\000\000\004\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\016\b\t\000\005\b\000\000\000\002\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\002\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \004\000\024\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006\000\016\016\000\002\016\000\000\000\004\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\128\000\000\000\018\003\016\b\t\000\005\b\000\000\000\002\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\002\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224'\204oC\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\250\000\016\144\000\004\000\018\001\016\012\b\000\001\b\000\128\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\016\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\159q\189\r\128?\216\016\019$=$\238\030<\004\249\141\232l\000J@\000\017 h$`0\160\002\004 \003\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\003\255P\147\223\216\127\151\1890N\138\198\r\200'\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0006\000% \000\b\1444\0180\024P\001\002\016\001\176\001)\000\000D\129\160\145\128\194\128\b\016\128\012\000\000@\000\000\000\t\000\128\000\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255P\147\223\216\127\151\1918N\138\246\r\204'\128\000\002\001\0002\001\002\024\192H\000\000\128\006\002\000\000\000\000\000\000\000\000\000\000@\000\002\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000\000\000\000\b\000\000\000\016\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2446\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\192\004\164\000\001\018\006\130F\003\n\000 B\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\255\192\144\153!\233'p\241\224#\204oC\000\002\016\000\000\b\002@!\001\001\000 !\000\003\000\127\176 .HzI\220<x\b\243\027\208\216\002\253\129\001rC\210N\225\227\192G\152\222\134\000\004 \000\000\016\004\128D\002\002\000\000B\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\176\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224'\220oC`\015\246\004\004\201\015I;\135\143\001>cz\027\000\127\176 &HzI\220<x\t\243\027\208\192\000\132\000\000\002\000\144\b\128@@\000\b@\000\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\001\255\168I\239\236?\203\222\152'Ec\006\228\019\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\012\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\002\000\016\144\000\004\000\018\001\016\012\b\000\001\b\000\128\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\b\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001>cz\027\000\018\144\000\004H\026\t\024\012(\000\129\b\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\004\000! \000\b\000$\002 \024\016\000\002\016\001\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\001\146\b\000B@\000\024@\002\000\000\000\000\000\000\b\016\000\000\016\000\000\128\000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\001\b\000\000\000\001 0\000\128\128\000\016\128\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\144\024\128@H\000(@\000\000\000\016\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\b@\000\000\000\t\001\128\004\004\000\000\132\000\000\000\001\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\004\128\196\002\002@\001B\000\000\000\000\128\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\t\001\128\004\004\000\000\132\000\000\000\001\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\004\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012\000  \000\004 \000\000\000\b\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\004\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 1\000\128\144\000P\128\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 1\000\128\144\000P\128\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000P\128\028\024@\018\001\016\b\b\192\t\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\148\128\000\"@\208H\192a@\004\b@\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\n\016\003\131\b\002@\"\001\001\024\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192O\152\222\134\192\031\236\b\t\146\030\146w\015\030\002|\198\2446\000\255`@L\144\244\147\184x\240\019\2307\161\176\007\251\002\002d\135\164\157\195\199\128\1591\189\r\128?\216\016\019$=$\238\030<\004\251\141\232`\000\001\000\000\128\000\b\000\b\001\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001>cz\027\000\018\144\000\004H\026\t\024\012(\000\129\b\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\004\128D\002\002@\001\194\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@`\001\001\000\000!\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 1\000\128\144\000P\128\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\245\t=\253\135\249{\243\132\232\175`\220\194y\128?\216\016\019$=$\238\030<\004y\141\232l\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\018\144\000\004H\026\t\024\012(\000\129\b\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\001)\000\000D\129\160\145\128\194\128\b\016\128\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\250\000\138\234\193\252-\225\0024\0220f\001<\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\007\251\002\002d\135\164\157\195\199\128\1431\189\r\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1591\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224'\220oC\000\000\b\000\004\000\000@\000@\b\000\000\000\000\003\000\127\176 &HzI\220<x\t\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \012\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\127\176 &HzI\220<x\t\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\t\000\136\004\004\128\003\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\002R\000\000\137\003A#\001\133\000\016!\000\027\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\216\000\148\128\000\"@\208H\192a@\004\b@\006\255\208\004\247\246\015\224n\000\017\0001\1310\t\230\000% \000\b\1444\0180\024P\001\002\016\001\191\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128\tH\000\002$\r\004\140\006\020\000@\132\000o\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255`\002R\000\000\137\003A#\001\133\000\016!\000\027\255@\019\223\216?\129\184\000D\000\198\012\192'\152\000\148\128\000\"@\208H\192a@\004\b@\006\255\208\004\247\246\015\224n\000\017\0001\1310\t\230\000% \000\b\1444\0180\024P\001\002\016\001\191\244\001=\253\131\248\027\128\004@\012`\204\002y\128\tH\000\002$\r\004\140\006\020\000@\132\000o\253\000O\127`\254\006\224\001\016\003\0243\000\158`\002R\000\000\137\003A#\001\133\000\016!\000\027\255@\019\223\216?\129\184\000D\000\198\012\192'\152\000\148\128\000\"@\208H\192a@\004\b@\006\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000% \000\b\1444\0180\024P\001\002\016\001\191\244\001=\253\131\248[\194\000h,`\204\002x\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\0012C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0007\254\128\"\186\176\127\011x@\141\005\140\025\128O0\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\232\002+\171\007\240\183\132\b\208X\193\152\004\243\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\250\000\158\254\193\252\r\192\002 \0060f\001<\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000J@\000\017 h$`0\160\002\004 \003\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\160\t\239\236\031\192\220\000\"\000c\006`\019\204\000J@\000\017 h$`0\160\002\004 \003\127\232\002{\251\007\2407\000\b\128\024\193\152\004\243\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\250\000\158\254\193\252-\225\0004\0220f\001<\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\160\t\239\236\031\192\220\000\"\000c\006`\019\204\000J@\000\017 h$`0\160\002\004 \003\127\232\002{\251\007\2407\000\b\128\024\193\152\004\243\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\250\000\158\254\193\252\r\192\002 \0060f\001<\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\007\251\002\002d\135\164\157\195\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\001)\000\000D\129\160\145\128\194\128\b\016\128\r\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\236\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\223\255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\192\004\164\000\001\018\006\130F\003\n\000 B\0007\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\128\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\016\004\128D\002\002\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\024\003\253\129\0012C\210N\225\227\192O\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000`\015\246\004\004\201\015I;\135\143\001>cz\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\001 1\000\128\144\000P\128\000\000\000 \000\000\000\000\000\000\004\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000 \000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\127\176 &HzI\220<x\t\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\255\255\255\255\255\255\255\255\255\255\255\255\255\255\253\128?\216\016\019$=$\238\030<\004\249\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\255\255\255\255\255\255\255\255\255\255\255\255\255\255\251\000\127\176 &HzI\220<x\t\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\000\001\128/\216\016\023$=$\238\030<\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\002\000\144\024\192@A\128\b`\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000!\000\b\000\128$\0060\016\016`\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\003\000\127\176$&HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\016\004\128D\002\002\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000\255`@L\144\244\147\184x\240\019\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \001\t\000\000@\001 \017\000\192\128\000\016\128\b\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\012\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\003\002\000\000\000\000\000\000\024\000\000\000\003\000\127\176 &HzI\220<x\t\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\002\000\000\000\000\000\000\016\000\000\000\003\000\127\176 6HzI\220<x\136\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\r\146\030\146w\015\030\"<\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\004\128\196\002\002@\001B\000\000\000\000\128\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\t\001\128\004\004\000\000\132\000\000\000\001\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004 \000\000\000\004\128\196\002\002@\001B\000\000\000\000\128\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000B\000\000\000\000H\012\000  \000\004 \000\000\000\b\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!\000\000\000\000$\006 \016\018\000\n\016\000\000\000\004\000\000\000\000\000\000\000\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\004\000\000\000\000\000\000\000\000\000\000\006\000\255\232@o\144\244\147\184x\248\017\2307\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128?\250\016\027\228=$\238\030>\004y\141\232`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\000\000\t\001\136\004\004\128\002\132\000\000\000\001\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\132\000\000\000\000\144\b\000@@\000\b@\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\001\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\002\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\016\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012@ $\000\020 \000\000\000\b\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\016\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012@ $\000\020 \000\000\000\b\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\144\024\000@@\000\b@\000\000\000\016\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\b@\000\000\000\t\000\128\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\000\000\000\000H\012@ $\000\020 \000\000\000\b\000\000\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\004 \000\000\000\004\128@\002\002\000\000B\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\016\000\000\000\002@ \001\001\000\000!\000\000\000\000\000\000\000\000\000\000\016\000\001\000\004\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\004\000\016\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\004 \000\000\000\004\128\192\002\002\000\000B\000\000\000\000\128\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000B\000\000\000\000H\004\000  \000\004 \000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\016\000\000\000\002@b\001\001 \000\161\000\000\000\000@\000\000\000\000\000\000\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\016\128\000\000\000\018\001\000\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\128\000\b\000 \000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000@\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\b@\000\000\000\t\000\136\004\004\000\000\132\000\012\001\254\192\128\153!\233'p\241\224'\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002B\000`A\000H\012` $\192\0200\004\000\000\000\003\002\000\000\000\000\000\000 \000\000\000\003\000\127\176 &HzI\220<x\b\243\027\208\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000`@\000\000\000\000\000\004\000\016\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\128\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\000\128$\0060\016\016`\002\024\002\000\001\b\000\000\004\001 \017\128\128\128\000\016\128\000\000@\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\000\002\b\002@c\001\001\006\000!\128 \000\016\128\000\000@\018\001\024\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\004\001 \017\128\128\128\000\016\128\000\000\b@\000\000 \t\001\140\004\004\024\000\134\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\002\016\000\128\b\002@c\001\001\006\000!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\031\236\b\t\146\030\146w\015\030\002|\198\2440\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\007\251\003\002d\135\164\157\203\199\128\1431\189\r\128?\216\024\019$=$\238\030<\004y\141\232`\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\024\003\253\129\1292C\210N\225\227\192G\152\222\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\255`pL\144\244\147\184x\240\017\2307\161\176\007\251\003\002d\135\164\157\203\199\128\1431\189\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\128\025\000\129\012` \000\000@\003\001\000\000\000\003\000\000\016\000\000\000\000\000\000\000\000(\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\192\000\004\000\000\000\000\000\000\000\000\n\000\000\000\006\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000 \000\128\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\016\003 \016!\140\004\000\000\b\000` \000\000\000`@\002\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\192\128\004\000\000\000\000\000\000\000\000\b\000\000\000\006\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
+  
+  and start =
+    4
+  
+  and action =
+    ((16, "\000\000$\242;\252\000\000\000\000\000\000\000\000P\158\000\003\000\000\000\000\000\000\000\000\000\003\000\000P\158%\170(\156O\178'P\000\000$\172\000\000*\030&PP\182-\018'`&D$X&\202O\178%X\000\000%\"&\200%|%\166O\178%\"\000\000(\030&D&\160&P&\200&\232&\206$X&\182$X\000\000&\246'$O\178O\178O\178\000\000'\144/\214(r&D'@&P\000\000'4O\178O\178O\178%\"\000\000\000\000\000\000\000\000\000\000$\206O\178%\198O\178\000\000\000\000\000\000)xO\178(\148O\178\000\000O\178\000\000'\136\000\000'\202\000\000\000\000\000\000\000\000\000\000'\218&P'\252O\178\000\000(\026O\178\000\000%\142\000\000(\022\000\000'\022O\178(\184+\254(\208&D(\130&P(fO\178(\238(\160&P(vO\178)\228O\178*\174(~O\178+\160'\012\000\000(\156\000\000&\234&\140'\012)\184&\140\000\000&\140\000\000\000\000&\140\000\000)\234&\200\000\000&\200\000\000)\n\000\000)2\000\000(\148O\178\000\000(\254&P(\194O\178\000\000+\188\000\000,z&D\000\000)\022&P(\206O\178\000\000)2&P(\242O\178\000\000)\012O\178\000\000( O\178+\182% P\182-\140\000\000)\206\000\000\000\000)\180&D)n&P)&O\178\000\000)v&P)0O\178\000\000)JO\178\000\000+b-BP\158\000\000)\170O\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000+\002P\158\000\000O\178.&\000\000*\004\000\000*\204%\170\000\000%\170\000\000\000\000*\020\000\000&@P\158\000\000'j\000\000*8\000\000\000\000)\176\000\000-:.&\000\000.&\000\000\000\000\000\000.&6^M\214M\214\000\000)\228/\018)\140*L\000\000/\018)\214&8)\196\000\003)\220&\240$X)\244)\232O\178UVO\178V\0002\194M\214M\214M\214M\214M\214M\214/\0182\194M\214Q4*\006(\156.J\000\003)\140\000\000\000\000\000\000\000\000\000\000*\026'`;\2522\194)\1402\194\000\0002\194*,/\018Q\012Q|\000\000*\234)\22460*.&D*L;\252'\190'\026,N\000\000\000\000\000\000/\254\000\000\000\0006^\000\003Q|,J*><\242+\006&D*n;\252'\190'\026(8'\026\000\000\000\000\000\000\000\000*x;\252'\190'\026\000\000M\212+\158&D*z;\252'\190'\026\000\000*\130;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000*X=\232+\242&D*\142;\252'\190'\026\000\000*\146;\252'\190'\026\000\000Q\170,f&D*\152;\252'\190'\026\000\000*\162;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000>\222,\138&D*\168;\252'\190'\2046^2\1942\194)\140*\208'`+\018\000\000,\140'`\000\000'`\000\000M\2149\"/\018'\190'\190'\236'\026\000\000?\212-\214&D*\198;\252'\190'\026\000\000*\202;\252'\190'\026\000\000R\n.B&D*\204;\252'\190'\026\000\000*\230;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000'\236'\026\000\000*x'\190'\236'\026\000\000@\202.b&D*\240;\252'\190'\026\000\000+\002;\252'\190'\026\000\000R\030.\162&D+\012;\252'\190'\026\000\000+\020;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000'\236'\026\000\0002\194\000\246P\158+\n\000\003+$0\2342\194M\214+&)\140\000\000M\214M\214M\214)\140\000\000\000\000&\190O\178'\248O\178-\136\000\000+2\000\000+4\000\000\000\0032\194+\190\000\000M\214\000\000\000\0002\194M\214\000\000M\214\000\0001\2142\194:\014/\018)\1402\1942\194+V0\2342\1942\194)\1402\194\000\000+f*\130\000\000A\192.\164&D+p;\252'\190'\204\000\003+\148P\158+\138\000\003%\204%\204\000\000\000\0002\194M\214\000\000+\160P\158+\156\000\003+\148\000\000+\230Q|,\152+hB\180.\176&D+\168;\252'\190'\026\000\000+\176;\252'\190'\026\000\000R~.\186&D+\184;\252'\190'\026\000\000+\186;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000+\142C\170.\212&D+\190;\252'\190'\026\000\000+\192;\252'\190'\026\000\000R\178.\232&D+\216;\252'\190'\026\000\000+\238;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000D\160/(&D,\n;\252'\190'\204\000\000\000\000,\026;\252'\190'\204\000\000R\236/D&D, ;\252'\190'\204\000\000,>;\252'\190'\204\000\000'\190'\204\000\000'\190'\204\000\000E\150/N&D,\\;\252'\190'\026\000\000,d;\252'\190'\026\000\000S\n/\142&D,n;\252'\190'\026\000\000,\128;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000,TF\140/\156&D,\148;\252'\190'\026\000\000,\166;\252'\190'\026\000\000Sb/\160&D,\168;\252'\190'\026\000\000,\170;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000G\130/\174&D,\196;\252'\190'\026\000\000,\200;\252'\190'\026\000\000S\128/\212&D,\204;\252'\190'\026\000\000,\214;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000,\222N\172\000\000\000\0002\194&\254%\204\000\000\000\000\000\000M\214\000\0002\194,\228\000\000,\232N\172\000\0002\1942\1942\1942\1942\194,^2\194M\214\000\000U\234'\190'\236'\026\000\000Hx/\220&D,\228;\252'\190'\026\000\000-\006;\252'\190'\026\000\000S\1860\020&D-\n;\252'\190'\026\000\000-\024;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000\000\000'\236'\026\000\000\000\000'\180\000\0032\194\000\000\000\000\000\000\000\000\000\000\001\238M\214\000\000\002\230M\214\000\000M\214;\006M\214\000\000M\214;\252M\214<\242M\214=\232\000\0032\194\000\000\000\000\000\000\000\000\000\000\000\0002\194\000\0003\174-(2\194\000\0002\194\000\000,\254,\2342\194\000\0002\194\000\0002\194\000\000\000\000U\234\000\000\000\000\003\222M\214\004\214\000\003\000\000\000\000\000\000M\214\005\206M\214\006\198M\214\007\190M\214\b\182M\214\t\174M\214\n\166M\214\011\158\000\003\000\000\000\003\000\000\000\003\000\000M\214\012\150\000\003\000\000M\214\r\142\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000M\214\014\134M\214\015~M\214B\182M\214\016vM\214\017nM\214C\172M\214D\162M\214E\152M\214F\142M\214G\132M\214\018f\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000M\2144\166O\178\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\003\000\000\000\000M\214\019^\000\003\000\000M\214\000\000\000\003\000\000M\214\020V\000\003\000\000M\214\021N\000\003\000\000M\214\022FM\214>\222\000\003\000\000M\214?\212\000\003\000\000M\214@\202\000\003\000\000M\214A\192\000\003\000\000M\214\000\000\000\003\000\000\000\003\000\000M\214\023>M\214\0246\000\003\000\000M\214\025.M\214HzM\214\026&\000\003\000\000M\214\027\030\000\003\000\000\000\003\000\000M\214IpM\214JfM\2145\156M\214\028\022M\214K\\M\214LRM\214MHM\214\029\014\000\003\000\000O\178\000\000\000\003\000\000\000\003\000\000M\214\030\006\000\003\000\000M\214\030\254M\214\031\246-\142\000\000\000\000-B\000\000\000\000)\140\000\000\000\0002\194\000\000-$-\0202\194\000\0002\194\000\0002\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000-\2002\194\000\000\000\000-\2022\194\000\000\000\000\000\000-l;\252'\190'\204\000\000S\2160z&D-n;\252'\190'\204\000\000-p;\252'\190'\204\000\000'\190'\204\000\000'\190'\204\000\000 \2382\194\000\000\000\000\000\000!\2302\194\000\000\"\2222\194\000\000-\204\000\000$\150/\018\000\000-\214\000\0004\166-\144O\182\000\000-\244\000\000)f/\018\000\000\000\000\000\000-\232\000\000\000\000-\154\000\000\000\000)\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000#\2142\194\000\000-\236\000\000-\238\000\000\000\000\000\000\000\000P\158-\154\000\003(\0182\194\000\000.\b\000\000\000\000\000\000\000\000+\\6^\000\0006^\000\000\000\000-\180;\252'\190'\204\000\000T00|&D-\184;\252'\190'\204\000\000-\186;\252'\190'\204\000\000'\190'\204\000\000'\190'\204\000\000In0\136&D-\196;\252'\190'\026\000\000-\202;\252'\190'\026\000\000TN0\140&D-\222;\252'\190'\026\000\000-\246;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000-\202Jd0\154&D.\002;\252'\190'\026\000\000.\004;\252'\190'\026\000\000T\1360\166&D.\020;\252'\190'\026\000\000.\026;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000\000\000\000\000.|\000\000-\174,N\000\000,N\000\000\000\000.2;\252'\190'\026\000\000T\1660\192&D.:;\252'\190'\026\000\000.D;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000.\024KZ0\200&D.|;\252'\190'\026\000\000.~;\252'\190'\026\000\000T\2541\000&D.\128;\252'\190'\026\000\000.\130;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000LP1&&D.\132;\252'\190'\204\000\000.\160;\252'\190'\204\000\000U\0281f&D.\166;\252'\190'\204\000\000.\178;\252'\190'\204\000\000'\190'\204\000\000'\190'\204\000\000MF1h&D.\182;\252'\190'\026\000\000.\194;\252'\190'\026\000\000UV1t&D.\196;\252'\190'\026\000\000.\202;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000.\162V\0181~&D.\222;\252'\190'\026\000\000.\228;\252'\190'\026\000\000Ut1\152&D.\234;\252'\190'\026\000\000.\238;\252'\190'\026\000\000'\190'\026\000\000'\190'\026\000\000/T\000\000.\198;\2522\194\000\000\000\000\000\000\000\000/v\000\000\000\000NT.d\000\003\000\000/~\000\000/\184&B(\156/\134\000\000/h(.\000\000/l(.\000\000(.\000\000(.\000\000O8\000\003'\240\000\000O\004\000\003\000\000\000\000\000\000\000\003;\006/6P \000\000\000\000\000\000\000\000\000\000\000\000\000\000.\198\000\000\000\0002\194\000\000/\160\000\000\000\000\000\000/4\000\000\000\000\000\0007J6^/\202\000\000$\2306^\000\000867J\000\000\000\000\000\000'L/n'T$X/j/\\O\178)HO\178)x*\152'L\000\000'L\000\000/\026/\136)z',/\146/dO\178,\168/fO\178-x0\")z\000\000)z\000\000/\246\000\000\000\000"), (16, "\003\246\003\250\004}\004}\004}\004}\004}\004}\004}\004}\004}\004\n\004\026\003\254\004*\004N\004\002\004n\000\018\004}\004\138\004V\004}\004}\004}\004}\004}\004}\004\202\004}\004}\004}\004}\004}\004}\004}\005\026\004}\004}\004Z\005\030\004}\004}\004\014\004}\004}\004^\004}\004}\004}\004}\006b\006\158\000\022\004b\004}\000\026\004}\004}\007>\004}\004}\004f\004}\004}\004j\007\222\007\230\004}\004v\006\150\007\242\004}\004}\004}\004}\bR\b\142\004\142\b\002\004}\004}\004}\b\194\b\014\b\226\000&\004}\004}\004}\004}\004}\004}\004}\b\242\004}\004}\004}\b\018\t\002\t\030\t&\004}\004}\011\194\000*\004}\004}\004}\012B\000.\004}\012R\r^\r\186\r\214\004}\r\222\004}\004}\004}\004}\b\022\014\026\003\246\003\250\003\185\003\185\003\185\003\185\003\185\003\185\003\185\003\185\003\185\004\n\004\026\003\254\004*\004N\004\002\004n\000\018\003\185\004\138\004V\003\185\003\185\003\185\003\185\003\185\003\185\004\202\003\185\003\185\003\185\003\185\003\185\003\185\003\185\005\026\003\185\003\185\004Z\005\030\003\185\003\185\004\014\003\185\003\185\004^\003\185\003\185\003\185\003\185\006b\006\158\000\022\004b\003\185\000\026\003\185\003\185\007>\003\185\003\185\004f\003\185\003\185\004j\007\222\007\230\003\185\004v\006\150\007\242\003\185\003\185\003\185\003\185\bR\b\142\004\142\b\002\003\185\003\185\003\185\b\194\b\014\b\226\000&\003\185\003\185\003\185\003\185\003\185\003\185\003\185\b\242\003\185\003\185\003\185\b\018\t\002\t\030\t&\003\185\003\185\011\194\000*\003\185\003\185\003\185\012B\000.\003\185\012R\r^\r\186\r\214\003\185\r\222\003\185\003\185\003\185\003\185\b\022\014\026\rz\r\182\015\134\015\142\015\150\015\158\015\166\015\174\015\182\015\190\003i\003i\003i\003i\003i\003i\003i\003i\003i\003i\003i\015\198\003i\003i\015\206\015\214\015\222\015\230\003i\003i\003i\003i\015\238\015\246\015\254\016\006\003i\003i\003i\003i\003i\003i\003i\003i\016\014\016\022\016\030\016&\016.\0166\016>\003i\003i\003i\003i\016F\003i\016N\016V\003i\016^\016f\016n\016v\003i\003i\003i\003i\016~\003i\003i\003i\003i\003i\003i\016\134\003i\003i\003i\016\142\016\150\003i\016\158\003i\003i\003i\003i\003i\016\166\003i\003i\003i\003i\003i\003i\016\174\016\182\003i\003i\003i\003i\003i\003i\016\190\003i\003i\003i\016\198\003i\003i\003i\003i\003i\003i\003i\003i\016\206\003i\003i\016\214\016\222\016\230\016\238\003i\002\149\002\149\002\149\002\149\r\134\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\r\142\002\149\r\158\002\149\002\149\002\149\002\149\002\149\r\166\002\149\r\174\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\r\150\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\002\149\014*\0142\014B\014z\r\134\014\130\014J\014\138\014\146\014\154\004-\004-\004-\004-\004-\004-\004-\004-\004-\004-\004-\014\162\004-\004-\r\142\014\170\r\158\014\178\004-\004-\004-\004-\r\166\014\186\r\174\014\194\004-\004-\004-\004-\004-\004-\004-\004-\r\150\014\202\014\210\014\218\014R\0152\014\226\004-\004-\004-\004-\014\234\004-\014b\015:\004-\014j\015B\015J\015\002\004-\004-\004-\004-\015\n\004-\004-\004-\004-\004-\004-\015R\004-\004-\004-\014\242\015\018\004-\015\026\004-\004-\004-\004-\004-\015\"\004-\004-\004-\004-\004-\004-\014r\015b\004-\004-\004-\004-\004-\004-\015Z\004-\004-\004-\015j\004-\004-\004-\004-\004-\004-\004-\004-\015r\004-\004-\014Z\015z\015*\014\250\004-\003\r\003\r\003\r\003\r\r\134\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\r\142\003\r\r\158\003\r\003\r\003\r\003\r\003\r\r\166\003\r\r\174\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\r\150\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\003\r\014*\002\249\002\249\002\249\r\134\002\249\014J\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\r\142\002\249\r\158\002\249\002\249\002\249\002\249\002\249\r\166\002\249\r\174\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\r\150\002\249\002\249\002\249\014R\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\014b\002\249\002\249\014j\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\014r\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\002\249\014Z\002\249\002\249\002\249\002\249\014*\002\253\002\253\002\253\r\134\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\r\142\002\253\r\158\002\253\002\253\002\253\002\253\002\253\r\166\002\253\r\174\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\r\150\002\253\002\253\002\253\014R\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\002\253\014Z\002\253\002\253\002\253\002\253\014*\003\t\003\t\003\t\r\134\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\r\142\003\t\r\158\003\t\003\t\003\t\003\t\003\t\r\166\003\t\r\174\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\r\150\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\003\t\014Z\003\t\003\t\003\t\003\t\014*\003\005\003\005\003\005\r\134\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\r\142\003\005\r\158\003\005\003\005\003\005\003\005\003\005\r\166\003\005\r\174\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\r\150\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\003\005\014*\002\229\002\229\002\229\r\134\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\r\142\002\229\r\158\002\229\002\229\002\229\002\229\002\229\r\166\002\229\r\174\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\r\150\002\229\002\229\002\229\014R\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\002\229\014Z\002\229\002\229\002\229\002\229\014*\002\237\002\237\002\237\r\134\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\r\142\002\237\r\158\002\237\002\237\002\237\002\237\002\237\r\166\002\237\r\174\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\r\150\002\237\002\237\002\237\014R\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\002\237\014Z\002\237\002\237\002\237\002\237\014*\002\233\002\233\002\233\r\134\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\r\142\002\233\r\158\002\233\002\233\002\233\002\233\002\233\r\166\002\233\r\174\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\r\150\002\233\002\233\002\233\014R\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\002\233\014Z\002\233\002\233\002\233\002\233\014*\002\245\002\245\002\245\r\134\002\245\014J\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\r\142\002\245\r\158\002\245\002\245\002\245\002\245\002\245\r\166\002\245\r\174\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\r\150\002\245\002\245\002\245\014R\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\014b\002\245\002\245\014j\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\014r\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\002\245\014Z\002\245\002\245\002\245\002\245\014*\002\225\002\225\002\225\r\134\002\225\014J\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\r\142\002\225\r\158\002\225\002\225\002\225\002\225\002\225\r\166\002\225\r\174\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\r\150\002\225\002\225\002\225\014R\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\014b\002\225\002\225\014j\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\014r\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\014Z\002\225\002\225\002\225\002\225\014*\003I\014B\003I\r\134\003I\014J\003I\014\146\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\014\162\003I\003I\r\142\003I\r\158\003I\003I\003I\003I\003I\r\166\003I\r\174\003I\003I\003I\003I\003I\003I\003I\003I\003I\r\150\003I\003I\003I\014R\003I\014\226\003I\003I\003I\003I\014\234\003I\014b\003I\003I\014j\003I\003I\015\002\003I\003I\003I\003I\015\n\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\014\242\015\018\003I\015\026\003I\003I\003I\003I\003I\015\"\003I\003I\003I\003I\003I\003I\014r\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\003I\014Z\003I\015*\014\250\003I\014*\003A\014B\003A\r\134\003A\014J\003A\014\146\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\014\162\003A\003A\r\142\003A\r\158\003A\003A\003A\003A\003A\r\166\003A\r\174\003A\003A\003A\003A\003A\003A\003A\003A\003A\r\150\003A\003A\003A\014R\003A\003A\003A\003A\003A\003A\014\234\003A\014b\003A\003A\014j\003A\003A\015\002\003A\003A\003A\003A\015\n\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\014\242\015\018\003A\015\026\003A\003A\003A\003A\003A\015\"\003A\003A\003A\003A\003A\003A\014r\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\003A\014Z\003A\015*\014\250\003A\014*\003!\003!\003!\r\134\003!\014J\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\r\142\003!\r\158\003!\003!\003!\003!\003!\r\166\003!\r\174\003!\003!\003!\003!\003!\003!\003!\003!\003!\r\150\003!\003!\003!\014R\003!\003!\003!\003!\003!\003!\003!\003!\014b\003!\003!\014j\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\014r\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\003!\014Z\003!\003!\003!\003!\014*\002\221\002\221\002\221\r\134\002\221\014J\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\r\142\002\221\r\158\002\221\002\221\002\221\002\221\002\221\r\166\002\221\r\174\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\r\150\002\221\002\221\002\221\014R\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\014b\002\221\002\221\014j\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\014r\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\002\221\014Z\002\221\002\221\002\221\002\221\014*\003=\014B\003=\r\134\003=\014J\003=\014\146\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\014\162\003=\003=\r\142\003=\r\158\003=\003=\003=\003=\003=\r\166\003=\r\174\003=\003=\003=\003=\003=\003=\003=\003=\003=\r\150\003=\003=\003=\014R\003=\003=\003=\003=\003=\003=\014\234\003=\014b\003=\003=\014j\003=\003=\015\002\003=\003=\003=\003=\015\n\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\014\242\015\018\003=\015\026\003=\003=\003=\003=\003=\015\"\003=\003=\003=\003=\003=\003=\014r\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\003=\014Z\003=\003=\014\250\003=\014*\002\129\002\129\002\129\r\134\002\129\014J\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\r\142\002\129\r\158\002\129\002\129\002\129\002\129\002\129\r\166\002\129\r\174\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\r\150\002\129\002\129\002\129\014R\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\014b\002\129\002\129\014j\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\014r\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\002\129\014Z\002\129\002\129\002\129\002\129\014*\002\133\002\133\002\133\r\134\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\r\142\002\133\r\158\002\133\002\133\002\133\002\133\002\133\r\166\002\133\r\174\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\r\150\002\133\002\133\002\133\014R\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\002\133\014Z\002\133\002\133\002\133\002\133\014*\002}\002}\002}\r\134\002}\014J\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\r\142\002}\r\158\002}\002}\002}\002}\002}\r\166\002}\r\174\002}\002}\002}\002}\002}\002}\002}\002}\002}\r\150\002}\002}\002}\014R\002}\002}\002}\002}\002}\002}\002}\002}\014b\002}\002}\014j\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\014r\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\002}\014Z\002}\002}\002}\002}\014*\002i\002i\002i\r\134\002i\014J\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\r\142\002i\r\158\002i\002i\002i\002i\002i\r\166\002i\r\174\002i\002i\002i\002i\002i\002i\002i\002i\002i\r\150\002i\002i\002i\014R\002i\002i\002i\002i\002i\002i\002i\002i\014b\002i\002i\014j\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\014r\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\002i\014Z\002i\002i\002i\002i\014*\002\209\014B\002\209\r\134\002\209\014J\002\209\014\146\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\014\162\002\209\002\209\r\142\002\209\r\158\002\209\002\209\002\209\002\209\002\209\r\166\002\209\r\174\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\r\150\002\209\002\209\002\209\014R\002\209\014\226\002\209\002\209\002\209\002\209\014\234\002\209\014b\002\209\002\209\014j\002\209\002\209\015\002\002\209\002\209\002\209\002\209\015\n\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\014\242\015\018\002\209\015\026\002\209\002\209\002\209\002\209\002\209\015\"\002\209\002\209\002\209\002\209\002\209\002\209\014r\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\002\209\014Z\002\209\015*\014\250\002\209\014*\002\145\002\145\002\145\r\134\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\r\142\002\145\r\158\002\145\002\145\002\145\002\145\002\145\r\166\002\145\r\174\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\r\150\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\002\145\014Z\002\145\002\145\002\145\002\145\014*\002\201\014B\002\201\r\134\002\201\014J\002\201\014\146\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\014\162\002\201\002\201\r\142\002\201\r\158\002\201\002\201\002\201\002\201\002\201\r\166\002\201\r\174\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\r\150\002\201\002\201\002\201\014R\002\201\002\201\002\201\002\201\002\201\002\201\014\234\002\201\014b\002\201\002\201\014j\002\201\002\201\015\002\002\201\002\201\002\201\002\201\015\n\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\014\242\015\018\002\201\015\026\002\201\002\201\002\201\002\201\002\201\015\"\002\201\002\201\002\201\002\201\002\201\002\201\014r\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\002\201\014Z\002\201\015*\014\250\002\201\014*\002m\002m\002m\r\134\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\r\142\002m\r\158\002m\002m\002m\002m\002m\r\166\002m\r\174\002m\002m\002m\002m\002m\002m\002m\002m\002m\r\150\002m\002m\002m\014R\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\002m\014Z\002m\002m\002m\002m\014*\002u\002u\002u\r\134\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\r\142\002u\r\158\002u\002u\002u\002u\002u\r\166\002u\r\174\002u\002u\002u\002u\002u\002u\002u\002u\002u\r\150\002u\002u\002u\014R\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\002u\014Z\002u\002u\002u\002u\014*\002\169\002\169\002\169\r\134\002\169\014J\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\r\142\002\169\r\158\002\169\002\169\002\169\002\169\002\169\r\166\002\169\r\174\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\r\150\002\169\002\169\002\169\014R\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\014b\002\169\002\169\014j\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\014r\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\002\169\014Z\002\169\002\169\002\169\002\169\014*\002q\002q\002q\r\134\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\r\142\002q\r\158\002q\002q\002q\002q\002q\r\166\002q\r\174\002q\002q\002q\002q\002q\002q\002q\002q\002q\r\150\002q\002q\002q\014R\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\002q\014Z\002q\002q\002q\002q\014*\002\141\002\141\002\141\r\134\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\r\142\002\141\r\158\002\141\002\141\002\141\002\141\002\141\r\166\002\141\r\174\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\r\150\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\002\141\014*\002\197\014B\002\197\r\134\002\197\014J\002\197\014\146\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\014\162\002\197\002\197\r\142\002\197\r\158\002\197\002\197\002\197\002\197\002\197\r\166\002\197\r\174\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\r\150\002\197\002\197\002\197\014R\002\197\002\197\002\197\002\197\002\197\002\197\014\234\002\197\014b\002\197\002\197\014j\002\197\002\197\015\002\002\197\002\197\002\197\002\197\015\n\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\014\242\015\018\002\197\015\026\002\197\002\197\002\197\002\197\002\197\015\"\002\197\002\197\002\197\002\197\002\197\002\197\014r\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\002\197\014Z\002\197\002\197\014\250\002\197\014*\002e\002e\002e\r\134\002e\014J\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\r\142\002e\r\158\002e\002e\002e\002e\002e\r\166\002e\r\174\002e\002e\002e\002e\002e\002e\002e\002e\002e\r\150\002e\002e\002e\014R\002e\002e\002e\002e\002e\002e\002e\002e\014b\002e\002e\014j\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\014r\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\002e\014Z\002e\002e\002e\002e\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\017\230\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\229\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\017\250\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\003\253\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\018\006\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\169\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\018\146\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\004\193\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\007=\006e\006e\006e\006e\006e\006e\006e\006e\000z\006e\006e\007\153\000Z\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006\245\024\n\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\0012\006e\006e\006e\006e\006e\006e\006e\007\201\006e\018\026\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\000\134\006e\006e\006e\006e\000\n\001n\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\007Q\006e\006e\000\142\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\006e\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\001\170\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\002\226\b\165\b\165\001N\007m\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\000\150\b\246\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\000F\b\165\b\165\b\165\b\165\b\165\b\165\b\165\006^\b\165\004z\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\000\154\b\165\b\165\b\165\b\165\007e\001V\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\b\165\000b\b\165\b\165\003n\b\165\b\165\b\165\b\165\b\165\b\165\001:\b\165\b\165\b\165\b\165\b\165\005\193\005\193\005\193\005\193\005\193\005\193\005\193\005\193\005\193\005\193\000f\005\193\007\209\006\r\000\182\000\222\023>\000\146\006\r\000\186\006!\005\193\000\021\000\230\005\193\005\193\005\193\005\193\000~\005\193\005\193\005\193\005\193\005\193\005\193\005\193\000J\005\193\005\193\003\174\003v\000v\007\181\006\r\005\193\005\193\005\193\005\193\005\193\005\193\005\193\002\030\002>\006\r\002\"\005\193\006\r\005\193\005\193\007\237\005\193\005\193\005\193\005\193\b*\006\r\000\178\024r\005\193\006\r\bN\012Z\000\194\b5\b5\005\193\002\014\007\157\006\r\005\193\005\193\b5\005\193\001\194\002\n\024*\006\r\b%\005\193\0042\005\193\005\193\018^\018b\001N\005\193\005\193\001\186\000\202\000\190\000r\006^\005\193\005\193\006I\006\r\005\193\005\193\b%\000\214\006\r\018j\006Y\000R\004F\004\250\005\193\002\018\006\225\005\193\005\193\005\193\005\193\005\133\005\133\005\133\005\133\005\133\005\133\005\133\005\133\005\133\005\133\024\130\005\133\005F\006\r\006Y\006Y\0242\000\218\006\r\006Y\006Y\005\133\000\238\000\254\005\133\005\133\005\133\005\133\006Y\005\133\005\133\005\133\005\133\005\133\005\133\005\133\000z\005\133\005\133\007\153\006\221\024F\001V\006\r\005\133\005\133\005\133\005\133\005\133\005\133\005\133\000V\003\186\006\r\001\n\005\133\006\r\005\133\005\133\001j\005\133\005\133\005\133\005\133\b*\006\r\004\170\023~\005\133\006\r\rZ\007\165\000\170\004z\000\021\005\133\000I\000I\006\r\005\133\005\133\006^\005\133\006\162\000I\006\209\006\r\001\178\005\133\001r\005\133\005\133\016\254\017\002\000\021\005\133\005\133\006I\007)\001N\001\138\b\222\005\133\005\133\006\209\006\r\005\133\005\133\000J\006\178\006\r\017\n\b\025\b\025\000\246\006\025\005\133\003\186\006\209\005\133\005\133\005\133\005\133\b\025\b\025\b\025\b\025\b\025\b\025\b\025\b\025\000z\b\025\b\025\007\153\004\250\b2\000I\018\198\023>\b\025\b\025\b\025\b\025\005J\000\021\000\021\006\209\b\025\b\025\b\025\b\025\b\025\000\021\001\146\b\025\006\209\002\214\b\025\b1\b1\001\202\b\025\b\025\b\025\b\025\b\025\b1\b\025\001\158\001V\b\025\006\209\000z\b\025\006\209\007\153\b\025\b\025\b\025\001N\b\025\b\025\b\025\001\210\b\025\bI\bI\b\025\b\025\b\025\b\025\001\218\b\025\bI\b\025\b\025\b\025\b\025\001\230\001\238\b\025\b\025\b\025\002\002\000\021\b\025\001N\002^\b\025\b\025\b\025\b\025\b\025\b\025\b\025\b\025\b\025\b\025\000J\000z\b\025\b\025\007\153\b\025\b\025\b\025\b\025\002f\b\025\002n\b-\b-\001V\b\025\b\025\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\005\197\002z\005\197\007!\003\254\024n\001V\001N\002\130\000\018\b)\b)\005\197\002\162\002\170\005\197\005\197\005\197\005\197\007}\005\197\005\197\005\197\005\197\005\197\005\197\005\197\002\182\005\197\005\197\002\254\001N\002\190\001V\004\014\005\197\005\197\005\197\005\197\005\197\005\197\005\197\002*\0022\000\022\002\202\005\197\000\026\005\197\005\197\007\213\005\197\005\197\005\197\005\197\002\242\004\022\003\006\003\014\005\197\004v\003\026\007\145\003\"\bE\bE\005\197\002J\002R\004\142\005\197\005\197\bE\005\197\018F\007\185\003.\000&\001V\005\197\b-\005\197\005\197\001^\003J\001N\005\197\005\197\003\134\000z\003\166\004\230\007\153\005\197\005\197\003\194\000*\005\197\005\197\003\207\004\006\000.\001V\000b\b)\004\018\004\030\005\197\004&\004.\005\197\005\197\005\197\005\197\005\137\005\137\005\137\005\137\005\137\005\137\005\137\005\137\005\137\005\137\004:\005\137\004>\003\254\002\250\000f\004~\004\166\000\018\000\182\000\222\005\137\004\198\004\222\005\137\005\137\005\137\005\137\000\230\005\137\005\137\005\137\005\137\005\137\005\137\005\137\000z\005\137\005\137\007\153\024R\024Z\001V\004\014\005\137\005\137\005\137\005\137\005\137\005\137\005\137\b9\b9\000\022\004\238\005\137\000\026\005\137\005\137\b9\005\137\005\137\005\137\005\137\000\021\004\022\003\142\003\150\005\137\004v\005*\005:\001N\007B\007q\005\137\005b\005\130\004\142\005\137\005\137\005\150\005\137\005\194\000\021\0052\000&\005\210\005\137\005\230\005\137\005\137\006\006\006}\006}\005\137\005\137\006\026\000J\007R\006R\006}\005\137\005\137\004\218\000*\005\137\005\137\006r\006z\000.\020\230\000\017\000\017\003n\006\194\005\137\006\214\006\246\005\137\005\137\005\137\005\137\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\007\n\000\017\000\017\007\169\021j\007b\006}\018\230\018\238\000\017\000\017\000\017\001V\000z\007v\007\001\007\153\000\017\000\017\007\150\000\017\000\017\006}\007\170\000\017\021\234\007\238\000\017\007\246\b\006\005z\001N\000\017\000\017\000\017\000\017\003v\000\017\bB\bJ\000\017\bA\bA\000\017\022j\bZ\000\017\000\017\000\017\bA\000\017\000\017\000\017\b\158\bM\b=\b=\000\017\000\017\000\017\000\017\b\186\001N\b=\000\017\000\017\000\017\000\017\007\001\b\210\000\017\b\230\005\202\001N\b\238\000\017\001N\t\018\000\017\000\017\000\017\000\017\000\017\t\026\t\"\000\017\000\017\t*\t6\000z\000\017\000\017\007\153\000\017\000\017\000\017\000\017\tF\000\017\b\213\b\213\tZ\001V\000\017\000\017\tz\t\142\t\186\t\202\t\222\b\213\b\213\b\213\b\213\b\213\b\213\b\213\b\213\004\254\b\213\b\213\t\254\b\213\001\198\000f\bM\012\162\b\213\000\182\000\222\005\254\000z\n\018\001V\007\153\b\213\007\r\000\230\b\213\b\213\005\002\005\006\b\213\017\026\001V\b\213\nJ\001V\006J\005&\b\213\b\213\b\213\b\213\nb\b\213\005\190\n\130\b\213\006\130\006\138\b\213\001\246\017\"\b\213\b\213\b\213\006\229\b\213\b\213\b\213\001N\n\150\b\t\b\t\b\213\b\213\b\213\b\213\0172\006B\b\t\b\213\b\213\b\213\b\213\b\213\n\206\t2\000z\017:\n\226\007\153\b\213\001N\t\182\011\002\b\213\b\213\b\213\b\213\019Z\b!\b\213\b\213\011\022\011B\000z\b\213\b\213\007\153\b\213\b\213\b\213\b\213\011R\b\213\007U\007U\n:\019\218\b\213\b\213\b!\011f\011\134\011\154\r\230\007U\007U\007U\007U\007U\007U\007U\007U\000b\007U\007U\011\210\n\190\011\230\001V\012\006\r\238\007U\003\214\003\222\012\026\012F\006\141\006\141\012z\007U\012\130\012\210\007U\007U\006\141\011>\007U\000n\000f\007U\r\246\001V\000\182\000\222\007U\007U\007U\007U\012\230\007U\r\006\000\230\007U\b\005\b\005\007U\014\006\r\026\007U\007U\007U\b\005\007U\007U\007U\bQ\r\250\014\014\r\254\007U\007U\007U\007U\016\250\001N\017\006\007U\007U\007U\007U\020r\020z\001N\007U\001N\017&\003>\007U\007\017\017*\006\186\007U\007U\007U\007U\017b\017r\007U\007U\017\134\017\166\017\186\007U\007U\018\018\007U\007U\007U\007U\018&\007U\007Q\007Q\006\025\0182\007U\007U\018>\018Z\018f\018\158\018\166\007Q\007Q\007Q\007Q\007Q\007Q\007Q\007Q\018\190\007Q\007Q\018\210\b2\018\254\bQ\019\030\0192\007Q\006\137\006\137\006\137\019j\006\238\001V\019~\007Q\006\137\000z\007Q\007Q\007\153\001V\007Q\001V\019\158\007Q\003U\003U\007Z\001N\007Q\007Q\007Q\007Q\003U\007Q\019\178\019\222\007Q\003Q\003Q\007Q\019\238\020\002\007Q\007Q\007Q\003Q\007Q\007Q\007Q\020\"\006\137\000\n\0206\007Q\007Q\007Q\007Q\020j\007\142\b\202\007Q\007Q\007Q\007Q\020\138\t>\006\137\007Q\020\170\000z\tr\007Q\007\153\020\190\020\234\007Q\007Q\007Q\007Q\006\137\006\137\007Q\007Q\t\194\004\134\000z\007Q\007Q\007\153\007Q\007Q\007Q\007Q\t\246\007Q\003\246\003\250\023&\001V\007Q\007Q\020\250\021\014\021.\021B\021z\004\n\004\026\003\254\004*\004N\004\002\004n\000\018\023\150\004\138\004V\000z\000z\021\142\007\153\007\153\021\174\004\202\000z\nB\007\029\007\153\021\194\000z\021\250\005\026\007\153\0079\004Z\005\030\022\014\022.\004\014\nz\022B\004^\000z\022n\n\198\007\153\006b\006\158\000\022\004b\022~\000\026\000z\022\146\007>\007\153\022\178\004f\022\198\022\242\004j\007\222\007\230\022\250\004v\006\150\007\242\023N\023j\023Z\023b\bR\b\142\004\142\b\002\007\225\n\250\007-\b\194\b\014\b\226\000&\023\022\011J\000z\011~\0232\007\153\023:\b\242\023F\023\162\011\202\b\018\t\002\t\030\t&\023\218\000z\011\194\000*\007\153\023\235\000z\012B\000.\007\153\012R\r^\r\186\r\214\011\254\r\222\007\249\007\249\012\202\024\003\b\022\014\026\024.\024:\024>\024f\024j\007\249\007\249\007\249\007\249\007\249\007\249\007\249\007\249\000b\007\249\007\249\000z\005\014\024v\007\153\024z\024\134\007\249\000z\012\254\000z\007\153\024\167\007\153\000\000\007\249\000\000\000z\007\249\007\249\007\153\000\000\007\249\000\242\000f\007\249\024\146\024\154\000\182\000\222\007\249\007\249\007\249\007\249\007\129\007\249\000z\000\230\007\249\007\153\000z\007\249\000\000\007\153\007\249\007\249\007\249\000\000\007\249\007\249\007\249\000\000\000\000\000\000\000\000\007\249\007\249\007\249\007\249\000\000\017\158\019\022\007\249\007\249\007\249\007\249\005\018\019b\000z\019\150\000\000\007\153\000\000\007\249\000\000\000\000\019\230\007\249\007\249\007\249\007\249\000\000\020\026\007\249\007\249\000\000\000\000\000\000\007\249\007\249\000\000\007\249\007\249\007\249\007\249\020\162\007\249\000\021\000\021\020\242\000\000\007\249\007\249\000\000\000\000\000\000\000\000\000\000\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\000\000\021\000\021\000z\000z\000\000\007\153\007\153\000\000\000\021\000z\021&\000z\007\153\000\000\007\153\000\000\000\021\000\000\000z\000\021\000\021\007\153\000\000\000\021\000z\000\000\000\021\007\153\000\000\021r\000\000\000\021\000\021\000\021\000\021\000\000\000\021\000z\000\000\000\021\007\153\000z\000\021\000\000\007\153\000\021\000\021\000\021\000\000\000\021\000\021\000\021\000\000\000\000\000\000\000\000\000\021\000\021\000\021\000\021\000\000\021\166\021\242\000\021\000\021\000\021\000\021\000\000\022&\000z\000\000\000\000\007\153\022v\000\021\000\000\000\000\000\021\000\021\000\021\000\021\000\021\000\000\000J\000\021\000\021\022\170\000\000\000z\000\021\000\021\007\153\000\021\000\021\000\021\000\021\000\000\000\021\003\246\003\250\000\000\000\000\000\021\000\021\000\000\000\000\000\000\000\000\000\000\004\n\004\026\003\254\004*\004N\004\002\004n\000\018\b\130\004\138\004V\000z\000z\000\000\007\153\007\153\000\000\004\202\000z\000\000\007\029\007\153\000\000\000z\000\000\005\026\007\153\000\000\004Z\005\030\000\000\000\000\004\014\000\000\000\000\004^\000z\000\000\000\000\007\153\006b\006\158\000\022\004b\000\000\000\026\000\000\000\000\007>\000\000\000\000\004f\000\000\000\000\004j\007\222\007\230\000\000\004v\006\150\007\242\000\000\000\000\000\000\000\000\bR\b\142\004\142\b\002\000\000\000\000\000\000\b\194\b\014\b\226\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\242\000\000\000\000\000\000\b\018\t\002\t\030\t&\000\000\000\000\011\194\000*\000\000\000\000\000\000\012B\000.\000\000\012R\r^\r\186\r\214\000\000\r\222\004R\004r\000\000\000\000\b\022\014\026\000\000\000\000\000\000\000\000\000\000\004\178\004\026\004\186\004*\004\190\004\194\006f\000\018\000\000\006j\006\146\000\000\000\000\000\000\000\000\000\000\000\000\004\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\226\000\000\000\000\007\254\005\030\000\000\000\000\bV\000\000\000\000\b^\000\000\000\000\000\000\000\000\bj\006\158\000\022\bn\000\000\000\026\000\000\000\000\007>\000\000\000\000\bv\000\000\000\000\b~\b\150\007\230\000\000\006^\b\134\b\154\000\000\000\000\000\000\000\000\b\166\b\170\b\178\b\182\000\000\000\000\000\000\b\194\t\006\t\014\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012V\000\000\000\000\012f\012j\012r\012v\t&\000\000\012\158\011\194\000*\000\000\000\000\000\000\012~\000.\000\000\012\138\012\142\012\146\012\150\000\000\012\154\004R\004r\000\000\000\000\012\166\012\174\000\000\000\000\000\000\000\000\000\000\004\178\004\026\004\186\004*\004\190\004\194\006f\000\018\000\000\006j\006\146\000\000\000\000\000\000\000\000\000\000\000\000\004\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\226\000\000\000\000\007\254\005\030\000\000\000\000\bV\000\000\000\000\b^\000\000\000\000\000\000\000\000\bj\006\158\000\022\bn\000\000\000\026\000\000\000\000\007>\000\000\000\000\bv\000\000\000\000\b~\b\150\007\230\000\000\006^\b\134\b\154\000\000\000\000\000\000\000\000\b\166\b\170\b\178\b\182\000\000\000\000\000\000\b\194\t\006\t\014\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012V\000\000\000\000\012f\012j\012r\012v\t&\000\000\r\226\011\194\000*\000\000\000\000\000\000\012~\000.\000\000\012\138\012\142\012\146\012\150\000\000\012\154\000\000\000\000\000\000\000\000\012\166\012\174\014*\003M\014B\003M\r\134\003M\014J\003M\014\146\003M\000\000\003M\000\000\006\r\000\000\000\000\000\000\000\000\006\r\000\000\000\000\014\162\000\000\000\000\r\142\003M\r\158\003M\000\000\003M\003M\003M\r\166\003M\r\174\003M\000\000\003M\003M\000\000\000\000\000\000\000\000\006\r\r\150\003M\003M\014\218\014R\003M\014\226\000\000\000\000\006\r\000\000\014\234\006\r\014b\003M\000\000\014j\003M\003M\015\002\b*\006\r\000\000\000\000\015\n\006\r\rZ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\r\014\242\015\018\000\000\015\026\000\000\000\000\000\000\006\r\000\000\015\"\000\000\003M\003M\016\254\018.\000\000\014r\003M\000\000\000\000\000\000\000\000\000\000\003M\015Z\000\000\006\r\003M\003M\000\000\000\000\006\r\017\n\000\000\000\000\000\000\000\000\003M\000\000\000\000\014Z\003M\015*\014\250\014*\002\213\014B\002\213\r\134\002\213\014J\002\213\014\146\002\213\000\000\002\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\213\r\158\002\213\000\000\002\213\002\213\002\213\r\166\002\213\r\174\002\213\000\000\002\213\002\213\000\000\000\000\000\000\000\000\000\000\r\150\002\213\002\213\014\218\014R\002\213\014\226\000\000\000\000\000\000\000\000\014\234\000\000\014b\002\213\000\000\014j\002\213\002\213\015\002\000\000\000\000\000\000\000\000\015\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\242\015\018\000\000\015\026\000\000\000\000\000\000\000\000\000\014\015\"\000\000\002\213\002\213\000\018\000\000\000\000\014r\002\213\003\246\003\250\000\000\000\000\000\000\002\213\015Z\000\000\000\000\002\213\002\213\004\n\004\026\003\254\004*\004N\004\002\004n\000\018\002\213\004\138\004V\014Z\002\213\015*\014\250\000\000\000\000\004\202\006\241\000\022\000\000\000\000\000\026\000\000\000\000\005\026\006\253\000\000\004Z\005\030\004\226\000\030\004\014\000\000\000\000\004^\000\000\000\000\000\000\000\000\006b\006\158\000\022\004b\020\154\000\026\000\000\000\000\007>\000\000\000\000\004f\000&\000\000\004j\007\222\018\182\000\000\004v\006\150\007\242\000\000\000\000\000\000\000\000\bR\b\142\004\142\b\002\000\000\000\000\000*\b\194\b\014\b\226\000&\000.\000\000\000\000\006\253\000\000\000\000\000\000\b\242\000\000\000\000\000\000\b\018\t\002\t\030\t&\000\000\000\000\011\194\000*\000\000\000\000\000\000\012B\000.\000\000\012R\r^\r\186\r\214\000\000\r\222\007E\007E\000\000\000\000\b\022\014\026\000\000\000\000\000\000\000\000\000\000\007E\007E\007E\007E\007E\007E\007E\007E\000\000\007E\007E\000\000\000\000\000\000\000\000\000\000\000\000\007E\007E\000\000\000\000\000\000\000\000\000\000\000\000\007E\000\000\000\000\007E\007E\000\000\000\000\007E\000\000\000\000\007E\000\000\000\000\000\000\000\000\007E\007E\007E\007E\000\000\007E\000\000\000\000\007E\000\000\000\000\007E\000\000\000\000\007E\007E\007E\000\000\007E\007E\007E\000\000\000\000\000\n\000\000\007E\007E\007E\007E\000\000\000\000\000\000\007E\007E\007E\007E\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007E\000\000\000\000\000\000\007E\007E\007E\007E\000\000\000\000\007E\007E\000\000\000\000\000\000\007E\007E\000\000\007E\007E\007E\007E\000\000\007E\007I\007I\000\000\000\000\007E\007E\000\000\000\000\000\000\000\000\000\000\007I\007I\007I\007I\007I\007I\007I\007I\000\000\007I\007I\000\000\000\000\000\000\000\000\000\000\000\000\007I\007I\024\022\000\000\000\000\000\000\000\000\000\000\007I\000\000\000\000\007I\007I\000\000\000\000\007I\000\000\000\000\007I\000\000\000\000\000\000\000\000\007I\007I\007I\007I\000\000\007I\000\000\000\000\007I\000\000\000\000\007I\000\000\000\000\007I\007I\007I\000\000\007I\007I\007I\000\000\000\000\000\000\000\000\007I\007I\007I\007I\000\000\000\000\000\000\007I\007I\007I\007I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007I\000\000\000\000\000\000\007I\007I\007I\007I\000\000\000\000\007I\007I\000\000\000\000\000\000\007I\007I\000\000\007I\007I\007I\007I\000\000\007I\003\246\003\250\000\000\000\000\007I\007I\000\000\000\000\000\000\000\000\000\000\004\n\006\154\003\254\004*\004N\004\002\004n\000\018\000\000\004\138\004V\000\000\000\000\000\000\000\000\000\000\000\000\004\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\026\000\000\0079\004Z\005\030\000\000\000\000\004\014\000\000\000\000\004^\000\000\000\000\000\000\000\000\006b\006\158\000\022\004b\000\000\000\026\000\000\000\000\007>\000\000\000\000\004f\000\000\000\000\004j\007\222\007\230\000\000\004v\006\150\007\242\000\000\000\000\000\000\000\000\bR\b\142\004\142\b\002\000\000\000\000\000\000\b\194\b\014\b\226\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\242\000\000\000\000\000\000\b\018\t\002\t\030\t&\000\000\000\000\011\194\000*\000\000\000\000\000\000\012B\000.\000\000\012R\r^\r\186\r\214\000\000\r\222\003\246\003\250\000\000\000\000\b\022\014\026\000\000\000\000\000\000\000\000\000\000\004\n\b\138\003\254\004*\004N\004\002\004n\000\018\000\000\004\138\004V\000\000\000\000\000\000\000\000\000\000\000\000\004\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\026\000\000\0079\004Z\005\030\000\000\000\000\004\014\000\000\000\000\004^\000\000\000\000\000\000\000\000\006b\006\158\000\022\004b\000\000\000\026\000\000\000\000\007>\000\000\000\000\004f\000\000\000\000\004j\007\222\007\230\000\000\004v\006\150\007\242\000\000\000\000\000\000\000\000\bR\b\142\004\142\b\002\000\000\000\000\000\000\b\194\b\014\b\226\000&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\242\000\000\000\000\000\000\b\018\t\002\t\030\t&\000\000\000\000\011\194\000*\000\000\000\000\000\000\012B\000.\000\000\012R\r^\r\186\r\214\000\000\r\222\000\000\000\000\000\000\000\000\b\022\014\026\003\021\003\021\003\021\003\021\r\134\003\021\003\021\003\021\003\021\003\021\000\000\003\021\000\000\006\r\000\000\000\000\000\000\000\000\006\r\000\000\000\000\003\021\000\000\000\000\000\000\003\021\000\000\003\021\000\000\003\021\003\021\003\021\000\000\003\021\000\000\003\021\000\000\003\021\003\021\000\000\000\000\000\000\000\000\006\r\r\150\003\021\003\021\003\021\003\021\003\021\003\021\000\000\000\000\006\r\000\000\003\021\006\r\003\021\003\021\000\000\003\021\003\021\003\021\003\021\b*\006\r\000\000\000\000\003\021\006\r\bN\000\000\000\000\000\000\000\000\003\021\000\000\000\000\006\r\003\021\003\021\000\000\003\021\000\000\000\000\000\000\006\r\000\000\003\021\000\000\003\021\003\021\018^\023\158\000\000\003\021\003\021\000\000\000\000\000\000\000\000\000\000\003\021\003\021\000\000\006\r\003\021\003\021\000\000\000\000\006\r\018j\000\000\000\000\000\000\000\000\003\021\000\000\000\000\003\021\003\021\003\021\003\021\003\017\003\017\003\017\003\017\r\134\003\017\003\017\003\017\003\017\003\017\000\000\003\017\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\003\017\000\000\000\000\000\000\003\017\000\000\003\017\000\000\003\017\003\017\003\017\000\000\003\017\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\r\150\003\017\003\017\003\017\003\017\003\017\003\017\000\000\000\000\000\022\000\000\003\017\000\026\003\017\003\017\000\000\003\017\003\017\003\017\003\017\000\000\000\030\000\000\000\000\003\017\000B\000\000\000\000\000\000\000\000\000\000\003\017\000\000\000\000\003B\003\017\003\017\000\000\003\017\000\000\000\000\000\000\000&\000\000\003\017\000\000\003\017\003\017\000\000\000\000\000\000\003\017\003\017\000\000\000\000\000\000\000\000\000\000\003\017\003\017\000\000\000*\003\017\003\017\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\003\017\000\000\000\000\003\017\003\017\003\017\003\017\003\029\003\029\003\029\003\029\r\134\003\029\003\029\003\029\003\029\003\029\000\000\003\029\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\003\029\000\000\000\000\000\000\003\029\000\000\003\029\000\000\003\029\003\029\003\029\000\000\003\029\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\000\000\000\000\r\150\003\029\003\029\003\029\003\029\003\029\003\029\000\000\000\000\000\022\000\000\003\029\000\026\003\029\003\029\000\000\003\029\003\029\003\029\003\029\005.\000\030\000\000\000\000\003\029\000\000\000\000\000\000\000\000\000\000\000\000\003\029\000\000\000\000\005r\003\029\003\029\000\000\003\029\000\000\000\000\000\000\000&\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\003\029\003\029\000\000\000\000\000\000\000\000\000\000\003\029\003\029\000\000\000*\003\029\003\029\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\003\029\000\000\000\000\003\029\003\029\003\029\003\029\003\025\003\025\003\025\003\025\r\134\003\025\003\025\003\025\003\025\003\025\000\000\003\025\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\003\025\000\000\000\000\000\000\003\025\000\000\003\025\000\000\003\025\003\025\003\025\000\000\003\025\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\r\150\003\025\003\025\003\025\003\025\003\025\003\025\000\000\000\000\000\022\000\000\003\025\000\026\003\025\003\025\000\000\003\025\003\025\003\025\003\025\005\198\000\030\000\000\000\000\003\025\000\000\000\000\000\000\000\000\000\000\000\000\003\025\000\000\000\000\005\246\003\025\003\025\000\000\003\025\000\000\000\000\000\000\000&\000\000\003\025\000\000\003\025\003\025\000\000\000\000\000\000\003\025\003\025\000\000\000\000\000\000\000\000\000\000\003\025\003\025\000\000\000*\003\025\003\025\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\003\025\000\000\000\000\003\025\003\025\003\025\003\025\002\157\002\157\002\157\002\157\r\134\002\157\002\157\002\157\002\157\002\157\000\000\002\157\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002\157\000\000\000\000\000\000\002\157\000\000\002\157\000\000\002\157\002\157\002\157\000\000\002\157\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\r\150\002\157\002\157\002\157\002\157\002\157\002\157\000\000\000\000\000\022\000\000\002\157\000\026\002\157\002\157\000\000\002\157\002\157\002\157\002\157\006F\000\030\000\000\000\000\002\157\000\000\000\000\000\000\000\000\000\000\000\000\002\157\000\000\000\000\019\014\002\157\002\157\000\000\002\157\000\000\000\000\000\000\000&\000\000\002\157\000\000\002\157\002\157\000\000\000\000\000\000\002\157\002\157\000\000\000\000\000\000\000\000\000\000\002\157\002\157\000\000\000*\002\157\002\157\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002\157\000\000\000\000\002\157\002\157\002\157\002\157\002\153\002\153\002\153\002\153\r\134\002\153\002\153\002\153\002\153\002\153\000\000\002\153\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002\153\000\000\000\000\000\000\002\153\000\000\002\153\000\000\002\153\002\153\002\153\000\000\002\153\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\r\150\002\153\002\153\002\153\002\153\002\153\002\153\000\000\000\000\000\022\000\000\002\153\000\026\002\153\002\153\000\000\002\153\002\153\002\153\002\153\006\182\000\030\000\000\000\000\002\153\000\000\000\000\000\000\000\000\000\000\000\000\002\153\000\000\000\000\006\230\002\153\002\153\000\000\002\153\000\000\000\000\000\000\000&\000\000\002\153\000\000\002\153\002\153\000\000\000\000\000\000\002\153\002\153\000\000\000\000\000\000\000\000\000\000\002\153\002\153\000\000\000*\002\153\002\153\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002\153\000\000\000\000\002\153\002\153\002\153\002\153\002\165\002\165\002\165\002\165\r\134\002\165\002\165\002\165\002\165\002\165\000\000\002\165\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002\165\000\000\000\000\000\000\002\165\000\000\002\165\000\000\002\165\002\165\002\165\000\000\002\165\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\r\150\002\165\002\165\002\165\002\165\002\165\002\165\000\000\000\000\000\022\000\000\002\165\000\026\002\165\002\165\000\000\002\165\002\165\002\165\002\165\007V\000\030\000\000\000\000\002\165\000\000\000\000\000\000\000\000\000\000\000\000\002\165\000\000\000\000\007\134\002\165\002\165\000\000\002\165\000\000\000\000\000\000\000&\000\000\002\165\000\000\002\165\002\165\000\000\000\000\000\000\002\165\002\165\000\000\000\000\000\000\000\000\000\000\002\165\002\165\000\000\000*\002\165\002\165\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002\165\000\000\000\000\002\165\002\165\002\165\002\165\002\161\002\161\002\161\002\161\r\134\002\161\002\161\002\161\002\161\002\161\000\000\002\161\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\002\161\000\000\000\000\000\000\002\161\000\000\002\161\000\000\002\161\002\161\002\161\000\000\002\161\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\000\000\000\000\r\150\002\161\002\161\002\161\002\161\002\161\002\161\000\000\000\000\000\022\000\000\002\161\000\026\002\161\002\161\000\000\002\161\002\161\002\161\002\161\b\198\000\030\000\000\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\002\161\000\000\000\000\017\150\002\161\002\161\000\000\002\161\000\000\000\000\000\000\000&\000\000\002\161\000\000\002\161\002\161\000\000\000\000\000\000\002\161\002\161\000\000\000\000\000\000\000\000\000\000\002\161\002\161\000\000\000*\002\161\002\161\000\000\000\000\000.\000\000\000\000\000\000\000\000\000\000\002\161\000\000\000\000\002\161\002\161\002\161\002\161\014*\003)\014B\003)\r\134\003)\014J\003)\014\146\003)\000\000\003)\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\003)\r\158\003)\000\000\003)\003)\003)\r\166\003)\r\174\003)\000\000\003)\003)\000\000\000\000\000\000\000\000\000\000\r\150\003)\003)\003)\014R\003)\003)\000\000\000\022\000\000\000\000\000\026\000\000\014b\003)\000\000\014j\003)\003)\t:\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000\000\tj\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\003)\003)\000\000\000\000\000\000\014r\003)\000\000\000\000\000\000\000\000\000\000\003)\003)\000*\000\000\003)\003)\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\003)\000\000\000\000\014Z\003)\003)\014\250\014*\003-\014B\003-\r\134\003-\014J\003-\014\146\003-\000\000\003-\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\003-\r\158\003-\000\000\003-\003-\003-\r\166\003-\r\174\003-\000\000\003-\003-\000\000\000\000\000\000\000\000\000\000\r\150\003-\003-\003-\014R\003-\003-\000\000\000\022\000\000\000\000\000\026\000\000\014b\003-\000\000\014j\003-\003-\t\190\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003-\000\000\t\238\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\003-\003-\000\000\000\000\000\000\014r\003-\000\000\000\000\000\000\000\000\000\000\003-\003-\000*\000\000\003-\003-\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\003-\000\000\000\000\014Z\003-\003-\014\250\014*\0031\014B\0031\r\134\0031\014J\0031\014\146\0031\000\000\0031\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\0031\r\158\0031\000\000\0031\0031\0031\r\166\0031\r\174\0031\000\000\0031\0031\000\000\000\000\000\000\000\000\000\000\r\150\0031\0031\0031\014R\0031\0031\000\000\000\022\000\000\000\000\000\026\000\000\014b\0031\000\000\014j\0031\0031\n>\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0031\000\000\nr\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\0031\0031\000\000\000\000\000\000\014r\0031\000\000\000\000\000\000\000\000\000\000\0031\0031\000*\000\000\0031\0031\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\0031\000\000\000\000\014Z\0031\0031\014\250\014*\0035\014B\0035\r\134\0035\014J\0035\014\146\0035\000\000\0035\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\0035\r\158\0035\000\000\0035\0035\0035\r\166\0035\r\174\0035\000\000\0035\0035\000\000\000\000\000\000\000\000\000\000\r\150\0035\0035\0035\014R\0035\0035\000\000\000\022\000\000\000\000\000\026\000\000\014b\0035\000\000\014j\0035\0035\n\194\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\n\242\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\0035\0035\000\000\000\000\000\000\014r\0035\000\000\000\000\000\000\000\000\000\000\0035\0035\000*\000\000\0035\0035\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\014Z\0035\0035\014\250\014*\0039\014B\0039\r\134\0039\014J\0039\014\146\0039\000\000\0039\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\0039\r\158\0039\000\000\0039\0039\0039\r\166\0039\r\174\0039\000\000\0039\0039\000\000\000\000\000\000\000\000\000\000\r\150\0039\0039\0039\014R\0039\0039\000\000\000\022\000\000\000\000\000\026\000\000\014b\0039\000\000\014j\0039\0039\011F\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0039\000\000\011v\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\0039\0039\000\000\000\000\000\000\014r\0039\000\000\000\000\000\000\000\000\000\000\0039\0039\000*\000\000\0039\0039\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\0039\000\000\000\000\014Z\0039\0039\014\250\014*\003%\014B\003%\r\134\003%\014J\003%\014\146\003%\000\000\003%\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\003%\r\158\003%\000\000\003%\003%\003%\r\166\003%\r\174\003%\000\000\003%\003%\000\000\000\000\000\000\000\000\000\000\r\150\003%\003%\003%\014R\003%\003%\000\000\000\022\000\000\000\000\000\026\000\000\014b\003%\000\000\014j\003%\003%\011\198\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003%\000\000\011\246\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\003%\003%\000\000\000\000\000\000\014r\003%\000\000\000\000\000\000\000\000\000\000\003%\003%\000*\000\000\003%\003%\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\003%\000\000\000\000\014Z\003%\003%\014\250\014*\002\177\014B\002\177\r\134\002\177\014J\002\177\014\146\002\177\000\000\002\177\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\177\r\158\002\177\000\000\002\177\002\177\002\177\r\166\002\177\r\174\002\177\000\000\002\177\002\177\000\000\000\000\000\000\000\000\000\000\r\150\002\177\002\177\002\177\014R\002\177\002\177\000\000\000\022\000\000\000\000\000\026\000\000\014b\002\177\000\000\014j\002\177\002\177\012\198\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\177\000\000\012\246\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\177\002\177\000\000\000\000\000\000\014r\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\000*\000\000\002\177\002\177\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\177\000\000\000\000\014Z\002\177\002\177\014\250\014*\002\181\014B\002\181\r\134\002\181\014J\002\181\014\146\002\181\000\000\002\181\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\181\r\158\002\181\000\000\002\181\002\181\002\181\r\166\002\181\r\174\002\181\000\000\002\181\002\181\000\000\000\000\000\000\000\000\000\000\r\150\002\181\002\181\002\181\014R\002\181\002\181\000\000\000\022\000\000\000\000\000\026\000\000\014b\002\181\000\000\014j\002\181\002\181\019^\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\181\000\000\019\142\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\181\002\181\000\000\000\000\000\000\014r\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\000*\000\000\002\181\002\181\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\181\000\000\000\000\014Z\002\181\002\181\014\250\014*\002\185\014B\002\185\r\134\002\185\014J\002\185\014\146\002\185\000\000\002\185\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\185\r\158\002\185\000\000\002\185\002\185\002\185\r\166\002\185\r\174\002\185\000\000\002\185\002\185\000\000\000\000\000\000\000\000\000\000\r\150\002\185\002\185\002\185\014R\002\185\002\185\000\000\000\022\000\000\000\000\000\026\000\000\014b\002\185\000\000\014j\002\185\002\185\019\226\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\020\018\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\185\002\185\000\000\000\000\000\000\014r\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\000*\000\000\002\185\002\185\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\185\000\000\000\000\014Z\002\185\002\185\014\250\014*\002\189\014B\002\189\r\134\002\189\014J\002\189\014\146\002\189\000\000\002\189\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\189\r\158\002\189\000\000\002\189\002\189\002\189\r\166\002\189\r\174\002\189\000\000\002\189\002\189\000\000\000\000\000\000\000\000\000\000\r\150\002\189\002\189\002\189\014R\002\189\002\189\000\000\000\022\000\000\000\000\000\026\000\000\014b\002\189\000\000\014j\002\189\002\189\020\238\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\189\000\000\021\030\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\189\002\189\000\000\000\000\000\000\014r\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\000*\000\000\002\189\002\189\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\189\000\000\000\000\014Z\002\189\002\189\014\250\014*\002\193\014B\002\193\r\134\002\193\014J\002\193\014\146\002\193\000\000\002\193\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\193\r\158\002\193\000\000\002\193\002\193\002\193\r\166\002\193\r\174\002\193\000\000\002\193\002\193\000\000\000\000\000\000\000\000\000\000\r\150\002\193\002\193\002\193\014R\002\193\002\193\000\000\000\022\000\000\000\000\000\026\000\000\014b\002\193\000\000\014j\002\193\002\193\021n\000\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\193\000\000\021\158\000\000\014\242\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\002\193\002\193\000\000\000\000\000\000\014r\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\000*\000\000\002\193\002\193\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\002\193\000\000\000\000\014Z\002\193\002\193\014\250\014*\002\173\014B\002\173\r\134\002\173\014J\002\173\014\146\002\173\000\000\002\173\000\014\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\014\162\000\000\000\000\r\142\002\173\r\158\002\173\000\000\002\173\002\173\002\173\r\166\002\173\r\174\002\173\000\000\002\173\002\173\000\000\000\000\000\000\000\000\000\000\r\150\002\173\002\173\002\173\014R\002\173\002\173\000\000\000\022\000\000\000\000\000\026\000\000\014b\002\173\000\000\014j\002\173\002\173\021\238\000\030\000\000\000\000\000\000\000\000\000\000\000\000\003\246\003\250\000\000\000\000\002\173\000\000\022\030\000\000\014\242\000\000\000\000\000\000\000\014\003\254\000&\000\000\004\002\000\018\000\018\002\173\002\173\004V\000\000\000\000\014r\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\000*\000\000\002\173\002\173\000\000\000.\004Z\000\000\000\000\000\000\004\014\000\000\002\173\004^\000\000\014Z\002\173\002\173\014\250\000\022\000\022\004b\000\026\000\026\000\000\000\000\000\000\000\000\000\000\004f\005v\000\030\004j\000\000\000\000\006\169\004v\006\150\000\000\000\000\005\029\000\000\000\000\005\029\003B\004\142\b\002\000\000\005\029\000\000\000\000\b\014\000&\000&\000\000\006\169\000\000\000\000\000\000\000\021\000\021\000\000\000\000\000\000\000\000\b\018\000\000\000\021\000\000\006\169\000\000\000*\000*\005\029\000\000\000\000\000.\000.\000\000\000\000\000\000\000\000\000\000\005\029\000\000\006Q\005\029\003\254\000\000\b\022\b\026\000\000\000\018\000\000\005\029\005\029\000\000\000\000\000\000\005\029\005\029\000\000\000\000\006Q\006Q\006Q\000\000\000\000\005\029\000\000\000\000\006Q\006Q\000\000\000\000\000\000\005\029\004\014\000\000\000\021\000\000\000\000\005\029\005\029\000\000\000\000\000\000\000\022\006\217\000\014\000\026\006\r\000\000\000J\000\018\005\029\006\r\000\000\000\000\004\022\005\029\005\029\000\000\004v\000\000\006\185\006\185\006\185\000\000\000\000\000\000\005\029\004\142\006\185\006\217\006\217\000\000\006\r\000\000\000\000\000&\006\r\006\r\000\000\006Q\006Q\006\185\000\000\000\000\000\022\000\000\006\r\000\026\000\000\006\r\000\000\006Q\000\000\000\000\000*\006Q\000\030\b*\006\r\000.\000B\000\000\006\r\bN\006\185\000\000\000\000\000\000\000\000\003B\000\000\006\r\006\r\000\000\000\000\006\r\000\000\000&\000\000\006\r\006\185\000\000\000\000\b*\006\r\018^\018b\000\000\006\r\bN\000\000\000\000\000\226\006\185\006\185\005Q\000*\006\r\006\r\b.\005Q\000.\000\000\006\r\018j\006\r\000\000\000\000\000N\000\000\000\000\018^\018b\0186\023\134\000\000\000\000\000\000\000\000\000b\000j\000\000\000\000\000\130\006\r\005Q\000\000\000\000\000\000\006\r\018j\000\000\000\138\000\000\000\000\005Q\000\000\000\000\005Q\000\158\023v\000\000\000\000\000\000\000\166\000f\005Q\005Q\005u\000\182\000\222\005Q\005Q\005u\000\000\000\000\000\000\000\000\000\230\000\000\005Q\007\141\000\000\000\000\000\000\000\000\023\166\000\000\005Q\000\000\000\000\000\000\000\000\000\000\005Q\005Q\000\000\000\000\005u\000\000\000\000\000\234\000\000\000\000\000\000\000\000\000\000\005Q\005u\000\000\000\000\005u\005Q\005Q\001\014\001\018\000\000\000\000\000\"\005u\005u\000\000\000\000\001\022\005u\005u\000\000\000\000\000\000\000\000\000\000\000\014\000\000\005u\000\000\000\000\000\018\000\000\000\000\0006\000\000\005u\000\000\000\000\000\000\000\000\000\000\005u\005u\007a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000>\000N\000\000\005u\007\197\000\000\000\000\000\000\005u\005u\000\000\000\000\000b\000j\000\022\000\000\000\130\000\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\138\000\030\000\000\000\000\006Y\000B\000\000\000\158\000\000\006Y\000\000\000\000\000\166\000f\003B\003F\000\000\000\182\000\222\000\000\000\000\000\000\000&\004z\003\254\000\000\002\210\000\000\000\000\000\018\000\000\000R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000\000\006Y\006Y\000\000\000.\006Y\007)\000\234\006Y\000\000\000\000\000\000\004\014\000\000\006Y\000\000\003Z\000\000\000\014\000\000\001\014\001\018\000\022\000\018\000\000\000\026\000\000\006Y\000\000\001\022\000\000\000\000\006Y\000\000\004j\006Y\000\000\000\000\004v\006\150\000\000\000\014\000\000\000\000\000\000\000\000\000\018\023\030\000\000\000\000\000V\000\000\000\000\006Y\006Y\000&\000\000\006\161\000\022\006Y\000\000\000\026\000\000\000\000\006\161\000\000\000\000\000\000\000\000\000\000\000\030\000\000\006Y\000\000\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\003B\000\026\000\000\000\000\000\000\006\161\000\014\000\000\000&\005\250\000\030\000\018\000\000\000\000\006\169\000\000\000\014\000\000\000\000\000\000\000\000\000\018\000\000\003B\000\000\000\000\006\161\000*\000\000\000\000\000\000\000&\000.\000\000\006\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\161\000\022\000\000\006\169\000\026\000*\000\000\000\000\000\000\000\000\000.\000\022\006\234\000\030\000\026\000\000\000\000\006\169\000\000\000\014\000\000\000\000\007\138\000\030\000\018\000\000\003B\006\169\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\003B\006\169\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\014\000\000\006\169\000\000\000\000\000\018\006\169\000\000\000*\000\000\000\000\000\000\000\000\000.\000\022\000\000\006\169\000\026\000*\000\000\000\000\000\000\000\000\000.\000\000\tn\000\030\000\000\000\000\000\014\006\169\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\003B\000\022\000\000\000\000\000\026\000\014\000\000\000\000\000&\000\000\000\018\006\169\t\242\000\030\000\000\000\000\000\000\006\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\169\003B\000*\000\000\000\000\000\022\000\000\000.\000\026\000&\000\000\000\000\006\169\000\000\000\000\000\000\nv\000\030\000\000\000\000\000\022\006\169\000\000\000\026\000\014\000\000\006\169\000\000\000*\000\018\003B\n\246\000\030\000.\000\000\000\000\006\169\000\000\000&\000\014\000\000\006\169\000\000\000\000\000\018\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\006\169\006\169\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\000\000\000\026\000\014\000\000\006\169\000\000\000*\000\018\000\000\011z\000\030\000.\000\000\000\022\006\169\000\000\000\026\000\014\000\000\000\000\000\000\000\000\000\018\003B\011\250\000\030\000\000\000\000\000\000\006\169\000\000\000&\000\000\000\000\006\169\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\022\000\000\000\000\000\026\000&\000\000\006\169\006\169\000*\000\000\000\000\012\250\000\030\000.\000\000\000\022\006\169\000\000\000\026\000\014\000\000\006\169\000\000\000*\000\018\003B\017\154\000\030\000.\000\000\000\000\006\169\000\000\000&\000\014\000\000\006\169\000\000\000\000\000\018\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\006\169\006\169\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\000\000\000\026\000\014\000\000\006\169\000\000\000*\000\018\000\000\019\018\000\030\000.\000\000\000\022\006\169\000\000\000\026\000\014\000\000\000\000\000\000\000\000\000\018\003B\019\146\000\030\000\000\000\000\000\000\006\169\000\000\000&\000\000\000\000\006\169\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\022\000\000\000\000\000\026\000&\000\000\006\169\006\169\000*\000\000\000\000\020\022\000\030\000.\000\000\000\022\006\169\000\000\000\026\000\014\000\000\006\169\000\000\000*\000\018\003B\020\158\000\030\000.\000\000\000\000\006\169\000\000\000&\000\014\000\000\006\169\000\000\000\000\000\018\003B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\006\169\006\169\000*\000\000\000\000\000\000\000\000\000.\000\000\000\022\000\000\000Q\000\026\000\014\000\000\006\169\000\000\000*\000\018\000\000\021\"\000\030\000.\000\000\000\022\006\169\000\000\000\026\000\014\000Q\000Q\000Q\000\000\000\018\003B\021\162\000\030\000Q\000Q\000\000\006\169\000\000\000&\000\000\000\000\006\169\000\000\000\000\000\000\003B\001N\000\000\000\000\000\022\000\000\000\000\000\026\000&\000\000\006\169\006\169\000*\000\000\000\000\022\"\000\030\000.\000\000\000\022\006\169\000\000\000\026\000\000\000\000\006\169\000\000\000*\000\000\003B\022\166\000\030\000.\000\000\000\000\006\169\000\000\000&\000\000\000\000\006\169\000Q\000Q\000\018\003B\000\000\000\000\000M\000\000\000\000\000\000\000\000\000&\000Q\006\169\006\169\000*\000Q\000\014\000\000\000\000\000.\000\000\000\018\000\000\000M\000M\000M\000\000\006\169\000\000\000*\001V\000M\000M\000\000\000.\000\000\000\022\000\000\000\000\000\026\000\000\000\000\000\000\000\000\001N\000\000\000\000\000\000\004\022\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\022\000\000\000\000\000\026\000\000\012\178\000\000\000\000\000\000\000\000\000\000\022r\000\030\000&\000\000\000\000\000\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\162\000\000\000\000\000M\000M\000J\012\194\000*\000&\000\000\000\000\000\000\000.\000\000\000\000\000M\000\000\000\000\000\000\000M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000\000\000\000\000\000\000\000\000.\000\000\001V"))
+  
+  and lhs =
+    (8, "\003\002\001\000^^]\\[ZYYYXXXXWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUTTSSRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPPPPOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLKKJJJJJIIIIIHHHGGFFFFFFFFFEEEEEEEEEDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCBBA@???>>==<<<<<<;:99887776654321000//..--,,,,+++++++**))(((('''&&&&%%%%$$$####\"\"\"!!!    \031\031\031\030\030\030\030\029\029\029\029\028\028\028\027\027\027\026\026\026\026\025\025\025\025\024\024\024\023\023\023\023\022\022\022\021\021\021\020\020\020\019\019\018\017\017\017\016\015\015\014\014\r\r\r\r\r\r\r\012\012\011\011\011\011\011\011\011\011\011\011\011\011\011\n\n\n\n\n\n\t\b\b\b\b\b\b\b\007\006\006\005\005\004\004\004\004")
+  
+  and goto =
+    ((16, "\001v\000\212\000A\000\000\000\000\000\000\000\000\016n\000u\000\000\000\000\000\000\000\000\000k\000\000\000\240\000;\000\145\018\164\000\014\000\000\000\000\000\000\028^\028|\018\002\028\154\000\022\000\014\000\218\000\000\018\184\000\000\000\000\000\246\0006\000\000\000\000\018\210\001.\000\000\000>\001\026\000\000\028\184\0006\000\000\000\000\000N\000\000\000Z\000\000\000\000\000\000\018\240\019\n\019\030\000\000\000\000\028\214\000\206\001v\000\000\028\244\000\000\000\000\027F\000\000\028@\002\246\000\000\000\000\000\000\000\000\000\000\001\000\018*\000\000\027V\000\000\000\000\000\000\000\000\019>\000\000\019X\000\000\018>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\029\018\000\000\027d\000\000\000\000\027x\000\000\000\000\000\000\000\000\000\000\000\000\019l\000\000\016\200\000\250\002\222\000\000\028\026\000\000\019\140\000\000\000\000\029\198\000\000\019\166\000\000\019\186\000\000\000\000\019\218\000\000\000\000\000\000\002\196\000\000\000\000\001J\000\000\000\000\001n\000\000\001r\000\000\000\000\001~\000\000\000\000\001\n\000\000\001V\000\000\000\000\000\000\000\000\000\000\000\000\027\140\000\000\000\000\0290\000\000\027\156\000\000\000\000\000\000\000\000\003r\000\000\000\000\029N\000\000\027\170\000\000\000\000\029l\000\000\027\190\000\000\000\000\027\210\000\000\000\000\019\244\000\000\000\000\018\022\000\000\000\000\000\000\000\000\000\000\001\146\004\178\000\000\029\138\000\000\027\226\000\000\000\000\029\168\000\000\027\240\000\000\000\000\028\004\000\000\000\000\000\000\030J\000\000\000\000\000P\000\000\000\000\000\000\005\004\000\000\000\000\000\000\000\000\000@\000\000\020\b\000\000\000\000\000\000\000\000\000\000\007h\000\000\b0\000\000\000\000\000\000\000\000\000\000\018\150\000\000\005\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\012\000\000\b\132\000\000\000\000\000\\\015\204\007\232\027\170\027\208\000\000\000\000\000I\015\230\000\000\000\000\000!\000\000\005\216\000\000\000q\000\000\000\000\001\158\000\000\000\000\020(\000\000\020B\000\000\000\006\027\238\028\012\028*\028H\028f\028\132\000!\000.\028\162\018\018\000\000\006x\000\000\b\016\017\204\000\000\000\000\000\000\000\000\000\000\000\000\015\240\000x\000V\020\184\000~\000\000\000\166\000\000\000\228\006\210\001\012\000\000\000\000\000\000\001`\001\174\007\022\000\000\001\164\007\004\016\b\001Z\000\000\000\000\000\000\007\244\000\000\000\000\016\156\b8\007\026\000\000\000\000\001\204\001\214\007\190\000\000\001\216\007\196\0160\b\024\b\132\000\000\000\000\000\000\000\000\000\000\001\244\bH\016<\000\000\002\000\001\226\b\166\000\000\002\028\b\180\016\128\000\000\000\000\002(\b\220\016\250\000\000\t\004\017\030\000\000\t,\017\"\000\000\000\000\002D\002\n\nZ\000\000\002P\nT\017F\000\000\000\000\002l\n\\\017J\000\000\002x\002\182\n\242\000\000\002\160\n\216\017P\000\000\000\000\002\188\011L\017l\000\000\011\\\017\188\000\000\011h\017\248\000\000\002\200\002\238\011\250\000\000\002\228\011\196\001\176\b`\001\n\0012\020\214\000\000\017\176\000\000\000\000\000\000\017\186\000\000\017\204\000\000\028\192\016\196\016\236\011\200\011\212\012\"\012(\000\000\002\240\003.\012&\000\000\003\024\011\236\018\012\000\000\000\000\0034\011\240\0188\000\000\003@\003f\012:\000\000\003\\\011\252\018^\000\000\000\000\003h\012\000\018\148\000\000\012\b\018\164\000\000\012\012\018\216\000\000\012^\012`\000\000\012 \012$\012r\012x\000\000\003\132\003\178\012v\000\000\003\172\012<\018\232\000\000\000\000\003\184\012@\018\242\000\000\003\212\003\234\012\138\000\000\003\224\012L\019\016\000\000\000\000\003\252\012P\019 \000\000\012X\0196\000\000\012\\\019@\000\000\012\174\012\176\000\000\001Z\b\136\030d\000\000\b\176\000\000\012p\001\130\028\222\000\000\020\244\000\000\028\252\029\026\0298\bh\000\000\000\000\012\178\018\132\012\184\020V\012\192\000\000\000\000\000\000\000\000\000\000\b\216\001\170\000\000\000\000\029V\000\000\000\000\001\210\029t\000\000\029\146\000\000\000!\007\214\017\020\017<\021\018\001\250\002\"\000\000\012\132\002J\002r\0210\002\154\000\000\000\000\021N\000\000\004\b\004F\012\206\000\000\0040\012\144\001\216\t\000\000\000\030~\000\000\t(\012\156\012\160\000\000\000\000\002\194\029\176\000\000\000\000\030\140\000\000\tP\000\000\000\000\000\000\b$\000\000\000\000\004L\004z\012\226\000\000\004t\012\168\019n\000\000\000\000\004\128\012\172\019\132\000\000\004\156\004~\012\246\000\000\004\168\012\184\019\142\000\000\000\000\004\196\012\192\019\206\000\000\012\196\019\210\000\000\012\200\019\230\000\000\000\000\004\208\004\178\r\018\000\000\004\236\012\212\019\254\000\000\000\000\004\248\012\220\020\000\000\000\005\020\005B\r\"\000\000\005<\012\232\020\002\000\000\000\000\005H\012\236\020\030\000\000\012\240\020 \000\000\012\248\020*\000\000\005d\005z\r>\000\000\005p\r\004\002\000\000\000\000\000\000\000\005\140\r\b\002(\000\000\005\152\005\214\rR\000\000\005\192\r\020\002x\000\000\000\000\005\220\r\024\002\240\000\000\r \003@\000\000\r$\003\144\000\000\005\232\006\014\rn\000\000\006\004\r0\020.\000\000\000\000\006\016\r8\020B\000\000\006,\006Z\r~\000\000\006T\r@\021\170\000\000\000\000\006`\rH\021\194\000\000\rL\021\196\000\000\rT\021\198\000\000\000\000\006|\006\146\r\154\000\000\006\136\r`\021\200\000\000\000\000\006\164\rd\021\224\000\000\006\176\006\238\r\170\000\000\006\216\rp\021\226\000\000\000\000\007 \rt\021\228\000\000\r|\021\230\000\000\r\128\021\254\000\000\007<\007&\r\202\000\000\007P\r\140\022\028\000\000\000\000\007T\r\144\022:\000\000\007`\007J\r\218\000\000\007\140\r\156\022>\000\000\000\000\007\168\r\164\022@\000\000\r\168\022X\000\000\r\176\022\\\000\000\000\000\020^\000\000\000\000\002\234\r\184\r\188\000\000\000\000\000\000\029\206\000\000\003\018\000\000\000\000\000\000\020\154\000\000\003:\003b\003\138\003\178\003\218\000\000\004\002\029\236\000\000\006\244\r\192\014\014\014\020\000\000\007\180\007f\014\018\000\000\007\208\r\216\022^\000\000\000\000\007\248\r\220\022v\000\000\007\252\007\178\014\"\000\000\b,\r\232\022z\000\000\000\000\b\\\r\236\022\148\000\000\r\244\022\152\000\000\r\248\022\178\000\000\000\000\014J\014L\000\000\000\000\014F\tx\004*\000\000\000\000\000\000\000\000\000\000\000\000\019\248\000\000\000\000\020\022\000\000\0206\000\000\020T\000\000\020r\000\000\020\144\000\000\020\174\000\000\t\160\004R\000\000\000\000\000\000\000\000\000\000\000\000\004z\000\000\004\162\000\000\004\202\000\000\004\242\000\000\000\000\000\000\005\026\000\000\005B\000\000\005j\000\000\000\000\bh\000\000\000\000\000\000\020\204\000\000\t\200\000\000\000\000\000\000\020\234\000\000\021\b\000\000\021&\000\000\021D\000\000\021b\000\000\021\128\000\000\021\158\000\000\t\240\000\000\n\024\000\000\n@\000\000\021\188\000\000\nh\000\000\021\218\000\000\n\144\000\000\n\184\000\000\n\224\000\000\011\b\000\000\0110\000\000\011X\000\000\021\248\000\000\022\022\000\000\0224\000\000\022R\000\000\022p\000\000\022\142\000\000\022\172\000\000\022\202\000\000\022\232\000\000\023\006\000\000\023$\000\000\011\128\000\000\011\168\000\000\011\208\000\000\011\248\000\000\023B\000\000\030v\000\000\012 \000\000\012H\000\000\012p\000\000\012\152\000\000\000\000\023`\000\000\012\192\000\000\023~\000\000\012\232\000\000\023\156\000\000\r\016\000\000\023\186\000\000\r8\000\000\023\216\000\000\023\246\000\000\r`\000\000\024\020\000\000\r\136\000\000\0242\000\000\r\176\000\000\024P\000\000\r\216\000\000\024n\000\000\014\000\000\000\014(\000\000\024\140\000\000\024\170\000\000\014P\000\000\024\200\000\000\024\230\000\000\025\004\000\000\014x\000\000\025\"\000\000\014\160\000\000\014\200\000\000\025@\000\000\025^\000\000\025|\000\000\025\154\000\000\025\184\000\000\025\214\000\000\025\244\000\000\026\018\000\000\014\240\000\000\030\132\000\000\015\024\000\000\015@\000\000\0260\000\000\015h\000\000\026N\000\000\026l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021l\000\000\000\000\005\146\000\000\000\000\000\000\005\186\000\000\005\226\000\000\006\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0062\000\000\000\000\000\000\006Z\000\000\000\000\000\000\000\000\bt\014\016\003\184\000\000\b\132\007\190\014V\000\000\b\144\014\028\004\b\000\000\000\000\b\156\014 \004X\000\000\014(\004\128\000\000\014,\004\208\000\000\000\000\006\130\000\000\000\000\000\000\000\000\006\170\000\000\000\000\006\210\000\000\000\000\000\000\000\000\017d\000\000\000\000\000\000\014F\000\000\000\000\000\000\000\000\000\000\000\000\007\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0076\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\156\000\000\015\144\000\000\007^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\184\000\000\015\224\000\000\000\000\000\000\b\196\0140\005 \000\000\b\212\007\218\014z\000\000\b\224\014<\005H\000\000\000\000\b\236\014D\005\152\000\000\014H\005\232\000\000\014P\0068\000\000\b\252\b&\014\150\000\000\t\b\014X\022\182\000\000\000\000\t\020\014`\022\208\000\000\t$\b\138\014\166\000\000\t0\014l\022\212\000\000\000\000\t<\014p\022\238\000\000\014x\022\242\000\000\014|\023\012\000\000\000\000\tL\b\154\014\194\000\000\tX\014\136\023\016\000\000\000\000\td\014\140\023*\000\000\tt\t\018\014\214\000\000\t\128\014\152\023.\000\000\000\000\t\140\014\160\023H\000\000\014\164\023L\000\000\014\168\023f\000\000\000\000\000\000\000\000\000\000\000\000\016\148\000\000\016\174\000\000\000\000\000\000\t\156\014\176\023j\000\000\t\168\t\242\014\246\000\000\t\180\014\188\023\132\000\000\000\000\t\196\014\192\023\136\000\000\014\200\023\162\000\000\014\204\023\166\000\000\000\000\t\220\n\026\015\018\000\000\t\236\014\216\023\192\000\000\000\000\n\004\014\220\023\196\000\000\n\020\n*\015&\000\000\n \014\232\023\222\000\000\000\000\n,\014\240\023\226\000\000\014\244\023\252\000\000\014\248\024\000\000\000\n<\nR\015B\000\000\nH\015\004\006`\000\000\000\000\nT\015\012\n,\000\000\nd\n\186\015R\000\000\np\015\024\np\000\000\000\000\n\164\015\028\n|\000\000\015 \n\128\000\000\015(\n\136\000\000\n\204\0112\015n\000\000\n\212\0154\024\026\000\000\000\000\n\252\0158\024\030\000\000\011\004\011B\015\130\000\000\011,\015D\0248\000\000\000\000\0118\015T\024<\000\000\015\\\024V\000\000\015`\024Z\000\000\000\000\011D\011j\015\170\000\000\011T\015l\024t\000\000\000\000\011`\015x\024x\000\000\011l\011\170\015\190\000\000\011|\015\144\024\146\000\000\000\000\011\148\015\148\024\150\000\000\015\152\024\176\000\000\015\164\024\180\000\000\000\000\000\000\015\184\000\132\007\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\200\000\000\016\b\000\000\000\000\000\000\000\000\000\020\015\200\000\000\000\000\000\000\016z\000\000\000\000\016\202\000\000\017B\000\000\0186\000\000\012\178\018\172\000\000\000\000\012\178\030&\000\000\000\000\000\000\030\144\012\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\212\000\000\000\000\007\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016 \011\174\016F\000\000\000\000\000\000\016t\000\000\000\000\011\186\000\000\000\000\011\220\012\000\000\000\000\000\012&\000\000\000\000\026\246\000\000\027\n\000\000\000\000\0120\000\000\0124\000\000\000\000\000\000\011\238\000\000\000\000\000\000\027\030\000\000\000\000\0272\000\000\000\000\0122\000\000\012R\000\000\000\000\000\000\000\000"), (16, "\005\246\000\225\000\r\001%\001&\000A\000H\000\015\000`\000J\000K\003`\000\212\002\n\000\238\001'\001(\002\026\000\227\003\136\004\143\003\137\000\207\001%\001&\003\138\0002\005\243\000\214\003\143\003\144\003`\005\209\002\n\000\135\001'\001(\002\026\000\173\003\136\000\146\003\137\000L\001%\001&\003\138\0002\004\145\000\151\003\143\003\144\003`\000\153\002\n\0002\001'\001(\002\026\000\158\003\136\0002\003\137\000\024\001&\000\252\003\138\0005\004\145\000\168\003\143\003\144\003U\0004\003V\003Y\000\217\000\212\003Z\000\218\003[\000\221\003\\\005\241\001&\000\212\003^\000\213\003q\003r\003s\005\211\003U\000\214\003V\003Y\003t\003u\003Z\005\252\003[\000\214\003\\\005\229\001&\000\212\003^\001,\003q\003r\003s\000\212\003U\005\192\003V\003Y\003t\003u\003Z\0002\003[\000\214\003\\\005\196\001&\000\166\003^\000\214\003q\003r\003s\000b\003U\000\164\003V\003Y\003t\003u\003Z\000\242\003[\0002\003\\\005\195\001&\000^\003^\000\146\003q\003r\003s\005\188\003U\000y\003V\003Y\003t\003u\003Z\000\148\003[\000)\003\\\005\190\000\232\000\212\003^\000\218\003q\003r\003s\000\243\000\245\000\138\001%\001&\003t\003u\001C\0015\0016\000\214\003`\000_\002\n\000\146\001'\001(\002\026\000\143\003\136\000\138\003\137\000\138\001&\000\214\003\138\000\150\004\145\000\138\003\143\003\144\003U\000,\003V\003Y\000\002\000\140\003Z\000\142\003[\005\026\003\\\004\173\001&\000\145\003^\0002\003q\003r\003s\0057\003U\0002\003V\003Y\003t\003u\003Z\000\198\003[\0002\003\\\004\172\001&\001\014\003^\000\214\003q\003r\003s\000\250\003U\005\"\003V\003Y\003t\003u\003Z\000?\003[\0002\003\\\004\164\001&\001=\003^\0002\003q\003r\003s\005\028\003U\001X\003V\003Y\003t\003u\003Z\001e\003[\000\214\003\\\004\161\001&\001m\003^\0002\003q\003r\003s\001P\003U\004\190\003V\003Y\003t\003u\003Z\001y\003[\000\214\003\\\004\149\001&\001Z\003^\000\214\003q\003r\003s\001j\003U\004`\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004\148\001&\001b\003^\000\214\003q\003r\003s\001g\003U\002\150\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004\129\001&\001\142\003^\000\214\003q\003r\003s\001v\003U\002\156\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004~\001&\001{\003^\000\214\003q\003r\003s\001\139\003U\0002\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004}\001&\001\134\003^\000\214\003q\003r\003s\001\131\003U\002\164\003V\003Y\003t\003u\003Z\000G\003[\0002\003\\\004|\001&\001\136\003^\000\214\003q\003r\003s\004\212\003U\004\191\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004y\001&\001\150\003^\000\214\003q\003r\003s\001\202\003U\0002\003V\003Y\003t\003u\003Z\000t\003[\000\214\003\\\004[\001&\001\181\003^\000\214\003q\003r\003s\001\178\003U\002\169\003V\003Y\003t\003u\003Z\000\134\003[\0002\003\\\004W\001&\001\183\003^\000\214\003q\003r\003s\001\199\003U\001\194\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004V\001&\001\191\003^\000\214\003q\003r\003s\001\196\003U\002\172\003V\003Y\003t\003u\003Z\0002\003[\000\214\003\\\004U\001&\001\242\003^\000\214\003q\003r\003s\001\221\003U\000\167\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004T\001&\001\218\003^\0002\003q\003r\003s\001\223\003U\002\175\003V\003Y\003t\003u\003Z\001\234\003[\000\214\003\\\004S\001&\001\239\003^\000\214\003q\003r\003s\001\231\003U\004e\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004R\001&\001\236\003^\000\214\003q\003r\003s\004v\003U\0002\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004Q\001&\004a\003^\000\214\003q\003r\003s\0026\003U\004m\003V\003Y\003t\003u\003Z\0002\003[\0002\003\\\004F\001&\002k\003^\000\214\003q\003r\003s\002V\003U\002c\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\003]\001&\002S\003^\0002\003q\003r\003s\002X\003U\004r\003V\003Y\003t\003u\003Z\002w\003[\000\214\003\\\003p\001&\002h\003^\000\214\003q\003r\003s\002`\003U\004u\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\003w\001&\002e\003^\000\214\003q\003r\003s\002\140\003U\000\193\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\003\134\001&\002t\003^\000\214\003q\003r\003s\002y\003U\004x\003V\003Y\003t\003u\003Z\0002\003[\000\214\003\\\003{\001&\002\137\003^\000\214\003q\003r\003s\002\132\003U\000\216\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\003}\001&\002\129\003^\0002\003q\003r\003s\002\134\003U\004\195\003V\003Y\003t\003u\003Z\002\152\003[\000\214\003\\\003\129\001&\002\173\003^\000\214\003q\003r\003s\002\148\003U\004\203\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\003\131\001&\002\154\003^\000\214\003q\003r\003s\002\170\003U\0002\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\003\133\001&\002\165\003^\000\214\003q\003r\003s\002\162\003U\004\208\003V\003Y\003t\003u\003Z\000\240\003[\0002\003\\\004H\001&\002\167\003^\000\214\003q\003r\003s\002\205\003U\002\184\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004L\001&\002\181\003^\000\214\003q\003r\003s\002\186\003U\004\211\003V\003Y\003t\003u\003Z\0002\003[\000\214\003\\\004N\001&\002\202\003^\000\214\003q\003r\003s\002\197\003U\001\t\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004P\001&\002\194\003^\0002\003q\003r\003s\002\199\003U\004\214\003V\003Y\003t\003u\003Z\002\217\003[\000\214\003\\\004Z\001&\002\238\003^\000\214\003q\003r\003s\002\214\003U\005b\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004^\001&\002\219\003^\000\214\003q\003r\003s\002\235\003U\0002\003V\003Y\003t\003u\003Z\002\151\003[\000\214\003\\\004{\001&\002\230\003^\000\214\003q\003r\003s\002\227\003U\001!\003V\003Y\003t\003u\003Z\0014\003[\0002\003\\\004\128\001&\000\247\003^\000\214\003q\003r\003s\004\147\003U\002\249\003V\003Y\003t\003u\003Z\0002\003[\001&\003\\\004\131\0015\001I\003^\002\232\003q\003r\003s\003\006\003Q\0002\001%\001&\003t\003u\000\245\001;\000\214\003\014\003`\000\214\002\n\0039\001'\001(\002\026\000\229\003\136\002\246\003\137\002\251\001&\003R\003\138\000\214\004\145\003\011\003\143\003\144\003U\001>\003V\003Y\000\227\000\214\003Z\000\214\003[\0002\003\\\004\166\001&\000\214\003^\0002\003q\003r\003s\003\003\003U\003F\003V\003Y\003t\003u\003Z\004n\003[\0002\003\\\004\179\001&\003\b\003^\000\214\003q\003r\003s\003N\003U\004\204\003V\003Y\003t\003u\003Z\001F\003[\000\214\003\\\005\193\001&\0036\003^\000\214\003q\003r\003s\005\250\003U\001N\003V\003Y\003t\003u\003Z\0002\003[\000\214\003\\\005\245\001&\003;\003^\003K\003q\003r\003s\004\223\001%\001&\004\139\003Y\003t\003u\003Z\000\231\003`\000\214\002\n\000\214\001'\001(\002\026\0015\002L\001Q\004\182\003C\001%\001&\003\138\001U\000\227\003u\004\183\004\184\003`\004\185\002\n\000\214\001'\001(\002\026\000\214\003\136\0002\003\137\004\180\001%\001&\003\138\003H\005\199\0002\003\143\003\144\003`\004\236\002\n\000\249\001'\001(\002\026\004c\003\136\005\000\003\137\000\214\001%\001&\003\138\004s\005\024\001&\003\143\003\144\003`\004k\002\n\000\214\001'\001(\002\026\004p\002\b\001T\004\182\000\214\001%\001&\003\138\001[\000\245\000\214\004\183\004\184\003`\004\185\002\n\000\214\001'\001(\002\026\004\193\003\136\001`\003\137\003R\001%\001&\003\138\004\209\004\163\0002\003\143\003\144\003`\004\201\002\n\000\214\001'\001(\002\026\004\206\003\136\005\r\003\137\000\214\001%\001&\003\138\004\244\004\162\000\214\003\143\003\144\003`\004\220\002\n\000\214\001'\001(\002\026\004\225\003\136\001c\003\137\000\214\001%\001&\003\138\004\241\004\150\000\214\003\143\003\144\003`\004\233\002\n\000\214\001'\001(\002\026\004\238\003\136\001h\003\137\000\214\001%\001&\003\138\005\021\004_\000\214\003\143\003\144\003`\004\253\002\n\000\214\001'\001(\002\026\005\002\003\136\001k\003\137\000\214\001%\001&\003\138\005\018\004\\\000\214\003\143\003\144\003`\005\n\002\n\000\214\001'\001(\002\026\005\015\003\136\001n\003\137\000\214\001%\001&\003\138\005$\004X\000\214\003\143\003\144\003`\0054\002\n\000\214\001'\001(\002\026\005,\003\136\0002\003\137\000\214\001%\001&\003\138\0051\004>\000\214\003\143\003\144\003`\005/\002\n\000\214\001'\001(\002\026\005X\003\136\0002\003\137\000\214\001%\001&\003\138\005@\003\225\0002\003\143\003\144\003`\005C\002\n\000\214\001'\001(\002\026\005E\003\136\005P\003\137\000\214\001%\001&\003\138\005U\003\142\0002\003\143\003\144\003`\005M\002\n\000\214\001'\001(\002\026\005R\003\136\005c\003\137\000\214\001%\001&\003\138\005x\003\160\000\214\003\143\003\144\003`\005`\002\n\000\214\001'\001(\002\026\005e\003\136\005g\003\137\000\214\001%\001&\003\138\005u\003\162\000\214\003\143\003\144\003`\005m\002\n\000\214\001'\001(\002\026\001t\003\136\0002\003\137\000\214\001%\001&\003\138\002\151\003\164\000\214\003\143\003\144\003`\005p\002\n\005o\001'\001(\002\026\005r\003\136\005t\003\137\005w\001%\001&\003\138\005z\003\168\001w\003\143\003\144\003`\001|\002\n\000\214\001'\001(\002\026\005\152\003\136\002\151\003\137\005\128\001%\001&\003\138\002\151\003\172\002\151\003\143\003\144\003`\002\151\002\n\000\214\001'\001(\002\026\000\214\003\136\0002\003\137\005\133\001%\001&\003\138\005\149\003\174\0002\003\143\003\144\003`\005\131\002\n\001\129\001'\001(\002\026\000\214\003\136\005\144\003\137\000\214\001%\001&\003\138\005\141\003\176\0002\003\143\003\144\003`\005\146\002\n\001\132\001'\001(\002\026\005\185\003\136\005\164\003\137\000\214\001%\001&\003\138\005\161\003\178\000\214\003\143\003\144\003`\005\166\002\n\000\214\001'\001(\002\026\005\182\003\136\0002\003\137\000\214\001%\001&\003\138\005\174\003\180\000\214\003\143\003\144\003`\005\177\002\n\000\214\001'\001(\002\026\005\179\003\136\005\255\003\137\000\214\001%\001&\003\138\006\007\003\182\006\n\003\143\003\144\003`\001\137\002\n\000\214\001'\001(\002\026\006$\003\136\001\140\003\137\006\020\001%\001&\003\138\001\143\003\206\006)\003\143\003\144\003`\006\005\002\n\006\025\001'\001(\002\026\006\005\003\136\006+\003\137\0002\001%\001&\003\138\006\020\003\208\006\020\003\143\003\144\003`\006$\002\n\006\014\001'\001(\002\026\006\022\003\136\006\024\003\137\006&\001%\001&\003\138\001\148\003\210\006$\003\143\003\144\003`\001\151\002\n\001\205\001'\001(\002\026\006(\003\136\001\170\003\137\001\171\001%\001&\003\138\001\172\003\212\001\176\003\143\003\144\003`\001\179\002\n\001\184\001'\001(\002\026\001\189\003\136\001\192\003\137\001\197\001%\001&\003\138\001\200\003\218\001\203\003\143\003\144\003`\001\206\002\n\001\207\001'\001(\002\026\001\245\003\136\001\210\003\137\001\211\001%\001&\003\138\001\212\003\220\001\216\003\143\003\144\003`\001\219\002\n\001\224\001'\001(\002\026\001\229\003\136\001\232\003\137\001\237\001%\001&\003\138\001\240\003\222\001\243\003\143\003\144\003`\001\246\002\n\001\247\001'\001(\002\026\001\255\003\136\004\156\003\137\002\016\001%\001&\003\138\002\015\003\224\002)\003\143\003\144\003`\0024\002\n\0027\001'\001(\002\026\002@\003\136\002?\003\137\002Q\001%\001&\003\138\002T\003\229\002Y\003\143\003\144\003`\002^\002\n\002a\001'\001(\002\026\002f\003\136\002i\003\137\002l\001%\001&\003\138\002r\003\233\002u\003\143\003\144\003`\002z\002\n\002\127\001'\001(\002\026\002\130\003\136\002\135\003\137\002\138\001%\001&\003\138\002\141\003\237\002\146\003\143\003\144\003`\002\149\002\n\002\155\001'\001(\002\026\002\160\003\136\002\163\003\137\002\168\001%\001&\003\138\002\171\003\241\002\174\003\143\003\144\003`\002\179\002\n\002\182\001'\001(\002\026\002\187\003\136\002\192\003\137\002\195\001%\001&\003\138\002\200\003\247\002\203\003\143\003\144\003`\002\206\002\n\002\212\001'\001(\002\026\002\215\003\136\002\220\003\137\002\225\001%\001&\003\138\002\228\003\251\002\233\003\143\003\144\003`\002\236\002\n\002\239\001'\001(\002\026\002\244\003\136\002\247\003\137\002\252\001%\001&\003\138\003\001\003\255\003\004\003\143\003\144\003`\003\t\002\n\003\012\001'\001(\002\026\003\015\003\136\003\025\003\137\003\024\001%\001&\003\138\003.\004\003\003/\003\143\003\144\003`\0030\002\n\0034\001'\001(\002\026\0037\003\136\003<\003\137\003A\001%\001&\003\138\003D\004\007\003I\003\143\003\144\003`\003L\002\n\003O\001'\001(\002\026\003S\003\136\003T\003\137\004D\001%\001&\003\138\004d\004\t\004i\003\143\003\144\003`\004l\002\n\004q\001'\001(\002\026\004t\003\136\004w\003\137\004\194\001%\001&\003\138\004\199\004\015\004\202\003\143\003\144\003`\004\207\002\n\004\210\001'\001(\002\026\004\213\003\136\004\218\003\137\004\221\001%\001&\003\138\004\226\004\023\004\231\003\143\003\144\003`\004\234\002\n\004\239\001'\001(\002\026\004\242\003\136\004\245\003\137\004\251\001%\001&\003\138\004\254\004\027\005\003\003\143\003\144\003`\005\b\002\n\005\011\001'\001(\002\026\005\016\003\136\005\019\003\137\005\022\001%\001&\003\138\005%\004\029\005*\003\143\003\144\003`\005-\002\n\0052\001'\001(\002\026\0055\003\136\0058\003\137\005>\001%\001&\003\138\005A\004/\005F\003\143\003\144\003`\005K\002\n\005N\001'\001(\002\026\005S\003\136\005V\003\137\005Y\001%\001&\003\138\005^\0043\005a\003\143\003\144\003`\005f\002\n\005k\001'\001(\002\026\005n\003\136\005s\003\137\005v\001%\001&\003\138\005y\0045\005~\003\143\003\144\003`\005\129\002\n\005\134\001'\001(\002\026\005\139\003\136\005\142\003\137\004\187\001%\001&\003\138\000\253\0049\005\147\003\143\003\144\003`\005\150\002\n\005\153\001'\001(\002\026\005\159\003\136\005\162\003\137\004\189\001%\001&\003\138\005\167\004\177\005\172\003\143\003\144\003`\005\197\002\n\005\254\001'\001(\002\026\005\175\000\245\005\180\004\182\005\183\001%\001&\003\138\001%\001&\005\186\004\183\004\184\003`\004\185\002\n\005\194\001'\001(\002\026\001'\001(\005\244\004\182\001V\001%\001&\003\138\005\201\006\b\005\242\004\183\004\184\003`\004\185\002\n\006\000\001'\001(\002\026\001C\003\136\000\000\003\137\001V\001\160\000\000\003\138\000\233\005\203\001V\003\143\003\144\001C\000\000\005!\001%\001&\005\213\006\004\000\217\000\212\000\000\000\218\003`\000\235\002\n\000A\001'\001(\002\026\000J\000\128\005\030\004\182\001W\000\000\000\214\003\138\001%\001&\001\\\004\183\004\184\001V\006\002\005 \003`\000\000\002\n\000\000\001'\001(\002\026\004\169\000\000\000\000\004\182\005\216\001%\001&\003\138\000\000\005\214\000L\004\183\004\184\003`\006\002\002\n\000\000\001'\001(\002\026\004\167\001d\000\000\004\182\000\000\001%\001&\003\138\000\000\005\028\000\000\004\183\004\184\003`\005\025\002\n\000\000\001'\001(\002\026\004\137\004\134\005\028\003\137\000\000\001%\001&\003\138\000\000\005\214\000\000\001V\003\144\003`\000\000\002\n\000\000\001'\001(\002\026\004\132\004\134\000\000\003\137\005\218\001%\001&\003\138\000\000\001V\000\000\001V\003\144\003`\000\000\002\n\000\000\001'\001(\002\026\004\136\004\134\001i\003\137\000\000\001%\001&\003\138\000\000\001V\000\000\001V\003\144\003`\001V\002\n\000\000\001'\001(\002\026\001l\004\134\001o\003\137\000\000\001%\001&\003\138\001V\005\214\000\000\000\000\003\144\003`\000\000\002\n\000\000\001'\001(\002\026\001x\004\134\001}\003\137\001\158\001\133\000\000\003\138\000\000\001\162\000A\000N\003\144\000P\000J\000K\000R\000\184\001\164\001\138\000A\000N\000\186\000P\000J\000K\000R\000\184\001V\000\188\000A\000N\000\186\000P\000J\000K\000R\001%\001&\000\187\000A\000N\000S\000P\000J\000K\000R\000L\005\204\001'\001(\001)\000S\000Z\005\206\001\160\000\000\000L\001V\001\141\001\160\000\000\000\000\000Y\000\000\000\000\005\220\000L\001V\001\160\000\000\000\000\001%\001&\000\000\000A\000N\000L\000P\000J\000K\000R\005\221\000\000\001'\001(\002\026\000S\000\000\001\144\001V\000A\000N\005\214\000P\000J\000K\000R\002\018\001\180\000\000\000A\000N\000\206\000P\000J\000K\000R\000\000\001V\000\237\005\214\000L\000\165\000A\000N\000\000\000P\000J\000K\000R\001\185\000\217\000\212\000\000\000\218\000\163\000\235\000L\000A\000N\005\223\000P\000J\000K\000R\001V\000\000\000L\000\214\001\193\000n\000A\000N\001V\000P\000J\000K\000R\001%\001&\000L\000A\000N\000l\000P\000J\000K\000R\005\225\000\000\001'\001(\002\026\000j\000\000\000L\001\198\000A\000N\001V\000P\000J\000K\000R\001\201\000\000\000\000\001V\000L\000U\000A\000N\001V\000P\000J\000K\000R\000\000\000L\000\000\000A\000N\000W\000P\000J\000K\000R\001V\000\000\000\000\001\204\000\000\000p\000\000\000L\001V\000A\000N\001\220\000P\000J\000K\000R\001\225\000\000\000\000\001V\000L\000x\000A\000N\001V\000P\000J\000K\000R\000\000\000L\001\233\000A\000N\000}\000P\000J\000K\000R\001\238\000\000\000\000\000\000\000\000\000\127\000\000\000L\001V\000A\000N\001\241\000P\000J\000K\000R\001\244\000\000\000\000\001V\000L\000\130\000A\000N\001V\000P\000J\000K\000R\000\000\000L\000\000\000A\000N\000\183\000P\000J\000K\000R\002U\000\000\000\000\000\000\000\000\000\223\000\000\000L\000\000\000A\000N\002Z\000P\000J\000K\000R\002b\001V\000\000\001V\000L\001\017\000A\000N\000\000\000P\000J\000K\000R\001V\000L\000\000\000A\000N\001\019\000P\000J\000K\000R\001%\001&\001V\001V\001V\002\014\000\000\000L\003`\002g\002\n\002j\001'\001(\002\026\001%\001&\000\000\001V\001V\000L\002m\003a\003`\001V\002\n\001V\001'\001(\002\026\000L\001%\001&\002v\002{\002\131\001V\003c\000\000\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\003\019\002\136\002\139\001%\001&\003e\003`\002\142\002\n\002\183\001'\001(\002\026\001%\001&\001'\001(\003\020\000\000\002\188\003g\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\003\"\000\000\000\000\001%\001&\003i\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\003\020\001%\001&\003k\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\001.\001%\001&\003m\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\001\156\001%\001&\003\140\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\002\003\001%\001&\003\146\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\002%\001%\001&\003\148\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\002,\001%\001&\003\150\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\0020\001%\001&\003\152\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\004E\001%\001&\003\154\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001'\001(\004\157\001V\000\000\003\156\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\001V\001V\001V\000\000\003\158\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\001V\001V\001V\002\196\003\166\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\002\201\002\204\002\207\002\216\003\170\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\002\221\002\229\002\234\002\237\003\184\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\002\240\001V\001V\000\000\003\186\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\002\248\001V\001V\000\000\003\188\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\002\253\001V\003\005\003\n\003\190\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\003\r\001V\003\016\0038\003\192\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\003=\001V\003E\000\000\003\194\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\003J\001V\003M\000\000\003\196\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\003P\001V\004\222\000\000\003\198\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\004\227\001V\004\235\000\000\003\200\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\004\240\001V\004\243\000\000\003\202\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\004\246\001V\004\255\000\000\003\204\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\004\001V\005\012\000\000\003\214\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\017\001V\005\020\000\000\003\227\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\023\001V\005&\000\000\003\231\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005.\001V\0053\000\000\003\235\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\0056\001V\0059\000\000\003\239\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005B\001V\005G\000\000\003\243\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005O\001V\005T\000\000\003\245\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005W\001V\005Z\000\000\003\249\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\130\001V\005\135\000\000\003\253\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\143\001V\005\148\000\000\004\001\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\151\001V\005\154\000\000\004\005\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\001V\005\163\001V\005\168\000\000\004\011\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\005\176\000\000\005\181\000\000\004\r\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\005\184\000\000\005\187\000\000\004\017\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004\019\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004\021\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004\025\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004\031\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004!\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004#\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004%\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004'\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004)\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004+\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004-\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\0047\003`\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\004;\003`\000\000\002\n\000\000\001'\001(\002\026\000A\000N\000\000\000P\000J\000K\000R\004=\000\000\000\000\000A\000N\006\017\000P\000J\000K\000R\000\000\000\000\000\000\000A\000N\006\019\000P\000J\000K\000R\000\000\000\000\000\000\000A\000N\006 \000P\000J\000K\000R\000L\000\000\000\000\000A\000N\006#\000P\000J\000K\000a\000L\000A\000N\000\000\000P\000J\000K\000Q\000A\000N\000L\000P\000J\000K\000f\000\000\000\000\000\000\000A\000N\000L\000P\000J\000K\000i\000\000\000\000\000\000\000A\000N\000L\000P\000J\000K\000\157\000\000\000A\000N\000L\000P\000J\000K\000\162\000A\000N\000L\000P\000J\000K\000\172\000\000\000\000\000\000\000A\000N\000L\000P\000J\000K\000\177\000\000\000\000\000\000\000A\000N\000L\000P\000J\000K\000\180\000\000\000A\000N\000L\000P\000J\000K\000\197\000A\000N\000L\000P\000J\000K\000\202\000\000\000\000\000\000\000A\000N\000L\000P\000J\000K\000\205\000\000\000\000\001%\001&\000A\000L\000\000\000\000\000J\000v\005\249\000\000\002\n\000L\001'\001(\002\026\000\000\000\000\000\000\000L\001%\001&\000A\000H\000\000\000I\000J\000K\005\248\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\203\000\000\000L\000J\000K\005\240\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\190\000\000\000\000\000J\000K\005\239\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\178\000\000\000\000\000J\000K\005\238\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\155\000\000\000\000\000J\000K\005\237\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000g\000\000\000\000\000J\000K\005\236\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000B\000\000\000\000\000J\000K\005\235\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000d\000\000\000\000\000J\000K\005\228\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\160\000\000\000\000\000J\000K\004\171\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\170\000\000\000\000\000J\000K\004\160\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\175\000\000\000\000\000J\000K\004\159\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\195\000\000\000\000\000J\000K\004\158\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\200\000\000\000\000\000J\000K\002\t\000L\002\n\000\000\001'\001(\002\026\001%\001&\000A\000\000\000\000\000\000\000J\000{\002\025\000L\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\000\000\002\029\000L\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\000\000\002\031\000L\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\000\000\002C\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\000\000\003\028\000\000\002\n\000\000\001'\001(\002\026\001%\001&\000\000\000\000\000\000\000\000\000\000\000\000\003+\000\000\002\n\005\227\001'\001(\002\026\000A\000N\000\000\000P\000J\000K\003\216\000A\000N\000\000\000P\000J\000K\0041\001%\001&\000\217\000\212\000\000\000\218\000\000\000\219\000\224\000\000\005\225\000\000\001'\001(\002\026\000\217\000\212\000\000\000\218\000\214\000\219\001\251\000\000\000L\000\000\000\000\000\000\000\000\000\217\000\212\000L\000\218\000\214\000\219\002;\000\217\000\212\000\000\000\218\000\000\000\219\002F\000\000\000\217\000\212\000\214\000\218\000\000\000\219\004\175\000\000\000\000\000\214\001%\001&\000\000\000\000\000\000\000\000\000\000\000\214\000\000\000\000\005\231\000\000\001'\001(\002\026"))
+  
+  and semantic_action =
+    [|
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ option) = 
+# 495 "mo_frontend/parser.mly"
+                ( Some t )
+# 961 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ option) = 
+# 496 "mo_frontend/parser.mly"
+                ( None )
+# 979 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 568 "mo_frontend/parser.mly"
+                ( PrimE("dummy") @? at _sloc )
+# 1008 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ds;
+            MenhirLib.EngineTypes.startp = _startpos_ds_;
+            MenhirLib.EngineTypes.endp = _endpos_ds_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 754 "mo_frontend/parser.mly"
+    ( BlockE(ds) @? at _sloc )
+# 1052 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = p;
+            MenhirLib.EngineTypes.startp = _startpos_p_;
+            MenhirLib.EngineTypes.endp = _endpos_p_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 758 "mo_frontend/parser.mly"
+    ( {pat = p; exp = e} @@ at _sloc )
+# 1096 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = p;
+            MenhirLib.EngineTypes.startp = _startpos_p_;
+            MenhirLib.EngineTypes.endp = _endpos_p_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 762 "mo_frontend/parser.mly"
+    ( {pat = p; exp = e} @@ at _sloc )
+# 1140 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = dfs;
+          MenhirLib.EngineTypes.startp = _startpos_dfs_;
+          MenhirLib.EngineTypes.endp = _endpos_dfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 1175 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_dfs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 1190 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 1196 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_dfs_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 919 "mo_frontend/parser.mly"
+                              ( snd (xf "object" _sloc), dfs )
+# 1205 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = dfs;
+          MenhirLib.EngineTypes.startp = _startpos_dfs_;
+          MenhirLib.EngineTypes.endp = _endpos_dfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_dfs_ in
+        let _v =
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 1239 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_dfs_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 919 "mo_frontend/parser.mly"
+                              ( snd (xf "object" _sloc), dfs )
+# 1247 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = dfs;
+          MenhirLib.EngineTypes.startp = _startpos_dfs_;
+          MenhirLib.EngineTypes.endp = _endpos_dfs_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_dfs_ in
+        let _endpos = _endpos_dfs_ in
+        let _v =
+          let _endpos = _endpos_dfs_ in
+          let _symbolstartpos = _startpos_dfs_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 920 "mo_frontend/parser.mly"
+                 ( anon_id "object" (at _sloc) @@ at _sloc, dfs )
+# 1277 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v : (Mo_def.Syntax.dec) = 
+# 902 "mo_frontend/parser.mly"
+    ( d )
+# 1303 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v : (Mo_def.Syntax.dec) = 
+# 904 "mo_frontend/parser.mly"
+    ( d )
+# 1328 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 906 "mo_frontend/parser.mly"
+    ( ExpD e @? at _sloc )
+# 1357 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fail;
+          MenhirLib.EngineTypes.startp = _startpos_fail_;
+          MenhirLib.EngineTypes.endp = _endpos_fail_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _5;
+            MenhirLib.EngineTypes.startp = _startpos__5_;
+            MenhirLib.EngineTypes.endp = _endpos__5_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = p;
+                  MenhirLib.EngineTypes.startp = _startpos_p_;
+                  MenhirLib.EngineTypes.endp = _endpos_p_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fail : (Mo_def.Syntax.exp) = Obj.magic fail in
+        let _5 : unit = Obj.magic _5 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fail_ in
+        let _v =
+          let _endpos = _endpos_fail_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 908 "mo_frontend/parser.mly"
+    ( let p', e' = normalize_let p e in
+      LetD (p', e', Some fail) @? at _sloc )
+# 1423 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = s;
+            MenhirLib.EngineTypes.startp = _startpos_s_;
+            MenhirLib.EngineTypes.endp = _endpos_s_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = v;
+              MenhirLib.EngineTypes.startp = _startpos_v_;
+              MenhirLib.EngineTypes.endp = _endpos_v_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let s : (Mo_def.Syntax.stab option) = Obj.magic s in
+        let v : (Mo_def.Syntax.vis' Source.phrase) = Obj.magic v in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_v_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = if _startpos_v_ != _endpos_v_ then
+            _startpos_v_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 773 "mo_frontend/parser.mly"
+    ( {dec = d; vis = v; stab = s} @@ at _sloc )
+# 1473 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 860 "mo_frontend/parser.mly"
+    ( let p', e' = normalize_let p e in
+      LetD (p', e', None) @? at _sloc )
+# 1525 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 1567 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 1577 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 1586 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 863 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 1595 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = ts;
+                MenhirLib.EngineTypes.startp = _startpos_ts_;
+                MenhirLib.EngineTypes.endp = _endpos_ts_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = id;
+                    MenhirLib.EngineTypes.startp = _startpos_id_;
+                    MenhirLib.EngineTypes.endp = _endpos_id_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 1658 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 1668 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 1677 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 863 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 1686 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _4 : (unit option) = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 1735 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 1750 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 1756 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 1766 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 865 "mo_frontend/parser.mly"
+    ( let sort = Type.(match s.it with
+                       | Actor -> "actor" | Module -> "module" | Object -> "object"
+                       | _ -> assert false) in
+      let named, x = xf sort _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+                    objblock s t (List.map share_dec_field efs) @? at _sloc)
+             @? at _sloc) @? at _sloc
+        else objblock s t efs @? at _sloc
+      in
+      let_or_exp named x e.it e.at )
+# 1789 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _4 : (unit option) = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 1837 "mo_frontend/parser.ml"
+           in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 1846 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 865 "mo_frontend/parser.mly"
+    ( let sort = Type.(match s.it with
+                       | Actor -> "actor" | Module -> "module" | Object -> "object"
+                       | _ -> assert false) in
+      let named, x = xf sort _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+                    objblock s t (List.map share_dec_field efs) @? at _sloc)
+             @? at _sloc) @? at _sloc
+        else objblock s t efs @? at _sloc
+      in
+      let_or_exp named x e.it e.at )
+# 1869 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _4 : (unit option) = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 1918 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 1933 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 1939 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 1949 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 865 "mo_frontend/parser.mly"
+    ( let sort = Type.(match s.it with
+                       | Actor -> "actor" | Module -> "module" | Object -> "object"
+                       | _ -> assert false) in
+      let named, x = xf sort _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+                    objblock s t (List.map share_dec_field efs) @? at _sloc)
+             @? at _sloc) @? at _sloc
+        else objblock s t efs @? at _sloc
+      in
+      let_or_exp named x e.it e.at )
+# 1972 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _4 : (unit option) = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2020 "mo_frontend/parser.ml"
+           in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 2029 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 865 "mo_frontend/parser.mly"
+    ( let sort = Type.(match s.it with
+                       | Actor -> "actor" | Module -> "module" | Object -> "object"
+                       | _ -> assert false) in
+      let named, x = xf sort _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+                    objblock s t (List.map share_dec_field efs) @? at _sloc)
+             @? at _sloc) @? at _sloc
+        else objblock s t efs @? at _sloc
+      in
+      let_or_exp named x e.it e.at )
+# 2052 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _4 : (unit option) = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 2101 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2116 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2122 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 2132 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 865 "mo_frontend/parser.mly"
+    ( let sort = Type.(match s.it with
+                       | Actor -> "actor" | Module -> "module" | Object -> "object"
+                       | _ -> assert false) in
+      let named, x = xf sort _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+                    objblock s t (List.map share_dec_field efs) @? at _sloc)
+             @? at _sloc) @? at _sloc
+        else objblock s t efs @? at _sloc
+      in
+      let_or_exp named x e.it e.at )
+# 2155 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = efs;
+          MenhirLib.EngineTypes.startp = _startpos_efs_;
+          MenhirLib.EngineTypes.endp = _endpos_efs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let efs : (Mo_def.Syntax.dec_field list) = Obj.magic efs in
+        let _4 : (unit option) = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_efs_ in
+        let _v =
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2203 "mo_frontend/parser.ml"
+           in
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 2212 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_efs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 865 "mo_frontend/parser.mly"
+    ( let sort = Type.(match s.it with
+                       | Actor -> "actor" | Module -> "module" | Object -> "object"
+                       | _ -> assert false) in
+      let named, x = xf sort _sloc in
+      let e =
+        if s.it = Type.Actor then
+          AwaitE
+            (Type.Fut,
+             AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc),
+                    objblock s t (List.map share_dec_field efs) @? at _sloc)
+             @? at _sloc) @? at _sloc
+        else objblock s t efs @? at _sloc
+      in
+      let_or_exp named x e.it e.at )
+# 2235 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 2284 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 2295 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 2300 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2311 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2317 "mo_frontend/parser.ml"
+            
+          in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2323 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2340 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 2410 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 2421 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 2426 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2437 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2443 "mo_frontend/parser.ml"
+            
+          in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2449 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2466 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _2;
+                          MenhirLib.EngineTypes.startp = _startpos__2_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 2543 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 2553 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2563 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2569 "mo_frontend/parser.ml"
+            
+          in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2575 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2592 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 2641 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 2646 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2652 "mo_frontend/parser.ml"
+           in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2657 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2674 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 2744 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 2749 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2755 "mo_frontend/parser.ml"
+           in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2760 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2777 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _2 : unit = Obj.magic _2 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__2_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 2853 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 2858 "mo_frontend/parser.ml"
+           in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 2863 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 2880 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 2947 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 2961 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 2966 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 2977 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 2983 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 2993 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3011 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 3099 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3113 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 3118 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3129 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3135 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 3145 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3163 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2;
+                          MenhirLib.EngineTypes.startp = _startpos__2_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 3258 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 3271 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3281 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3287 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 3297 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3315 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = qo;
+                    MenhirLib.EngineTypes.startp = _startpos_qo_;
+                    MenhirLib.EngineTypes.endp = _endpos_qo_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 3385 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 3390 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3396 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 3405 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3423 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = qo;
+                          MenhirLib.EngineTypes.startp = _startpos_qo_;
+                          MenhirLib.EngineTypes.endp = _endpos_qo_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3514 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 3519 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3525 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 3534 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3552 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 3649 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 3654 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 3663 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3681 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 3742 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 3755 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 3760 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3771 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3777 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 3784 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3793 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3811 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 3893 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 3906 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 3911 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 3922 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 3928 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 3935 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 3944 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 3962 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2;
+                          MenhirLib.EngineTypes.startp = _startpos__2_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 4051 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 4063 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 4073 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 4079 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 4086 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4095 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4113 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 4176 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 4181 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 4187 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 4193 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4202 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4220 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4304 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 4309 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 4315 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 4321 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4330 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4348 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 4438 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 4443 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 4449 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4458 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4476 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 4543 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 4557 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 4562 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 4573 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 4579 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 4586 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4595 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4613 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 4701 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 4715 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 4720 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 4731 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 4737 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 4744 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4753 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4771 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2;
+                          MenhirLib.EngineTypes.startp = _startpos__2_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2_inlined1;
+                              MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined2 : unit = Obj.magic _2_inlined2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 4866 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 4879 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 4889 "mo_frontend/parser.ml"
+              
+            in
+            
+# 346 "mo_frontend/parser.mly"
+          ( fun _ _ -> true, id )
+# 4895 "mo_frontend/parser.ml"
+            
+          in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 4902 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 4911 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 4929 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 4999 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 5004 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 5010 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 5016 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 5025 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 5043 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5134 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 5139 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 5145 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 5151 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 5160 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 5178 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = fb;
+          MenhirLib.EngineTypes.startp = _startpos_fb_;
+          MenhirLib.EngineTypes.endp = _endpos_fb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let fb : (bool * Mo_def.Syntax.exp) = Obj.magic fb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined2 : unit = Obj.magic _2_inlined2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_fb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 5275 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 347 "mo_frontend/parser.mly"
+                ( fun sort sloc -> false, anon_id sort (at sloc) @@ at sloc )
+# 5280 "mo_frontend/parser.ml"
+           in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 5286 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 5295 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_fb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            _startpos__2_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 881 "mo_frontend/parser.mly"
+    ( (* This is a hack to support local func declarations that return a computed async.
+         These should be defined using RHS syntax EQ e to avoid the implicit AsyncE introduction
+         around bodies declared as blocks *)
+      let named, x = xf "func" _sloc in
+      let is_sugar, e = desugar_func_body sp x t fb in
+      let_or_exp named x (func_exp x.it sp tps p t is_sugar e) (at _sloc) )
+# 5313 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 5362 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 5373 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 5378 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5389 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5395 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 5401 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5407 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5431 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 5501 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5512 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 5517 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5528 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5534 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 5540 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5546 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5570 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 5647 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 5657 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 5667 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 5673 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 5679 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5685 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5709 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 5758 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 5763 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 5769 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 5774 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5780 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5804 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 5874 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 5879 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 5885 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 5890 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 5896 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 5920 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _3 : unit = Obj.magic _3 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__3_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 5996 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 6001 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 6006 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6012 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6036 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 6091 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 6103 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 6108 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6119 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6125 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6136 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6142 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6149 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6173 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 6249 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 6261 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 6266 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6277 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6283 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6294 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6300 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6307 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6331 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 6414 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 6425 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6435 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6441 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6452 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6458 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6465 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6489 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 6545 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 6550 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 6556 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6566 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6572 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6579 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6603 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 6680 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 6685 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 6691 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6701 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6707 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6714 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6738 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 6821 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 6826 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 6836 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6842 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6849 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 6873 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 6928 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 6940 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 6945 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 6956 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 6962 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 6973 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 6979 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 6986 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7010 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 7086 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 7098 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 7103 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7114 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7120 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7131 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7137 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7144 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7168 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 7251 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 7262 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7272 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7278 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7289 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7295 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7302 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7326 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 7382 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 7387 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7393 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7403 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7409 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7416 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7440 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 7517 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 7522 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7528 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7538 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7544 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7551 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7575 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 7658 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 7663 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 7673 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7679 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7686 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7710 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 7765 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 7777 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 7782 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7793 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7799 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 7810 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7816 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7823 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 7847 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 7923 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 7935 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 7940 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 7951 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 7957 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 7968 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 7974 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 7981 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8005 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 8088 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 8099 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8109 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8115 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8126 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 8132 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 8139 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8163 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 8219 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 8224 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8230 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8240 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 8246 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 8253 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8277 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 8354 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 8359 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8365 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8375 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 8381 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 8388 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8412 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 8495 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 8500 "mo_frontend/parser.ml"
+           in
+          let s =
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 8510 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 8516 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let sp = 
+# 376 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 8523 "mo_frontend/parser.ml"
+           in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8547 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 8614 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 8628 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 8633 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8644 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8650 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8656 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 8666 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8691 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 8779 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 8793 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 8798 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8809 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8815 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8821 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 8831 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 8856 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 8951 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 8964 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 8974 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 8980 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 8986 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 8996 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9021 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = qo;
+                    MenhirLib.EngineTypes.startp = _startpos_qo_;
+                    MenhirLib.EngineTypes.endp = _endpos_qo_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 9091 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 9096 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 9102 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 9107 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 9117 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9142 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = qo;
+                          MenhirLib.EngineTypes.startp = _startpos_qo_;
+                          MenhirLib.EngineTypes.endp = _endpos_qo_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 9233 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 9238 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 9244 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 9249 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 9259 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9284 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 9381 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 9386 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 9391 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 9401 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9426 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 9499 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 9514 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 9519 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9530 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9536 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9548 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 9554 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 9565 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9590 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 9684 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 9699 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 9704 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9715 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9721 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9733 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 9739 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 9750 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9775 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _;
+                                MenhirLib.EngineTypes.semv = qo;
+                                MenhirLib.EngineTypes.startp = _startpos_qo_;
+                                MenhirLib.EngineTypes.endp = _endpos_qo_;
+                                MenhirLib.EngineTypes.next = {
+                                  MenhirLib.EngineTypes.state = _menhir_s;
+                                  MenhirLib.EngineTypes.semv = _1;
+                                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                                  MenhirLib.EngineTypes.next = _menhir_stack;
+                                };
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 9876 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 9890 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 9900 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 9906 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 9918 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 9924 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 9935 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 9960 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 10037 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 10042 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10048 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 10059 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 10065 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 10076 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10101 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 10199 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 10204 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10210 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 10221 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 10227 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 10238 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10263 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 10367 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 10372 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 10383 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 10389 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 10400 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10425 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 10498 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 10513 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 10518 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 10529 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 10535 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 10547 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 10553 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 10564 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10589 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 10683 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 10698 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 10703 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 10714 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 10720 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 10732 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 10738 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 10749 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10774 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _;
+                                MenhirLib.EngineTypes.semv = qo;
+                                MenhirLib.EngineTypes.startp = _startpos_qo_;
+                                MenhirLib.EngineTypes.endp = _endpos_qo_;
+                                MenhirLib.EngineTypes.next = {
+                                  MenhirLib.EngineTypes.state = _menhir_s;
+                                  MenhirLib.EngineTypes.semv = _1;
+                                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                                  MenhirLib.EngineTypes.next = _menhir_stack;
+                                };
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 10875 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 10889 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 10899 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 10905 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 10917 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 10923 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 10934 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 10959 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 11036 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 11041 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 11047 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 11058 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 11064 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 11075 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11100 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 11198 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 11203 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 11209 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 11220 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 11226 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 11237 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11262 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 11366 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 11371 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 11382 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 11388 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 11399 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11424 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 11497 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 11512 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 11517 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 11528 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 11534 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 11546 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 11552 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 11563 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11588 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 11682 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 11697 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 11702 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 11713 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 11719 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 11731 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 11737 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 11748 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11773 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _;
+                                MenhirLib.EngineTypes.semv = qo;
+                                MenhirLib.EngineTypes.startp = _startpos_qo_;
+                                MenhirLib.EngineTypes.endp = _endpos_qo_;
+                                MenhirLib.EngineTypes.next = {
+                                  MenhirLib.EngineTypes.state = _menhir_s;
+                                  MenhirLib.EngineTypes.semv = _1;
+                                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                                  MenhirLib.EngineTypes.next = _menhir_stack;
+                                };
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 11874 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 11888 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 11898 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 11904 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 11916 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 11922 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 11933 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 11958 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 12035 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 12040 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12046 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 12057 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 12063 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 12074 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12099 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = qo;
+                            MenhirLib.EngineTypes.startp = _startpos_qo_;
+                            MenhirLib.EngineTypes.endp = _endpos_qo_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 12197 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 12202 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12208 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 12219 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 12225 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 12236 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12261 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = qo;
+                              MenhirLib.EngineTypes.startp = _startpos_qo_;
+                              MenhirLib.EngineTypes.endp = _endpos_qo_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 12365 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12370 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 12381 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 12387 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 377 "mo_frontend/parser.mly"
+                                ( Type.Shared (Lib.Option.get qo Type.Write, op (at _sloc)) @@ at _sloc )
+# 12398 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12423 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 12484 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 12497 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 12502 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 12513 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 12519 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 12525 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 12532 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12541 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12566 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 12648 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 12661 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 12666 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 12677 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 12683 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 12689 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 12696 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12705 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12730 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 12819 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 12831 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 12841 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 12847 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 12853 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 12860 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12869 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 12894 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 12957 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 12962 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 12968 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 12973 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 12980 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 12989 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13014 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 13098 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 13103 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 13109 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 13114 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 13121 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13130 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13155 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 13245 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 13250 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 13255 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 13262 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13271 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13296 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 13363 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 13377 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 13382 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 13393 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 13399 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 13411 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 13417 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 13425 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13434 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13459 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 13547 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 13561 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 13566 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 13577 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 13583 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 13595 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 13601 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 13609 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13618 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13643 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 13738 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 13751 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 13761 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 13767 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 13779 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 13785 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 13793 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13802 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13827 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 13897 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 13902 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 13908 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 13919 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 13925 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 13933 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 13942 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 13967 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 14058 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 14063 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 14069 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 14080 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 14086 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 14094 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 14103 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 14128 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 14225 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 14230 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 14241 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 14247 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 14255 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 14264 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 14289 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 14356 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 14370 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 14375 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 14386 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 14392 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 14404 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 14410 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 14418 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 14427 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 14452 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 14540 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 14554 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 14559 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 14570 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 14576 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 14588 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 14594 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 14602 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 14611 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 14636 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 14731 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 14744 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 14754 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 14760 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 14772 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 14778 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 14786 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 14795 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 14820 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 14890 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 14895 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 14901 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 14912 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 14918 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 14926 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 14935 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 14960 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 15051 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 15056 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 15062 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 15073 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 15079 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 15087 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 15096 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 15121 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 15218 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 15223 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 15234 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 15240 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 15248 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 15257 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 15282 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 15349 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 15363 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 15368 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 15379 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 15385 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 15397 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 15403 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 15411 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 15420 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 15445 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 15533 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 15547 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 15552 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 15563 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 15569 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 15581 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 15587 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 15595 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 15604 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 15629 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 15724 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 15737 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 15747 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 15753 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 15765 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 15771 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 15779 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 15788 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 15813 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 15883 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 15888 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 15894 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 15905 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 15911 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 15919 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 15928 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 15953 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 16044 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 16049 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 16055 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 16066 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 16072 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 16080 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 16089 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 16114 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 16211 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 16216 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 16227 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 16233 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 16241 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 16250 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 16275 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 16342 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 16356 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 16361 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 16372 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 16378 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 16384 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 16391 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 16400 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 16425 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 16513 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 16527 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 16532 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 16543 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 16549 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 16555 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 16562 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 16571 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 16596 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 16691 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 16704 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 16714 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 16720 "mo_frontend/parser.ml"
+            
+          in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 16726 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 16733 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 16742 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 16767 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = op;
+                  MenhirLib.EngineTypes.startp = _startpos_op_;
+                  MenhirLib.EngineTypes.endp = _endpos_op_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 16837 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 16842 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 16848 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 16853 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 16860 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 16869 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 16894 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = op;
+                        MenhirLib.EngineTypes.startp = _startpos_op_;
+                        MenhirLib.EngineTypes.endp = _endpos_op_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _2;
+                          MenhirLib.EngineTypes.startp = _startpos__2_;
+                          MenhirLib.EngineTypes.endp = _endpos__2_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _menhir_s;
+                            MenhirLib.EngineTypes.semv = _1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_;
+                            MenhirLib.EngineTypes.next = _menhir_stack;
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 16985 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 16990 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 16996 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 17001 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 17008 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 17017 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 17042 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _3 : unit = Obj.magic _3 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 17139 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 17144 "mo_frontend/parser.ml"
+           in
+          let s = 
+# 363 "mo_frontend/parser.mly"
+                ( Type.Object @@ no_region )
+# 17149 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos_op_, _endpos_op_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 17156 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 17165 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 17190 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 17263 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 17278 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 17283 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 17294 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 17300 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 17312 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 17318 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 17326 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 17335 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 17360 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 17454 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 17469 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 17474 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 17485 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 17491 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 17503 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 17509 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 17517 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 17526 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 17551 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _;
+                                MenhirLib.EngineTypes.semv = _2;
+                                MenhirLib.EngineTypes.startp = _startpos__2_;
+                                MenhirLib.EngineTypes.endp = _endpos__2_;
+                                MenhirLib.EngineTypes.next = {
+                                  MenhirLib.EngineTypes.state = _menhir_s;
+                                  MenhirLib.EngineTypes.semv = _1;
+                                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                                  MenhirLib.EngineTypes.next = _menhir_stack;
+                                };
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 17652 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 17666 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 17676 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 17682 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 17694 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 17700 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 17708 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 17717 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 17742 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 17819 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 17824 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 17830 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 17841 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 17847 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 17855 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 17864 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 17889 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 17987 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 17992 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 17998 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 18009 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 18015 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 18023 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 18032 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 18057 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 18161 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 18166 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 18177 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 18183 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 18191 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 18200 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 18225 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 18298 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 18313 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 18318 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 18329 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 18335 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 18347 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 18353 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 18361 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 18370 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 18395 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 18489 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 18504 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 18509 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 18520 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 18526 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 18538 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 18544 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 18552 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 18561 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 18586 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _;
+                                MenhirLib.EngineTypes.semv = _2;
+                                MenhirLib.EngineTypes.startp = _startpos__2_;
+                                MenhirLib.EngineTypes.endp = _endpos__2_;
+                                MenhirLib.EngineTypes.next = {
+                                  MenhirLib.EngineTypes.state = _menhir_s;
+                                  MenhirLib.EngineTypes.semv = _1;
+                                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                                  MenhirLib.EngineTypes.next = _menhir_stack;
+                                };
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 18687 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 18701 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 18711 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 18717 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 18729 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 18735 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 18743 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 18752 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 18777 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 18854 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 18859 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 18865 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 18876 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 18882 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 18890 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 18899 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 18924 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 19022 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 19027 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 19033 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 19044 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 19050 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 19058 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 19067 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 19092 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 19196 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 19201 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 19212 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 19218 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 19226 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 19235 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 19260 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _3;
+                  MenhirLib.EngineTypes.startp = _startpos__3_;
+                  MenhirLib.EngineTypes.endp = _endpos__3_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = op;
+                      MenhirLib.EngineTypes.startp = _startpos_op_;
+                      MenhirLib.EngineTypes.endp = _endpos_op_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 19333 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 19348 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 19353 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 19364 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 19370 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 19382 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 19388 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 19396 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 19405 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 19430 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 19524 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 19539 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 19544 "mo_frontend/parser.ml"
+            
+          in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 19555 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 19561 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 19573 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 19579 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 19587 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 19596 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 19621 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _3;
+                          MenhirLib.EngineTypes.startp = _startpos__3_;
+                          MenhirLib.EngineTypes.endp = _endpos__3_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _1_inlined1;
+                            MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                            MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = op;
+                              MenhirLib.EngineTypes.startp = _startpos_op_;
+                              MenhirLib.EngineTypes.endp = _endpos_op_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _;
+                                MenhirLib.EngineTypes.semv = _2;
+                                MenhirLib.EngineTypes.startp = _startpos__2_;
+                                MenhirLib.EngineTypes.endp = _endpos__2_;
+                                MenhirLib.EngineTypes.next = {
+                                  MenhirLib.EngineTypes.state = _menhir_s;
+                                  MenhirLib.EngineTypes.semv = _1;
+                                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                                  MenhirLib.EngineTypes.next = _menhir_stack;
+                                };
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 19722 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 19736 "mo_frontend/parser.ml"
+           in
+          let xf =
+            let id =
+              let _endpos = _endpos_id_ in
+              let _symbolstartpos = _startpos_id_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 19746 "mo_frontend/parser.ml"
+              
+            in
+            
+# 350 "mo_frontend/parser.mly"
+              ( fun _ _ -> id )
+# 19752 "mo_frontend/parser.ml"
+            
+          in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 19764 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 19770 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 19778 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 19787 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 19812 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = op;
+                    MenhirLib.EngineTypes.startp = _startpos_op_;
+                    MenhirLib.EngineTypes.endp = _endpos_op_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 19889 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 19894 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 19900 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 19911 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 19917 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 19925 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 19934 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 19959 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__3_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__3_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined2;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _3;
+                      MenhirLib.EngineTypes.startp = _startpos__3_;
+                      MenhirLib.EngineTypes.endp = _endpos__3_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _1_inlined1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = op;
+                          MenhirLib.EngineTypes.startp = _startpos_op_;
+                          MenhirLib.EngineTypes.endp = _endpos_op_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = _2;
+                            MenhirLib.EngineTypes.startp = _startpos__2_;
+                            MenhirLib.EngineTypes.endp = _endpos__2_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _menhir_s;
+                              MenhirLib.EngineTypes.semv = _1;
+                              MenhirLib.EngineTypes.startp = _startpos__1_;
+                              MenhirLib.EngineTypes.endp = _endpos__1_;
+                              MenhirLib.EngineTypes.next = _menhir_stack;
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3_inlined1 : unit = Obj.magic _3_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 20057 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 20062 "mo_frontend/parser.ml"
+            
+          in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 20068 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 20079 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 20085 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 20093 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 20102 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 20127 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = cb;
+          MenhirLib.EngineTypes.startp = _startpos_cb_;
+          MenhirLib.EngineTypes.endp = _endpos_cb_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined2;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined2_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _3;
+                        MenhirLib.EngineTypes.startp = _startpos__3_;
+                        MenhirLib.EngineTypes.endp = _endpos__3_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _;
+                          MenhirLib.EngineTypes.semv = _1_inlined1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                          MenhirLib.EngineTypes.next = {
+                            MenhirLib.EngineTypes.state = _;
+                            MenhirLib.EngineTypes.semv = op;
+                            MenhirLib.EngineTypes.startp = _startpos_op_;
+                            MenhirLib.EngineTypes.endp = _endpos_op_;
+                            MenhirLib.EngineTypes.next = {
+                              MenhirLib.EngineTypes.state = _;
+                              MenhirLib.EngineTypes.semv = _2;
+                              MenhirLib.EngineTypes.startp = _startpos__2_;
+                              MenhirLib.EngineTypes.endp = _endpos__2_;
+                              MenhirLib.EngineTypes.next = {
+                                MenhirLib.EngineTypes.state = _menhir_s;
+                                MenhirLib.EngineTypes.semv = _1;
+                                MenhirLib.EngineTypes.startp = _startpos__1_;
+                                MenhirLib.EngineTypes.endp = _endpos__1_;
+                                MenhirLib.EngineTypes.next = _menhir_stack;
+                              };
+                            };
+                          };
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let cb : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) = Obj.magic cb in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined2 : unit = Obj.magic _1_inlined2 in
+        let _3 : unit = Obj.magic _3 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let op : (Source.region -> Mo_def.Syntax.pat) = Obj.magic op in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_cb_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 20231 "mo_frontend/parser.ml"
+           in
+          let xf = 
+# 351 "mo_frontend/parser.mly"
+                ( fun sort sloc -> anon_id sort (at sloc) @= at sloc )
+# 20236 "mo_frontend/parser.ml"
+           in
+          let s =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let s =
+              let _endpos = _endpos__1_ in
+              let _symbolstartpos = _startpos__1_ in
+              let _sloc = (_symbolstartpos, _endpos) in
+              
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 20247 "mo_frontend/parser.ml"
+              
+            in
+            
+# 364 "mo_frontend/parser.mly"
+               ( s )
+# 20253 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+          let sp =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 20261 "mo_frontend/parser.ml"
+             in
+            let _startpos_q_ = _startpos__1_ in
+            let _endpos = _endpos_op_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 378 "mo_frontend/parser.mly"
+                       ( Type.Shared (q, op (at _sloc)) @@ at _sloc )
+# 20270 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_sp_, _startpos_sp_) = (_endpos_op_, _startpos__1_) in
+          let _endpos = _endpos_cb_ in
+          let _symbolstartpos = if _startpos_sp_ != _endpos_sp_ then
+            _startpos_sp_
+          else
+            if _startpos_s_ != _endpos_s_ then
+              _startpos_s_
+            else
+              _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 889 "mo_frontend/parser.mly"
+    ( let x, dfs = cb in
+      let dfs', tps', t' =
+        if s.it = Type.Actor then
+          (List.map share_dec_field dfs,
+     ensure_scope_bind "" tps,
+           (* Not declared async: insert AsyncT but deprecate in typing *)
+     ensure_async_typ t)
+        else (dfs, tps, t)
+      in
+      ClassD(sp, xf "class" _sloc, tps', p, t', s, x, dfs') @? at _sloc )
+# 20295 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 20344 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 20358 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 856 "mo_frontend/parser.mly"
+    ( VarD(x, annot_exp e t) @? at _sloc )
+# 20367 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 743 "mo_frontend/parser.mly"
+    ( e )
+# 20393 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 745 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 20422 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 743 "mo_frontend/parser.mly"
+    ( e )
+# 20448 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 745 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 20477 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 647 "mo_frontend/parser.mly"
+    ( e )
+# 20503 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 515 "mo_frontend/parser.mly"
+          ( AddOp )
+# 20543 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20551 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 516 "mo_frontend/parser.mly"
+          ( SubOp )
+# 20592 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20600 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 517 "mo_frontend/parser.mly"
+          ( MulOp )
+# 20641 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20649 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 518 "mo_frontend/parser.mly"
+          ( DivOp )
+# 20690 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20698 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 519 "mo_frontend/parser.mly"
+          ( ModOp )
+# 20739 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20747 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 520 "mo_frontend/parser.mly"
+          ( PowOp )
+# 20788 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20796 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 521 "mo_frontend/parser.mly"
+              ( WAddOp )
+# 20837 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20845 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 522 "mo_frontend/parser.mly"
+              ( WSubOp )
+# 20886 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20894 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 523 "mo_frontend/parser.mly"
+              ( WMulOp )
+# 20935 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20943 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 524 "mo_frontend/parser.mly"
+              ( WPowOp )
+# 20984 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 20992 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 525 "mo_frontend/parser.mly"
+          ( AndOp )
+# 21033 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21041 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 526 "mo_frontend/parser.mly"
+          ( OrOp )
+# 21082 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21090 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 527 "mo_frontend/parser.mly"
+          ( XorOp )
+# 21131 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21139 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 528 "mo_frontend/parser.mly"
+          ( ShLOp )
+# 21180 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21188 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 529 "mo_frontend/parser.mly"
+          ( ShROp )
+# 21229 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21237 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 530 "mo_frontend/parser.mly"
+           ( RotLOp )
+# 21278 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21286 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 531 "mo_frontend/parser.mly"
+           ( RotROp )
+# 21327 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21335 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 532 "mo_frontend/parser.mly"
+         ( CatOp )
+# 21376 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21384 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 535 "mo_frontend/parser.mly"
+          ( EqOp )
+# 21425 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21433 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 536 "mo_frontend/parser.mly"
+          ( NeqOp )
+# 21474 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21482 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 537 "mo_frontend/parser.mly"
+          ( LtOp )
+# 21523 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21531 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 538 "mo_frontend/parser.mly"
+          ( LeOp )
+# 21572 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21580 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 539 "mo_frontend/parser.mly"
+          ( GtOp )
+# 21621 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21629 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 540 "mo_frontend/parser.mly"
+          ( GeOp )
+# 21670 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21678 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 653 "mo_frontend/parser.mly"
+    ( AndE(e1, e2) @? at _sloc )
+# 21722 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 655 "mo_frontend/parser.mly"
+    ( OrE(e1, e2) @? at _sloc )
+# 21766 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 657 "mo_frontend/parser.mly"
+    ( AnnotE(e, t) @? at _sloc )
+# 21810 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 659 "mo_frontend/parser.mly"
+    ( let x = "_" @@ e1.at in
+      BlockE [
+        LetD (VarP x @! x.at, e1, None) @? e1.at;
+        ExpD e2 @? e2.at
+      ] @? at _sloc )
+# 21858 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 36 "mo_frontend/assertions.mly"
+    ( ImpliesE(e1, e2) @? at _sloc )
+# 21902 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 647 "mo_frontend/parser.mly"
+    ( e )
+# 21928 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 515 "mo_frontend/parser.mly"
+          ( AddOp )
+# 21968 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 21976 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 516 "mo_frontend/parser.mly"
+          ( SubOp )
+# 22017 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22025 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 517 "mo_frontend/parser.mly"
+          ( MulOp )
+# 22066 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22074 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 518 "mo_frontend/parser.mly"
+          ( DivOp )
+# 22115 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22123 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 519 "mo_frontend/parser.mly"
+          ( ModOp )
+# 22164 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22172 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 520 "mo_frontend/parser.mly"
+          ( PowOp )
+# 22213 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22221 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 521 "mo_frontend/parser.mly"
+              ( WAddOp )
+# 22262 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22270 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 522 "mo_frontend/parser.mly"
+              ( WSubOp )
+# 22311 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22319 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 523 "mo_frontend/parser.mly"
+              ( WMulOp )
+# 22360 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22368 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 524 "mo_frontend/parser.mly"
+              ( WPowOp )
+# 22409 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22417 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 525 "mo_frontend/parser.mly"
+          ( AndOp )
+# 22458 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22466 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 526 "mo_frontend/parser.mly"
+          ( OrOp )
+# 22507 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22515 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 527 "mo_frontend/parser.mly"
+          ( XorOp )
+# 22556 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22564 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 528 "mo_frontend/parser.mly"
+          ( ShLOp )
+# 22605 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22613 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 529 "mo_frontend/parser.mly"
+          ( ShROp )
+# 22654 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22662 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 530 "mo_frontend/parser.mly"
+           ( RotLOp )
+# 22703 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22711 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 531 "mo_frontend/parser.mly"
+           ( RotROp )
+# 22752 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22760 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 532 "mo_frontend/parser.mly"
+         ( CatOp )
+# 22801 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 649 "mo_frontend/parser.mly"
+    ( BinE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22809 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 535 "mo_frontend/parser.mly"
+          ( EqOp )
+# 22850 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22858 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 536 "mo_frontend/parser.mly"
+          ( NeqOp )
+# 22899 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22907 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 537 "mo_frontend/parser.mly"
+          ( LtOp )
+# 22948 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 22956 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 538 "mo_frontend/parser.mly"
+          ( LeOp )
+# 22997 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 23005 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 539 "mo_frontend/parser.mly"
+          ( GtOp )
+# 23046 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 23054 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 540 "mo_frontend/parser.mly"
+          ( GeOp )
+# 23095 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 651 "mo_frontend/parser.mly"
+    ( RelE(ref Type.Pre, e1, op, e2) @? at _sloc )
+# 23103 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 653 "mo_frontend/parser.mly"
+    ( AndE(e1, e2) @? at _sloc )
+# 23147 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 655 "mo_frontend/parser.mly"
+    ( OrE(e1, e2) @? at _sloc )
+# 23191 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 657 "mo_frontend/parser.mly"
+    ( AnnotE(e, t) @? at _sloc )
+# 23235 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 659 "mo_frontend/parser.mly"
+    ( let x = "_" @@ e1.at in
+      BlockE [
+        LetD (VarP x @! x.at, e1, None) @? e1.at;
+        ExpD e2 @? e2.at
+      ] @? at _sloc )
+# 23283 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 36 "mo_frontend/assertions.mly"
+    ( ImpliesE(e1, e2) @? at _sloc )
+# 23327 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 23356 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23369 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 23376 "mo_frontend/parser.ml"
+           in
+          let (_endpos_m_, _startpos_m_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 766 "mo_frontend/parser.mly"
+    ( let e = VarE(x.it @@ x.at) @? x.at in
+      { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 23389 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 23424 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23438 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 23449 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_m_, _startpos_m_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 766 "mo_frontend/parser.mly"
+    ( let e = VarE(x.it @@ x.at) @? x.at in
+      { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 23463 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 23506 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23519 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 23526 "mo_frontend/parser.ml"
+           in
+          let (_endpos_m_, _startpos_m_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 769 "mo_frontend/parser.mly"
+    ( { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 23538 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 23587 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 23601 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let m =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 23612 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_m_, _startpos_m_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = if _startpos_m_ != _endpos_m_ then
+            _startpos_m_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 769 "mo_frontend/parser.mly"
+    ( { mut = m; id = x; exp = annot_exp e t; } @@ at _sloc )
+# 23625 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 750 "mo_frontend/parser.mly"
+    ( e )
+# 23651 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 750 "mo_frontend/parser.mly"
+    ( e )
+# 23676 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 668 "mo_frontend/parser.mly"
+    ( e )
+# 23701 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 670 "mo_frontend/parser.mly"
+    ( AssignE(e1, e2) @? at _sloc)
+# 23744 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 548 "mo_frontend/parser.mly"
+               ( AddOp )
+# 23785 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 23793 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 549 "mo_frontend/parser.mly"
+                ( SubOp )
+# 23834 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 23842 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 550 "mo_frontend/parser.mly"
+              ( MulOp )
+# 23883 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 23891 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 551 "mo_frontend/parser.mly"
+              ( DivOp )
+# 23932 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 23940 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 552 "mo_frontend/parser.mly"
+              ( ModOp )
+# 23981 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 23989 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 553 "mo_frontend/parser.mly"
+              ( PowOp )
+# 24030 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24038 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 554 "mo_frontend/parser.mly"
+                  ( WAddOp )
+# 24079 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24087 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 555 "mo_frontend/parser.mly"
+                  ( WSubOp )
+# 24128 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24136 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 556 "mo_frontend/parser.mly"
+                  ( WMulOp )
+# 24177 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24185 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 557 "mo_frontend/parser.mly"
+                  ( WPowOp )
+# 24226 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24234 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 558 "mo_frontend/parser.mly"
+              ( AndOp )
+# 24275 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24283 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 559 "mo_frontend/parser.mly"
+             ( OrOp )
+# 24324 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24332 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 560 "mo_frontend/parser.mly"
+              ( XorOp )
+# 24373 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24381 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 561 "mo_frontend/parser.mly"
+              ( ShLOp )
+# 24422 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24430 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 562 "mo_frontend/parser.mly"
+              ( ShROp )
+# 24471 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24479 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 563 "mo_frontend/parser.mly"
+               ( RotLOp )
+# 24520 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24528 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 564 "mo_frontend/parser.mly"
+               ( RotROp )
+# 24569 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24577 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 565 "mo_frontend/parser.mly"
+              ( CatOp )
+# 24618 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 24626 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 674 "mo_frontend/parser.mly"
+    ( RetE(TupE([]) @? at _sloc) @? at _sloc )
+# 24656 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 676 "mo_frontend/parser.mly"
+    ( RetE(e) @? at _sloc )
+# 24693 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 678 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 24730 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 680 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Cmp, scope_bind (anon_id "async*" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 24767 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 682 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Fut, e) @? at _sloc )
+# 24804 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 684 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Cmp, e) @? at _sloc )
+# 24841 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 686 "mo_frontend/parser.mly"
+    ( AssertE(Runtime, e) @? at _sloc )
+# 24878 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = rt;
+            MenhirLib.EngineTypes.startp = _startpos_rt_;
+            MenhirLib.EngineTypes.endp = _endpos_rt_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let rt : (Mo_def.Syntax.typ option) = Obj.magic rt in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 24920 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 24934 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 688 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      let unit () = TupT [] @! at _sloc in
+      let e' =
+        match e.it with
+        | WhileE (e1, e2) -> WhileE (e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | LoopE (e1, eo) -> LoopE (LabelE (x', unit (), e1) @? e1.at, eo) @? e.at
+        | ForE (p, e1, e2) -> ForE (p, e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | _ -> e
+      in
+      LabelE(x, Lib.Option.get rt (unit ()), e') @? at _sloc )
+# 24952 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = eo;
+          MenhirLib.EngineTypes.startp = _startpos_eo_;
+          MenhirLib.EngineTypes.endp = _endpos_eo_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let eo : (Mo_def.Syntax.exp option) = Obj.magic eo in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 24987 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_eo_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25001 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_eo_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 699 "mo_frontend/parser.mly"
+    ( let e = Lib.Option.get eo (TupE([]) @? at _sloc) in
+      BreakE(x, e) @? at _sloc )
+# 25011 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 25039 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 25053 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 702 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      BreakE(x', TupE([]) @? no_region) @? at _sloc )
+# 25064 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 705 "mo_frontend/parser.mly"
+    ( DebugE(e) @? at _sloc )
+# 25101 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e1;
+          MenhirLib.EngineTypes.startp = _startpos_e1_;
+          MenhirLib.EngineTypes.endp = _endpos_e1_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = b;
+            MenhirLib.EngineTypes.startp = _startpos_b_;
+            MenhirLib.EngineTypes.endp = _endpos_b_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e1_ in
+        let _v =
+          let _endpos = _endpos_e1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 707 "mo_frontend/parser.mly"
+    ( IfE(b, e1, TupE([]) @? at _sloc) @? at _sloc )
+# 25145 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = b;
+                MenhirLib.EngineTypes.startp = _startpos_b_;
+                MenhirLib.EngineTypes.endp = _endpos_b_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 709 "mo_frontend/parser.mly"
+    ( IfE(b, e1, e2) @? at _sloc )
+# 25203 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let c : (Mo_def.Syntax.case) = Obj.magic c in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_c_ in
+        let _v =
+          let _endpos = _endpos_c_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 711 "mo_frontend/parser.mly"
+    ( TryE(e1, [c]) @? at _sloc )
+# 25247 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 717 "mo_frontend/parser.mly"
+    ( ThrowE(e) @? at _sloc )
+# 25284 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = cs;
+            MenhirLib.EngineTypes.startp = _startpos_cs_;
+            MenhirLib.EngineTypes.endp = _endpos_cs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e;
+                MenhirLib.EngineTypes.startp = _startpos_e_;
+                MenhirLib.EngineTypes.endp = _endpos_e_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let cs : (Mo_def.Syntax.case list) = Obj.magic cs in
+        let _3 : unit = Obj.magic _3 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 719 "mo_frontend/parser.mly"
+    ( SwitchE(e, cs) @? at _sloc )
+# 25342 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 721 "mo_frontend/parser.mly"
+    ( WhileE(e1, e2) @? at _sloc )
+# 25386 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 723 "mo_frontend/parser.mly"
+    ( LoopE(e, None) @? at _sloc )
+# 25423 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _3 : unit = Obj.magic _3 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 725 "mo_frontend/parser.mly"
+    ( LoopE(e1, Some e2) @? at _sloc )
+# 25474 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _6;
+            MenhirLib.EngineTypes.startp = _startpos__6_;
+            MenhirLib.EngineTypes.endp = _endpos__6_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = p;
+                  MenhirLib.EngineTypes.startp = _startpos_p_;
+                  MenhirLib.EngineTypes.endp = _endpos_p_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _6 : unit = Obj.magic _6 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _4 : unit = Obj.magic _4 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 727 "mo_frontend/parser.mly"
+    ( ForE(p, e1, e2) @? at _sloc )
+# 25546 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 729 "mo_frontend/parser.mly"
+    ( IgnoreE(e) @? at _sloc )
+# 25583 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 731 "mo_frontend/parser.mly"
+    ( e )
+# 25616 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 733 "mo_frontend/parser.mly"
+    ( DoOptE(e) @? at _sloc )
+# 25659 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 40 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Static, e) @? at _sloc )
+# 25710 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 42 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Invariant, e) @? at _sloc )
+# 25761 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 44 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Precondition, e) @? at _sloc )
+# 25812 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 46 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Postcondition, e) @? at _sloc )
+# 25863 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _5;
+            MenhirLib.EngineTypes.startp = _startpos__5_;
+            MenhirLib.EngineTypes.endp = _endpos__5_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = s;
+                MenhirLib.EngineTypes.startp = _startpos_s_;
+                MenhirLib.EngineTypes.endp = _endpos_s_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _5 : unit = Obj.magic _5 in
+        let _4 : unit = Obj.magic _4 in
+        let s : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 25918 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 48 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Concurrency s, e) @? at _sloc )
+# 25932 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 50 "mo_frontend/assertions.mly"
+    ( is_verification () &&& OldE e @? at _sloc )
+# 25969 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 668 "mo_frontend/parser.mly"
+    ( e )
+# 25995 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 670 "mo_frontend/parser.mly"
+    ( AssignE(e1, e2) @? at _sloc)
+# 26038 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 548 "mo_frontend/parser.mly"
+               ( AddOp )
+# 26079 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26087 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 549 "mo_frontend/parser.mly"
+                ( SubOp )
+# 26128 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26136 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 550 "mo_frontend/parser.mly"
+              ( MulOp )
+# 26177 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26185 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 551 "mo_frontend/parser.mly"
+              ( DivOp )
+# 26226 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26234 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 552 "mo_frontend/parser.mly"
+              ( ModOp )
+# 26275 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26283 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 553 "mo_frontend/parser.mly"
+              ( PowOp )
+# 26324 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26332 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 554 "mo_frontend/parser.mly"
+                  ( WAddOp )
+# 26373 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26381 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 555 "mo_frontend/parser.mly"
+                  ( WSubOp )
+# 26422 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26430 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 556 "mo_frontend/parser.mly"
+                  ( WMulOp )
+# 26471 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26479 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 557 "mo_frontend/parser.mly"
+                  ( WPowOp )
+# 26520 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26528 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 558 "mo_frontend/parser.mly"
+              ( AndOp )
+# 26569 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26577 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 559 "mo_frontend/parser.mly"
+             ( OrOp )
+# 26618 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26626 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 560 "mo_frontend/parser.mly"
+              ( XorOp )
+# 26667 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26675 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 561 "mo_frontend/parser.mly"
+              ( ShLOp )
+# 26716 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26724 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 562 "mo_frontend/parser.mly"
+              ( ShROp )
+# 26765 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26773 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 563 "mo_frontend/parser.mly"
+               ( RotLOp )
+# 26814 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26822 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 564 "mo_frontend/parser.mly"
+               ( RotROp )
+# 26863 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26871 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _1 : unit = Obj.magic _1 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let op = 
+# 565 "mo_frontend/parser.mly"
+              ( CatOp )
+# 26912 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 672 "mo_frontend/parser.mly"
+    ( assign_op e1 (fun e1' -> BinE(ref Type.Pre, e1', op, e2) @? at _sloc) (at _sloc) )
+# 26920 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 674 "mo_frontend/parser.mly"
+    ( RetE(TupE([]) @? at _sloc) @? at _sloc )
+# 26950 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 676 "mo_frontend/parser.mly"
+    ( RetE(e) @? at _sloc )
+# 26987 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 678 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Fut, scope_bind (anon_id "async" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 27024 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 680 "mo_frontend/parser.mly"
+    ( AsyncE(Type.Cmp, scope_bind (anon_id "async*" (at _sloc)) (at _sloc), e) @? at _sloc )
+# 27061 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 682 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Fut, e) @? at _sloc )
+# 27098 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 684 "mo_frontend/parser.mly"
+    ( AwaitE(Type.Cmp, e) @? at _sloc )
+# 27135 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 686 "mo_frontend/parser.mly"
+    ( AssertE(Runtime, e) @? at _sloc )
+# 27172 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = rt;
+            MenhirLib.EngineTypes.startp = _startpos_rt_;
+            MenhirLib.EngineTypes.endp = _endpos_rt_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let rt : (Mo_def.Syntax.typ option) = Obj.magic rt in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 27214 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 27228 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 688 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      let unit () = TupT [] @! at _sloc in
+      let e' =
+        match e.it with
+        | WhileE (e1, e2) -> WhileE (e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | LoopE (e1, eo) -> LoopE (LabelE (x', unit (), e1) @? e1.at, eo) @? e.at
+        | ForE (p, e1, e2) -> ForE (p, e1, LabelE (x', unit (), e2) @? e2.at) @? e.at
+        | _ -> e
+      in
+      LabelE(x, Lib.Option.get rt (unit ()), e') @? at _sloc )
+# 27246 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = eo;
+          MenhirLib.EngineTypes.startp = _startpos_eo_;
+          MenhirLib.EngineTypes.endp = _endpos_eo_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let eo : (Mo_def.Syntax.exp option) = Obj.magic eo in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 27281 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_eo_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 27295 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_eo_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 699 "mo_frontend/parser.mly"
+    ( let e = Lib.Option.get eo (TupE([]) @? at _sloc) in
+      BreakE(x, e) @? at _sloc )
+# 27305 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 27333 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 27347 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 702 "mo_frontend/parser.mly"
+    ( let x' = ("continue " ^ x.it) @@ x.at in
+      BreakE(x', TupE([]) @? no_region) @? at _sloc )
+# 27358 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 705 "mo_frontend/parser.mly"
+    ( DebugE(e) @? at _sloc )
+# 27395 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e1;
+          MenhirLib.EngineTypes.startp = _startpos_e1_;
+          MenhirLib.EngineTypes.endp = _endpos_e1_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = b;
+            MenhirLib.EngineTypes.startp = _startpos_b_;
+            MenhirLib.EngineTypes.endp = _endpos_b_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e1_ in
+        let _v =
+          let _endpos = _endpos_e1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 707 "mo_frontend/parser.mly"
+    ( IfE(b, e1, TupE([]) @? at _sloc) @? at _sloc )
+# 27439 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = b;
+                MenhirLib.EngineTypes.startp = _startpos_b_;
+                MenhirLib.EngineTypes.endp = _endpos_b_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let b : (Mo_def.Syntax.exp) = Obj.magic b in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 709 "mo_frontend/parser.mly"
+    ( IfE(b, e1, e2) @? at _sloc )
+# 27497 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let c : (Mo_def.Syntax.case) = Obj.magic c in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_c_ in
+        let _v =
+          let _endpos = _endpos_c_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 711 "mo_frontend/parser.mly"
+    ( TryE(e1, [c]) @? at _sloc )
+# 27541 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 717 "mo_frontend/parser.mly"
+    ( ThrowE(e) @? at _sloc )
+# 27578 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = cs;
+            MenhirLib.EngineTypes.startp = _startpos_cs_;
+            MenhirLib.EngineTypes.endp = _endpos_cs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e;
+                MenhirLib.EngineTypes.startp = _startpos_e_;
+                MenhirLib.EngineTypes.endp = _endpos_e_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let cs : (Mo_def.Syntax.case list) = Obj.magic cs in
+        let _3 : unit = Obj.magic _3 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 719 "mo_frontend/parser.mly"
+    ( SwitchE(e, cs) @? at _sloc )
+# 27636 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 721 "mo_frontend/parser.mly"
+    ( WhileE(e1, e2) @? at _sloc )
+# 27680 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 723 "mo_frontend/parser.mly"
+    ( LoopE(e, None) @? at _sloc )
+# 27717 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _3 : unit = Obj.magic _3 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 725 "mo_frontend/parser.mly"
+    ( LoopE(e1, Some e2) @? at _sloc )
+# 27768 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _6;
+            MenhirLib.EngineTypes.startp = _startpos__6_;
+            MenhirLib.EngineTypes.endp = _endpos__6_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4;
+                MenhirLib.EngineTypes.startp = _startpos__4_;
+                MenhirLib.EngineTypes.endp = _endpos__4_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = p;
+                  MenhirLib.EngineTypes.startp = _startpos_p_;
+                  MenhirLib.EngineTypes.endp = _endpos_p_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _6 : unit = Obj.magic _6 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _4 : unit = Obj.magic _4 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 727 "mo_frontend/parser.mly"
+    ( ForE(p, e1, e2) @? at _sloc )
+# 27840 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 729 "mo_frontend/parser.mly"
+    ( IgnoreE(e) @? at _sloc )
+# 27877 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 731 "mo_frontend/parser.mly"
+    ( e )
+# 27910 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 733 "mo_frontend/parser.mly"
+    ( DoOptE(e) @? at _sloc )
+# 27953 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 40 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Static, e) @? at _sloc )
+# 28004 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 42 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Invariant, e) @? at _sloc )
+# 28055 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 44 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Precondition, e) @? at _sloc )
+# 28106 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 46 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Postcondition, e) @? at _sloc )
+# 28157 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _5;
+            MenhirLib.EngineTypes.startp = _startpos__5_;
+            MenhirLib.EngineTypes.endp = _endpos__5_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = s;
+                MenhirLib.EngineTypes.startp = _startpos_s_;
+                MenhirLib.EngineTypes.endp = _endpos_s_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _5 : unit = Obj.magic _5 in
+        let _4 : unit = Obj.magic _4 in
+        let s : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 28212 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 48 "mo_frontend/assertions.mly"
+    ( is_verification () &&& AssertE(Concurrency s, e) @? at _sloc )
+# 28226 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 50 "mo_frontend/assertions.mly"
+    ( is_verification () &&& OldE e @? at _sloc )
+# 28263 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 737 "mo_frontend/parser.mly"
+    ( e )
+# 28289 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 739 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 28318 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 737 "mo_frontend/parser.mly"
+    ( e )
+# 28344 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = d;
+          MenhirLib.EngineTypes.startp = _startpos_d_;
+          MenhirLib.EngineTypes.endp = _endpos_d_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let d : (Mo_def.Syntax.dec) = Obj.magic d in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_d_ in
+        let _endpos = _endpos_d_ in
+        let _v =
+          let _endpos = _endpos_d_ in
+          let _symbolstartpos = _startpos_d_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 739 "mo_frontend/parser.mly"
+    ( match d.it with ExpD e -> e | _ -> BlockE([d]) @? at _sloc )
+# 28373 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 588 "mo_frontend/parser.mly"
+    ( e )
+# 28399 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 588 "mo_frontend/parser.mly"
+    ( e )
+# 28424 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 28445 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 28458 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 590 "mo_frontend/parser.mly"
+    ( VarE(x) @? at _sloc )
+# 28468 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 28496 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 592 "mo_frontend/parser.mly"
+    ( PrimE(s) @? at _sloc )
+# 28509 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 594 "mo_frontend/parser.mly"
+    ( VarE ("_" @@ at _sloc) @? at _sloc )
+# 28539 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 588 "mo_frontend/parser.mly"
+    ( e )
+# 28565 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 588 "mo_frontend/parser.mly"
+    ( e )
+# 28590 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 28611 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 28624 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 590 "mo_frontend/parser.mly"
+    ( VarE(x) @? at _sloc )
+# 28634 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 28662 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 592 "mo_frontend/parser.mly"
+    ( PrimE(s) @? at _sloc )
+# 28675 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 594 "mo_frontend/parser.mly"
+    ( VarE ("_" @@ at _sloc) @? at _sloc )
+# 28705 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = efs;
+            MenhirLib.EngineTypes.startp = _startpos_efs_;
+            MenhirLib.EngineTypes.endp = _endpos_efs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let efs : (Mo_def.Syntax.exp_field list) = Obj.magic efs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 573 "mo_frontend/parser.mly"
+    ( ObjE ([], efs) @? at _sloc )
+# 28749 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = bases;
+            MenhirLib.EngineTypes.startp = _startpos_bases_;
+            MenhirLib.EngineTypes.endp = _endpos_bases_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = base;
+                MenhirLib.EngineTypes.startp = _startpos_base_;
+                MenhirLib.EngineTypes.endp = _endpos_base_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let bases : (Mo_def.Syntax.exp list) = Obj.magic bases in
+        let _3 : unit = Obj.magic _3 in
+        let base : (Mo_def.Syntax.exp) = Obj.magic base in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 575 "mo_frontend/parser.mly"
+    ( ObjE (base :: bases, []) @? at _sloc )
+# 28807 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _5;
+          MenhirLib.EngineTypes.startp = _startpos__5_;
+          MenhirLib.EngineTypes.endp = _endpos__5_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = efs;
+            MenhirLib.EngineTypes.startp = _startpos_efs_;
+            MenhirLib.EngineTypes.endp = _endpos_efs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = bases;
+                MenhirLib.EngineTypes.startp = _startpos_bases_;
+                MenhirLib.EngineTypes.endp = _endpos_bases_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _5 : unit = Obj.magic _5 in
+        let efs : (Mo_def.Syntax.exp_field list) = Obj.magic efs in
+        let _3 : unit = Obj.magic _3 in
+        let bases : (Mo_def.Syntax.exp list) = Obj.magic bases in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__5_ in
+        let _v =
+          let _endpos = _endpos__5_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 577 "mo_frontend/parser.mly"
+    ( ObjE (bases, efs) @? at _sloc )
+# 28865 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_l_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_l_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 581 "mo_frontend/parser.mly"
+    ( LitE(ref l) @? at _sloc )
+# 28895 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 583 "mo_frontend/parser.mly"
+    ( match es with [e] -> e | _ -> TupE(es) @? at _sloc )
+# 28939 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 598 "mo_frontend/parser.mly"
+    ( e )
+# 28965 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 29005 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 600 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 29013 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _1_inlined1;
+              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 29066 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 600 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 29075 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e2;
+            MenhirLib.EngineTypes.startp = _startpos_e2_;
+            MenhirLib.EngineTypes.endp = _endpos_e2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 602 "mo_frontend/parser.mly"
+    ( IdxE(e1, e2) @? at _sloc )
+# 29126 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e;
+            MenhirLib.EngineTypes.startp = _startpos_e_;
+            MenhirLib.EngineTypes.endp = _endpos_e_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 233 "mo_frontend/parser.mly"
+      (string)
+# 29154 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 604 "mo_frontend/parser.mly"
+    ( ProjE (e, int_of_string s) @? at _sloc )
+# 29167 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 29201 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29216 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 606 "mo_frontend/parser.mly"
+    ( DotE(e, x) @? at _sloc )
+# 29226 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = inst;
+            MenhirLib.EngineTypes.startp = _startpos_inst_;
+            MenhirLib.EngineTypes.endp = _endpos_inst_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let inst : (Mo_def.Syntax.inst) = Obj.magic inst in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 608 "mo_frontend/parser.mly"
+    ( CallE(e1, inst, e2) @? at _sloc )
+# 29270 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _2;
+          MenhirLib.EngineTypes.startp = _startpos__2_;
+          MenhirLib.EngineTypes.endp = _endpos__2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__2_ in
+        let _v =
+          let _endpos = _endpos__2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 610 "mo_frontend/parser.mly"
+    ( BangE(e1) @? at _sloc )
+# 29307 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _6;
+          MenhirLib.EngineTypes.startp = _startpos__6_;
+          MenhirLib.EngineTypes.endp = _endpos__6_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _6 : unit = Obj.magic _6 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 29360 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__6_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29377 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__6_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 612 "mo_frontend/parser.mly"
+    ( DotE(
+        DotE(e1, "system" @@ at (_startpos__1_,_endpos__1_)) @? at _sloc,
+        x) @? at _sloc )
+# 29388 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 598 "mo_frontend/parser.mly"
+    ( e )
+# 29414 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 29454 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 600 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 29462 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _1_inlined1;
+              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 29515 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 600 "mo_frontend/parser.mly"
+    ( ArrayE(m, es) @? at _sloc )
+# 29524 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = e2;
+            MenhirLib.EngineTypes.startp = _startpos_e2_;
+            MenhirLib.EngineTypes.endp = _endpos_e2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 602 "mo_frontend/parser.mly"
+    ( IdxE(e1, e2) @? at _sloc )
+# 29575 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e;
+            MenhirLib.EngineTypes.startp = _startpos_e_;
+            MenhirLib.EngineTypes.endp = _endpos_e_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 233 "mo_frontend/parser.mly"
+      (string)
+# 29603 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 604 "mo_frontend/parser.mly"
+    ( ProjE (e, int_of_string s) @? at _sloc )
+# 29616 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e;
+              MenhirLib.EngineTypes.startp = _startpos_e_;
+              MenhirLib.EngineTypes.endp = _endpos_e_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 29650 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29665 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_e_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 606 "mo_frontend/parser.mly"
+    ( DotE(e, x) @? at _sloc )
+# 29675 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e2;
+          MenhirLib.EngineTypes.startp = _startpos_e2_;
+          MenhirLib.EngineTypes.endp = _endpos_e2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = inst;
+            MenhirLib.EngineTypes.startp = _startpos_inst_;
+            MenhirLib.EngineTypes.endp = _endpos_inst_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = e1;
+              MenhirLib.EngineTypes.startp = _startpos_e1_;
+              MenhirLib.EngineTypes.endp = _endpos_e1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e2 : (Mo_def.Syntax.exp) = Obj.magic e2 in
+        let inst : (Mo_def.Syntax.inst) = Obj.magic inst in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos_e2_ in
+        let _v =
+          let _endpos = _endpos_e2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 608 "mo_frontend/parser.mly"
+    ( CallE(e1, inst, e2) @? at _sloc )
+# 29719 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _2;
+          MenhirLib.EngineTypes.startp = _startpos__2_;
+          MenhirLib.EngineTypes.endp = _endpos__2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = e1;
+            MenhirLib.EngineTypes.startp = _startpos_e1_;
+            MenhirLib.EngineTypes.endp = _endpos_e1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let _2 : unit = Obj.magic _2 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e1_ in
+        let _endpos = _endpos__2_ in
+        let _v =
+          let _endpos = _endpos__2_ in
+          let _symbolstartpos = _startpos_e1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 610 "mo_frontend/parser.mly"
+    ( BangE(e1) @? at _sloc )
+# 29756 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _6;
+          MenhirLib.EngineTypes.startp = _startpos__6_;
+          MenhirLib.EngineTypes.endp = _endpos__6_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = e1;
+                MenhirLib.EngineTypes.startp = _startpos_e1_;
+                MenhirLib.EngineTypes.endp = _endpos_e1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _2;
+                  MenhirLib.EngineTypes.startp = _startpos__2_;
+                  MenhirLib.EngineTypes.endp = _endpos__2_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _6 : unit = Obj.magic _6 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 29809 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _4 : unit = Obj.magic _4 in
+        let e1 : (Mo_def.Syntax.exp) = Obj.magic e1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__6_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29826 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__6_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 612 "mo_frontend/parser.mly"
+    ( DotE(
+        DotE(e1, "system" @@ at (_startpos__1_,_endpos__1_)) @? at _sloc,
+        x) @? at _sloc )
+# 29837 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 618 "mo_frontend/parser.mly"
+    ( e )
+# 29863 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 29890 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29904 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 620 "mo_frontend/parser.mly"
+    ( TagE (x, TupE([]) @? at _sloc) @? at _sloc )
+# 29914 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 29949 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 29963 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 622 "mo_frontend/parser.mly"
+    ( TagE (x, e) @? at _sloc )
+# 29972 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( OptE(e) @? at _sloc )
+# 30009 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 510 "mo_frontend/parser.mly"
+          ( PosOp )
+# 30043 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 30057 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 511 "mo_frontend/parser.mly"
+          ( NegOp )
+# 30091 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 30105 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 512 "mo_frontend/parser.mly"
+          ( NotOp )
+# 30139 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 30153 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 543 "mo_frontend/parser.mly"
+               ( PosOp )
+# 30187 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 633 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 30196 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 544 "mo_frontend/parser.mly"
+                ( NegOp )
+# 30230 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 633 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 30239 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 545 "mo_frontend/parser.mly"
+              ( NotOp )
+# 30273 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 633 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 30282 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 635 "mo_frontend/parser.mly"
+    ( ActorUrlE e @? at _sloc )
+# 30319 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 637 "mo_frontend/parser.mly"
+    ( NotE e @? at _sloc )
+# 30356 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 639 "mo_frontend/parser.mly"
+    ( ShowE (ref Type.Pre, e) @? at _sloc )
+# 30393 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 641 "mo_frontend/parser.mly"
+    ( ToCandidE es @? at _sloc )
+# 30444 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 643 "mo_frontend/parser.mly"
+    ( FromCandidE e @? at _sloc )
+# 30481 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 618 "mo_frontend/parser.mly"
+    ( e )
+# 30507 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 30534 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 30548 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 620 "mo_frontend/parser.mly"
+    ( TagE (x, TupE([]) @? at _sloc) @? at _sloc )
+# 30558 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 30593 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 30607 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 622 "mo_frontend/parser.mly"
+    ( TagE (x, e) @? at _sloc )
+# 30616 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 624 "mo_frontend/parser.mly"
+    ( OptE(e) @? at _sloc )
+# 30653 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 510 "mo_frontend/parser.mly"
+          ( PosOp )
+# 30687 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 30701 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 511 "mo_frontend/parser.mly"
+          ( NegOp )
+# 30735 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 30749 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 512 "mo_frontend/parser.mly"
+          ( NotOp )
+# 30783 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 626 "mo_frontend/parser.mly"
+    ( match op, e.it with
+      | (PosOp | NegOp), LitE {contents = PreLit (s, (Type.(Nat | Float) as typ))} ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitE(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @? at _sloc
+      | _ -> UnE(ref Type.Pre, op, e) @? at _sloc
+    )
+# 30797 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 543 "mo_frontend/parser.mly"
+               ( PosOp )
+# 30831 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 633 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 30840 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 544 "mo_frontend/parser.mly"
+                ( NegOp )
+# 30874 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 633 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 30883 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let op = 
+# 545 "mo_frontend/parser.mly"
+              ( NotOp )
+# 30917 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 633 "mo_frontend/parser.mly"
+    ( assign_op e (fun e' -> UnE(ref Type.Pre, op, e') @? at _sloc) (at _sloc) )
+# 30926 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 635 "mo_frontend/parser.mly"
+    ( ActorUrlE e @? at _sloc )
+# 30963 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 637 "mo_frontend/parser.mly"
+    ( NotE e @? at _sloc )
+# 31000 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 639 "mo_frontend/parser.mly"
+    ( ShowE (ref Type.Pre, e) @? at _sloc )
+# 31037 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = es;
+            MenhirLib.EngineTypes.startp = _startpos_es_;
+            MenhirLib.EngineTypes.endp = _endpos_es_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let es : (Mo_def.Syntax.exp list) = Obj.magic es in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 641 "mo_frontend/parser.mly"
+    ( ToCandidE es @? at _sloc )
+# 31088 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v =
+          let _endpos = _endpos_e_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 643 "mo_frontend/parser.mly"
+    ( FromCandidE e @? at _sloc )
+# 31125 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_e_ in
+        let _v : (bool * Mo_def.Syntax.exp) = 
+# 912 "mo_frontend/parser.mly"
+                 ( (false, e) )
+# 31158 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (bool * Mo_def.Syntax.exp) = 
+# 913 "mo_frontend/parser.mly"
+            ( (true, e) )
+# 31183 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = f;
+          MenhirLib.EngineTypes.startp = _startpos_f_;
+          MenhirLib.EngineTypes.endp = _endpos_f_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let f : (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 31222 "mo_frontend/parser.ml"
+        ) = Obj.magic f in
+        let _3 : (unit option) = Obj.magic _3 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_f_ in
+        let _v =
+          let _endpos = _endpos_f_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 927 "mo_frontend/parser.mly"
+    ( LetD(p, ImportE(f, ref Unresolved) @? at _sloc, None) @? at _sloc )
+# 31237 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = is;
+          MenhirLib.EngineTypes.startp = _startpos_is_;
+          MenhirLib.EngineTypes.endp = _endpos_is_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let is : (Mo_def.Syntax.dec list) = Obj.magic is in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_is_ in
+        let _endpos = _endpos_is_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 950 "mo_frontend/parser.mly"
+                               ( raise (Imports is) )
+# 31263 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.inst) = 
+# 460 "mo_frontend/parser.mly"
+    ( { it = None; at = no_region; note = [] } )
+# 31281 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 462 "mo_frontend/parser.mly"
+    ( { it = Some (false, ts); at = at _sloc; note = [] } )
+# 31324 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.inst))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _2;
+              MenhirLib.EngineTypes.startp = _startpos__2_;
+              MenhirLib.EngineTypes.endp = _endpos__2_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let ts : (Mo_def.Syntax.typ list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 464 "mo_frontend/parser.mly"
+    ( { it = Some (true, ts); at = at _sloc; note = [] } )
+# 31375 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.inst))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 208 "<standard.mly>"
+    ( [] )
+# 31394 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = x;
+            MenhirLib.EngineTypes.startp = _startpos_x_;
+            MenhirLib.EngineTypes.endp = _endpos_x_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ list) = Obj.magic xs in
+        let x : (Mo_def.Syntax.typ) = Obj.magic x in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let x = 
+# 180 "<standard.mly>"
+    ( x )
+# 31434 "mo_frontend/parser.ml"
+           in
+          (
+# 210 "<standard.mly>"
+    ( x :: xs )
+# 31439 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 208 "<standard.mly>"
+    ( [] )
+# 31458 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = x;
+            MenhirLib.EngineTypes.startp = _startpos_x_;
+            MenhirLib.EngineTypes.endp = _endpos_x_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_bind list) = Obj.magic xs in
+        let x : (Mo_def.Syntax.typ_bind) = Obj.magic x in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let x = 
+# 180 "<standard.mly>"
+    ( x )
+# 31498 "mo_frontend/parser.ml"
+           in
+          (
+# 210 "<standard.mly>"
+    ( x :: xs )
+# 31503 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_bind list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 502 "mo_frontend/parser.mly"
+         ( NullLit )
+# 31529 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = b;
+          MenhirLib.EngineTypes.startp = _startpos_b_;
+          MenhirLib.EngineTypes.endp = _endpos_b_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let b : (
+# 237 "mo_frontend/parser.mly"
+      (bool)
+# 31550 "mo_frontend/parser.ml"
+        ) = Obj.magic b in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_b_ in
+        let _endpos = _endpos_b_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 503 "mo_frontend/parser.mly"
+           ( BoolLit b )
+# 31558 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let s : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 31579 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_s_ in
+        let _endpos = _endpos_s_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 504 "mo_frontend/parser.mly"
+          ( PreLit (s, Type.Nat) )
+# 31587 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let s : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 31608 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_s_ in
+        let _endpos = _endpos_s_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 505 "mo_frontend/parser.mly"
+            ( PreLit (s, Type.Float) )
+# 31616 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let c : (
+# 236 "mo_frontend/parser.mly"
+      (Mo_values.Value.unicode)
+# 31637 "mo_frontend/parser.ml"
+        ) = Obj.magic c in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_c_ in
+        let _endpos = _endpos_c_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 506 "mo_frontend/parser.mly"
+           ( CharLit c )
+# 31645 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 31666 "mo_frontend/parser.ml"
+        ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.lit) = 
+# 507 "mo_frontend/parser.mly"
+           ( PreLit (t, Type.Text) )
+# 31674 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = e;
+          MenhirLib.EngineTypes.startp = _startpos_e_;
+          MenhirLib.EngineTypes.endp = _endpos_e_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let e : (Mo_def.Syntax.exp) = Obj.magic e in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_e_ in
+        let _endpos = _endpos_e_ in
+        let _v : (Mo_def.Syntax.exp) = 
+# 569 "mo_frontend/parser.mly"
+                       ( e )
+# 31699 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = dfs;
+            MenhirLib.EngineTypes.startp = _startpos_dfs_;
+            MenhirLib.EngineTypes.endp = _endpos_dfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let dfs : (Mo_def.Syntax.dec_field list) = Obj.magic dfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.dec_field list) = 
+# 916 "mo_frontend/parser.mly"
+                                                    ( dfs )
+# 31738 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (unit option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 31756 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : unit = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (unit option) = 
+# 113 "<standard.mly>"
+    ( Some x )
+# 31781 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 31799 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp option) = 
+# 113 "<standard.mly>"
+    ( Some x )
+# 31824 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_types.Type.shared_sort option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 31842 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let x = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 31868 "mo_frontend/parser.ml"
+           in
+          (
+# 113 "<standard.mly>"
+    ( Some x )
+# 31873 "mo_frontend/parser.ml"
+           : (Mo_types.Type.shared_sort option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _2;
+          MenhirLib.EngineTypes.startp = _startpos__2_;
+          MenhirLib.EngineTypes.endp = _endpos__2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__2_ in
+        let _v =
+          let x = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 31907 "mo_frontend/parser.ml"
+           in
+          (
+# 113 "<standard.mly>"
+    ( Some x )
+# 31912 "mo_frontend/parser.ml"
+           : (Mo_types.Type.shared_sort option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ list option) = 
+# 111 "<standard.mly>"
+    ( None )
+# 31931 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ list) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ list option) = 
+# 113 "<standard.mly>"
+    ( Some x )
+# 31956 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : (Mo_def.Syntax.dec list) = Obj.magic _2 in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (unit) = 
+# 953 "mo_frontend/parser.mly"
+                          ()
+# 31995 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ds;
+            MenhirLib.EngineTypes.startp = _startpos_ds_;
+            MenhirLib.EngineTypes.endp = _endpos_ds_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = is;
+              MenhirLib.EngineTypes.startp = _startpos_is_;
+              MenhirLib.EngineTypes.endp = _endpos_is_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let is : (Mo_def.Syntax.dec list) = Obj.magic is in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = if _startpos_is_ != _endpos_is_ then
+            _startpos_is_
+          else
+            if _startpos_ds_ != _endpos_ds_ then
+              _startpos_ds_
+            else
+              _startpos__4_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 934 "mo_frontend/parser.mly"
+    (
+      let trivia = !triv_table in
+      fun filename -> { it = is @ ds; at = at _sloc; note = { filename; trivia }} )
+# 32053 "mo_frontend/parser.ml"
+           : (string -> Mo_def.Syntax.prog))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ds;
+            MenhirLib.EngineTypes.startp = _startpos_ds_;
+            MenhirLib.EngineTypes.endp = _endpos_ds_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = is;
+              MenhirLib.EngineTypes.startp = _startpos_is_;
+              MenhirLib.EngineTypes.endp = _endpos_is_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let is : (Mo_def.Syntax.dec list) = Obj.magic is in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = if _startpos_is_ != _endpos_is_ then
+            _startpos_is_
+          else
+            if _startpos_ds_ != _endpos_ds_ then
+              _startpos_ds_
+            else
+              _startpos__4_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 940 "mo_frontend/parser.mly"
+    (
+      let trivia = !triv_table in
+      fun filename -> {
+        it = is @ ds;
+        at = at _sloc;
+        note = { filename; trivia }
+      }
+    )
+# 32117 "mo_frontend/parser.ml"
+           : (string -> Mo_def.Syntax.prog))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _6;
+          MenhirLib.EngineTypes.startp = _startpos__6_;
+          MenhirLib.EngineTypes.endp = _endpos__6_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = sfs;
+            MenhirLib.EngineTypes.startp = _startpos_sfs_;
+            MenhirLib.EngineTypes.endp = _endpos_sfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _4;
+              MenhirLib.EngineTypes.startp = _startpos__4_;
+              MenhirLib.EngineTypes.endp = _endpos__4_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ds;
+                  MenhirLib.EngineTypes.startp = _startpos_ds_;
+                  MenhirLib.EngineTypes.endp = _endpos_ds_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _6 : unit = Obj.magic _6 in
+        let sfs : (Mo_def.Syntax.typ_field list) = Obj.magic sfs in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ds : (Mo_def.Syntax.dec list) = Obj.magic ds in
+        let _1 : (unit) = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__6_ in
+        let _v =
+          let _endpos = _endpos__6_ in
+          let _symbolstartpos = if _startpos_ds_ != _endpos_ds_ then
+            _startpos_ds_
+          else
+            _startpos__3_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 965 "mo_frontend/parser.mly"
+    ( let trivia = !triv_table in
+      fun filename -> { it = (ds, sfs); at = at _sloc; note = { filename; trivia }}
+    )
+# 32187 "mo_frontend/parser.ml"
+           : (string -> Mo_def.Syntax.stab_sig))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 836 "mo_frontend/parser.mly"
+    ( p )
+# 32213 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 828 "mo_frontend/parser.mly"
+    ( p )
+# 32238 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p2;
+          MenhirLib.EngineTypes.startp = _startpos_p2_;
+          MenhirLib.EngineTypes.endp = _endpos_p2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = p1;
+              MenhirLib.EngineTypes.startp = _startpos_p1_;
+              MenhirLib.EngineTypes.endp = _endpos_p1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let p2 : (Mo_def.Syntax.pat) = Obj.magic p2 in
+        let _2 : unit = Obj.magic _2 in
+        let p1 : (Mo_def.Syntax.pat) = Obj.magic p1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p1_ in
+        let _endpos = _endpos_p2_ in
+        let _v =
+          let _endpos = _endpos_p2_ in
+          let _symbolstartpos = _startpos_p1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 830 "mo_frontend/parser.mly"
+    ( AltP(p1, p2) @! at _sloc )
+# 32281 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_p_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 832 "mo_frontend/parser.mly"
+    ( AnnotP(p, t) @! at _sloc )
+# 32325 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 32354 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 32367 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 840 "mo_frontend/parser.mly"
+    ( {id = x; pat = annot_pat (VarP x @! x.at) t} @@ at _sloc )
+# 32377 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t;
+              MenhirLib.EngineTypes.startp = _startpos_t_;
+              MenhirLib.EngineTypes.endp = _endpos_t_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _3 : unit = Obj.magic _3 in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 32420 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_p_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 32433 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_p_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 842 "mo_frontend/parser.mly"
+    ( {id = x; pat = annot_pat p t} @@ at _sloc )
+# 32443 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 805 "mo_frontend/parser.mly"
+    ( p )
+# 32469 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = fps;
+            MenhirLib.EngineTypes.startp = _startpos_fps_;
+            MenhirLib.EngineTypes.endp = _endpos_fps_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let fps : (Mo_def.Syntax.pat_field list) = Obj.magic fps in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 807 "mo_frontend/parser.mly"
+    ( ObjP(fps) @! at _sloc )
+# 32512 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Source.region -> Mo_def.Syntax.pat) = 
+# 846 "mo_frontend/parser.mly"
+    ( fun sloc -> p )
+# 32538 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Source.region -> Mo_def.Syntax.pat) = 
+# 848 "mo_frontend/parser.mly"
+    ( fun sloc -> WildP @! sloc )
+# 32556 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 795 "mo_frontend/parser.mly"
+    ( WildP @! at _sloc )
+# 32585 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 32607 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 32620 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 797 "mo_frontend/parser.mly"
+    ( VarP(x) @! at _sloc )
+# 32630 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_l_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_l_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 799 "mo_frontend/parser.mly"
+    ( LitP(ref l) @! at _sloc )
+# 32660 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ps;
+            MenhirLib.EngineTypes.startp = _startpos_ps_;
+            MenhirLib.EngineTypes.endp = _endpos_ps_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ps : (Mo_def.Syntax.pat list) = Obj.magic ps in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 801 "mo_frontend/parser.mly"
+    ( (match ps with [p] -> ParP(p) | _ -> TupP(ps)) @! at _sloc )
+# 32704 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_p_ in
+        let _v : (Mo_def.Syntax.pat) = 
+# 811 "mo_frontend/parser.mly"
+    ( p )
+# 32730 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 32757 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 32771 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 813 "mo_frontend/parser.mly"
+    ( TagP(x, TupP [] @! at _sloc) @! at _sloc )
+# 32781 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 32816 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_p_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 32830 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_p_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 815 "mo_frontend/parser.mly"
+    ( TagP(x, p) @! at _sloc )
+# 32839 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = p;
+          MenhirLib.EngineTypes.startp = _startpos_p_;
+          MenhirLib.EngineTypes.endp = _endpos_p_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let p : (Mo_def.Syntax.pat) = Obj.magic p in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_p_ in
+        let _v =
+          let _endpos = _endpos_p_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 817 "mo_frontend/parser.mly"
+    ( OptP(p) @! at _sloc )
+# 32876 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let op = 
+# 510 "mo_frontend/parser.mly"
+          ( PosOp )
+# 32910 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 819 "mo_frontend/parser.mly"
+    ( match op, l with
+      | (PosOp | NegOp), PreLit (s, (Type.(Nat | Float) as typ)) ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitP(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @! at _sloc
+      | _ -> SignP(op, ref l) @! at _sloc
+    )
+# 32924 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let op = 
+# 511 "mo_frontend/parser.mly"
+          ( NegOp )
+# 32958 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 819 "mo_frontend/parser.mly"
+    ( match op, l with
+      | (PosOp | NegOp), PreLit (s, (Type.(Nat | Float) as typ)) ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitP(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @! at _sloc
+      | _ -> SignP(op, ref l) @! at _sloc
+    )
+# 32972 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = l;
+          MenhirLib.EngineTypes.startp = _startpos_l_;
+          MenhirLib.EngineTypes.endp = _endpos_l_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let l : (Mo_def.Syntax.lit) = Obj.magic l in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_l_ in
+        let _v =
+          let op = 
+# 512 "mo_frontend/parser.mly"
+          ( NotOp )
+# 33006 "mo_frontend/parser.ml"
+           in
+          let _startpos_op_ = _startpos__1_ in
+          let _endpos = _endpos_l_ in
+          let _symbolstartpos = _startpos_op_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 819 "mo_frontend/parser.mly"
+    ( match op, l with
+      | (PosOp | NegOp), PreLit (s, (Type.(Nat | Float) as typ)) ->
+        let signed = match op with NegOp -> "-" ^ s | _ -> "+" ^ s in
+        LitP(ref (PreLit (signed, Type.(if typ = Nat then Int else typ)))) @! at _sloc
+      | _ -> SignP(op, ref l) @! at _sloc
+    )
+# 33020 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 33042 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 33055 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 385 "mo_frontend/parser.mly"
+    ( IdH x @! at _sloc )
+# 33065 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.path))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = p;
+              MenhirLib.EngineTypes.startp = _startpos_p_;
+              MenhirLib.EngineTypes.endp = _endpos_p_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 33099 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _2 : unit = Obj.magic _2 in
+        let p : (Mo_def.Syntax.path) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 33114 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos_x_ = _endpos_id_ in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_p_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 387 "mo_frontend/parser.mly"
+    ( DotH (p, x) @! at _sloc )
+# 33124 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.path))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 238 "<standard.mly>"
+    ( [ x ] )
+# 33150 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 240 "<standard.mly>"
+    ( x :: xs )
+# 33189 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.case list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33207 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.case) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.case list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33232 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.case list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.case) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33272 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33277 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.case list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.case) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33318 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33323 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.case list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33342 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33367 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33406 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33424 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33449 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33489 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33494 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33535 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33540 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec_field list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33559 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec_field list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33584 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33624 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33629 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33670 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33675 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33694 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33719 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33758 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp_field list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33776 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp_field list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33801 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33841 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33846 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 33887 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33892 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33911 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 33936 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.exp) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.exp list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 33975 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 33993 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34018 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34057 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34075 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34100 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34140 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34145 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34186 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34191 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.pat list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34210 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.pat) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.pat list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34235 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.pat list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.pat) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.pat list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34274 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.pat_field list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34292 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.pat_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.pat_field list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34317 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.pat_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.pat_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34357 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34362 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.pat_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.pat_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34403 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34408 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.pat_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34427 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34452 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34492 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34497 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34538 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34543 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34562 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34587 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.typ) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34626 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34644 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_bind) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34669 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_bind list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.typ_bind) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.typ_bind list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34708 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34726 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.dec list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34751 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34791 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34796 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.dec list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.dec) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34837 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34842 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34861 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 34886 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34926 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34931 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_field' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 34972 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 34977 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_item list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 34996 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_item) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_item list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 35021 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_item list) = Obj.magic xs in
+        let _2 : unit = Obj.magic _2 in
+        let x : (Mo_def.Syntax.typ_item) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v : (Mo_def.Syntax.typ_item list) = 
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35060 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 324 "mo_frontend/parser.mly"
+                ( [] )
+# 35078 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 325 "mo_frontend/parser.mly"
+        ( [x] )
+# 35103 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 35143 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35148 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 35189 "mo_frontend/parser.ml"
+           in
+          (
+# 326 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35194 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.exp_field list) = 
+# 329 "mo_frontend/parser.mly"
+        ( [x] )
+# 35220 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 35260 "mo_frontend/parser.ml"
+           in
+          (
+# 330 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35265 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.exp_field list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.exp_field) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 35306 "mo_frontend/parser.ml"
+           in
+          (
+# 330 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35311 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.exp_field list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = x;
+          MenhirLib.EngineTypes.startp = _startpos_x_;
+          MenhirLib.EngineTypes.endp = _endpos_x_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_x_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 329 "mo_frontend/parser.mly"
+        ( [x] )
+# 35337 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 35377 "mo_frontend/parser.ml"
+           in
+          (
+# 330 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35382 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = xs;
+          MenhirLib.EngineTypes.startp = _startpos_xs_;
+          MenhirLib.EngineTypes.endp = _endpos_xs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = x;
+              MenhirLib.EngineTypes.startp = _startpos_x_;
+              MenhirLib.EngineTypes.endp = _endpos_x_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let xs : (Mo_def.Syntax.typ_tag list) = Obj.magic xs in
+        let _1 : unit = Obj.magic _1 in
+        let x : (Mo_def.Syntax.typ_tag' Source.phrase) = Obj.magic x in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_x_ in
+        let _endpos = _endpos_xs_ in
+        let _v =
+          let _2 = 
+# 337 "mo_frontend/parser.mly"
+                  ( () )
+# 35423 "mo_frontend/parser.ml"
+           in
+          (
+# 330 "mo_frontend/parser.mly"
+                               ( x::xs )
+# 35428 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag list))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.stab option) = 
+# 786 "mo_frontend/parser.mly"
+                ( None )
+# 35447 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 787 "mo_frontend/parser.mly"
+             ( Some (Flexible @@ at _sloc) )
+# 35476 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.stab option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 788 "mo_frontend/parser.mly"
+           ( Some (Stable @@ at _sloc) )
+# 35506 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.stab option))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 35548 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 35562 "mo_frontend/parser.ml"
+            
+          in
+          let mut = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 35568 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 961 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 35576 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _1_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 35624 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 35639 "mo_frontend/parser.ml"
+            
+          in
+          let mut =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 35650 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 961 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 35659 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (unit) = 
+# 930 "mo_frontend/parser.mly"
+                ( () )
+# 35678 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 445 "mo_frontend/parser.mly"
+    ( t )
+# 35703 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _2 : unit = Obj.magic _2 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 447 "mo_frontend/parser.mly"
+    ( AndT(t1, t2) @! at _sloc )
+# 35746 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _2 : unit = Obj.magic _2 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 449 "mo_frontend/parser.mly"
+    ( OrT(t1, t2) @! at _sloc )
+# 35790 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ list) = 
+# 456 "mo_frontend/parser.mly"
+                                 ( ts )
+# 35830 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 35865 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 35878 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 490 "mo_frontend/parser.mly"
+    ( {var = x; sort = Type.Type @@ no_region; bound = t} @= at _sloc )
+# 35888 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_bind))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = id;
+          MenhirLib.EngineTypes.startp = _startpos_id_;
+          MenhirLib.EngineTypes.endp = _endpos_id_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 35910 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_id_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 35923 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_x_, _startpos_x_) = (_endpos_id_, _startpos_id_) in
+          let _endpos = _endpos_x_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 492 "mo_frontend/parser.mly"
+    ( {var = x; sort = Type.Type @@ no_region; bound = PrimT "Any" @! at _sloc} @= at _sloc )
+# 35933 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_bind))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 35975 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 35985 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 35994 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 957 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 36003 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = ts;
+                MenhirLib.EngineTypes.startp = _startpos_ts_;
+                MenhirLib.EngineTypes.endp = _endpos_ts_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = id;
+                    MenhirLib.EngineTypes.startp = _startpos_id_;
+                    MenhirLib.EngineTypes.endp = _endpos_id_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36066 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 36076 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 36085 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 957 "mo_frontend/parser.mly"
+    ( TypD(x, tps, t) @? at _sloc )
+# 36094 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.dec))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36136 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 36146 "mo_frontend/parser.ml"
+           in
+          let c =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 36155 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 476 "mo_frontend/parser.mly"
+    ( TypF (c, tps, t) @@ at _sloc )
+# 36164 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _3;
+              MenhirLib.EngineTypes.startp = _startpos__3_;
+              MenhirLib.EngineTypes.endp = _endpos__3_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = ts;
+                MenhirLib.EngineTypes.startp = _startpos_ts_;
+                MenhirLib.EngineTypes.endp = _endpos_ts_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = _1_inlined1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = id;
+                    MenhirLib.EngineTypes.startp = _startpos_id_;
+                    MenhirLib.EngineTypes.endp = _endpos_id_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _4 : unit = Obj.magic _4 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36227 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let tps = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 36237 "mo_frontend/parser.ml"
+           in
+          let c =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 343 "mo_frontend/parser.mly"
+          ( id @= at _sloc )
+# 36246 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 476 "mo_frontend/parser.mly"
+    ( TypF (c, tps, t) @@ at _sloc )
+# 36255 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _3 : unit = Obj.magic _3 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36291 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 36304 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let mut = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 36311 "mo_frontend/parser.ml"
+           in
+          let (_endpos_mut_, _startpos_mut_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_mut_ != _endpos_mut_ then
+            _startpos_mut_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 478 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 36323 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _3;
+            MenhirLib.EngineTypes.startp = _startpos__3_;
+            MenhirLib.EngineTypes.endp = _endpos__3_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _3 : unit = Obj.magic _3 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36365 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 36379 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let mut =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 36390 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_mut_, _startpos_mut_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = if _startpos_mut_ != _endpos_mut_ then
+            _startpos_mut_
+          else
+            _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 478 "mo_frontend/parser.mly"
+    ( ValF (x, t, mut) @@ at _sloc )
+# 36403 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = id;
+                MenhirLib.EngineTypes.startp = _startpos_id_;
+                MenhirLib.EngineTypes.endp = _endpos_id_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36446 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 36456 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 36461 "mo_frontend/parser.ml"
+            
+          in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 36471 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 480 "mo_frontend/parser.mly"
+    ( let t = funcT(Type.Local @@ no_region, tps, t1, t2)
+              @! span x.at t2.at in
+      ValF (x, t, Const @@ no_region) @@ at _sloc )
+# 36483 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = id;
+                      MenhirLib.EngineTypes.startp = _startpos_id_;
+                      MenhirLib.EngineTypes.endp = _endpos_id_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36547 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 36557 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 36562 "mo_frontend/parser.ml"
+            
+          in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 36572 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 480 "mo_frontend/parser.mly"
+    ( let t = funcT(Type.Local @@ no_region, tps, t1, t2)
+              @! span x.at t2.at in
+      ValF (x, t, Const @@ no_region) @@ at _sloc )
+# 36584 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = id;
+                        MenhirLib.EngineTypes.startp = _startpos_id_;
+                        MenhirLib.EngineTypes.endp = _endpos_id_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _4_inlined1 : unit = Obj.magic _4_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36655 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 36664 "mo_frontend/parser.ml"
+           in
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 36673 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_x_ = _startpos_id_ in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = _startpos_x_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 480 "mo_frontend/parser.mly"
+    ( let t = funcT(Type.Local @@ no_region, tps, t1, t2)
+              @! span x.at t2.at in
+      ValF (x, t, Const @@ no_region) @@ at _sloc )
+# 36685 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_field' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = id;
+              MenhirLib.EngineTypes.startp = _startpos_id_;
+              MenhirLib.EngineTypes.endp = _endpos_id_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _2 : unit = Obj.magic _2 in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 36721 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_id_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let i =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 36734 "mo_frontend/parser.ml"
+            
+          in
+          (
+# 452 "mo_frontend/parser.mly"
+                     ( Some i, t )
+# 36740 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_item))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ_item) = 
+# 453 "mo_frontend/parser.mly"
+          ( None, t )
+# 36766 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 439 "mo_frontend/parser.mly"
+    ( t )
+# 36791 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 36832 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 36837 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__0_, _endpos__0_) in
+          let s = 
+# 371 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 36844 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 36859 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _menhir_s;
+                    MenhirLib.EngineTypes.semv = _1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_;
+                    MenhirLib.EngineTypes.next = _menhir_stack;
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 36922 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 36927 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_) in
+          let s = 
+# 371 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 36934 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 36949 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _4_inlined1 : unit = Obj.magic _4_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 37018 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__4_inlined1_, _startpos__1_) in
+          let s = 
+# 371 "mo_frontend/parser.mly"
+                ( Type.Local @@ no_region )
+# 37024 "mo_frontend/parser.ml"
+           in
+          let (_endpos_s_, _startpos_s_) = (_endpos__0_, _endpos__0_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37039 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = qo;
+                MenhirLib.EngineTypes.startp = _startpos_qo_;
+                MenhirLib.EngineTypes.endp = _endpos_qo_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 37095 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 37100 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos_qo_, _endpos_qo_) in
+          let s =
+            let _endpos = _endpos_qo_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 372 "mo_frontend/parser.mly"
+                     ( Type.Shared (Lib.Option.get qo Type.Write) @@ at _sloc )
+# 37111 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos_qo_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37127 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = qo;
+                      MenhirLib.EngineTypes.startp = _startpos_qo_;
+                      MenhirLib.EngineTypes.endp = _endpos_qo_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 37204 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 37209 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_inlined1_) in
+          let s =
+            let _endpos = _endpos_qo_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 372 "mo_frontend/parser.mly"
+                     ( Type.Shared (Lib.Option.get qo Type.Write) @@ at _sloc )
+# 37220 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos_qo_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37236 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = qo;
+                        MenhirLib.EngineTypes.startp = _startpos_qo_;
+                        MenhirLib.EngineTypes.endp = _endpos_qo_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _4_inlined1 : unit = Obj.magic _4_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let qo : (Mo_types.Type.shared_sort option) = Obj.magic qo in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 37319 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__4_inlined1_, _startpos__1_inlined1_) in
+          let s =
+            let _endpos = _endpos_qo_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 372 "mo_frontend/parser.mly"
+                     ( Type.Shared (Lib.Option.get qo Type.Write) @@ at _sloc )
+# 37329 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos_qo_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37345 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 37394 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 37399 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__1_, _endpos__1_) in
+          let s =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 37407 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__1_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 37416 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37432 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _menhir_s;
+                      MenhirLib.EngineTypes.semv = _1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_;
+                      MenhirLib.EngineTypes.next = _menhir_stack;
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 37502 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 37507 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_inlined1_) in
+          let s =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 37515 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__1_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 37524 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37540 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2;
+                    MenhirLib.EngineTypes.startp = _startpos__2_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _4_inlined1 : unit = Obj.magic _4_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2 : unit = Obj.magic _2 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 37616 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__4_inlined1_, _startpos__1_inlined1_) in
+          let s =
+            let q = 
+# 367 "mo_frontend/parser.mly"
+          ( Type.Query )
+# 37623 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__1_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 37632 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__1_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37648 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _2;
+                MenhirLib.EngineTypes.startp = _startpos__2_;
+                MenhirLib.EngineTypes.endp = _endpos__2_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _menhir_s;
+                  MenhirLib.EngineTypes.semv = _1;
+                  MenhirLib.EngineTypes.startp = _startpos__1_;
+                  MenhirLib.EngineTypes.endp = _endpos__1_;
+                  MenhirLib.EngineTypes.next = _menhir_stack;
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 467 "mo_frontend/parser.mly"
+                ( [] )
+# 37704 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 37709 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__2_, _endpos__2_) in
+          let s =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 37717 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__2_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 37726 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__2_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37742 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _3;
+                MenhirLib.EngineTypes.startp = _startpos__3_;
+                MenhirLib.EngineTypes.endp = _endpos__3_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _1_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _2;
+                      MenhirLib.EngineTypes.startp = _startpos__2_;
+                      MenhirLib.EngineTypes.endp = _endpos__2_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _menhir_s;
+                        MenhirLib.EngineTypes.semv = _1;
+                        MenhirLib.EngineTypes.startp = _startpos__1_;
+                        MenhirLib.EngineTypes.endp = _endpos__1_;
+                        MenhirLib.EngineTypes.next = _menhir_stack;
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps =
+            let ts = 
+# 468 "mo_frontend/parser.mly"
+                                      ( ts )
+# 37819 "mo_frontend/parser.ml"
+             in
+            
+# 471 "mo_frontend/parser.mly"
+                           ( ts )
+# 37824 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__3_, _startpos__1_inlined1_) in
+          let s =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 37832 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__2_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 37841 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__2_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37857 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t2;
+          MenhirLib.EngineTypes.startp = _startpos_t2_;
+          MenhirLib.EngineTypes.endp = _endpos_t2_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _4;
+            MenhirLib.EngineTypes.startp = _startpos__4_;
+            MenhirLib.EngineTypes.endp = _endpos__4_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = t1;
+              MenhirLib.EngineTypes.startp = _startpos_t1_;
+              MenhirLib.EngineTypes.endp = _endpos_t1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _;
+                MenhirLib.EngineTypes.semv = _4_inlined1;
+                MenhirLib.EngineTypes.startp = _startpos__4_inlined1_;
+                MenhirLib.EngineTypes.endp = _endpos__4_inlined1_;
+                MenhirLib.EngineTypes.next = {
+                  MenhirLib.EngineTypes.state = _;
+                  MenhirLib.EngineTypes.semv = ts;
+                  MenhirLib.EngineTypes.startp = _startpos_ts_;
+                  MenhirLib.EngineTypes.endp = _endpos_ts_;
+                  MenhirLib.EngineTypes.next = {
+                    MenhirLib.EngineTypes.state = _;
+                    MenhirLib.EngineTypes.semv = _2_inlined1;
+                    MenhirLib.EngineTypes.startp = _startpos__2_inlined1_;
+                    MenhirLib.EngineTypes.endp = _endpos__2_inlined1_;
+                    MenhirLib.EngineTypes.next = {
+                      MenhirLib.EngineTypes.state = _;
+                      MenhirLib.EngineTypes.semv = _1_inlined1;
+                      MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+                      MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+                      MenhirLib.EngineTypes.next = {
+                        MenhirLib.EngineTypes.state = _;
+                        MenhirLib.EngineTypes.semv = _2;
+                        MenhirLib.EngineTypes.startp = _startpos__2_;
+                        MenhirLib.EngineTypes.endp = _endpos__2_;
+                        MenhirLib.EngineTypes.next = {
+                          MenhirLib.EngineTypes.state = _menhir_s;
+                          MenhirLib.EngineTypes.semv = _1;
+                          MenhirLib.EngineTypes.startp = _startpos__1_;
+                          MenhirLib.EngineTypes.endp = _endpos__1_;
+                          MenhirLib.EngineTypes.next = _menhir_stack;
+                        };
+                      };
+                    };
+                  };
+                };
+              };
+            };
+          };
+        } = _menhir_stack in
+        let t2 : (Mo_def.Syntax.typ) = Obj.magic t2 in
+        let _4 : unit = Obj.magic _4 in
+        let t1 : (Mo_def.Syntax.typ) = Obj.magic t1 in
+        let _4_inlined1 : unit = Obj.magic _4_inlined1 in
+        let ts : (Mo_def.Syntax.typ_bind list) = Obj.magic ts in
+        let _2_inlined1 : unit = Obj.magic _2_inlined1 in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t2_ in
+        let _v =
+          let tps = 
+# 472 "mo_frontend/parser.mly"
+                                               ( ensure_scope_bind "" ts )
+# 37940 "mo_frontend/parser.ml"
+           in
+          let (_endpos_tps_, _startpos_tps_) = (_endpos__4_inlined1_, _startpos__1_inlined1_) in
+          let s =
+            let q = 
+# 368 "mo_frontend/parser.mly"
+                    ( Type.Composite )
+# 37947 "mo_frontend/parser.ml"
+             in
+            let (_endpos_q_, _startpos_q_) = (_endpos__2_, _startpos__1_) in
+            let _endpos = _endpos_q_ in
+            let _symbolstartpos = _startpos_q_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 373 "mo_frontend/parser.mly"
+            ( Type.Shared q @@ at _sloc )
+# 37956 "mo_frontend/parser.ml"
+            
+          in
+          let (_endpos_s_, _startpos_s_) = (_endpos__2_, _startpos__1_) in
+          let _endpos = _endpos_t2_ in
+          let _symbolstartpos = if _startpos_s_ != _endpos_s_ then
+            _startpos_s_
+          else
+            if _startpos_tps_ != _endpos_tps_ then
+              _startpos_tps_
+            else
+              _startpos_t1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 441 "mo_frontend/parser.mly"
+    ( funcT(s, tps, t1, t2) @! at _sloc )
+# 37972 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = ts;
+            MenhirLib.EngineTypes.startp = _startpos_ts_;
+            MenhirLib.EngineTypes.endp = _endpos_ts_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let ts : (Mo_def.Syntax.typ_item list) = Obj.magic ts in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v =
+          let _endpos = _endpos__3_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 404 "mo_frontend/parser.mly"
+    ( (match ts with
+       | [(Some id, t)] -> NamedT(id, t)
+       | [(None, t)] -> ParT t
+       | _ -> TupT(ts)) @! at _sloc )
+# 38019 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tso;
+          MenhirLib.EngineTypes.startp = _startpos_tso_;
+          MenhirLib.EngineTypes.endp = _endpos_tso_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = p;
+            MenhirLib.EngineTypes.startp = _startpos_p_;
+            MenhirLib.EngineTypes.endp = _endpos_p_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tso : (Mo_def.Syntax.typ list option) = Obj.magic tso in
+        let p : (Mo_def.Syntax.path) = Obj.magic p in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_p_ in
+        let _endpos = _endpos_tso_ in
+        let _v =
+          let _endpos = _endpos_tso_ in
+          let _symbolstartpos = _startpos_p_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 409 "mo_frontend/parser.mly"
+    ( PathT(p, Lib.Option.get tso []) @! at _sloc )
+# 38056 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m = 
+# 354 "mo_frontend/parser.mly"
+                ( Const @@ no_region )
+# 38097 "mo_frontend/parser.ml"
+           in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 411 "mo_frontend/parser.mly"
+    ( ArrayT(m, t) @! at _sloc )
+# 38105 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _4;
+          MenhirLib.EngineTypes.startp = _startpos__4_;
+          MenhirLib.EngineTypes.endp = _endpos__4_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = t;
+            MenhirLib.EngineTypes.startp = _startpos_t_;
+            MenhirLib.EngineTypes.endp = _endpos_t_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _;
+              MenhirLib.EngineTypes.semv = _1_inlined1;
+              MenhirLib.EngineTypes.startp = _startpos__1_inlined1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_inlined1_;
+              MenhirLib.EngineTypes.next = {
+                MenhirLib.EngineTypes.state = _menhir_s;
+                MenhirLib.EngineTypes.semv = _1;
+                MenhirLib.EngineTypes.startp = _startpos__1_;
+                MenhirLib.EngineTypes.endp = _endpos__1_;
+                MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          };
+        } = _menhir_stack in
+        let _4 : unit = Obj.magic _4 in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1_inlined1 : unit = Obj.magic _1_inlined1 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__4_ in
+        let _v =
+          let m =
+            let (_endpos__1_, _startpos__1_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 355 "mo_frontend/parser.mly"
+        ( Var @@ at _sloc )
+# 38158 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos__4_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 411 "mo_frontend/parser.mly"
+    ( ArrayT(m, t) @! at _sloc )
+# 38167 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_tfs_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_tfs_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 413 "mo_frontend/parser.mly"
+    ( ObjT(Type.Object @@ at _sloc, tfs) @! at _sloc )
+# 38197 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_tag list) = Obj.magic tfs in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_tfs_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_tfs_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 415 "mo_frontend/parser.mly"
+    ( VariantT tfs @! at _sloc )
+# 38227 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = tfs;
+            MenhirLib.EngineTypes.startp = _startpos_tfs_;
+            MenhirLib.EngineTypes.endp = _endpos_tfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ_field list) = 
+# 394 "mo_frontend/parser.mly"
+    ( tfs )
+# 38267 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 425 "mo_frontend/parser.mly"
+    ( t )
+# 38292 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = s;
+          MenhirLib.EngineTypes.startp = _startpos_s_;
+          MenhirLib.EngineTypes.endp = _endpos_s_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let s : (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 38319 "mo_frontend/parser.ml"
+        ) = Obj.magic s in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_s_ in
+        let _v =
+          let _endpos = _endpos_s_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 427 "mo_frontend/parser.mly"
+    ( PrimT(s) @! at _sloc )
+# 38332 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 429 "mo_frontend/parser.mly"
+    ( AsyncT(Type.Fut, scopeT (at _sloc), t) @! at _sloc )
+# 38369 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 431 "mo_frontend/parser.mly"
+    ( AsyncT(Type.Cmp, scopeT (at _sloc), t) @! at _sloc )
+# 38406 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 358 "mo_frontend/parser.mly"
+           ( Type.Object @@ at _sloc )
+# 38444 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 433 "mo_frontend/parser.mly"
+    ( let tfs' =
+        if s.it = Type.Actor then List.map share_typfield tfs else tfs
+      in ObjT(s, tfs') @! at _sloc )
+# 38456 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 359 "mo_frontend/parser.mly"
+          ( Type.Actor @@ at _sloc )
+# 38494 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 433 "mo_frontend/parser.mly"
+    ( let tfs' =
+        if s.it = Type.Actor then List.map share_typfield tfs else tfs
+      in ObjT(s, tfs') @! at _sloc )
+# 38506 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = tfs;
+          MenhirLib.EngineTypes.startp = _startpos_tfs_;
+          MenhirLib.EngineTypes.endp = _endpos_tfs_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let tfs : (Mo_def.Syntax.typ_field list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_tfs_ in
+        let _v =
+          let s =
+            let _endpos = _endpos__1_ in
+            let _symbolstartpos = _startpos__1_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 360 "mo_frontend/parser.mly"
+           ( Type.Module @@ at _sloc )
+# 38544 "mo_frontend/parser.ml"
+            
+          in
+          let _startpos_s_ = _startpos__1_ in
+          let _endpos = _endpos_tfs_ in
+          let _symbolstartpos = _startpos_s_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 433 "mo_frontend/parser.mly"
+    ( let tfs' =
+        if s.it = Type.Actor then List.map share_typfield tfs else tfs
+      in ObjT(s, tfs') @! at _sloc )
+# 38556 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = id;
+            MenhirLib.EngineTypes.startp = _startpos_id_;
+            MenhirLib.EngineTypes.endp = _endpos_id_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ option) = Obj.magic t in
+        let id : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 38591 "mo_frontend/parser.ml"
+        ) = Obj.magic id in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let x =
+            let _endpos = _endpos_id_ in
+            let _symbolstartpos = _startpos_id_ in
+            let _sloc = (_symbolstartpos, _endpos) in
+            
+# 340 "mo_frontend/parser.mly"
+          ( id @@ at _sloc )
+# 38605 "mo_frontend/parser.ml"
+            
+          in
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 486 "mo_frontend/parser.mly"
+    ( {tag = x; typ = Lib.Option.get t (TupT [] @! at _sloc)} @@ at _sloc )
+# 38614 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ_tag' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos_t_ in
+        let _endpos = _endpos_t_ in
+        let _v : (Mo_def.Syntax.typ) = 
+# 419 "mo_frontend/parser.mly"
+    ( t )
+# 38640 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = t;
+          MenhirLib.EngineTypes.startp = _startpos_t_;
+          MenhirLib.EngineTypes.endp = _endpos_t_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _menhir_s;
+            MenhirLib.EngineTypes.semv = _1;
+            MenhirLib.EngineTypes.startp = _startpos__1_;
+            MenhirLib.EngineTypes.endp = _endpos__1_;
+            MenhirLib.EngineTypes.next = _menhir_stack;
+          };
+        } = _menhir_stack in
+        let t : (Mo_def.Syntax.typ) = Obj.magic t in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_t_ in
+        let _v =
+          let _endpos = _endpos_t_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 421 "mo_frontend/parser.mly"
+    ( OptT(t) @! at _sloc )
+# 38676 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.typ))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = _2;
+            MenhirLib.EngineTypes.startp = _startpos__2_;
+            MenhirLib.EngineTypes.endp = _endpos__2_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let _2 : unit = Obj.magic _2 in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 398 "mo_frontend/parser.mly"
+    ( [] )
+# 38716 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _;
+          MenhirLib.EngineTypes.semv = _3;
+          MenhirLib.EngineTypes.startp = _startpos__3_;
+          MenhirLib.EngineTypes.endp = _endpos__3_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.state = _;
+            MenhirLib.EngineTypes.semv = tfs;
+            MenhirLib.EngineTypes.startp = _startpos_tfs_;
+            MenhirLib.EngineTypes.endp = _endpos_tfs_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+            };
+          };
+        } = _menhir_stack in
+        let _3 : unit = Obj.magic _3 in
+        let tfs : (Mo_def.Syntax.typ_tag list) = Obj.magic tfs in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__3_ in
+        let _v : (Mo_def.Syntax.typ_tag list) = 
+# 400 "mo_frontend/parser.mly"
+    ( tfs )
+# 38755 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let _menhir_s = _menhir_env.MenhirLib.EngineTypes.current in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _endpos = _startpos in
+        let _v : (Mo_def.Syntax.vis' Source.phrase) = 
+# 776 "mo_frontend/parser.mly"
+                ( Private @@ no_region )
+# 38773 "mo_frontend/parser.ml"
+         in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 777 "mo_frontend/parser.mly"
+            ( Private @@ at _sloc )
+# 38802 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.vis' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 778 "mo_frontend/parser.mly"
+           (
+    let at = at _sloc in
+    let trivia = Trivia.find_trivia !triv_table at in
+    let depr = Trivia.deprecated_of_trivia_info trivia in
+    Public depr @@ at )
+# 38836 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.vis' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        } = _menhir_stack in
+        let _1 : unit = Obj.magic _1 in
+        let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v =
+          let _endpos = _endpos__1_ in
+          let _symbolstartpos = _startpos__1_ in
+          let _sloc = (_symbolstartpos, _endpos) in
+          (
+# 783 "mo_frontend/parser.mly"
+           ( System @@ at _sloc )
+# 38866 "mo_frontend/parser.ml"
+           : (Mo_def.Syntax.vis' Source.phrase))
+        in
+        {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+        });
+    |]
+  
+  and trace =
+    None
+  
+end
+
+module MenhirInterpreter = struct
+  
+  module ET = MenhirLib.TableInterpreter.MakeEngineTable (Tables)
+  
+  module TI = MenhirLib.Engine.Make (ET)
+  
+  include TI
+  
+  module Symbols = struct
+    
+    type _ terminal = 
+      | T_error : unit terminal
+      | T_XOROP : unit terminal
+      | T_XORASSIGN : unit terminal
+      | T_WRAPSUBOP : unit terminal
+      | T_WRAPSUBASSIGN : unit terminal
+      | T_WRAPPOWOP : unit terminal
+      | T_WRAPPOWASSIGN : unit terminal
+      | T_WRAPMULOP : unit terminal
+      | T_WRAPMULASSIGN : unit terminal
+      | T_WRAPADDOP : unit terminal
+      | T_WRAPADDASSIGN : unit terminal
+      | T_WITH : unit terminal
+      | T_WHILE : unit terminal
+      | T_VAR : unit terminal
+      | T_UNDERSCORE : unit terminal
+      | T_TYPE : unit terminal
+      | T_TRY : unit terminal
+      | T_TO_CANDID : unit terminal
+      | T_THROW : unit terminal
+      | T_TEXT : (
+# 239 "mo_frontend/parser.mly"
+      (string)
+# 38916 "mo_frontend/parser.ml"
+    ) terminal
+      | T_SYSTEM : unit terminal
+      | T_SWITCH : unit terminal
+      | T_SUBOP : unit terminal
+      | T_SUB : unit terminal
+      | T_STABLE : unit terminal
+      | T_SHROP : unit terminal
+      | T_SHRASSIGN : unit terminal
+      | T_SHLOP : unit terminal
+      | T_SHLASSIGN : unit terminal
+      | T_SHARED : unit terminal
+      | T_SEMICOLON_EOL : unit terminal
+      | T_SEMICOLON : unit terminal
+      | T_RPAR : unit terminal
+      | T_ROTROP : unit terminal
+      | T_ROTRASSIGN : unit terminal
+      | T_ROTLOP : unit terminal
+      | T_ROTLASSIGN : unit terminal
+      | T_RETURN : unit terminal
+      | T_RCURLY : unit terminal
+      | T_RBRACKET : unit terminal
+      | T_QUEST : unit terminal
+      | T_QUERY : unit terminal
+      | T_PUBLIC : unit terminal
+      | T_PRIVATE : unit terminal
+      | T_PRIM : unit terminal
+      | T_POWOP : unit terminal
+      | T_POWASSIGN : unit terminal
+      | T_PLUSASSIGN : unit terminal
+      | T_PIPE : unit terminal
+      | T_OROP : unit terminal
+      | T_ORASSIGN : unit terminal
+      | T_OR : unit terminal
+      | T_OLD : unit terminal
+      | T_OBJECT : unit terminal
+      | T_NULL : unit terminal
+      | T_NOT : unit terminal
+      | T_NEQOP : unit terminal
+      | T_NAT : (
+# 234 "mo_frontend/parser.mly"
+      (string)
+# 38958 "mo_frontend/parser.ml"
+    ) terminal
+      | T_MULOP : unit terminal
+      | T_MULASSIGN : unit terminal
+      | T_MODULE : unit terminal
+      | T_MODOP : unit terminal
+      | T_MODASSIGN : unit terminal
+      | T_MINUSASSIGN : unit terminal
+      | T_LTOP : unit terminal
+      | T_LT : unit terminal
+      | T_LPAR : unit terminal
+      | T_LOOP : unit terminal
+      | T_LET : unit terminal
+      | T_LEOP : unit terminal
+      | T_LCURLY : unit terminal
+      | T_LBRACKET : unit terminal
+      | T_LABEL : unit terminal
+      | T_INVARIANT : unit terminal
+      | T_IN : unit terminal
+      | T_IMPORT : unit terminal
+      | T_IMPLIES : unit terminal
+      | T_IGNORE : unit terminal
+      | T_IF : unit terminal
+      | T_ID : (
+# 238 "mo_frontend/parser.mly"
+      (string)
+# 38984 "mo_frontend/parser.ml"
+    ) terminal
+      | T_HASH : unit terminal
+      | T_GTOP : unit terminal
+      | T_GT : unit terminal
+      | T_GEOP : unit terminal
+      | T_FUNC : unit terminal
+      | T_FROM_CANDID : unit terminal
+      | T_FOR : unit terminal
+      | T_FLOAT : (
+# 235 "mo_frontend/parser.mly"
+      (string)
+# 38996 "mo_frontend/parser.ml"
+    ) terminal
+      | T_FLEXIBLE : unit terminal
+      | T_EQOP : unit terminal
+      | T_EQ : unit terminal
+      | T_EOF : unit terminal
+      | T_ELSE : unit terminal
+      | T_DOT_NUM : (
+# 233 "mo_frontend/parser.mly"
+      (string)
+# 39006 "mo_frontend/parser.ml"
+    ) terminal
+      | T_DOT : unit terminal
+      | T_DO : unit terminal
+      | T_DIVOP : unit terminal
+      | T_DIVASSIGN : unit terminal
+      | T_DISALLOWED : unit terminal
+      | T_DEBUG_SHOW : unit terminal
+      | T_DEBUG : unit terminal
+      | T_CONTINUE : unit terminal
+      | T_COMPOSITE : unit terminal
+      | T_COMMA : unit terminal
+      | T_COLON : unit terminal
+      | T_CLASS : unit terminal
+      | T_CHAR : (
+# 236 "mo_frontend/parser.mly"
+      (Mo_values.Value.unicode)
+# 39023 "mo_frontend/parser.ml"
+    ) terminal
+      | T_CATCH : unit terminal
+      | T_CATASSIGN : unit terminal
+      | T_CASE : unit terminal
+      | T_BREAK : unit terminal
+      | T_BOOL : (
+# 237 "mo_frontend/parser.mly"
+      (bool)
+# 39032 "mo_frontend/parser.ml"
+    ) terminal
+      | T_BANG : unit terminal
+      | T_AWAITSTAR : unit terminal
+      | T_AWAIT : unit terminal
+      | T_ASYNCSTAR : unit terminal
+      | T_ASYNC : unit terminal
+      | T_ASSIGN : unit terminal
+      | T_ASSERT : unit terminal
+      | T_ARROW : unit terminal
+      | T_ANDOP : unit terminal
+      | T_ANDASSIGN : unit terminal
+      | T_AND : unit terminal
+      | T_ADDOP : unit terminal
+      | T_ACTOR : unit terminal
+    
+    type _ nonterminal = 
+      | N_vis : (Mo_def.Syntax.vis' Source.phrase) nonterminal
+      | N_typ_variant : (Mo_def.Syntax.typ_tag list) nonterminal
+      | N_typ_un : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_tag : (Mo_def.Syntax.typ_tag' Source.phrase) nonterminal
+      | N_typ_pre : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_obj : (Mo_def.Syntax.typ_field list) nonterminal
+      | N_typ_nullary : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_nobin : (Mo_def.Syntax.typ) nonterminal
+      | N_typ_item : (Mo_def.Syntax.typ_item) nonterminal
+      | N_typ_field : (Mo_def.Syntax.typ_field' Source.phrase) nonterminal
+      | N_typ_dec : (Mo_def.Syntax.dec) nonterminal
+      | N_typ_bind : (Mo_def.Syntax.typ_bind) nonterminal
+      | N_typ_args : (Mo_def.Syntax.typ list) nonterminal
+      | N_typ : (Mo_def.Syntax.typ) nonterminal
+      | N_start : (unit) nonterminal
+      | N_stab_field : (Mo_def.Syntax.typ_field' Source.phrase) nonterminal
+      | N_stab : (Mo_def.Syntax.stab option) nonterminal
+      | N_seplist1_typ_tag_semicolon_ : (Mo_def.Syntax.typ_tag list) nonterminal
+      | N_seplist1_exp_field_semicolon_ : (Mo_def.Syntax.exp_field list) nonterminal
+      | N_seplist_typ_tag_semicolon_ : (Mo_def.Syntax.typ_tag list) nonterminal
+      | N_seplist_typ_item_COMMA_ : (Mo_def.Syntax.typ_item list) nonterminal
+      | N_seplist_typ_field_semicolon_ : (Mo_def.Syntax.typ_field list) nonterminal
+      | N_seplist_typ_dec_semicolon_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_typ_bind_COMMA_ : (Mo_def.Syntax.typ_bind list) nonterminal
+      | N_seplist_typ_COMMA_ : (Mo_def.Syntax.typ list) nonterminal
+      | N_seplist_stab_field_semicolon_ : (Mo_def.Syntax.typ_field list) nonterminal
+      | N_seplist_pat_field_semicolon_ : (Mo_def.Syntax.pat_field list) nonterminal
+      | N_seplist_pat_bin_COMMA_ : (Mo_def.Syntax.pat list) nonterminal
+      | N_seplist_imp_semicolon_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_imp_SEMICOLON_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_exp_nonvar_ob__COMMA_ : (Mo_def.Syntax.exp list) nonterminal
+      | N_seplist_exp_field_semicolon_ : (Mo_def.Syntax.exp_field list) nonterminal
+      | N_seplist_exp_ob__COMMA_ : (Mo_def.Syntax.exp list) nonterminal
+      | N_seplist_dec_field_semicolon_ : (Mo_def.Syntax.dec_field list) nonterminal
+      | N_seplist_dec_semicolon_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_dec_SEMICOLON_ : (Mo_def.Syntax.dec list) nonterminal
+      | N_seplist_case_semicolon_ : (Mo_def.Syntax.case list) nonterminal
+      | N_separated_nonempty_list_AND_exp_post_ob__ : (Mo_def.Syntax.exp list) nonterminal
+      | N_path : (Mo_def.Syntax.path) nonterminal
+      | N_pat_un : (Mo_def.Syntax.pat) nonterminal
+      | N_pat_plain : (Mo_def.Syntax.pat) nonterminal
+      | N_pat_opt : (Source.region -> Mo_def.Syntax.pat) nonterminal
+      | N_pat_nullary : (Mo_def.Syntax.pat) nonterminal
+      | N_pat_field : (Mo_def.Syntax.pat_field) nonterminal
+      | N_pat_bin : (Mo_def.Syntax.pat) nonterminal
+      | N_pat : (Mo_def.Syntax.pat) nonterminal
+      | N_parse_stab_sig : (string -> Mo_def.Syntax.stab_sig) nonterminal
+      | N_parse_prog_interactive : (string -> Mo_def.Syntax.prog) nonterminal
+      | N_parse_prog : (string -> Mo_def.Syntax.prog) nonterminal
+      | N_parse_module_header : (unit) nonterminal
+      | N_option_typ_args_ : (Mo_def.Syntax.typ list option) nonterminal
+      | N_option_query_ : (Mo_types.Type.shared_sort option) nonterminal
+      | N_option_exp_nullary_ob__ : (Mo_def.Syntax.exp option) nonterminal
+      | N_option_EQ_ : (unit option) nonterminal
+      | N_obj_body : (Mo_def.Syntax.dec_field list) nonterminal
+      | N_ob : (Mo_def.Syntax.exp) nonterminal
+      | N_lit : (Mo_def.Syntax.lit) nonterminal
+      | N_list_preceded_COMMA_typ_bind__ : (Mo_def.Syntax.typ_bind list) nonterminal
+      | N_list_preceded_COMMA_typ__ : (Mo_def.Syntax.typ list) nonterminal
+      | N_inst : (Mo_def.Syntax.inst) nonterminal
+      | N_import_list : (Mo_def.Syntax.dec list) nonterminal
+      | N_imp : (Mo_def.Syntax.dec) nonterminal
+      | N_func_body : (bool * Mo_def.Syntax.exp) nonterminal
+      | N_exp_un_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_un_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_post_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_post_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_plain : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_obj : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nullary_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nullary_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nonvar_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nonvar_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nondec_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nondec_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_nest : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_field : (Mo_def.Syntax.exp_field) nonterminal
+      | N_exp_bin_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_bin_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_ob_ : (Mo_def.Syntax.exp) nonterminal
+      | N_exp_bl_ : (Mo_def.Syntax.exp) nonterminal
+      | N_dec_var : (Mo_def.Syntax.dec) nonterminal
+      | N_dec_nonvar : (Mo_def.Syntax.dec) nonterminal
+      | N_dec_field : (Mo_def.Syntax.dec_field) nonterminal
+      | N_dec : (Mo_def.Syntax.dec) nonterminal
+      | N_class_body : (Mo_def.Syntax.id * Mo_def.Syntax.dec_field list) nonterminal
+      | N_catch : (Mo_def.Syntax.case) nonterminal
+      | N_case : (Mo_def.Syntax.case) nonterminal
+      | N_block : (Mo_def.Syntax.exp) nonterminal
+      | N_bl : (Mo_def.Syntax.exp) nonterminal
+      | N_annot_opt : (Mo_def.Syntax.typ option) nonterminal
+    
+  end
+  
+  include Symbols
+  
+  include MenhirLib.InspectionTableInterpreter.Make (Tables) (struct
+    
+    include TI
+    
+    include Symbols
+    
+    include MenhirLib.InspectionTableInterpreter.Symbols (Symbols)
+    
+    let terminal =
+      fun t ->
+        match t with
+        | 0 ->
+            X (T T_error)
+        | 1 ->
+            X (T T_XOROP)
+        | 2 ->
+            X (T T_XORASSIGN)
+        | 3 ->
+            X (T T_WRAPSUBOP)
+        | 4 ->
+            X (T T_WRAPSUBASSIGN)
+        | 5 ->
+            X (T T_WRAPPOWOP)
+        | 6 ->
+            X (T T_WRAPPOWASSIGN)
+        | 7 ->
+            X (T T_WRAPMULOP)
+        | 8 ->
+            X (T T_WRAPMULASSIGN)
+        | 9 ->
+            X (T T_WRAPADDOP)
+        | 10 ->
+            X (T T_WRAPADDASSIGN)
+        | 11 ->
+            X (T T_WITH)
+        | 12 ->
+            X (T T_WHILE)
+        | 13 ->
+            X (T T_VAR)
+        | 14 ->
+            X (T T_UNDERSCORE)
+        | 15 ->
+            X (T T_TYPE)
+        | 16 ->
+            X (T T_TRY)
+        | 17 ->
+            X (T T_TO_CANDID)
+        | 18 ->
+            X (T T_THROW)
+        | 19 ->
+            X (T T_TEXT)
+        | 20 ->
+            X (T T_SYSTEM)
+        | 21 ->
+            X (T T_SWITCH)
+        | 22 ->
+            X (T T_SUBOP)
+        | 23 ->
+            X (T T_SUB)
+        | 24 ->
+            X (T T_STABLE)
+        | 25 ->
+            X (T T_SHROP)
+        | 26 ->
+            X (T T_SHRASSIGN)
+        | 27 ->
+            X (T T_SHLOP)
+        | 28 ->
+            X (T T_SHLASSIGN)
+        | 29 ->
+            X (T T_SHARED)
+        | 30 ->
+            X (T T_SEMICOLON_EOL)
+        | 31 ->
+            X (T T_SEMICOLON)
+        | 32 ->
+            X (T T_RPAR)
+        | 33 ->
+            X (T T_ROTROP)
+        | 34 ->
+            X (T T_ROTRASSIGN)
+        | 35 ->
+            X (T T_ROTLOP)
+        | 36 ->
+            X (T T_ROTLASSIGN)
+        | 37 ->
+            X (T T_RETURN)
+        | 38 ->
+            X (T T_RCURLY)
+        | 39 ->
+            X (T T_RBRACKET)
+        | 40 ->
+            X (T T_QUEST)
+        | 41 ->
+            X (T T_QUERY)
+        | 42 ->
+            X (T T_PUBLIC)
+        | 43 ->
+            X (T T_PRIVATE)
+        | 44 ->
+            X (T T_PRIM)
+        | 45 ->
+            X (T T_POWOP)
+        | 46 ->
+            X (T T_POWASSIGN)
+        | 47 ->
+            X (T T_PLUSASSIGN)
+        | 48 ->
+            X (T T_PIPE)
+        | 49 ->
+            X (T T_OROP)
+        | 50 ->
+            X (T T_ORASSIGN)
+        | 51 ->
+            X (T T_OR)
+        | 52 ->
+            X (T T_OLD)
+        | 53 ->
+            X (T T_OBJECT)
+        | 54 ->
+            X (T T_NULL)
+        | 55 ->
+            X (T T_NOT)
+        | 56 ->
+            X (T T_NEQOP)
+        | 57 ->
+            X (T T_NAT)
+        | 58 ->
+            X (T T_MULOP)
+        | 59 ->
+            X (T T_MULASSIGN)
+        | 60 ->
+            X (T T_MODULE)
+        | 61 ->
+            X (T T_MODOP)
+        | 62 ->
+            X (T T_MODASSIGN)
+        | 63 ->
+            X (T T_MINUSASSIGN)
+        | 64 ->
+            X (T T_LTOP)
+        | 65 ->
+            X (T T_LT)
+        | 66 ->
+            X (T T_LPAR)
+        | 67 ->
+            X (T T_LOOP)
+        | 68 ->
+            X (T T_LET)
+        | 69 ->
+            X (T T_LEOP)
+        | 70 ->
+            X (T T_LCURLY)
+        | 71 ->
+            X (T T_LBRACKET)
+        | 72 ->
+            X (T T_LABEL)
+        | 73 ->
+            X (T T_INVARIANT)
+        | 74 ->
+            X (T T_IN)
+        | 75 ->
+            X (T T_IMPORT)
+        | 76 ->
+            X (T T_IMPLIES)
+        | 77 ->
+            X (T T_IGNORE)
+        | 78 ->
+            X (T T_IF)
+        | 79 ->
+            X (T T_ID)
+        | 80 ->
+            X (T T_HASH)
+        | 81 ->
+            X (T T_GTOP)
+        | 82 ->
+            X (T T_GT)
+        | 83 ->
+            X (T T_GEOP)
+        | 84 ->
+            X (T T_FUNC)
+        | 85 ->
+            X (T T_FROM_CANDID)
+        | 86 ->
+            X (T T_FOR)
+        | 87 ->
+            X (T T_FLOAT)
+        | 88 ->
+            X (T T_FLEXIBLE)
+        | 89 ->
+            X (T T_EQOP)
+        | 90 ->
+            X (T T_EQ)
+        | 91 ->
+            X (T T_EOF)
+        | 92 ->
+            X (T T_ELSE)
+        | 93 ->
+            X (T T_DOT_NUM)
+        | 94 ->
+            X (T T_DOT)
+        | 95 ->
+            X (T T_DO)
+        | 96 ->
+            X (T T_DIVOP)
+        | 97 ->
+            X (T T_DIVASSIGN)
+        | 98 ->
+            X (T T_DISALLOWED)
+        | 99 ->
+            X (T T_DEBUG_SHOW)
+        | 100 ->
+            X (T T_DEBUG)
+        | 101 ->
+            X (T T_CONTINUE)
+        | 102 ->
+            X (T T_COMPOSITE)
+        | 103 ->
+            X (T T_COMMA)
+        | 104 ->
+            X (T T_COLON)
+        | 105 ->
+            X (T T_CLASS)
+        | 106 ->
+            X (T T_CHAR)
+        | 107 ->
+            X (T T_CATCH)
+        | 108 ->
+            X (T T_CATASSIGN)
+        | 109 ->
+            X (T T_CASE)
+        | 110 ->
+            X (T T_BREAK)
+        | 111 ->
+            X (T T_BOOL)
+        | 112 ->
+            X (T T_BANG)
+        | 113 ->
+            X (T T_AWAITSTAR)
+        | 114 ->
+            X (T T_AWAIT)
+        | 115 ->
+            X (T T_ASYNCSTAR)
+        | 116 ->
+            X (T T_ASYNC)
+        | 117 ->
+            X (T T_ASSIGN)
+        | 118 ->
+            X (T T_ASSERT)
+        | 119 ->
+            X (T T_ARROW)
+        | 120 ->
+            X (T T_ANDOP)
+        | 121 ->
+            X (T T_ANDASSIGN)
+        | 122 ->
+            X (T T_AND)
+        | 123 ->
+            X (T T_ADDOP)
+        | 124 ->
+            X (T T_ACTOR)
+        | _ ->
+            assert false
+    
+    and nonterminal =
+      fun nt ->
+        match nt with
+        | 94 ->
+            X (N N_annot_opt)
+        | 93 ->
+            X (N N_bl)
+        | 92 ->
+            X (N N_block)
+        | 91 ->
+            X (N N_case)
+        | 90 ->
+            X (N N_catch)
+        | 89 ->
+            X (N N_class_body)
+        | 88 ->
+            X (N N_dec)
+        | 87 ->
+            X (N N_dec_field)
+        | 86 ->
+            X (N N_dec_nonvar)
+        | 85 ->
+            X (N N_dec_var)
+        | 84 ->
+            X (N N_exp_bl_)
+        | 83 ->
+            X (N N_exp_ob_)
+        | 82 ->
+            X (N N_exp_bin_bl_)
+        | 81 ->
+            X (N N_exp_bin_ob_)
+        | 80 ->
+            X (N N_exp_field)
+        | 79 ->
+            X (N N_exp_nest)
+        | 78 ->
+            X (N N_exp_nondec_bl_)
+        | 77 ->
+            X (N N_exp_nondec_ob_)
+        | 76 ->
+            X (N N_exp_nonvar_bl_)
+        | 75 ->
+            X (N N_exp_nonvar_ob_)
+        | 74 ->
+            X (N N_exp_nullary_bl_)
+        | 73 ->
+            X (N N_exp_nullary_ob_)
+        | 72 ->
+            X (N N_exp_obj)
+        | 71 ->
+            X (N N_exp_plain)
+        | 70 ->
+            X (N N_exp_post_bl_)
+        | 69 ->
+            X (N N_exp_post_ob_)
+        | 68 ->
+            X (N N_exp_un_bl_)
+        | 67 ->
+            X (N N_exp_un_ob_)
+        | 66 ->
+            X (N N_func_body)
+        | 65 ->
+            X (N N_imp)
+        | 64 ->
+            X (N N_import_list)
+        | 63 ->
+            X (N N_inst)
+        | 62 ->
+            X (N N_list_preceded_COMMA_typ__)
+        | 61 ->
+            X (N N_list_preceded_COMMA_typ_bind__)
+        | 60 ->
+            X (N N_lit)
+        | 59 ->
+            X (N N_ob)
+        | 58 ->
+            X (N N_obj_body)
+        | 57 ->
+            X (N N_option_EQ_)
+        | 56 ->
+            X (N N_option_exp_nullary_ob__)
+        | 55 ->
+            X (N N_option_query_)
+        | 54 ->
+            X (N N_option_typ_args_)
+        | 53 ->
+            X (N N_parse_module_header)
+        | 52 ->
+            X (N N_parse_prog)
+        | 51 ->
+            X (N N_parse_prog_interactive)
+        | 50 ->
+            X (N N_parse_stab_sig)
+        | 49 ->
+            X (N N_pat)
+        | 48 ->
+            X (N N_pat_bin)
+        | 47 ->
+            X (N N_pat_field)
+        | 46 ->
+            X (N N_pat_nullary)
+        | 45 ->
+            X (N N_pat_opt)
+        | 44 ->
+            X (N N_pat_plain)
+        | 43 ->
+            X (N N_pat_un)
+        | 42 ->
+            X (N N_path)
+        | 41 ->
+            X (N N_separated_nonempty_list_AND_exp_post_ob__)
+        | 40 ->
+            X (N N_seplist_case_semicolon_)
+        | 39 ->
+            X (N N_seplist_dec_SEMICOLON_)
+        | 38 ->
+            X (N N_seplist_dec_semicolon_)
+        | 37 ->
+            X (N N_seplist_dec_field_semicolon_)
+        | 36 ->
+            X (N N_seplist_exp_ob__COMMA_)
+        | 35 ->
+            X (N N_seplist_exp_field_semicolon_)
+        | 34 ->
+            X (N N_seplist_exp_nonvar_ob__COMMA_)
+        | 33 ->
+            X (N N_seplist_imp_SEMICOLON_)
+        | 32 ->
+            X (N N_seplist_imp_semicolon_)
+        | 31 ->
+            X (N N_seplist_pat_bin_COMMA_)
+        | 30 ->
+            X (N N_seplist_pat_field_semicolon_)
+        | 29 ->
+            X (N N_seplist_stab_field_semicolon_)
+        | 28 ->
+            X (N N_seplist_typ_COMMA_)
+        | 27 ->
+            X (N N_seplist_typ_bind_COMMA_)
+        | 26 ->
+            X (N N_seplist_typ_dec_semicolon_)
+        | 25 ->
+            X (N N_seplist_typ_field_semicolon_)
+        | 24 ->
+            X (N N_seplist_typ_item_COMMA_)
+        | 23 ->
+            X (N N_seplist_typ_tag_semicolon_)
+        | 22 ->
+            X (N N_seplist1_exp_field_semicolon_)
+        | 21 ->
+            X (N N_seplist1_typ_tag_semicolon_)
+        | 20 ->
+            X (N N_stab)
+        | 19 ->
+            X (N N_stab_field)
+        | 18 ->
+            X (N N_start)
+        | 17 ->
+            X (N N_typ)
+        | 16 ->
+            X (N N_typ_args)
+        | 15 ->
+            X (N N_typ_bind)
+        | 14 ->
+            X (N N_typ_dec)
+        | 13 ->
+            X (N N_typ_field)
+        | 12 ->
+            X (N N_typ_item)
+        | 11 ->
+            X (N N_typ_nobin)
+        | 10 ->
+            X (N N_typ_nullary)
+        | 9 ->
+            X (N N_typ_obj)
+        | 8 ->
+            X (N N_typ_pre)
+        | 7 ->
+            X (N N_typ_tag)
+        | 6 ->
+            X (N N_typ_un)
+        | 5 ->
+            X (N N_typ_variant)
+        | 4 ->
+            X (N N_vis)
+        | _ ->
+            assert false
+    
+    and lr0_incoming =
+      (8, "\000%\152\030(nt\134\004\176\214\224y.yR\142\160\210<T\206ToR\134T\132*\208\1600Z(l\142\028\160\210z\019\132*{\166\142 \160\132\031\20877\166\182\144\028\160\206T\132*{\166\011\r\240\232\234\250\019\r\017\019\021U\132\r\240\017\023\023#h#\246#\20899\166\190\160!m\017\0237\166\r\240\023\r\240\023#P#P#\182#\160\132*{\166\021\210#7\166\021\210#\210#\021\210#\162N\160\189\015>\162\015>/@//@/\027>3@3+N3N\r\240\0237\166\r\240\023#\019#\031{{\166\r\240\0237\166\r\240\023\r\240\023\160\210#\025\208#11B\r\132*{\166\r\240\0237\166\r\240\023\r\240\023#\189\182\160\162\160Y]y\248yW]aha\210#c=N_>=@=W?Ba\208?]\182s(A\129\184\131>A@Ak\000%A\004\006\030$\134\026Z(\134\028\160\189\182 \160\1327\166\182#\182#\"\004.R`p\128\134&\006\142\028\160\189\182,\160wy\143\145\147\142\220]\026\147\030\"$\134<oY[l\212\132*{\166Y\189\142*VX\t2\178)LT[l\212\132*{\166Y\189\182\160uuu\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179z\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\170\132*{\166Y\189\142j&,\147\142QN\183>Q@Q.\144\028l\160\189su\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\189suz\160\189su\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\189su\136L\138c\182\146\160\189R\162\160\147\172\200\248\250\143\135\139\132*\208#}}\1669\166\144\156Z(`\135\147jp\135\128\135\134*\144\028\158\147\136\146\160\189\156\158\147\160\162\160\147\170\132*{\166Y\189\182\174\134c\150\192R\185\185\202\172\135\174\134c\150\204\160\206T[l\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179z\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\170\132*{\166Y\189\133\1857\166Y\189\133\160\132*{\166Y\189\1337\166Y\189\133Y\189\133Y\189\133\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\250\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\222\160q\147\228\192R\185\185\198\200\135\202\204\160\222\160q\228\230\232\234\238\210*\248\135\250\160\189su\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\143\189su\137\141\144\230\143\149\153\157\159\165\004\135\163\004\163\b\163\012\163\016\163\020\163.\1634\1638\163D\163H\163\\\163b\163d\163h\163r\163v\163|\163\130\163\140\163\154\163\162\163\164\163\168\163\180\163\194\163\210\023\242\163\246\163\248\163\006\232\159\169\171\173\185\187\234\159\238\210*\159L\159t\210\234\159\148\159\170\159\159\250\151\155\163\006\167\171\173\n\167\014\167\018\167\022\1676\167:\167F\167J\167^\167`\167f\167x\167~\167\128\167\196\167\218\167\236\167\244\167\167\b\163\n\167\012\163\014\167\016\163\018\167\020\163\022\167.\1634\1636\1678\163:\167D\163F\167H\163J\167\\\163^\167`\167b\163d\163f\167h\163r\163v\163x\167|\163~\167\128\167\130\163\140\163\154\163\162\163\164\163\168\163\180\163\194\163\196\167\210\023\218\167\236\167\242\163\244\167\246\163\248\163\167P\188\190\160\226\127\147\159L\159t\210\234\159\148\159\170\159\159\159\159\159\159\159\159\167B\159\159\167B\159\167\1337\166Y\189\133\160\132*{\166Y\189\1337\166Y\189\133Y\189\133Y\189\133\159\186\159\159\159\159\026\159\159\186\159EP\151\208EEP\141\190\160BIB\167\208I\159\159\167P\188\190\160\226\127\147\135\135\135\159\167\167\159\026\159EPEP\135\159\159\138c\182\167\186\159MN\155\171\173\177>M@M\1337\166Y\189\133\160\132*{\166Y\189\1337\166Y\189\133Y\189\133Y\189\133\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\250\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\167\177KN\175>K@K\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179z\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\170\132*{\166Y\189\1337\166Y\189\133\160\132*{\166Y\189\1337\166Y\189\133Y\189\133Y\189\133\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179\250\212\132*{\166Y\189\1797\166Y\189\179\160\132*{\166Y\189\1797\166Y\189\179Y\189\179Y\189\179IB\159\216]\159\181\159\159QN\167\160\189\182\167GNS\024\160-N\161>G\161>G@G@G\139\246SN\139\246S\135\159*\139\190\160B\135\135\135\135\135\135\159\181\167\147\159IB\135\135M\184i\000%CO>\177@O\131@Cg\000% \160\1327\166\182#\182#\029>5@55\250\1422\028\160\210#\160\210#'>;@;;Ne")
+    
+    and rhs =
+      ((8, "kige\210#\198\142MN\220]\159\216]\159\182\160u\182uu\171\173\155\138c\182\167\186\159\t)\177\138c\182\167 \160\182# \160\1327\166\182#l\160\189sul\189su\250\160\189su\250\189suz\160\189suz\189su\170\160Y\189\133\170\160\1327\166Y\189\133\170\160\132*{\166Y\189\133\170Y\189\133\170\1327\166Y\189\133\170\132*{\166Y\189\133<o[\170\160Y\189\133<o[\170\160\1327\166Y\189\133<o[\170\160\132*{\166Y\189\133<o[\170Y\189\133<o[\170\1327\166Y\189\133<o[\170\132*{\166Y\189\133T[\170\160Y\189\133T[\170\160\1327\166Y\189\133T[\170\160\132*{\166Y\189\133T[\170Y\189\133T[\170\1327\166Y\189\133T[\170\132*{\166Y\189\133\206T[\170\160Y\189\133\206T[\170\160\1327\166Y\189\133\206T[\170\160\132*{\166Y\189\133\206T[\170Y\189\133\206T[\170\1327\166Y\189\133\206T[\170\132*{\166Y\189\133\212\160Y\189\179\212\160\1327\166Y\189\179\212\160\132*{\166Y\189\179\212Y\189\179\212\1327\166Y\189\179\212\132*{\166Y\189\179l\212\160Y\189\179l\212\160\1327\166Y\189\179l\212\160\132*{\166Y\189\179l\212Y\189\179l\212\1327\166Y\189\179l\212\132*{\166Y\189\179\250\212\160Y\189\179\250\212\160\1327\166Y\189\179\250\212\160\132*{\166Y\189\179\250\212Y\189\179\250\212\1327\166Y\189\179\250\212\132*{\166Y\189\179z\212\160Y\189\179z\212\160\1327\166Y\189\179z\212\160\132*{\166Y\189\179z\212Y\189\179z\212\1327\166Y\189\179z\212\132*{\166Y\189\179<o[\212\160Y\189\179<o[\212\160\1327\166Y\189\179<o[\212\160\132*{\166Y\189\179<o[\212Y\189\179<o[\212\1327\166Y\189\179<o[\212\132*{\166Y\189\179<o[l\212\160Y\189\179<o[l\212\160\1327\166Y\189\179<o[l\212\160\132*{\166Y\189\179<o[l\212Y\189\179<o[l\212\1327\166Y\189\179<o[l\212\132*{\166Y\189\179<o[\250\212\160Y\189\179<o[\250\212\160\1327\166Y\189\179<o[\250\212\160\132*{\166Y\189\179<o[\250\212Y\189\179<o[\250\212\1327\166Y\189\179<o[\250\212\132*{\166Y\189\179<o[z\212\160Y\189\179<o[z\212\160\1327\166Y\189\179<o[z\212\160\132*{\166Y\189\179<o[z\212Y\189\179<o[z\212\1327\166Y\189\179<o[z\212\132*{\166Y\189\179T[\212\160Y\189\179T[\212\160\1327\166Y\189\179T[\212\160\132*{\166Y\189\179T[\212Y\189\179T[\212\1327\166Y\189\179T[\212\132*{\166Y\189\179T[l\212\160Y\189\179T[l\212\160\1327\166Y\189\179T[l\212\160\132*{\166Y\189\179T[l\212Y\189\179T[l\212\1327\166Y\189\179T[l\212\132*{\166Y\189\179T[\250\212\160Y\189\179T[\250\212\160\1327\166Y\189\179T[\250\212\160\132*{\166Y\189\179T[\250\212Y\189\179T[\250\212\1327\166Y\189\179T[\250\212\132*{\166Y\189\179T[z\212\160Y\189\179T[z\212\160\1327\166Y\189\179T[z\212\160\132*{\166Y\189\179T[z\212Y\189\179T[z\212\1327\166Y\189\179T[z\212\132*{\166Y\189\179\206T[\212\160Y\189\179\206T[\212\160\1327\166Y\189\179\206T[\212\160\132*{\166Y\189\179\206T[\212Y\189\179\206T[\212\1327\166Y\189\179\206T[\212\132*{\166Y\189\179\206T[l\212\160Y\189\179\206T[l\212\160\1327\166Y\189\179\206T[l\212\160\132*{\166Y\189\179\206T[l\212Y\189\179\206T[l\212\1327\166Y\189\179\206T[l\212\132*{\166Y\189\179\206T[\250\212\160Y\189\179\206T[\250\212\160\1327\166Y\189\179\206T[\250\212\160\132*{\166Y\189\179\206T[\250\212Y\189\179\206T[\250\212\1327\166Y\189\179\206T[\250\212\132*{\166Y\189\179\206T[z\212\160Y\189\179\206T[z\212\160\1327\166Y\189\179\206T[z\212\160\132*{\166Y\189\179\206T[z\212Y\189\179\206T[z\212\1327\166Y\189\179\206T[z\212\132*{\166Y\189\179\028\160\189\182\167\153\171\151\171\137\165\248\163\165.\163\165v\163\165\194\163\165|\163\165\\\163\165\020\163\165\b\163\165\016\163\165\012\163\165\242\163\165d\163\165\004\163\1658\163\1654\163\165H\163\165D\163\165\162\163\165\180\163\165r\163\165\130\163\165\140\163\165\164\163\165\168\163\165\246\163\165h\163\165\210\023\165b\163\165\154\163\135\163\248\163\163.\163\163v\163\163\194\163\163|\163\163\\\163\163\020\163\163\b\163\163\016\163\163\012\163\163\242\163\163d\163\163\004\163\1638\163\1634\163\163H\163\163D\163\163\162\163\163\180\163\163r\163\163\130\163\163\140\163\163\164\163\163\168\163\163\246\163\163h\163\163\210\023\163b\163\163\154\163\160\189\028\160\189\160\189\182\167\028\160\189\182\167\185\169\165\165\236\167\165`\167\165\128\167\165x\167\165\196\167\165~\167\165^\167\165\022\167\165\n\167\165\018\167\165\014\167\165\244\167\165f\167\165\006\167\165:\167\1656\167\165J\167\165F\167\165\218\167LL\167\234\159\232\159\230\159\228\159\238\159\146\160\189\159\222\160q\204\160\202\159\158\147\159\158\147\159\186\159\"\159\181&\159,\147\142QN\026\147\159\136\159\136\159\026\159\174\134c\150\167B\159\156\159\192\185\192R\185\238\210*\159\238\210\148\159\238\210\170\159\238\210L\159\238\210t\210\234\159j\159\163\163\236\167\163`\167\163\128\167\163x\167\163\196\167\163~\167\163^\167\163\022\167\163\n\167\163\018\167\163\014\167\163\244\167\163f\167\163\006\167\163:\167\1636\167\163J\167\163F\167\163\218\167LL\167\234\159\232\159\230\159\228\159\238\159\146\160\189\159\222\160q\204\160\202\159\158\147\159\158\147\159\186\159\"\159\181&\159,\147\142QN\026\147\159\136\159\136\159\026\159\174\134c\150\167B\159\156\159\192\185\192R\185\238\210*\159\238\210\148\159\238\210\170\159\238\210L\159\238\210t\210\234\159j\159\157\173\155\173\187\143\160Z(\030w\143\160Z(\030\142GN\142\139\246SN\142S\024-Ny\134IB\149\144EP\144\028EP\141\144\167P\141\188\141\190\160\141\127\147\141\226\134*\141\190\160B\147\144EP\144\028EP\139\144\167P\139\188\139\190\160\139\127\147\139\226\134*\139\190\160B\141\162\160\162\160\147R\135\248\135.\135\004\135`\135\128\135\006\135\250\143p\135\200\135$\134IB\172\135\139\162\160\162\160\147R\135\248\135.\135\004\135`\135\128\135\006\135\250\143p\135\200\135$\134IB\172\135\182\167\185\152]s(A\1329\166\132*}\166\208#}\208\031{n\224t\176\214(\145\142KN\182\147T\206T!%\129\184%AM\184%CO>%5\250\142;NaWahaa\210#\160\189\160\189\182cY\142=NY\030\160y\134?B]\162\160\162\160]RW\248y.y\004y\160U\190\160\139\139\246S\183\183@Q\183>Q\177\177@O\177\177@M\177>M\175\175@K\175>K\167\167\208I\161\161@G\161>G\151\151\208E\131\131@C\131\131@A\131>Aaa\208?__@=_>=''@;'>;##\2089\031\031\2087\029\029@5\029>5\027\027@3\027>3\025\025\2081\015\015@/\015>/\161\161@G\161>G\015\015@/\015>/\17822\160\210#2\028\160\210#\023#\246##h#\1329\166\1600#\160 \160\182# \160\1327\166\182# \160\182# \160\1327\166\182#\160\210#\028\160\210#\160\021\210#\160\1327\166\021\210#\160\132*{\166\021\210#\160\210##\017\r\240\023\1327\166\r\240\023\132*{\166\r\240\023<o\r\240\023<o\1327\166\r\240\023<o\132*{\166\r\240\023T\r\240\023T\1327\166\r\240\023T\132*{\166\r\240\023\206T\r\240\023\206T\1327\166\r\240\023\206T\132*{\166\r\240\023\1341BUm\144#P\144\028#P\019\011\1423N\rZ(\234\017\232\017l\019\250\019z\019\162\160\189\021R\r\142\162N\142+NXV*"), (16, "\000\000\000\001\000\002\000\003\000\004\000\006\000\006\000\007\000\n\000\r\000\016\000\019\000\021\000\022\000\023\000\024\000\025\000\031\000\"\000&\000*\0001\0006\000:\000?\000C\000H\000L\000Q\000Y\000b\000f\000m\000u\000}\000\136\000\148\000\155\000\165\000\176\000\183\000\193\000\204\000\210\000\219\000\229\000\237\000\248\001\004\001\011\001\021\001 \001%\001-\0016\001:\001A\001I\001O\001X\001b\001g\001o\001x\001~\001\135\001\145\001\150\001\158\001\167\001\173\001\182\001\192\001\197\001\205\001\214\001\222\001\233\001\245\001\252\002\006\002\017\002\026\002&\0023\002;\002F\002R\002[\002g\002t\002|\002\135\002\147\002\156\002\168\002\181\002\189\002\200\002\212\002\219\002\229\002\240\002\246\002\255\003\t\003\017\003\028\003(\003/\0039\003D\003L\003W\003c\003j\003t\003\127\003\135\003\146\003\158\003\165\003\175\003\186\003\194\003\205\003\217\003\224\003\234\003\245\003\254\004\n\004\023\004\031\004*\0046\004?\004K\004X\004`\004k\004w\004\128\004\140\004\153\004\161\004\172\004\184\004\189\004\190\004\191\004\192\004\193\004\194\004\197\004\200\004\203\004\206\004\209\004\212\004\215\004\218\004\221\004\224\004\227\004\230\004\233\004\236\004\239\004\242\004\245\004\248\004\251\004\254\005\001\005\004\005\007\005\n\005\r\005\016\005\019\005\022\005\025\005\026\005\029\005 \005#\005&\005)\005,\005/\0052\0055\0058\005;\005>\005A\005D\005G\005J\005M\005P\005S\005V\005Y\005\\\005_\005b\005e\005h\005k\005n\005q\005s\005v\005z\005\127\005\128\005\129\005\130\005\133\005\136\005\139\005\142\005\145\005\148\005\151\005\154\005\157\005\160\005\163\005\166\005\169\005\172\005\175\005\178\005\181\005\184\005\187\005\188\005\190\005\192\005\194\005\196\005\198\005\200\005\204\005\207\005\209\005\211\005\214\005\219\005\222\005\224\005\229\005\232\005\234\005\238\005\245\005\247\005\249\005\252\006\000\006\004\006\b\006\012\006\018\006\020\006\021\006\024\006\027\006\030\006!\006$\006'\006*\006-\0060\0063\0066\0069\006<\006?\006B\006E\006H\006K\006N\006O\006Q\006S\006U\006W\006Y\006[\006_\006b\006d\006f\006i\006n\006q\006s\006x\006{\006}\006\129\006\136\006\138\006\140\006\143\006\147\006\151\006\155\006\159\006\165\006\167\006\168\006\169\006\170\006\171\006\172\006\173\006\174\006\176\006\177\006\178\006\179\006\180\006\182\006\183\006\186\006\191\006\196\006\197\006\200\006\201\006\204\006\208\006\212\006\214\006\217\006\220\006\222\006\228\006\229\006\232\006\236\006\240\006\242\006\245\006\248\006\250\007\000\007\001\007\003\007\006\007\b\007\n\007\012\007\014\007\016\007\018\007\020\007\022\007\024\007\026\007\030\007 \007!\007#\007&\007(\007*\007,\007.\0070\0072\0074\0076\0078\007:\007>\007@\007B\007C\007G\007H\007H\007K\007O\007O\007R\007R\007U\007V\007W\007X\007Y\007Z\007[\007\\\007_\007_\007`\007`\007a\007a\007b\007d\007d\007e\007h\007l\007p\007v\007w\007x\007{\007~\007\128\007\132\007\133\007\136\007\137\007\137\007\138\007\139\007\140\007\143\007\144\007\146\007\149\007\151\007\153\007\155\007\157\007\158\007\161\007\162\007\165\007\165\007\166\007\169\007\172\007\172\007\173\007\176\007\176\007\177\007\180\007\183\007\183\007\184\007\187\007\190\007\190\007\191\007\194\007\194\007\195\007\198\007\201\007\201\007\202\007\205\007\205\007\206\007\209\007\209\007\210\007\213\007\216\007\216\007\217\007\220\007\220\007\221\007\224\007\227\007\227\007\228\007\231\007\234\007\234\007\235\007\238\007\238\007\239\007\242\007\242\007\243\007\246\007\249\007\249\007\250\007\253\b\000\b\000\b\001\b\004\b\004\b\005\b\b\b\011\b\012\b\015\b\018\b\019\b\022\b\025\b\025\b\026\b\027\b\031\b$\b$\b%\b(\b+\b.\b1\b2\b6\b=\bA\bH\bK\bO\bS\bZ\bb\be\bf\bg\bj\bp\bw\b|\b\132\b\141\b\145\b\152\b\160\b\165\b\173\b\182\b\185\b\187\b\190\b\194\b\195\b\196\b\199\b\200\b\202\b\204\b\206\b\208\b\210\b\212\b\215\b\216\b\218\b\221\b\224\b\224\b\225\b\226\b\227"))
+    
+    and lr0_core =
+      (16, "\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\b\000\t\000\n\000\011\000\012\000\r\000\014\000\015\000\016\000\017\000\018\000\019\000\020\000\021\000\022\000\023\000\024\000\025\000\026\000\027\000\028\000\029\000\030\000\031\000 \000!\000\"\000#\000$\000%\000&\000'\000(\000)\000*\000+\000,\000-\000.\000/\0000\0001\0002\0003\0004\0005\0006\0007\0008\0009\000:\000;\000<\000=\000>\000?\000@\000A\000B\000C\000D\000E\000F\000G\000H\000I\000J\000K\000L\000M\000N\000O\000P\000Q\000R\000S\000T\000U\000V\000W\000X\000Y\000Z\000[\000\\\000]\000^\000_\000`\000a\000b\000c\000d\000e\000f\000g\000h\000i\000j\000k\000l\000m\000n\000o\000p\000q\000r\000s\000t\000u\000v\000w\000x\000y\000z\000{\000|\000}\000~\000\127\000\128\000\129\000\130\000\131\000\132\000\133\000\134\000\135\000\136\000\137\000\138\000\139\000\140\000\141\000\142\000\143\000\144\000\145\000\146\000\147\000\148\000\149\000\150\000\151\000\152\000\153\000\154\000\155\000\156\000\157\000\158\000\159\000\160\000\161\000\162\000\163\000\164\000\165\000\166\000\167\000\168\000\169\000\170\000\171\000\172\000\173\000\174\000\175\000\176\000\177\000\178\000\179\000\180\000\181\000\182\000\183\000\184\000\185\000\186\000\187\000\188\000\189\000\190\000\191\000\192\000\193\000\194\000\195\000\196\000\197\000\198\000\199\000\200\000\201\000\202\000\203\000\204\000\205\000\206\000\207\000\208\000\209\000\210\000\211\000\212\000\213\000\214\000\215\000\216\000\217\000\218\000\219\000\220\000\221\000\222\000\223\000\224\000\225\000\226\000\227\000\228\000\229\000\230\000\231\000\232\000\233\000\234\000\235\000\236\000\237\000\238\000\239\000\240\000\241\000\242\000\243\000\244\000\245\000\246\000\247\000\248\000\249\000\250\000\251\000\252\000\253\000\254\000\255\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\b\001\t\001\n\001\011\001\012\001\r\001\014\001\015\001\016\001\017\001\018\001\019\001\020\001\021\001\022\001\023\001\024\001\025\001\026\001\027\001\028\001\029\001\030\001\031\001 \001!\001\"\001#\001$\001%\001&\001'\001(\001)\001*\001+\001,\001-\001.\001/\0010\0011\0012\0013\0014\0015\0016\0017\0018\0019\001:\001;\001<\001=\001>\001?\001@\001A\001B\001C\001D\001E\001F\001G\001H\001I\001J\001K\001L\001M\001N\001O\001P\001Q\001R\001S\001T\001U\001V\001W\001X\001Y\001Z\001[\001\\\001]\001^\001_\001`\001a\001b\001c\001d\001e\001f\001g\001h\001i\001j\001k\001l\001m\001n\001o\001p\001q\001r\001s\001t\001u\001v\001w\001x\001y\001z\001{\001|\001}\001~\001\127\001\128\001\129\001\130\001\131\001\132\001\133\001\134\001\135\001\136\001\137\001\138\001\139\001\140\001\141\001\142\001\143\001\144\001\145\001\146\001\147\001\148\001\149\001\150\001\151\001\152\001\153\001\154\001\155\001\156\001\157\001\158\001\159\001\160\001\161\001\162\001\163\001\164\001\165\001\166\001\167\001\168\001\169\001\170\001\171\001\172\001\173\001\174\001\175\001\176\001\177\001\178\001\179\001\180\001\181\001\182\001\183\001\184\001\185\001\186\001\187\001\188\001\189\001\190\001\191\001\192\001\193\001\194\001\195\001\196\001\197\001\198\001\199\001\200\001\201\001\202\001\203\001\204\001\205\001\206\001\207\001\208\001\209\001\210\001\211\001\212\001\213\001\214\001\215\001\216\001\217\001\218\001\219\001\220\001\221\001\222\001\223\001\224\001\225\001\226\001\227\001\228\001\229\001\230\001\231\001\232\001\233\001\234\001\235\001\236\001\237\001\238\001\239\001\240\001\241\001\242\001\243\001\244\001\245\001\246\001\247\001\248\001\249\001\250\001\251\001\252\001\253\001\254\001\255\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\b\002\t\002\n\002\011\002\012\002\r\002\014\002\015\002\016\002\017\002\018\002\019\002\020\002\021\002\022\002\023\002\024\002\025\002\026\002\027\002\028\002\029\002\030\002\031\002 \002!\002\"\002#\002$\002%\002&\002'\002(\002)\002*\002+\002,\002-\002.\002/\0020\0021\0022\0023\0024\0025\0026\0027\0028\0029\002:\002;\002<\002=\002>\002?\002@\002A\002B\002C\002D\002E\002F\002G\002H\002I\002J\002K\002L\002M\002N\002O\002P\002Q\002R\002S\002T\002U\002V\002W\002X\002Y\002Z\002[\002\\\002]\002^\002_\002`\002a\002b\002c\002d\002e\002f\002g\002h\002i\002j\002k\002l\002m\002n\002o\002p\002q\002r\002s\002t\002u\002v\002w\002x\002y\002z\002{\002|\002}\002~\002\127\002\128\002\129\002\130\002\131\002\132\002\133\002\134\002\135\002\136\002\137\002\138\002\139\002\140\002\141\002\142\002\143\002\144\002\145\002\146\002\147\002\148\002\149\002\150\002\151\002\152\002\153\002\154\002\155\002\156\002\157\002\158\002\159\002\160\002\161\002\162\002\163\002\164\002\165\002\166\002\167\002\168\002\169\002\170\002\171\002\172\002\173\002\174\002\175\002\176\002\177\002\178\002\179\002\180\002\181\002\182\002\183\002\184\002\185\002\186\002\187\002\188\002\189\002\190\002\191\002\192\002\193\002\194\002\195\002\196\002\197\002\198\002\199\002\200\002\201\002\202\002\203\002\204\002\205\002\206\002\207\002\208\002\209\002\210\002\211\002\212\002\213\002\214\002\215\002\216\002\217\002\218\002\219\002\220\002\221\002\222\002\223\002\224\002\225\002\226\002\227\002\228\002\229\002\230\002\231\002\232\002\233\002\234\002\235\002\236\002\237\002\238\002\239\002\240\002\241\002\242\002\243\002\244\002\245\002\246\002\247\002\248\002\249\002\250\002\251\002\252\002\253\002\254\002\255\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\b\003\t\003\n\003\011\003\012\003\r\003\014\003\015\003\016\003\017\003\018\003\019\003\020\003\021\003\022\003\023\003\024\003\025\003\026\003\027\003\028\003\029\003\030\003\031\003 \003!\003\"\003#\003$\003%\003&\003'\003(\003)\003*\003+\003,\003-\003.\003/\0030\0031\0032\0033\0034\0035\0036\0037\0038\0039\003:\003;\003<\003=\003>\003?\003@\003A\003B\003C\003D\003E\003F\003G\003H\003I\003J\003K\003L\003M\003N\003O\003P\003Q\003R\003S\003T\003U\003V\003W\003X\003Y\003Z\003[\003\\\003]\003^\003_\003`\003e\003f\003m\003n\003u\003v\003o\003p\003q\003r\003s\003t\003\155\003\156\003\157\003\158\003\159\003\160\003\161\003\162\003\163\003\164\003\165\003\166\003\167\003\168\003\169\003\170\003\171\003\172\003\173\003\174\003\175\003\176\003\177\003\178\003\179\003\180\003\181\003\182\003\183\003a\003b\003\184\003\185\003\186\003\187\003c\003d\003g\003h\003y\003z\003\149\003\150\003\127\003\128\003\129\003\130\003\145\003\146\003\188\003\189\003\190\003\191\003\192\003\193\003i\003j\003\194\003\195\003k\003l\003\196\003\197\003\198\003\199\003\200\003\201\003\202\003\203\003\204\003\205\003\206\003\207\003w\003x\003{\003|\003}\003~\003\137\003\138\003\153\003\154\003\131\003\132\003\133\003\134\003\139\003\140\003\141\003\142\003\143\003\144\003\151\003\152\003\208\003\209\003\210\003\211\003\212\003\213\003\214\003\215\003\135\003\136\003\147\003\148\003\216\003\217\003\218\003\219\003\220\003\221\003\222\003\223\003\224\003\225\003\226\003\227\003\228\003\229\003\230\003\231\003\232\003\233\003\234\003\235\003\236\003\237\003\238\003\239\003\240\003\241\003\242\003\243\003\244\003\245\003\246\003\247\003\248\003\249\003\250\003\251\003\252\003\253\003\254\003\255\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\b\004\t\004\n\004\011\004\012\004\r\004\014\004\015\004\016\004\017\004\018\004\019\004\020\004\021\004\022\004\023\004\024\004\025\004\026\004\027\004\028\004\029\004\030\004\031\004 \004!\004\"\004#\004$\004%\004&\004'\004(\004)\004*\004+\004,\004-\004.\004/\0040\0041\0042\0043\0044\0045\0046\0047\0048\0049\004:\004;\004<\004=\004>\004?\004@\004A\004B\004C\004D\004E\004F\004G\004H\004I\004J\004K\004L\004M\004N\004O\004P\004Q\004R\004S\004T\004U\004V\004W\004X\004Y\004Z\004[\004\\\004]\004^\004_\004`\004a\004b\004c\004d\004e\004f\004g\004h\004i\004j\004k\004l\004m\004n\004o\004p\004q\004r\004s\004t\004u\004v\004w\004x\004y\004z\004{\004|\004}\004~\004\127\004\128\004\129\004\130\004\131\004\132\004\133\004\134\004\135\004\136\004\137\004\138\004\139\004\140\004\141\004\142\004\143\004\144\004\145\004\146\004\147\004\148\004\149\004\150\004\151\004\152\004\153\004\154\004\155\004\156\004\157\004\158\004\159\004\160\004\161\004\162\004\163\004\164\004\165\004\166\004\167\004\168\004\169\004\170\004\171\004\172\004\173\004\174\004\175\004\176\004\177\004\178\004\179\004\180\004\181\004\182\004\183\004\184\004\185\004\186\004\187\004\188\004\189\004\190\004\191\004\192\004\193\004\194\004\195\004\196\004\197\004\198\004\199\004\200\004\201\004\202\004\203\004\204\004\205\004\206\004\207\004\208\004\209\004\210\004\211\004\212\004\213\004\214\004\215\004\216\004\217\004\218\004\219\004\220\004\221\004\222\004\223\004\224\004\225\004\226\004\227\004\228\004\229\004\230\004\231\004\232\004\233\004\234\004\235\004\236\004\237\004\238\004\239\004\240\004\241\004\242\004\243\004\244\004\245\004\246\004\247\004\248\004\249\004\250\004\251\004\252\004\253\004\254\004\255\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\b\005\t\005\n\005\011\005\012\005\r\005\014\005\015\005\016\005\017\005\018\005\019\005\020\005\021\005\022\005\023\005\024\005\025\005\026\005\027\005\028\005\029\005\030\005\031\005 \005!\005\"\005#\005$\005%\005&\005'\005(\005)\005*\005+\005,\005-\005.\005/\0050\0051\0052\0053\0054\0055\0056\0057\0058\0059\005:\005;\005<\005=\005>\005?\005@\005A\005B\005C\005D\005E\005F\005G\005H\005I\005J\005K\005L\005M\005N\005O\005P\005Q\005R\005S\005T\005U\005V\005W\005X\005Y\005Z\005[\005\\\005]\005^\005_\005`\005a\005b\005c\005d\005e\005f\005g\005h\005i\005j\005k\005l\005m\005n\005o\005p\005q\005r\005s\005t\005u\005v\005w\005x\005y\005z\005{\005|\005}\005~\005\127\005\128\005\129\005\130\005\131\005\132\005\133\005\134\005\135\005\136\005\137\005\138\005\139\005\140\005\141\005\142\005\143\005\144\005\145\005\146\005\147\005\148\005\149\005\150\005\151\005\152\005\153\005\154\005\155\005\156\005\157\005\158\005\159\005\160\005\161\005\162\005\163\005\164\005\165\005\166\005\167\005\168\005\169\005\170\005\171\005\172\005\173\005\174\005\175\005\176\005\177\005\178\005\179\005\180\005\181\005\182\005\183\005\184\005\185\005\186\005\187\005\188\005\189\005\190\005\191\005\192\005\193\005\194\005\195\005\196\005\197\005\198\005\199\005\200\005\201\005\202\005\203\005\204\005\205\005\206\005\207\005\208\005\209\005\210\005\211\005\212\005\213\005\214\005\215\005\216\005\217\005\218\005\219\005\220\005\221\005\222\005\223\005\224\005\225\005\226\005\227\005\228\005\229\005\230\005\231\005\232\005\233\005\234\005\235\005\236\005\237\005\238\005\239\005\240\005\241\005\242\005\243\005\244\005\245\005\246\005\247\005\248\005\249\005\250\005\251\005\252\005\253\005\254\005\255\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\b\006\t\006\n\006\011\006\012\006\r\006\014\006\015\006\016\006\017\006\018\006\019\006\020\006\021\006\022\006\023\006\024\006\025\006\026\006\027\006\028\006\029\006\030\006\031\006 \006!\006\"\006#\006$\006%\006&\006'\006(\006)\006*")
+    
+    and lr0_items =
+      ((32, "\000\000\000\000\000\006l\001\000\006\004\001\000\006\164\001\000\006<\001\000\006(\001\000\0060\001\000\006\176\001\000\006\204\001\000\0064\001\000\0068\001\000\006,\001\000\006\204\002\000\006\200\001\000\006\200\002\000\006\192\001\000\006\152\001\000\006\144\001\000\006\140\001\000\000\016\001\000\bl\001\000\bh\001\000\bd\001\000\006\\\001\000\006`\001\000\006`\002\000\bl\002\000\bh\002\000\bd\002\000\b\200\001\000\b\136\001\000\bx\001\000\bt\001\000\bp\001\000\bx\002\000\bt\002\000\bx\003\000\006$\001\000\b$\001\000\b \001\000\b \002\000\b\168\001\000\b\168\002\000\b\180\001\000\b\160\001\000\b<\001\000\b<\002\000\b<\003\000\b\188\001\000\b\188\002\000\b`\001\000\b\\\001\000\b`\002\000\b`\003\000\b`\004\000\b\208\001\000\b\204\001\000\b\160\001\000\b4\001\000\b0\001\000\b4\002\000\b0\002\000\b4\003\000\007\160\001\000\007\156\001\000\007\160\002\000\007\160\003\000\b4\004\000\b4\005\000\b4\006\000\b\148\001\000\b\144\001\000\b\148\002\000\006\208\001\000\b\132\001\000\b\128\001\000\b|\001\000\b\132\002\000\b\128\002\000\b|\002\000\b\132\003\000\b\128\003\000\b\132\004\000\b\132\005\000\b\132\006\000\b\156\001\000\b\132\007\000\b\132\b\000\b\176\001\000\b\172\001\000\b\184\001\000\b\184\002\000\b\164\001\000\b\172\002\000\b\152\001\000\b\196\001\000\b\140\001\000\006\212\001\000\b\028\001\000\b\164\001\000\bX\001\000\bX\002\000\bT\001\000\bX\003\000\b\016\001\000\b\024\001\000\b\020\001\000\007\148\001\000\007\144\001\000\b\024\002\000\b\024\003\000\b\024\001\000\b\020\001\000\b\020\002\000\b\024\001\000\b\020\003\000\b\020\001\000\007\148\002\000\007\148\003\000\b\028\002\000\b\028\003\000\006\212\002\000\006\212\003\000\006h\001\000\b\140\002\000\b\176\002\000\b\132\t\000\b\128\004\000\b\128\005\000\b\128\006\000\b\128\007\000\b\128\b\000\b|\003\000\b|\004\000\b|\005\000\b\148\003\000\b\024\001\000\b\020\001\000\b\148\004\000\b\144\002\000\b\024\001\000\b\020\001\000\b\144\003\000\b4\007\000\b\024\001\000\b\020\001\000\b0\003\000\b0\004\000\b\024\001\000\b\020\001\000\bH\001\000\bD\001\000\b@\001\000\b8\001\000\bH\002\000\bD\002\000\bH\003\000\bH\004\000\bH\005\000\bH\006\000\bH\007\000\bH\b\000\b\024\001\000\b\020\001\000\bD\003\000\bD\004\000\bD\005\000\bD\006\000\bD\007\000\b\024\001\000\b\020\001\000\b8\002\000\b8\003\000\b\024\001\000\b\020\001\000\b@\002\000\b@\003\000\b@\004\000\b\024\001\000\b\020\001\000\b\204\002\000\b\192\001\000\b\204\003\000\b\192\002\000\b\192\003\000\007\244\001\000\007\240\001\000\007\236\001\000\007\244\002\000\b\192\001\000\007\220\001\000\007\216\001\000\007\212\001\000\007\220\002\000\007\220\003\000\007\216\002\000\007\216\003\000\007\244\003\000\007\240\002\000\007\240\003\000\007\192\001\000\007\188\001\000\007\184\001\000\007\192\002\000\007\192\003\000\007\188\002\000\007\188\003\000\b\208\002\000\b\208\003\000\b\160\002\000\b\160\003\000\b`\005\000\b`\006\000\b`\007\000\b\\\002\000\b\\\003\000\b\\\004\000\b\\\005\000\b\\\006\000\b<\004\000\b\024\001\000\b\020\001\000\b\180\002\000\b \003\000\b\024\001\000\b\020\001\000\006$\002\000\006$\003\000\bx\004\000\bx\005\000\bx\006\000\bx\007\000\bx\b\000\bt\003\000\bt\004\000\bt\005\000\bt\006\000\bt\007\000\bp\002\000\bp\003\000\bp\004\000\bL\001\000\006\208\001\000\bL\002\000\bL\003\000\b\024\001\000\b\020\001\000\007\204\001\000\007\200\001\000\007\204\002\000\bP\001\000\b\024\001\000\b\020\001\000\007\204\003\000\b\136\002\000\b\136\003\000\b\200\002\000\bl\003\000\bh\003\000\bl\004\000\bl\005\000\bl\006\000\bl\007\000\bl\b\000\bl\t\000\bh\004\000\bh\005\000\bh\006\000\bh\007\000\bh\b\000\bd\003\000\bd\004\000\bd\005\000\b\024\001\000\b\020\001\000\000\016\002\000\006\144\002\000\006\140\002\000\006\144\003\000\006\168\001\000\006\188\001\000\006\184\001\000\006\188\002\000\006\184\002\000\006\148\001\000\006\188\003\000\006\172\001\000\006\196\001\000\006\196\002\000\006\128\001\000\006\180\001\000\006\136\001\000\006\132\001\000\006|\001\000\006\132\002\000\006\136\001\000\006\132\003\000\006\132\001\000\006\136\002\000\b\024\001\000\b\020\001\000\006\136\003\000\006\144\004\000\006\152\002\000\006\152\003\000\007x\001\000\007t\001\000\007p\001\000\007x\002\000\007x\003\000\007t\002\000\007t\003\000\006\192\002\000\006\176\002\000\006\176\003\000\007h\001\000\007d\001\000\006\136\001\000\006\132\001\000\007h\002\000\007h\003\000\006\004\002\000\006L\001\000\006\004\003\000\006\004\004\000\006\b\001\000\006l\002\000\006l\003\000\007\\\001\000\007X\001\000\007T\001\000\007\\\002\000\007\\\003\000\007X\002\000\007X\003\000\000\000\001\000\000\004\000\000\006p\001\000\006p\002\000\005\216\001\000\005\228\001\000\005$\001\000\005\244\001\000\005\244\002\000\004\188\001\000\005 \001\000\005 \002\000\0058\001\000\002L\001\000\002L\002\000\002L\003\000\002L\004\000\000P\001\000\000L\001\000\000P\002\000\000L\002\000\000P\003\000\000P\004\000\000P\005\000\000P\006\000\b\024\001\000\b\020\001\000\000P\007\000\000L\003\000\b\024\001\000\b\020\001\000\000L\004\000\004\176\001\000\005\156\001\000\005\212\001\000\005\204\001\000\005\220\001\000\005\236\001\000\005\224\001\000\005\128\001\000\0058\001\000\004\180\001\000\005\168\001\000\0050\001\000\005,\001\000\005(\001\000\003\\\001\000\003T\001\000\003\\\002\000\003T\002\000\003\\\003\000\003T\003\000\003\\\004\000\004\184\001\000\005\028\001\000\005\020\001\000\0054\001\000\005\024\001\000\006@\001\000\004\184\002\000\004\184\003\000\000 \001\000\000 \002\000\003\248\001\000\003\248\002\000\005\016\001\000\003\236\001\000\005\184\001\000\005\184\002\000\001\136\001\000\001\132\001\000\001\128\001\000\001|\001\000\001x\001\000\001t\001\000\001p\001\000\001l\001\000\001h\001\000\001d\001\000\001`\001\000\001\\\001\000\001X\001\000\001T\001\000\001P\001\000\001L\001\000\001H\001\000\001D\001\000\001@\001\000\001<\001\000\0018\001\000\0014\001\000\0010\001\000\001,\001\000\000\152\001\000\000\148\001\000\000\144\001\000\000\140\001\000\000\136\001\000\000\132\001\000\001\136\002\000\001\132\002\000\001\128\002\000\001|\002\000\001x\002\000\001t\002\000\001p\002\000\001l\002\000\001h\002\000\001d\002\000\001`\002\000\001\\\002\000\001X\002\000\001T\002\000\001P\002\000\001L\002\000\001H\002\000\001D\002\000\001@\002\000\001<\002\000\0018\002\000\0014\002\000\0010\002\000\001,\002\000\000\152\002\000\000\148\002\000\000\144\002\000\000\140\002\000\000\136\002\000\000\132\002\000\006\156\001\000\001\136\003\000\001\132\003\000\001\128\003\000\001|\003\000\001x\003\000\001t\003\000\001p\003\000\001l\003\000\001h\003\000\001d\003\000\001`\003\000\001\\\003\000\001X\003\000\001T\003\000\001P\003\000\001L\003\000\001H\003\000\001D\003\000\001@\003\000\001<\003\000\0018\003\000\0014\003\000\0010\003\000\001,\003\000\000\152\003\000\000\148\003\000\000\144\003\000\000\140\003\000\000\136\003\000\000\132\003\000\001X\004\000\001T\004\000\001P\004\000\001L\004\000\001H\004\000\001D\004\000\001X\005\000\001T\005\000\001P\005\000\001L\005\000\001H\005\000\001D\005\000\001X\006\000\001T\006\000\001X\007\000\001X\b\000\001X\t\000\001X\n\000\001X\011\000\006D\001\000\b\224\001\000\b\220\001\000\b\216\001\000\000D\001\000\b\000\001\000\007\252\001\000\000D\002\000\004\128\001\000\004|\001\000\001\232\001\000\001\228\001\000\001\224\001\000\001\220\001\000\001\216\001\000\001\212\001\000\001\208\001\000\001\204\001\000\001\200\001\000\001\196\001\000\001\192\001\000\001\188\001\000\001\184\001\000\001\180\001\000\001\176\001\000\001\172\001\000\001\168\001\000\001\164\001\000\001\160\001\000\001\156\001\000\001\152\001\000\001\148\001\000\001\144\001\000\001\140\001\000\000\176\001\000\000\172\001\000\000\168\001\000\000\164\001\000\000\160\001\000\000\156\001\000\001\232\002\000\001\228\002\000\001\224\002\000\001\220\002\000\001\216\002\000\001\212\002\000\001\208\002\000\001\204\002\000\001\200\002\000\001\196\002\000\001\192\002\000\001\188\002\000\001\184\002\000\001\180\002\000\001\176\002\000\001\172\002\000\001\168\002\000\001\164\002\000\001\160\002\000\001\156\002\000\001\152\002\000\001\148\002\000\001\144\002\000\001\140\002\000\000\176\002\000\000\172\002\000\000\168\002\000\000\164\002\000\000\160\002\000\000\156\002\000\001\184\003\000\001\180\003\000\001\176\003\000\001\172\003\000\001\168\003\000\001\164\003\000\001\184\004\000\001\180\004\000\001\176\004\000\001\172\004\000\001\168\004\000\001\164\004\000\001\184\005\000\001\180\005\000\001\184\006\000\001\184\007\000\001\184\b\000\001\184\t\000\001\184\n\000\000,\001\000\000(\001\000\000(\002\000\000(\003\000\000,\002\000\0000\001\000\001\184\011\000\001\180\006\000\001\180\007\000\001\180\b\000\001\180\t\000\001\180\n\000\006\168\001\000\001\172\005\000\001\168\005\000\001\164\005\000\001\172\006\000\001\168\006\000\001\172\007\000\001\172\b\000\001\172\t\000\001\172\n\000\001\172\011\000\001\172\012\000\001\168\007\000\001\168\b\000\001\168\t\000\001\168\n\000\001\168\011\000\001\164\006\000\001\164\007\000\001\164\b\000\001\176\005\000\001\176\006\000\001\176\007\000\001\232\003\000\001\228\003\000\001\224\003\000\001\220\003\000\001\216\003\000\001\212\003\000\001\232\004\000\001\228\004\000\001\224\004\000\001\220\004\000\001\216\004\000\001\212\004\000\001\232\005\000\001\228\005\000\001\232\006\000\001\232\007\000\001\232\b\000\001\232\t\000\001\232\n\000\001\232\011\000\001\228\006\000\001\228\007\000\001\228\b\000\001\228\t\000\001\228\n\000\006\168\001\000\001\220\005\000\001\216\005\000\001\212\005\000\001\220\006\000\001\216\006\000\001\220\007\000\001\220\b\000\001\220\t\000\001\220\n\000\001\220\011\000\001\220\012\000\001\216\007\000\001\216\b\000\001\216\t\000\001\216\n\000\001\216\011\000\001\212\006\000\001\212\007\000\001\212\b\000\001\224\005\000\001\224\006\000\001\224\007\000\000\176\003\000\000\172\003\000\000\168\003\000\000\164\003\000\000\160\003\000\000\156\003\000\000\176\004\000\000\172\004\000\000\176\005\000\000\176\006\000\000\176\007\000\000\176\b\000\000\176\t\000\000\028\001\000\004\236\001\000\003\240\001\000\003\244\001\000\003\244\002\000\003\244\003\000\003\244\004\000\003\244\005\000\006\236\001\000\006\232\001\000\006\228\001\000\006\236\002\000\006\236\003\000\006\232\002\000\006\232\003\000\005\152\001\000\005h\001\000\005d\001\000\005h\002\000\000\248\001\000\000\244\001\000\000\240\001\000\000\236\001\000\000\232\001\000\000\228\001\000\000X\001\000\000T\001\000\000T\002\000\000T\003\000\000T\004\000\000T\005\000\000\248\002\000\000\244\002\000\000\240\002\000\000\236\002\000\000\232\002\000\000\228\002\000\000\248\003\000\000\244\003\000\000\248\004\000\000\248\005\000\000\248\006\000\000\248\007\000\000\248\b\000\000\248\t\000\000\244\004\000\000\244\005\000\000\244\006\000\000\244\007\000\000\244\b\000\006\168\001\000\000\236\003\000\000\232\003\000\000\228\003\000\000\236\004\000\000\232\004\000\000\236\005\000\000\236\006\000\000\236\007\000\000\236\b\000\000\236\t\000\000\236\n\000\000\232\005\000\000\232\006\000\000\232\007\000\000\232\b\000\000\232\t\000\000\228\004\000\000\228\005\000\000\228\006\000\000\240\003\000\000\240\004\000\000\240\005\000\000X\002\000\000X\003\000\000X\004\000\001(\001\000\001$\001\000\001 \001\000\001\028\001\000\001\024\001\000\001\020\001\000\000h\001\000\000d\001\000\000d\002\000\000d\003\000\000d\004\000\000d\005\000\001(\002\000\001$\002\000\001 \002\000\001\028\002\000\001\024\002\000\001\020\002\000\001(\003\000\001$\003\000\001(\004\000\001(\005\000\001(\006\000\001(\007\000\001(\b\000\001(\t\000\001$\004\000\001$\005\000\001$\006\000\001$\007\000\001$\b\000\006\168\001\000\001\028\003\000\001\024\003\000\001\020\003\000\001\028\004\000\001\024\004\000\001\028\005\000\001\028\006\000\001\028\007\000\001\028\b\000\001\028\t\000\001\028\n\000\001\024\005\000\001\024\006\000\001\024\007\000\001\024\b\000\001\024\t\000\001\020\004\000\001\020\005\000\001\020\006\000\001 \003\000\001 \004\000\001 \005\000\000h\002\000\000h\003\000\000h\004\000\004\196\001\000\004\192\001\000\003\188\001\000\003\184\001\000\000H\001\000\000H\002\000\000H\003\000\004\152\001\000\004\152\002\000\004\152\003\000\005\144\001\000\005\200\001\000\005\196\001\000\005\200\002\000\005\196\002\000\005\200\003\000\005\248\001\000\005\240\001\000\005\208\001\000\005\232\001\000\005\232\002\000\005\208\002\000\005\192\001\000\005|\001\000\005x\001\000\005t\001\000\005p\001\000\005l\001\000\006\020\001\000\006\016\001\000\006\020\002\000\006\028\001\000\b\024\001\000\b\020\001\000\006\028\002\000\006\028\003\000\006\020\003\000\006\020\004\000\006\016\002\000\006\016\003\000\005l\002\000\004\204\001\000\005\012\001\000\005\012\002\000\005\160\001\000\005\160\002\000\005`\001\000\004(\001\000\005\176\001\000\005\176\002\000\005\164\001\000\005\164\002\000\005\\\001\000\0058\001\000\005\\\002\000\005D\001\000\005@\001\000\005D\002\000\004\172\001\000\004\168\001\000\004\172\002\000\004\168\002\000\004\000\001\000\003\252\001\000\003\212\001\000\003\212\002\000\003\212\003\000\004\b\001\000\003\232\001\000\003\228\001\000\003\232\002\000\003\228\002\000\005\b\001\000\005\140\001\000\005\136\001\000\005\140\002\000\005\136\002\000\005\140\003\000\000\128\001\000\000|\001\000\000x\001\000\000t\001\000\000p\001\000\000l\001\000\000\128\002\000\000|\002\000\000\128\003\000\000\128\004\000\000\128\005\000\000\128\006\000\000\128\007\000\005\252\001\000\004\200\001\000\004\200\002\000\004\200\003\000\004\200\004\000\004\212\001\000\004\208\001\000\004\212\002\000\004\212\003\000\004\208\002\000\004\164\001\000\005\188\001\000\005\188\002\000\004\004\001\000\004\004\002\000\004\004\003\000\004\004\004\000\004\160\001\000\004\160\002\000\002H\001\000\002D\001\000\002@\001\000\002<\001\000\0028\001\000\0024\001\000\0020\001\000\002,\001\000\002(\001\000\002$\001\000\002 \001\000\002\028\001\000\002\024\001\000\002\020\001\000\002\016\001\000\002\012\001\000\002\b\001\000\002\004\001\000\002\000\001\000\001\252\001\000\001\248\001\000\001\244\001\000\001\240\001\000\001\236\001\000\000\200\001\000\000\196\001\000\000\192\001\000\000\188\001\000\000\184\001\000\000\180\001\000\002H\002\000\002D\002\000\002@\002\000\002<\002\000\0028\002\000\0024\002\000\0020\002\000\002,\002\000\002(\002\000\002$\002\000\002 \002\000\002\028\002\000\002\024\002\000\002\020\002\000\002\016\002\000\002\012\002\000\002\b\002\000\002\004\002\000\002\000\002\000\001\252\002\000\001\248\002\000\001\244\002\000\001\240\002\000\001\236\002\000\000\200\002\000\000\196\002\000\000\192\002\000\000\188\002\000\000\184\002\000\000\180\002\000\002H\003\000\002D\003\000\002@\003\000\002<\003\000\0028\003\000\0024\003\000\0020\003\000\002,\003\000\002(\003\000\002$\003\000\002 \003\000\002\028\003\000\002\024\003\000\002\020\003\000\002\016\003\000\002\012\003\000\002\b\003\000\002\004\003\000\002\000\003\000\001\252\003\000\001\248\003\000\001\244\003\000\001\240\003\000\001\236\003\000\000\200\003\000\000\196\003\000\000\192\003\000\000\188\003\000\000\184\003\000\000\180\003\000\002\024\004\000\002\020\004\000\002\016\004\000\002\012\004\000\002\b\004\000\002\004\004\000\002\024\005\000\002\020\005\000\002\016\005\000\002\012\005\000\002\b\005\000\002\004\005\000\002\024\006\000\002\020\006\000\002\024\007\000\002\024\b\000\002\024\t\000\002\024\n\000\002\024\011\000\002\024\012\000\002\020\007\000\002\020\b\000\002\020\t\000\002\020\n\000\002\020\011\000\006\168\001\000\002\012\006\000\002\b\006\000\002\004\006\000\002\012\007\000\002\b\007\000\002\012\b\000\002\012\t\000\002\012\n\000\002\012\011\000\002\012\012\000\002\012\r\000\002\b\b\000\002\b\t\000\002\b\n\000\002\b\011\000\002\b\012\000\002\004\007\000\002\004\b\000\002\004\t\000\002\016\006\000\002\016\007\000\002\016\b\000\002H\004\000\002D\004\000\002@\004\000\002<\004\000\0028\004\000\0024\004\000\002H\005\000\002D\005\000\002@\005\000\002<\005\000\0028\005\000\0024\005\000\002H\006\000\002D\006\000\002H\007\000\002H\b\000\002H\t\000\002H\n\000\002H\011\000\002H\012\000\002D\007\000\002D\b\000\002D\t\000\002D\n\000\002D\011\000\006\168\001\000\002<\006\000\0028\006\000\0024\006\000\002<\007\000\0028\007\000\002<\b\000\002<\t\000\002<\n\000\002<\011\000\002<\012\000\002<\r\000\0028\b\000\0028\t\000\0028\n\000\0028\011\000\0028\012\000\0024\007\000\0024\b\000\0024\t\000\002@\006\000\002@\007\000\002@\b\000\000\200\004\000\000\196\004\000\000\192\004\000\000\188\004\000\000\184\004\000\000\180\004\000\000\200\005\000\000\196\005\000\000\200\006\000\000\200\007\000\000\200\b\000\000\200\t\000\000\200\n\000\000\200\011\000\006\000\001\000\000\196\006\000\000\196\007\000\000\196\b\000\000\196\t\000\000\196\n\000\006\168\001\000\000\188\005\000\000\184\005\000\000\180\005\000\000\188\006\000\000\184\006\000\000\188\007\000\000\188\b\000\000\188\t\000\000\188\n\000\000\188\011\000\000\188\012\000\000\184\007\000\000\184\b\000\000\184\t\000\000\184\n\000\000\184\011\000\000\180\006\000\000\180\007\000\000\180\b\000\000\192\005\000\000\192\006\000\000\192\007\000\002\000\004\000\001\252\004\000\001\248\004\000\001\244\004\000\001\240\004\000\001\236\004\000\002\000\005\000\001\252\005\000\002\000\006\000\002\000\007\000\002\000\b\000\002\000\t\000\002\000\n\000\002\000\011\000\001\252\006\000\001\252\007\000\001\252\b\000\001\252\t\000\001\252\n\000\006\168\001\000\001\244\005\000\001\240\005\000\001\236\005\000\001\244\006\000\001\240\006\000\001\244\007\000\001\244\b\000\001\244\t\000\001\244\n\000\001\244\011\000\001\244\012\000\001\240\007\000\001\240\b\000\001\240\t\000\001\240\n\000\001\240\011\000\001\236\006\000\001\236\007\000\001\236\b\000\001\248\005\000\001\248\006\000\001\248\007\000\0020\004\000\002,\004\000\002(\004\000\002$\004\000\002 \004\000\002\028\004\000\0020\005\000\002,\005\000\002(\005\000\002$\005\000\002 \005\000\002\028\005\000\0020\006\000\002,\006\000\0020\007\000\0020\b\000\0020\t\000\0020\n\000\0020\011\000\0020\012\000\002,\007\000\002,\b\000\002,\t\000\002,\n\000\002,\011\000\006\168\001\000\002$\006\000\002 \006\000\002\028\006\000\002$\007\000\002 \007\000\002$\b\000\002$\t\000\002$\n\000\002$\011\000\002$\012\000\002$\r\000\002 \b\000\002 \t\000\002 \n\000\002 \011\000\002 \012\000\002\028\007\000\002\028\b\000\002\028\t\000\002(\006\000\002(\007\000\002(\b\000\000\224\001\000\000\220\001\000\000\216\001\000\000\212\001\000\000\208\001\000\000\204\001\000\000\224\002\000\000\220\002\000\000\224\003\000\000\224\004\000\000\224\005\000\000\224\006\000\000\224\007\000\000\224\b\000\000\220\003\000\000\220\004\000\000\220\005\000\000\220\006\000\000\220\007\000\006\168\001\000\000\212\002\000\000\208\002\000\000\204\002\000\000\212\003\000\000\208\003\000\000\212\004\000\000\212\005\000\000\212\006\000\000\212\007\000\000\212\b\000\000\212\t\000\000\208\004\000\000\208\005\000\000\208\006\000\000\208\007\000\000\208\b\000\000\204\003\000\000\204\004\000\000\204\005\000\000\216\002\000\000\216\003\000\000\216\004\000\004\156\001\000\004\156\002\000\004\156\003\000\006T\001\000\004\144\001\000\004\016\001\000\004\012\001\000\004\016\002\000\004\016\003\000\004\012\002\000\000\024\001\000\005\180\001\000\005\180\002\000\003\224\001\000\003\220\001\000\003\220\002\000\003\216\001\000\003\216\002\000\003\216\003\000\003\204\001\000\003\200\001\000\003\196\001\000\003\192\001\000\004$\001\000\004 \001\000\004\028\001\000\004\024\001\000\004\020\001\000\003\208\001\000\004$\002\000\004 \002\000\004\028\002\000\004\024\002\000\004\020\002\000\004\020\003\000\005\148\001\000\005\148\002\000\005\172\001\000\001\016\001\000\001\012\001\000\001\b\001\000\001\004\001\000\001\000\001\000\000\252\001\000\000`\001\000\000\\\001\000\000\\\002\000\000\\\003\000\000\\\004\000\000\\\005\000\001\016\002\000\001\012\002\000\001\b\002\000\001\004\002\000\001\000\002\000\000\252\002\000\001\016\003\000\001\012\003\000\001\016\004\000\001\016\005\000\001\016\006\000\001\016\007\000\001\016\b\000\001\016\t\000\001\012\004\000\001\012\005\000\001\012\006\000\001\012\007\000\001\012\b\000\006\168\001\000\001\004\003\000\001\000\003\000\000\252\003\000\001\004\004\000\001\000\004\000\001\004\005\000\001\004\006\000\001\004\007\000\001\004\b\000\001\004\t\000\001\004\n\000\001\000\005\000\001\000\006\000\001\000\007\000\001\000\b\000\001\000\t\000\000\252\004\000\000\252\005\000\000\252\006\000\001\b\003\000\001\b\004\000\001\b\005\000\005\172\002\000\000`\002\000\000`\003\000\000`\004\000\002`\001\000\005\132\001\000\005X\001\000\005T\001\000\005P\001\000\005L\001\000\005H\001\000\005H\002\000\004\140\001\000\005\004\001\000\005<\001\000\002P\001\000\004\240\001\000\004\140\002\000\003\180\001\000\003\176\001\000\003\172\001\000\003\168\001\000\003\164\001\000\003\160\001\000\003\156\001\000\003\152\001\000\003\148\001\000\003\144\001\000\003\140\001\000\003\136\001\000\003\132\001\000\003\128\001\000\003|\001\000\003x\001\000\003t\001\000\003p\001\000\003l\001\000\003h\001\000\002\212\001\000\002\208\001\000\002\204\001\000\002\200\001\000\002\196\001\000\002\192\001\000\002\188\001\000\002\184\001\000\002\180\001\000\002\176\001\000\002\172\001\000\002\168\001\000\002\164\001\000\002\160\001\000\002\156\001\000\002\152\001\000\002\148\001\000\002\144\001\000\002\140\001\000\002\136\001\000\002\132\001\000\002\128\001\000\002|\001\000\002x\001\000\002t\001\000\002p\001\000\002l\001\000\002h\001\000\002d\001\000\002\148\002\000\002\216\001\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\148\003\000\003\012\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\003\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\248\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\003\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003\000\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\003\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\252\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\003\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\244\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\003\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\224\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\003\000\002\224\001\000\002\220\001\000\003\020\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\003\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003\016\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\003\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003\028\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\003\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003\024\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\003\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\240\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\003\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003H\002\000\003L\001\000\003H\003\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003\b\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\003\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003@\002\000\003L\001\000\003H\001\000\003D\001\000\003@\003\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003(\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\003\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\228\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\003\000\002\228\001\000\002\224\001\000\002\220\001\000\002\236\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\003\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003,\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\003\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\0030\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\003\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003L\002\000\003L\003\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003 \002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \003\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\0034\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\003\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\0038\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\003\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003$\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\003\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\232\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\003\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003D\002\000\003D\003\000\003\004\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\003\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\003<\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\003\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\220\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\003\000\002\220\001\000\003\160\002\000\004\136\001\000\004\136\002\000\003d\001\000\002T\001\000\004\244\001\000\003`\001\000\005\000\001\000\004\132\001\000\004\132\002\000\004\232\001\000\004\228\001\000\004\224\001\000\004\220\001\000\004\216\001\000\004\148\001\000\004\232\002\000\004\228\002\000\004\224\002\000\004\220\002\000\004\216\002\000\004\216\003\000\004\216\004\000\004\228\003\000\004\228\004\000\004\232\003\000\004\232\004\000\004\232\005\000\004\232\006\000\004\220\003\000\004\220\004\000\004\224\003\000\004\224\004\000\004\148\002\000\005\232\001\000\001\016\001\000\001\012\001\000\001\b\001\000\001\004\001\000\001\000\001\000\000\252\001\000\000`\001\000\000\\\001\000\002X\001\000\004\248\001\000\004x\001\000\004t\001\000\004p\001\000\004l\001\000\004h\001\000\004d\001\000\004`\001\000\004\\\001\000\004X\001\000\004T\001\000\004P\001\000\004L\001\000\004H\001\000\004D\001\000\004@\001\000\004<\001\000\0048\001\000\0044\001\000\0040\001\000\004,\001\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\004d\002\000\004d\003\000\002\\\001\000\004\252\001\000\004P\002\000\004P\003\000\004X\002\000\004X\003\000\004T\002\000\004T\003\000\004L\002\000\004L\003\000\004l\002\000\004l\003\000\004h\002\000\004h\003\000\004t\002\000\004t\003\000\004p\002\000\004p\003\000\004H\002\000\004H\003\000\0044\002\000\0044\003\000\004`\002\000\004`\003\000\004<\002\000\004<\003\000\004D\002\000\004D\003\000\0048\002\000\0048\003\000\004@\002\000\004@\003\000\004x\002\000\004x\003\000\0040\002\000\0040\003\000\004\\\002\000\004\\\003\000\003\160\003\000\002\128\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\128\003\000\003\140\002\000\003\140\003\000\002\136\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\136\003\000\003\148\002\000\003\148\003\000\002\132\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\132\003\000\003\144\002\000\003\144\003\000\002|\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002|\003\000\003\136\002\000\003\136\003\000\002h\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002h\003\000\002\156\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\156\003\000\003\168\002\000\003\168\003\000\002\152\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\152\003\000\003\164\002\000\003\164\003\000\002\164\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\164\003\000\003\176\002\000\003\176\003\000\002\160\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\160\003\000\003\172\002\000\003\172\003\000\002x\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002x\003\000\003\132\002\000\003\132\003\000\003p\002\000\003p\003\000\002\208\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\208\003\000\002\144\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\144\003\000\003\156\002\000\003\156\003\000\002\200\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\200\003\000\002\176\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\176\003\000\002l\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002l\003\000\003x\002\000\003x\003\000\002t\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002t\003\000\003\128\002\000\003\128\003\000\003t\002\000\003t\003\000\002\180\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\180\003\000\002\184\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\184\003\000\002\212\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\212\003\000\002\168\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\168\003\000\002\188\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\188\003\000\002\192\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\192\003\000\002\172\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\172\003\000\002p\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002p\003\000\003|\002\000\003|\003\000\002\204\002\000\002\204\003\000\003\180\002\000\003\180\003\000\003l\002\000\003l\003\000\002\140\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\140\003\000\003\152\002\000\003\152\003\000\002\196\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002\196\003\000\002d\002\000\003L\001\000\003H\001\000\003D\001\000\003@\001\000\003<\001\000\0038\001\000\0034\001\000\0030\001\000\003,\001\000\003(\001\000\003$\001\000\003 \001\000\003\028\001\000\003\024\001\000\003\020\001\000\003\016\001\000\003\012\001\000\003\b\001\000\003\004\001\000\003\000\001\000\002\252\001\000\002\248\001\000\002\244\001\000\002\240\001\000\002\236\001\000\002\232\001\000\002\228\001\000\002\224\001\000\002\220\001\000\002d\003\000\005H\003\000\005H\004\000\005L\002\000\005P\002\000\005P\003\000\005X\002\000\005T\002\000\005T\003\000\004\020\004\000\004 \003\000\004 \004\000\004$\003\000\004$\004\000\004$\005\000\004$\006\000\004\024\003\000\004\024\004\000\004\028\003\000\004\028\004\000\003\208\002\000\003\192\002\000\003\196\002\000\003\200\002\000\003\204\002\000\003\224\002\000\004\144\002\000\004\004\005\000\004\004\006\000\004\004\007\000\004\164\002\000\004\200\005\000\004\200\006\000\004\200\007\000\005\252\002\000\000\128\b\000\000|\003\000\000|\004\000\000|\005\000\000|\006\000\000|\007\000\006\168\001\000\000t\002\000\000p\002\000\000l\002\000\000t\003\000\000p\003\000\000t\004\000\000t\005\000\000t\006\000\000t\007\000\000t\b\000\000t\t\000\000p\004\000\000p\005\000\000p\006\000\000p\007\000\000p\b\000\000l\003\000\000l\004\000\000l\005\000\000x\002\000\000x\003\000\000x\004\000\003\232\003\000\003\228\003\000\003\232\004\000\003\232\005\000\004\b\002\000\003\212\004\000\004\000\002\000\003\252\002\000\004\000\003\000\004\000\004\000\004\172\003\000\004\168\003\000\004\172\004\000\004\172\005\000\005D\003\000\005D\004\000\007@\001\000\007<\001\000\007@\002\000\007@\003\000\005@\002\000\005@\003\000\005\\\003\000\005X\001\000\005T\001\000\005P\001\000\005L\001\000\005H\001\000\005\\\004\000\005P\002\000\005\\\005\000\005P\003\000\005\\\006\000\0058\002\000\0058\003\000\007$\001\000\007 \001\000\007$\002\000\007$\003\000\004(\002\000\004\204\002\000\005l\003\000\005l\004\000\005p\002\000\005t\002\000\005t\003\000\005|\002\000\005x\002\000\005x\003\000\005\240\002\000\005\248\002\000\005\144\002\000\004\152\004\000\000H\004\000\003\188\002\000\004\196\002\000\004\192\002\000\004\196\003\000\004\196\004\000\005h\003\000\005h\004\000\005d\002\000\005d\003\000\005\152\002\000\003\240\002\000\004\236\002\000\000H\001\000\000@\001\000\000H\002\000\000@\002\000\000H\003\000\000@\003\000\000H\004\000\000@\004\000\000@\005\000\000@\006\000\000\028\002\000\000\028\003\000\000<\001\000\0004\001\000\0008\001\000\007\b\001\000\007\004\001\000\007\000\001\000\007\b\002\000\007\b\003\000\007\004\002\000\007\004\003\000\000\176\n\000\000\172\005\000\000\172\006\000\000\172\007\000\000\172\b\000\000\172\t\000\006\168\001\000\000\164\004\000\000\160\004\000\000\156\004\000\000\164\005\000\000\160\005\000\000\164\006\000\000\164\007\000\000\164\b\000\000\164\t\000\000\164\n\000\000\164\011\000\000\160\006\000\000\160\007\000\000\160\b\000\000\160\t\000\000\160\n\000\000\156\005\000\000\156\006\000\000\156\007\000\000\168\004\000\000\168\005\000\000\168\006\000\001\160\003\000\001\156\003\000\001\152\003\000\001\148\003\000\001\144\003\000\001\140\003\000\001\160\004\000\001\156\004\000\001\160\005\000\001\160\006\000\001\160\007\000\001\160\b\000\001\160\t\000\001\160\n\000\001\156\005\000\001\156\006\000\001\156\007\000\001\156\b\000\001\156\t\000\006\168\001\000\001\148\004\000\001\144\004\000\001\140\004\000\001\148\005\000\001\144\005\000\001\148\006\000\001\148\007\000\001\148\b\000\001\148\t\000\001\148\n\000\001\148\011\000\001\144\006\000\001\144\007\000\001\144\b\000\001\144\t\000\001\144\n\000\001\140\005\000\001\140\006\000\001\140\007\000\001\152\004\000\001\152\005\000\001\152\006\000\001\208\003\000\001\204\003\000\001\200\003\000\001\196\003\000\001\192\003\000\001\188\003\000\001\208\004\000\001\204\004\000\001\200\004\000\001\196\004\000\001\192\004\000\001\188\004\000\001\208\005\000\001\204\005\000\001\208\006\000\001\208\007\000\001\208\b\000\001\208\t\000\001\208\n\000\001\208\011\000\001\204\006\000\001\204\007\000\001\204\b\000\001\204\t\000\001\204\n\000\006\168\001\000\001\196\005\000\001\192\005\000\001\188\005\000\001\196\006\000\001\192\006\000\001\196\007\000\001\196\b\000\001\196\t\000\001\196\n\000\001\196\011\000\001\196\012\000\001\192\007\000\001\192\b\000\001\192\t\000\001\192\n\000\001\192\011\000\001\188\006\000\001\188\007\000\001\188\b\000\001\200\005\000\001\200\006\000\001\200\007\000\004\128\002\000\000D\003\000\006D\002\000\006D\003\000\007\024\001\000\007\020\001\000\007\016\001\000\007\024\002\000\007\024\003\000\007\020\002\000\007\020\003\000\001X\012\000\001T\007\000\001T\b\000\001T\t\000\001T\n\000\001T\011\000\006\168\001\000\001L\006\000\001H\006\000\001D\006\000\001L\007\000\001H\007\000\001L\b\000\001L\t\000\001L\n\000\001L\011\000\001L\012\000\001L\r\000\001H\b\000\001H\t\000\001H\n\000\001H\011\000\001H\012\000\001D\007\000\001D\b\000\001D\t\000\001P\006\000\001P\007\000\001P\b\000\001\136\004\000\001\132\004\000\001\128\004\000\001|\004\000\001x\004\000\001t\004\000\001\136\005\000\001\132\005\000\001\128\005\000\001|\005\000\001x\005\000\001t\005\000\001\136\006\000\001\132\006\000\001\136\007\000\001\136\b\000\001\136\t\000\001\136\n\000\001\136\011\000\001\136\012\000\001\132\007\000\001\132\b\000\001\132\t\000\001\132\n\000\001\132\011\000\006\168\001\000\001|\006\000\001x\006\000\001t\006\000\001|\007\000\001x\007\000\001|\b\000\001|\t\000\001|\n\000\001|\011\000\001|\012\000\001|\r\000\001x\b\000\001x\t\000\001x\n\000\001x\011\000\001x\012\000\001t\007\000\001t\b\000\001t\t\000\001\128\006\000\001\128\007\000\001\128\b\000\000\152\004\000\000\148\004\000\000\144\004\000\000\140\004\000\000\136\004\000\000\132\004\000\000\152\005\000\000\148\005\000\000\152\006\000\000\152\007\000\000\152\b\000\000\152\t\000\000\152\n\000\000\152\011\000\000\148\006\000\000\148\007\000\000\148\b\000\000\148\t\000\000\148\n\000\006\168\001\000\000\140\005\000\000\136\005\000\000\132\005\000\000\140\006\000\000\136\006\000\000\140\007\000\000\140\b\000\000\140\t\000\000\140\n\000\000\140\011\000\000\140\012\000\000\136\007\000\000\136\b\000\000\136\t\000\000\136\n\000\000\136\011\000\000\132\006\000\000\132\007\000\000\132\b\000\000\144\005\000\000\144\006\000\000\144\007\000\001@\004\000\001<\004\000\0018\004\000\0014\004\000\0010\004\000\001,\004\000\001@\005\000\001<\005\000\001@\006\000\001@\007\000\001@\b\000\001@\t\000\001@\n\000\001@\011\000\001<\006\000\001<\007\000\001<\b\000\001<\t\000\001<\n\000\006\168\001\000\0014\005\000\0010\005\000\001,\005\000\0014\006\000\0010\006\000\0014\007\000\0014\b\000\0014\t\000\0014\n\000\0014\011\000\0014\012\000\0010\007\000\0010\b\000\0010\t\000\0010\n\000\0010\011\000\001,\006\000\001,\007\000\001,\b\000\0018\005\000\0018\006\000\0018\007\000\001p\004\000\001l\004\000\001h\004\000\001d\004\000\001`\004\000\001\\\004\000\001p\005\000\001l\005\000\001h\005\000\001d\005\000\001`\005\000\001\\\005\000\001p\006\000\001l\006\000\001p\007\000\001p\b\000\001p\t\000\001p\n\000\001p\011\000\001p\012\000\001l\007\000\001l\b\000\001l\t\000\001l\n\000\001l\011\000\006\168\001\000\001d\006\000\001`\006\000\001\\\006\000\001d\007\000\001`\007\000\001d\b\000\001d\t\000\001d\n\000\001d\011\000\001d\012\000\001d\r\000\001`\b\000\001`\t\000\001`\n\000\001`\011\000\001`\012\000\001\\\007\000\001\\\b\000\001\\\t\000\001h\006\000\001h\007\000\001h\b\000\005\184\003\000\005\184\004\000\003\236\002\000\000$\001\000\000$\002\000\000$\003\000\003\236\003\000\003\248\003\000\000 \003\000\004\184\004\000\004\184\005\000\003\\\005\000\005\028\001\000\003X\001\000\003P\001\000\003X\002\000\003P\002\000\003X\003\000\003X\004\000\005(\002\000\005(\003\000\0050\002\000\0050\003\000\003X\001\000\003P\001\000\0050\004\000\0050\005\000\007\232\001\000\007\228\001\000\007\224\001\000\007\232\002\000\007\232\003\000\0074\001\000\0070\001\000\007,\001\000\0074\002\000\0074\003\000\0070\002\000\0070\003\000\007\228\002\000\007\228\003\000\006\220\001\000\006\216\001\000\005|\001\000\005x\001\000\005t\001\000\005p\001\000\005l\001\000\005,\002\000\006\220\002\000\005,\003\000\006\220\003\000\005,\004\000\005,\005\000\006\220\001\000\006\216\001\000\005|\001\000\005x\001\000\005t\001\000\005p\001\000\005l\001\000\006\220\002\000\006\220\003\000\005\168\002\000\004\180\002\000\005\128\002\000\005\128\003\000\005|\001\000\005x\001\000\005t\001\000\005p\001\000\005l\001\000\005\128\004\000\005t\002\000\005\128\005\000\005t\003\000\005\128\006\000\005\224\002\000\005\236\002\000\005\220\002\000\005\204\002\000\005\212\002\000\005\156\002\000\004\176\002\000\004\176\003\000\002L\005\000\004\188\002\000\004\188\003\000\005\244\003\000\005\244\004\000\005\228\002\000\005\216\002\000\006p\003\000\006p\004\000\000\004\001\000\000\b\000\000\006t\001\000\006t\002\000\006t\003\000\006t\004\000\006\248\001\000\006\244\001\000\006\248\002\000\006\248\003\000\007L\001\000\007H\001\000\007L\002\000\007L\003\000\000\b\001\000\000\012\000\000\006x\001\000\b,\001\000\b(\001\000\b,\002\000\b(\002\000\b,\003\000\b,\004\000\b,\005\000\b,\006\000\b,\007\000\b\024\001\000\b\020\001\000\b(\003\000\b(\004\000\b\024\001\000\b\020\001\000\007\176\001\000\007\172\001\000\007\168\001\000\007\176\002\000\007\176\003\000\007\172\002\000\007\172\003\000\006x\002\000\006x\003\000\006x\004\000\b\b\001\000\b\004\001\000\b\b\002\000\b\b\003\000\b\b\004\000\b\024\001\000\b\020\001\000\b\b\005\000\b\004\002\000\b\004\003\000\b\024\001\000\b\020\001\000\b\004\004\000\007\136\001\000\007\132\001\000\007\128\001\000\007\136\002\000\007\136\003\000\007\132\002\000\007\132\003\000\006x\005\000\006x\006\000\000\012\001"), (16, "\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\b\000\t\000\n\000\011\000\012\000\r\000\014\000\015\000\016\000\017\000\019\000\020\000\023\000\024\000\025\000\026\000\029\000\030\000\031\000\"\000$\000%\000&\000(\000)\000*\000+\000,\000-\000.\000/\0000\0001\0002\0004\0005\0006\0007\000:\000<\000>\000?\000A\000B\000C\000D\000E\000F\000H\000I\000J\000M\000P\000R\000S\000T\000U\000V\000W\000X\000Y\000Z\000[\000\\\000]\000^\000_\000`\000b\000c\000e\000f\000g\000h\000i\000m\000n\000q\000r\000u\000v\000w\000x\000y\000z\000{\000|\000}\000~\000\127\000\128\000\129\000\130\000\131\000\132\000\133\000\134\000\135\000\138\000\139\000\142\000\143\000\146\000\147\000\150\000\154\000\156\000\157\000\158\000\159\000\160\000\161\000\164\000\165\000\166\000\167\000\168\000\171\000\172\000\175\000\176\000\177\000\180\000\182\000\183\000\184\000\185\000\188\000\189\000\190\000\193\000\194\000\195\000\196\000\197\000\198\000\199\000\200\000\203\000\204\000\205\000\206\000\207\000\208\000\209\000\210\000\211\000\212\000\213\000\214\000\215\000\216\000\217\000\218\000\219\000\222\000\223\000\226\000\227\000\228\000\229\000\230\000\231\000\232\000\233\000\234\000\235\000\236\000\237\000\238\000\239\000\240\000\241\000\243\000\244\000\247\000\249\000\250\000\253\000\254\000\255\001\000\001\001\001\003\001\004\001\005\001\006\001\007\001\b\001\t\001\n\001\011\001\012\001\r\001\014\001\015\001\016\001\017\001\020\001\022\001\023\001\024\001\026\001\028\001\029\001\030\001\031\001 \001!\001\"\001#\001&\001'\001*\001+\001.\001/\0010\0011\0014\0015\0016\0017\0018\0019\001:\001;\001?\001@\001A\001B\001C\001D\001E\001F\001G\001H\001K\001L\001M\001N\001O\001P\001Q\001R\001S\001T\001U\001V\001W\001X\001Y\001Z\001[\001\\\001]\001^\001_\001`\001b\001d\001e\001f\001g\001h\001k\001l\001o\001p\001q\001r\001s\001t\001u\001v\001x\001y\001z\001}\001\127\001\129\001\131\001\132\001\133\001\134\001\135\001\136\001\137\001\138\001\139\001\140\001\141\001\142\001\143\001\144\001\145\001\146\001\147\001\148\001\178\001\208\001\209\001\239\001\245\001\251\001\253\001\254\001\255\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\b\002\t\002\n\002\012\002*\002H\002N\002T\002V\002W\002X\002Y\002Z\002[\002]\002^\002_\002`\002a\002b\002c\002d\002e\002f\002g\002k\002m\002n\002o\002p\002q\002r\002s\002t\002u\002v\002w\002x\002y\002z\002{\002|\002}\002~\002\132\002\138\002\140\002\141\002\142\002\143\002\144\002\145\002\146\002\147\002\148\002\149\002\150\002\151\002\155\002\157\002\158\002\159\002\160\002\161\002\162\002\163\002\164\002\165\002\166\002\167\002\168\002\169\002\170\002\171\002\172\002\173\002\174\002\180\002\182\002\183\002\184\002\185\002\186\002\187\002\188\002\189\002\190\002\191\002\192\002\193\002\194\002\195\002\198\002\199\002\200\002\201\002\202\002\203\002\205\002\206\002\214\002\215\002\216\002\217\002\218\002\224\002\226\002\227\002\228\002\229\002\230\002\231\002\232\002\233\002\234\002\235\002\236\002\237\002\241\002\243\002\244\002\245\002\246\002\247\002\248\002\249\002\250\002\251\002\252\002\253\002\254\002\255\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\015\003\016\003\017\003\018\003\019\003\025\003\027\003\028\003\029\003\030\003\031\003 \003!\003\"\003#\003$\003%\003&\003*\003,\003-\003.\003/\0030\0031\0032\0033\0034\0035\0036\0037\0038\0039\003:\003;\003<\003=\003>\003?\003@\003B\003D\003E\003F\003G\003H\003I\003J\003K\003M\003O\003P\003Q\003R\003S\003T\003U\003V\003\\\003^\003_\003`\003c\003d\003e\003f\003g\003h\003i\003j\003k\003l\003m\003n\003o\003p\003q\003r\003s\003t\003v\003w\003y\003z\003|\003~\003\128\003\129\003\130\003\131\003\132\003\134\003\136\003\137\003\139\003\141\003\142\003\148\003\150\003\151\003\152\003\153\003\154\003\155\003\156\003\157\003\158\003\159\003\160\003\162\003\163\003\164\003\165\003\166\003\167\003\168\003\169\003\170\003\171\003\172\003\173\003\174\003\204\003\234\004\b\004\014\004\020\004\022\004\023\004\024\004\025\004\026\004\027\004\028\004\029\004\030\004\031\004 \004!\004%\004'\004(\004)\004*\004+\004,\004-\004.\004/\0040\0041\0042\0043\0044\0045\0046\0047\0048\004>\004D\004F\004G\004H\004I\004J\004K\004L\004M\004N\004O\004P\004Q\004U\004W\004X\004Y\004Z\004[\004\\\004]\004^\004_\004`\004a\004b\004c\004d\004e\004f\004g\004h\004n\004p\004q\004r\004s\004t\004u\004v\004w\004x\004y\004z\004{\004|\004\128\004\130\004\131\004\132\004\133\004\134\004\135\004\136\004\137\004\138\004\139\004\140\004\141\004\142\004\143\004\144\004\145\004\146\004\147\004\153\004\155\004\156\004\157\004\158\004\159\004\160\004\161\004\162\004\163\004\164\004\165\004\166\004\170\004\172\004\173\004\174\004\175\004\176\004\177\004\178\004\179\004\180\004\181\004\182\004\183\004\184\004\185\004\186\004\187\004\188\004\189\004\195\004\201\004\203\004\204\004\205\004\206\004\207\004\208\004\209\004\210\004\211\004\212\004\213\004\214\004\218\004\220\004\221\004\222\004\223\004\224\004\225\004\226\004\227\004\228\004\229\004\230\004\231\004\232\004\233\004\234\004\235\004\236\004\237\004\243\004\245\004\246\004\247\004\248\004\249\004\250\004\251\004\252\004\253\004\254\004\255\005\000\005\004\005\006\005\007\005\b\005\t\005\n\005\011\005\012\005\r\005\014\005\015\005\016\005\017\005\018\005\019\005\020\005\021\005\022\005\023\005\024\005\025\005\026\005\027\005\028\005\030\005\031\005 \005!\005\"\005#\005$\005%\005&\005'\005(\005)\005*\005+\005,\005-\005.\0054\0059\005:\005;\005<\005E\005F\005G\005H\005I\005O\005Q\005R\005S\005T\005U\005V\005W\005X\005Y\005Z\005[\005\\\005`\005b\005c\005d\005e\005f\005g\005h\005i\005j\005k\005l\005m\005n\005o\005p\005q\005r\005s\005t\005u\005v\005w\005x\005~\005\127\005\128\005\129\005\130\005\131\005\132\005\133\005\182\005\183\005\184\005\214\005\215\005\245\005\246\006\020\006\021\0063\0064\006R\006S\006q\006r\006\144\006\145\006\175\006\176\006\206\006\207\006\237\006\238\007\012\007\r\007+\007,\007J\007K\007i\007j\007\136\007\137\007\167\007\168\007\198\007\199\007\229\007\230\b\004\b\005\b#\b$\bB\bC\ba\bb\b\128\b\129\b\159\b\160\b\190\b\191\b\221\b\222\b\223\b\224\b\254\b\255\t\029\t\030\t<\t=\t>\t?\t@\tA\tB\tC\tD\tE\tF\tL\tQ\tR\tS\tT\tU\tV\tW\tX\tY\tZ\t[\t\\\t]\t^\tg\th\ti\t\154\t\155\t\156\t\157\t\158\t\159\t\160\t\161\t\162\t\163\t\164\t\165\t\166\t\167\t\168\t\169\t\170\t\171\t\172\t\173\t\174\t\175\t\176\t\177\t\178\t\179\t\180\t\181\t\182\t\183\t\184\t\185\t\186\t\187\t\188\t\189\t\190\t\191\t\192\t\193\t\194\t\195\t\196\t\226\t\227\t\228\t\229\n\003\n\004\n\005\n\006\n$\n%\n&\n'\nE\nF\nG\nH\nf\ng\n\133\n\134\n\135\n\136\n\166\n\167\n\168\n\169\n\199\n\200\n\201\n\202\n\232\n\233\n\234\n\235\011\t\011\n\011\011\011\012\011\r\011\014\011,\011-\011K\011L\011M\011N\011l\011m\011\139\011\140\011\170\011\171\011\172\011\173\011\203\011\204\011\205\011\206\011\207\011\208\011\238\011\239\012\r\012\014\012,\012-\012K\012L\012j\012k\012\137\012\138\012\168\012\169\012\199\012\200\012\201\012\202\012\203\012\204\012\205\012\206\012\207\012\208\012\238\012\239\012\240\012\241\r\015\r\016\r.\r/\r0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r:\r;\r<\r=\r>\r?\r@\rA\rB\rC\rD\rE\rF\rG\rH\rI\rJ\rK\rL\rM\rN\rO\rP\rQ\rR\rS\rT\rU\rV\rZ\r\\\r]\r^\r_\r`\ra\rb\rc\rd\re\rf\rg\rh\ri\rj\rk\rl\rm\ro\rp\rq\rr\rs\ru\rv\rw\ry\rz\r{\r|\r}\r\127\r\128\r\129\r\130\r\131\r\137\r\139\r\141\r\142\r\143\r\144\r\146\r\147\r\148\r\149\r\150\r\151\r\152\r\153\r\154\r\155\r\156\r\157\r\158\r\159\r\160\r\161\r\162\r\163\r\164\r\166\r\167\r\168\r\169\r\170\r\171\r\172\r\173\r\174\r\175\r\177\r\179\r\181\r\183\r\184\r\185\r\186\r\187\r\188\r\189\r\190\r\193\r\194\r\195\r\196\r\197\r\198\r\199\r\200\r\201\r\202\r\203\r\207\r\209\r\210\r\211\r\212\r\213\r\214\r\215\r\216\r\217\r\218\r\219\r\220\r\221\r\222\r\223\r\224\r\225\r\226\r\232\r\234\r\235\r\236\r\237\r\238\r\239\r\240\r\241\r\242\r\243\r\244\r\245\r\249\r\251\r\252\r\253\r\254\r\255\014\000\014\001\014\002\014\003\014\004\014\005\014\006\014\007\014\b\014\t\014\n\014\011\014\012\014\018\014\024\014\026\014\027\014\028\014\029\014\030\014\031\014 \014!\014\"\014#\014$\014%\014)\014+\014,\014-\014.\014/\0140\0141\0142\0143\0144\0145\0146\0147\0148\0149\014:\014;\014<\014=\014>\014?\014@\014C\014D\014E\014F\014G\014H\014I\014J\014K\014L\014M\014Q\014S\014T\014U\014V\014W\014X\014Y\014Z\014[\014\\\014]\014^\014_\014`\014a\014b\014c\014d\014j\014p\014r\014s\014t\014u\014v\014w\014x\014y\014z\014{\014|\014}\014\129\014\131\014\132\014\133\014\134\014\135\014\136\014\137\014\138\014\139\014\140\014\141\014\142\014\143\014\144\014\145\014\146\014\147\014\148\014\154\014\156\014\157\014\158\014\159\014\160\014\161\014\162\014\163\014\164\014\165\014\166\014\167\014\171\014\173\014\174\014\175\014\176\014\177\014\178\014\179\014\180\014\181\014\182\014\183\014\184\014\185\014\186\014\187\014\188\014\189\014\190\014\196\014\198\014\199\014\200\014\201\014\202\014\203\014\204\014\205\014\206\014\207\014\208\014\209\014\213\014\215\014\216\014\217\014\218\014\219\014\220\014\221\014\222\014\223\014\224\014\225\014\226\014\227\014\228\014\229\014\230\014\231\014\232\014\238\014\244\014\246\014\247\014\248\014\249\014\250\014\251\014\252\014\253\014\254\014\255\015\000\015\001\015\005\015\007\015\b\015\t\015\n\015\011\015\012\015\r\015\014\015\015\015\016\015\017\015\018\015\019\015\020\015\021\015\022\015\023\015\024\015\025\015\026\015\027\015\028\015\029\015\030\015\031\015 \015!\015\"\015#\015$\015'\015)\015*\015+\015,\015-\015.\015/\0151\0152\0153\0156\0157\0158\015;\015<\015=\015>\015?\015@\015A\015I\015K\015M\015N\015U\015V\015W\015X\015Y\015Z\015`\015b\015d\015e\015f\015g\015h\015i\015j\015k\015l\015m\015n\015o\015p\015q\015r\015s\015t\015u\015v\015w\015x\015y\015z\015{\015|\015~\015\127\015\128\015\130\015\131\015\132\015\133\015\134\015\135\015\137\015\139\015\140\015\141\015\142\015\143\015\146\015\147\015\150\015\153\015\154\015\155\015\156\015\157\015\158\015\159\015\160\015\162\015\163\015\164\015\165\015\168\015\169\015\170\015\173\015\176\015\177\015\178\015\179\015\180\015\181\015\182\015\183"))
+    
+    and nullable =
+      "\b\000)\255\255\132\003\199\128\000\000\002"
+    
+    and first =
+      (125, "\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\011\000\127\1760&HzI\220\188x\b\243\027\208\216\003\253\129\0012C\210N\229\227\196G\152\222\134\000\000\000\000\000\000\000\000\000 \000 \000\000\000\000\000\000\128\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\140\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\136\004\b#\001\000\000\000\000\024\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\192@\000\000\000\000\000\000\000\000\b\001\144\b\016\198\002\000\000\004\0000\016\000\000\000@\012\128@\1340\016\000\000 \001\128\128\002\128\000\000\000\000\000\000\000\128\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000 \006@ C\024\b\000\000\016\000\192@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\016\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\004\000\200\004\bc\001\000\000\002\000\024\b\000(\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\012\128@\1340\016\000\000 \001\128\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\b\000B@\000\016\000H\004@0 \000\004 \002\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\024\002\253\129\0012C\210N\225\227\192G\152\222\134\000\b\000\000\000\000\000\000\000\002\000\000\000\000\000\006\000\255`@L\144\244\147\184x\240\017\2307\161\176\007\255B\002|\135\164\157\195\199\192\1431\189\r\128?\216\016\019$=$\238\030<\004y\141\232l\001\254\192\128\153!\233'p\241\224#\204oC\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\128\000\000@\018\001\024\b\b\000\001\b\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\128\004$\000\001\000\004\128D\003\002\000\000B\000 \000!\000\000\000\000$\002\000\016\016\000\002\016\000\000\001\b\000\000\000\001 \016\000\128\128\000\016\128\000\000\b@\000\000\000\t\000\136\004\004\000\000\132\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000@\002\018\000\000\128\002@\"\001\129\000\000!\000\018\000\016\144\000\004\000\018\001\016\012\b\000\001\b\000\128\000@\000\000\000\000\000\000\000\000\000\000\000\000\002\192\031\236\012\t\146\030\146w/\030\002<\198\2446\000\255`@L\144\244\147\185x\241\017\2307\161\128\000\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000@\000\000\000\002\016\000\000\b\002@\"\001\001\000\000!\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\001\000\000\000\000$\000\000\000\016\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\192\004\164\000\001\018\006\130F\003\n\000 B\0006\000% \000\b\1444\018\016\024P\003\002\016\001\128\001\b\000\000\004\001 \017\128\128\128\000\016\128\000\000\b@\000\000 \t\000\132\004\004\000\128\132\000\000\000\002\000\000\000\000H\004\000\000 \000\004 \000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\016\128\000\000@\018\001\016\b\b\000\001\b\000\000\000\132\000\000\002\000\144\b\000@@\b\b@\000\192\023\236\b\t\146\030\146w\015\030\002<\198\2446\000\191`@L\144\244\147\152x\240\019\2307\161\176\005{\000\002D\133\160\153\195\195\128\142\017\189\r\128+\216\000\018$-\004\198\030\028\004\240\141\232l\001\254\192\128\153!\233'p\241\224'\204oC\000\004\000\000\000\000\000\000\000\001\000\000\000\000\000\003\000\018\144\000\004H\026\t\024\012(\000\129\b\000\216\000\148\128\000\"@\208H@a@\012\b@\006\192\031\236\b\t\146\030\146w\015\030\002<\198\2446\000\255`@L\144\244\147\152x\240\019\2307\161\128\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\016\001\000\016  \000 \000\t\000\000,\001\255\208\128\159!\233'p\241\240#\204oC`\015\246\004\004\201\015I;\135\143\001\030cz\024\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000")
+    
+  end) (ET) (TI)
+  
+end
+
+let parse_stab_sig =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 1544 lexer lexbuf) : (string -> Mo_def.Syntax.stab_sig))
+
+and parse_prog_interactive =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 1532 lexer lexbuf) : (string -> Mo_def.Syntax.prog))
+
+and parse_prog =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 250 lexer lexbuf) : (string -> Mo_def.Syntax.prog))
+
+and parse_module_header =
+  fun lexer lexbuf ->
+    (Obj.magic (MenhirInterpreter.entry `Legacy 0 lexer lexbuf) : (unit))
+
+module Incremental = struct
+  
+  let parse_stab_sig =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 1544 initial_position) : (string -> Mo_def.Syntax.stab_sig) MenhirInterpreter.checkpoint)
+  
+  and parse_prog_interactive =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 1532 initial_position) : (string -> Mo_def.Syntax.prog) MenhirInterpreter.checkpoint)
+  
+  and parse_prog =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 250 initial_position) : (string -> Mo_def.Syntax.prog) MenhirInterpreter.checkpoint)
+  
+  and parse_module_header =
+    fun initial_position ->
+      (Obj.magic (MenhirInterpreter.start 0 initial_position) : (unit) MenhirInterpreter.checkpoint)
+  
+end
+
+# 969 "mo_frontend/parser.mly"
+  
+
+# 39658 "mo_frontend/parser.ml"
+
+# 52 "mo_frontend/assertions.mly"
+  
+
+# 39663 "mo_frontend/parser.ml"
+
+
+
+ + + diff --git a/coverage/mo_frontend/parser_lib.ml.html b/coverage/mo_frontend/parser_lib.ml.html new file mode 100644 index 00000000000..aec0c93136a --- /dev/null +++ b/coverage/mo_frontend/parser_lib.ml.html @@ -0,0 +1,56 @@ + + + + + parser_lib.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+
+
exception Imports of Mo_def.Syntax.dec list
+
+(* Temporary hack! *)
+let msg_store : Diag.msg_store option ref = ref None
+let mode : Lexer_lib.mode option ref = ref None
+
+let triv_table : Trivia.triv_table ref = ref Trivia.empty_triv_table
+
+
+
+ + + diff --git a/coverage/mo_frontend/parsing.ml.html b/coverage/mo_frontend/parsing.ml.html new file mode 100644 index 00000000000..d40e8176bf1 --- /dev/null +++ b/coverage/mo_frontend/parsing.ml.html @@ -0,0 +1,380 @@ + + + + + parsing.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+
+

+module P =
+  MenhirLib.Printers.Make
+    (Parser.MenhirInterpreter)
+    (Printers)
+
+(* Instantiate [ErrorReporting] for our parser. This requires
+   providing a few functions -- see [CalcErrorReporting]. *)
+
+module E =
+  Menhir_error_reporting.Make
+    (Parser.MenhirInterpreter)
+    (Error_reporting)
+
+(* Define a printer for explanations. We treat an explanation as if it
+   were just an item: that is, we ignore the position information that
+   is provided in the explanation. Indeed, this information is hard to
+   show in text mode. *)
+
+let uniq xs = List.fold_right (fun x ys -> if List.mem x ys then ys else x::ys) xs []
+
+let abstract_symbols explanations =
+  let symbols = List.sort Parser.MenhirInterpreter.compare_symbols
+    (List.map (fun e -> List.hd (E.future e))  explanations) in
+  let ss = List.map Printers.string_of_symbol symbols in
+  String.concat "\n  " (uniq ss)
+
+let abstract_future future =
+  let ss = List.map Printers.string_of_symbol future  in
+  String.concat " " ss
+
+let rec lex_compare_futures f1 f2 =
+  match f1,f2 with
+  | [], [] -> 0
+  | s1::ss1,s2::ss2 ->
+    (match Parser.MenhirInterpreter.compare_symbols s1 s2 with
+     | 0 -> lex_compare_futures ss1 ss2
+     | c -> c)
+  | _ -> assert false
+
+let compare_futures f1 f2 = match compare (List.length f1) (List.length f2) with
+      | 0 -> lex_compare_futures f1 f2
+      | c -> c
+
+let abstract_futures explanations =
+  let futures = List.sort compare_futures (List.map E.future explanations) in
+  let ss = List.map abstract_future futures in
+  String.concat "\n  " (uniq ss)
+
+let abstract_item item =
+  P.print_item item;
+  Printers.to_string()
+
+let abstract_items explanations =
+  let items = List.sort Parser.MenhirInterpreter.compare_items (List.map E.item explanations) in
+  let ss = List.map abstract_item items in
+  String.concat "  " (uniq ss)
+
+type error_detail = int
+
+exception Error of string * Lexing.position * Lexing.position
+
+(* The lexbuf is a 1024 byte wide window, we need to compute offsets before
+   accessing it, because token positions are absolute to the whole input *)
+let slice_lexeme lexbuf i1 i2 =
+  let open Lexing in
+  let offset = i1.pos_cnum - lexbuf.lex_abs_pos in
+  let len = i2.pos_cnum - i1.pos_cnum in
+  if offset < 0 || len < 0
+  then "<unknown>" (* Too rare to care *)
+  else Bytes.sub_string lexbuf.lex_buffer offset len
+
+let parse mode error_detail checkpoint lexer lexbuf =
+  Diag.with_message_store (fun m ->
+    try
+      (* Temporary hack! *)
+      Parser_lib.msg_store := Some m;
+      Parser_lib.mode := Some mode;
+      Some (E.entry checkpoint lexer)
+    with E.Error ((start, end_), explanations) ->
+      let at =
+        Source.{left = Lexer.convert_pos start; right = Lexer.convert_pos end_}
+      in
+      let lexeme = slice_lexeme lexbuf start end_ in
+      let token =
+        if lexeme = "" then "end of input" else
+        "token '" ^ String.escaped lexeme ^ "'"
+      in
+      let msg =
+        match error_detail with
+        | 1 ->
+          Printf.sprintf
+            "unexpected %s, expected one of token or <phrase>:\n  %s"
+            token (abstract_symbols explanations)
+        | 2 ->
+          Printf.sprintf
+            "unexpected %s, expected one of token or <phrase> sequence:\n  %s"
+            token (abstract_futures explanations)
+        | 3 ->
+          Printf.sprintf
+            "unexpected %s in position marked . of partially parsed item(s):\n%s"
+            token (abstract_items explanations)
+        | _ ->
+          Printf.sprintf "unexpected %s" token
+      in
+      Diag.add_msg m (Diag.error_message at "M0001" "syntax" msg);
+      None
+  )
+
+
+
+ + + diff --git a/coverage/mo_frontend/printers.ml.html b/coverage/mo_frontend/printers.ml.html new file mode 100644 index 00000000000..9b9793a6ca2 --- /dev/null +++ b/coverage/mo_frontend/printers.ml.html @@ -0,0 +1,920 @@ + + + + + printers.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+
+
open Parser.MenhirInterpreter
+
+(* In order to print syntax error messages and/or debugging information, we
+   need a symbol printer. *)
+
+let abstract abs con = abs
+
+let binop = abstract "<binop>"
+let relop = abstract "<relop>"
+let binassign = abstract "<binassign>"
+
+(* all unary operators are also binary operators, so keep them unary *)
+let unop = abstract "<unop>"
+let unassign = abstract "<unassign>"
+
+
+let string_of_symbol = function
+  | X (T T_error) -> "error"
+  | X (T T_XOROP) -> unop "^"
+  | X (T T_XORASSIGN) -> unassign "^="
+  | X (T T_WHILE) -> "while"
+  | X (T T_VAR) -> "var"
+  | X (T T_SHROP) -> binop " >>"
+  | X (T T_SHRASSIGN) -> binop ">>="
+  | X (T T_UNDERSCORE) -> "_"
+  | X (T T_TYPE) -> "type"
+  | X (T T_TRY) -> "try"
+  | X (T T_THROW) -> "throw"
+  | X (T T_TEXT) -> "<text>"
+  | X (T T_SWITCH) -> "switch"
+  | X (T T_SUBOP) -> unop "-"
+  | X (T T_SUB) -> "<:"
+  | X (T T_STABLE) -> "stable"
+  | X (T T_SHLOP) -> binop "<<"
+  | X (T T_SHLASSIGN) -> binassign "<<="
+  | X (T T_SHARED) -> "shared"
+  | X (T T_SEMICOLON_EOL) -> ";" (* suppress the \n *)
+  | X (T T_SEMICOLON) -> ";"
+  | X (T T_SYSTEM) -> "system"
+  | X (T T_WITH) -> "with"
+  | X (T T_RPAR) -> ")"
+  | X (T T_ROTROP) -> binop "<>>"
+  | X (T T_ROTRASSIGN) -> binassign "<>>="
+  | X (T T_ROTLOP) -> binop "<<>"
+  | X (T T_ROTLASSIGN) -> binassign "<<>="
+  | X (T T_RETURN) -> "return"
+  | X (T T_RCURLY) -> "}"
+  | X (T T_RBRACKET) -> "]"
+  | X (T T_QUEST) -> "?"
+  | X (T T_BANG) -> "!"
+  | X (T T_QUERY) -> "query"
+  | X (T T_PUBLIC) -> "public"
+  | X (T T_PRIVATE) -> "private"
+  | X (T T_PRIM) -> "prim"
+  | X (T T_POWOP) -> binop "**"
+  | X (T T_WRAPADDOP) -> binop "+%"
+  | X (T T_WRAPSUBOP) -> binop "-%"
+  | X (T T_WRAPMULOP) -> binop "*%"
+  | X (T T_WRAPPOWOP) -> binop "**%"
+  | X (T T_WRAPADDASSIGN) -> binassign "+%-"
+  | X (T T_WRAPSUBASSIGN) -> binassign "-%="
+  | X (T T_WRAPMULASSIGN) -> binassign "*%="
+  | X (T T_WRAPPOWASSIGN) -> binassign "**%="
+  | X (T T_POWASSIGN) -> binassign "**="
+  | X (T T_PLUSASSIGN) -> unassign "+="
+  | X (T T_OROP) -> binop "|"
+  | X (T T_ORASSIGN) -> binassign "|="
+  | X (T T_OR) -> "or"
+  | X (T T_OBJECT) -> "object"
+  | X (T T_NULL) -> "null"
+  | X (T T_NOT) -> "not"
+  | X (T T_NEQOP) -> binop "!="
+  | X (T T_NAT) -> "<nat>"
+  | X (T T_MULOP) -> binop "*"
+  | X (T T_MULASSIGN) -> binassign "*="
+  | X (T T_MODULE) -> "module"
+  | X (T T_MODOP) -> binop "%"
+  | X (T T_MODASSIGN) -> binassign "%="
+  | X (T T_MINUSASSIGN) -> unassign "-="
+  | X (T T_LTOP) -> relop " < "
+  | X (T T_LT) -> "<"
+  | X (T T_LPAR) -> "("
+  | X (T T_LOOP) -> "loop"
+  | X (T T_LET) -> "let"
+  | X (T T_LEOP) -> relop "<="
+  | X (T T_LCURLY) -> "{"
+  | X (T T_LBRACKET) -> "["
+  | X (T T_LABEL) -> "label"
+  | X (T T_IN) -> "in"
+  | X (T T_IMPORT) -> "import"
+  | X (T T_IGNORE) -> "ignore"
+  | X (T T_IF) -> "if"
+  | X (T T_ID) -> "<id>"
+  | X (T T_HASH) -> binop "#"
+  | X (T T_GTOP) -> relop " > "
+  | X (T T_GT) -> ">"
+  | X (T T_GEOP) -> relop ">="
+  | X (T T_FUNC) -> "func"
+  | X (T T_FOR) -> "for"
+  | X (T T_FLEXIBLE) -> "flexible"
+  | X (T T_FLOAT) -> "<float>"
+  | X (T T_EQOP) -> relop "=="
+  | X (T T_EQ) -> "="
+  | X (T T_EOF) -> "<eof>"
+  | X (T T_ELSE) -> "else"
+  | X (T T_DOT_NUM) -> ".<nat>"
+  | X (T T_DOT) -> "."
+  | X (T T_DO) -> "do"
+  | X (T T_DIVOP) -> binop "/"
+  | X (T T_DIVASSIGN) -> binassign "/="
+  | X (T T_DISALLOWED) -> "<disallowed>"
+  | X (T T_DEBUG_SHOW) -> "debug_show"
+  | X (T T_TO_CANDID) -> "to_candid"
+  | X (T T_FROM_CANDID) -> "from_candid"
+  | X (T T_DEBUG) -> "debug"
+  | X (T T_CONTINUE) -> "continue"
+  | X (T T_COMMA) -> ","
+  | X (T T_COMPOSITE) -> "composite"
+  | X (T T_COLON) -> ":"
+  | X (T T_CLASS) -> "class"
+  | X (T T_CHAR) ->  "<char>"
+  | X (T T_CATCH) -> "catch"
+  | X (T T_CATASSIGN) -> binassign "@="
+  | X (T T_CASE) -> "case"
+  | X (T T_BREAK) -> "break"
+  | X (T T_BOOL) -> "<bool>"
+  | X (T T_AWAIT) -> "await"
+  | X (T T_AWAITSTAR) -> "await*"
+  | X (T T_ASYNC) -> "async"
+  | X (T T_ASYNCSTAR) -> "async*"
+  | X (T T_ASSIGN) -> binassign "assign"
+  | X (T T_ASSERT) -> "assert"
+  | X (T T_ARROW) -> "->"
+  | X (T T_ANDOP) -> binop "&"
+  | X (T T_ANDASSIGN) -> binassign "&="
+  | X (T T_AND) -> "and"
+  | X (T T_IMPLIES) -> "implies"
+  | X (T T_OLD) -> "old"
+  | X (T T_ADDOP) -> unop "+"
+  | X (T T_ACTOR) -> "actor"
+  | X (T T_INVARIANT) -> "invariant"
+  | X (T T_PIPE) -> "|>"
+  (* non-terminals *)
+  | X (N N_bl) -> "<bl>"
+  | X (N N_case) -> "<case>"
+  | X (N N_catch) -> "<catch>"
+  | X (N N_class_body) -> "<class_body>"
+  | X (N N_dec) -> "<dec>"
+  | X (N N_dec_field) -> "<dec_field>"
+  | X (N N_dec_nonvar) -> "<dec_nonvar>"
+  | X (N N_dec_var) -> "<dec_var>"
+  | X (N N_exp_bl_) -> "<exp(bl)>"
+  | X (N N_exp_ob_) -> "<exp(ob)>"
+  | X (N N_exp_bin_bl_) -> "<exp_bin(bl)>"
+  | X (N N_exp_bin_ob_) -> "<exp_bin(ob)>"
+  | X (N N_exp_obj) -> "<exp_obj>"
+  | X (N N_exp_nest) -> "<exp_nest>"
+  | X (N N_block) -> "<block>"
+  | X (N N_exp_field) -> "<exp_field>"
+  | X (N N_exp_nondec_bl_) -> "<exp_nondec(bl)>"
+  | X (N N_exp_nondec_ob_) -> "<exp_nondec(ob)>"
+  | X (N N_exp_nonvar_bl_) -> "<exp_nonvar(bl)>"
+  | X (N N_exp_nonvar_ob_) -> "<exp_nonvar(ob)>"
+  | X (N N_exp_nullary_bl_) -> "<exp_nullary(bl)>"
+  | X (N N_exp_nullary_ob_) -> "<exp_nullary(ob)>"
+  | X (N N_exp_plain) -> "<exp_plain>"
+  | X (N N_exp_post_bl_) -> "<exp_post(bl)>"
+  | X (N N_exp_post_ob_) -> "<exp_post(ob)>"
+  | X (N N_exp_un_bl_) -> "<exp_un(bl)>"
+  | X (N N_exp_un_ob_) -> "<exp_un(ob)>"
+  | X (N N_func_body) -> "<func_body>"
+  | X (N N_imp) -> "<imp>"
+  | X (N N_import_list) -> "<import_list>"
+  | X (N N_inst) -> "<inst>"
+  | X (N N_lit) -> "<lit>"
+  | X (N N_ob) -> "<ob>"
+  | X (N N_obj_body) -> "<obj_body>"
+  | X (N N_option_EQ_) -> "=?"
+  | X (N N_option_exp_nullary_ob__) -> "<exp_nullary(ob)>?"
+  | X (N N_option_typ_args_) -> "<typ_args>?"
+  | X (N N_option_query_) -> "<query>?"
+  | X (N N_parse_module_header) -> "<parse_module_header>"
+  | X (N N_parse_prog) -> "<parse_prog>"
+  | X (N N_parse_prog_interactive) -> "<parse_prog_interactive>"
+  | X (N N_parse_stab_sig) -> "<parse_stab_sig>"
+  | X (N N_pat) -> "<pat>"
+  | X (N N_pat_bin) -> "<pat_bin>"
+  | X (N N_pat_field) -> "<pat_field>"
+  | X (N N_pat_nullary) -> "<pat_nullary>"
+  | X (N N_pat_plain) -> "<pat_plain>"
+  | X (N N_pat_un) -> "<pat_un>"
+  | X (N N_path) -> "<path>"
+  | X (N N_annot_opt) -> "<annot_opt>"
+  | X (N N_seplist_case_semicolon_) ->  "seplist(<case>,<semicolon>)"
+  | X (N N_seplist_dec_SEMICOLON_) -> "seplist(<dec>,;)"
+  | X (N N_seplist_dec_semicolon_) -> "seplist(<dec>,<semicolon>)"
+  | X (N N_seplist_typ_dec_semicolon_) -> "seplist(<typ_dec>,<semicolon>)"
+  | X (N N_seplist_dec_field_semicolon_) -> "seplist(<dec_field>,<semicolon>)"
+  | X (N N_seplist_exp_ob__COMMA_) -> "seplist(<exp(ob)>,,)"
+  | X (N N_seplist_exp_field_semicolon_) -> "seplist(<exp_field>,<semicolon>)"
+  | X (N N_seplist1_exp_field_semicolon_) -> "seplist1(<exp_field>,<semicolon>)"
+  | X (N N_separated_nonempty_list_AND_exp_post_ob__) -> "seplist+(<exp_post(ob)>,and)"
+  | X (N N_seplist_exp_nonvar_ob__COMMA_) -> "seplist(<exp_nonvar(ob)>,,)"
+  | X (N N_seplist_imp_SEMICOLON_) -> "seplist(<imp>,;)"
+  | X (N N_seplist_imp_semicolon_) -> "seplist(<imp>,<semicolon>)"
+  | X (N N_seplist_pat_bin_COMMA_) -> "seplist(<pat_bin>,,)"
+  | X (N N_seplist_pat_field_semicolon_) -> "seplist(<pat_field>,<semicolon>)"
+  | X (N N_seplist_typ_COMMA_) -> "seplist(<typ>,,)"
+  | X (N N_list_preceded_COMMA_typ__) -> "(, <typ>)*"
+  | X (N N_seplist_typ_bind_COMMA_) -> "seplist(<typ_bind>,,)"
+  | X (N N_list_preceded_COMMA_typ_bind__) -> "(, <typ_bind>)*"
+  | X (N N_seplist_typ_field_semicolon_) -> "seplist(<typ_field>,<semicolon>)"
+  | X (N N_seplist_stab_field_semicolon_) -> "seplist(<stab_field>,<semicolon>)"
+  | X (N N_seplist_typ_item_COMMA_) -> "seplist(<typ_item>,,)"
+  | X (N N_seplist_typ_tag_semicolon_) -> "seplist(<typ_tag>,<semicolon>)"
+  | X (N N_seplist1_typ_tag_semicolon_) -> "seplist1(<typ_tag>,<semicolon>)"
+  | X (N N_pat_opt) -> "<pat_opt>"
+  | X (N N_typ) -> "<typ>"
+  | X (N N_typ_dec) -> "<typ_dec>"
+  | X (N N_typ_args) -> "<typ_args>"
+  | X (N N_typ_bind) -> "<typ_bind>"
+  | X (N N_typ_field) -> "<typ_field>"
+  | X (N N_typ_item) -> "<typ_item>"
+  | X (N N_typ_nobin) -> "<typ_nobin>"
+  | X (N N_typ_nullary) -> "<typ_nullary>"
+  | X (N N_typ_obj) -> "<typ_obj>"
+  | X (N N_typ_pre) -> "<typ_pre>"
+  | X (N N_typ_tag) -> "<typ_tag>"
+  | X (N N_typ_un) -> "<typ_un>"
+  | X (N N_typ_variant) -> "<typ_variant>"
+  | X (N N_vis) -> "<vis>"
+  | X (N N_stab) -> "<stab>"
+  | X (N N_stab_field) -> "<stab_field>"
+  | X (N N_start) -> "<start>" (* dummy non-terminal, don't display *)
+
+(* In order to print a view of the stack that includes semantic values,
+   we need an element printer. (If we don't need this feature, then
+   [print_symbol] above suffices.) *)
+
+(* The public functions. *)
+
+let buff :string list ref = ref []
+let print s = buff := s::!buff
+let print_symbol s = print (string_of_symbol s)
+let print_element = None
+let to_string() = let s = String.concat "" (List.rev (!buff)) in
+                  buff := [];
+                  s
+
+
+
+ + + diff --git a/coverage/mo_frontend/source_lexer.ml.html b/coverage/mo_frontend/source_lexer.ml.html new file mode 100644 index 00000000000..a19b588f9c4 --- /dev/null +++ b/coverage/mo_frontend/source_lexer.ml.html @@ -0,0 +1,21084 @@ + + + + + source_lexer.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+
+
# 1 "mo_frontend/source_lexer.mll"
+ 
+open Trivia
+open Source_token
+open Lexer_lib
+module Utf8 = Lib.Utf8
+
+let region lexbuf =
+  let left = convert_pos (Lexing.lexeme_start_p lexbuf) in
+  let right = convert_pos (Lexing.lexeme_end_p lexbuf) in
+  {Source.left = left; Source.right = right}
+
+let error lexbuf msg = raise (Error (region lexbuf, msg))
+let error_nest start lexbuf msg =
+  lexbuf.Lexing.lex_start_p <- start;
+  error lexbuf msg
+
+let utf8 s i =
+  let len = if s.[!i] < '\xe0' then 1 else if s.[!i] < '\xf0' then 2 else 3 in
+  i := !i + len;
+  List.hd (Utf8.decode (String.sub s (!i - len) (1 + len)))
+
+let codepoint lexbuf s i =
+  let u =
+    if s.[!i] >= '\x80' then Utf8.encode [utf8 s i] else
+    if s.[!i] <> '\\' then Utf8.encode [Char.code s.[!i]] else
+    match (incr i; s.[!i]) with
+    | 'n' -> Utf8.encode [Char.code '\n']
+    | 'r' -> Utf8.encode [Char.code '\r']
+    | 't' -> Utf8.encode [Char.code '\t']
+    | '\\' -> Utf8.encode [Char.code '\\']
+    | '\'' -> Utf8.encode [Char.code '\'']
+    | '\"' -> Utf8.encode [Char.code '\"']
+    | 'u' ->
+      let j = !i + 2 in
+      i := String.index_from s j '}';
+      Utf8.encode [
+        try
+          let n = int_of_string ("0x" ^ String.sub s j (!i - j)) in
+          if 0 <= n && n < 0xD800 || 0xE000 <= n && n < 0x110000 then n else raise (Failure "")
+        with Failure _ -> error lexbuf "unicode escape out of range"
+      ]
+    | h ->
+      incr i;
+      let b = int_of_string ("0x" ^ String.make 1 h ^ String.make 1 s.[!i]) in
+      String.of_seq (Seq.return (Char.chr b))
+  in incr i; u
+
+let text lexbuf s =
+  let b = Buffer.create (String.length s) in
+  let i = ref 1 in
+  while !i < String.length s - 1 do
+    if s.[!i] = '\n' then Lexing.new_line lexbuf;
+    let bs = codepoint lexbuf s i in
+    Buffer.add_substring b bs 0 (String.length bs)
+  done;
+  Buffer.contents b
+
+let char lexbuf s =
+  let t = text lexbuf s in
+  try
+    match Utf8.decode t with
+    | [n] -> n
+    | [] -> error lexbuf "empty character literal"
+    | _ -> error lexbuf "overlong character literal"
+  with Lib.Utf8.Utf8 ->
+    error lexbuf "invalid utf8 in character literal"
+
+# 70 "mo_frontend/source_lexer.ml"
+let __ocaml_lex_tables = {
+  Lexing.lex_base =
+   "\000\000\123\255\000\000\129\000\129\000\193\000\001\001\001\001\
+    \065\001\124\255\125\255\126\255\182\000\161\000\236\000\192\001\
+    \011\002\086\002\161\002\236\002\055\003\130\003\205\003\024\004\
+    \099\004\174\004\249\004\068\005\143\005\218\005\037\006\112\006\
+    \187\006\006\007\081\007\204\007\195\008\191\007\138\009\194\009\
+    \185\000\186\000\187\000\189\000\190\000\207\007\213\007\214\007\
+    \216\007\191\000\193\000\194\000\244\255\249\007\011\002\222\001\
+    \248\255\249\255\250\255\251\255\252\255\253\255\254\255\255\255\
+    \217\255\218\255\222\001\224\001\246\255\207\255\227\001\205\255\
+    \009\002\204\255\018\009\003\008\220\255\221\255\013\002\219\255\
+    \206\255\216\255\014\002\203\255\198\255\215\255\041\002\202\255\
+    \214\255\042\002\219\007\211\255\043\002\200\255\201\255\131\255\
+    \189\009\213\255\062\010\078\008\110\010\174\010\204\008\206\010\
+    \014\011\078\011\142\011\206\011\014\012\078\012\142\012\206\012\
+    \014\013\078\013\212\255\210\255\209\255\231\255\208\255\199\255\
+    \066\009\222\013\232\013\013\008\033\014\160\009\098\014\136\014\
+    \174\014\239\014\255\013\170\009\009\014\163\014\066\014\006\015\
+    \016\015\038\015\066\002\063\015\053\015\006\015\101\015\165\015\
+    \229\015\229\015\037\016\101\016\165\016\229\016\037\017\101\017\
+    \165\017\229\017\037\018\101\018\240\001\245\018\175\007\193\255\
+    \012\019\050\019\073\019\111\019\172\019\190\255\191\255\192\255\
+    \019\020\020\020\149\020\054\019\197\020\005\021\069\021\069\021\
+    \133\021\197\021\005\022\069\022\133\022\197\022\005\023\069\023\
+    \133\023\197\023\189\255\021\002\133\024\120\024\143\024\086\025\
+    \147\025\185\025\004\026\079\026\154\026\229\026\048\027\123\027\
+    \198\027\017\028\092\028\167\028\248\028\185\255\067\029\142\029\
+    \217\029\036\030\111\030\192\030\182\255\011\031\086\031\161\031\
+    \236\031\055\032\130\032\205\032\024\033\099\033\174\033\249\033\
+    \068\034\143\034\218\034\037\035\112\035\187\035\006\036\081\036\
+    \156\036\231\036\050\037\125\037\200\037\019\038\094\038\169\038\
+    \244\038\063\039\138\039\213\039\032\040\107\040\182\040\001\041\
+    \076\041\151\041\226\041\045\042\120\042\195\042\014\043\089\043\
+    \164\043\239\043\058\044\133\044\208\044\027\045\102\045\177\045\
+    \252\045\071\046\146\046\221\046\040\047\115\047\190\047\009\048\
+    \084\048\159\048\234\048\053\049\128\049\203\049\022\050\097\050\
+    \172\050\247\050\066\051\141\051\216\051\035\052\110\052\185\052\
+    \004\053\079\053\154\053\229\053\048\054\123\054\198\054\017\055\
+    \092\055\167\055\242\055\061\056\136\056\211\056\030\057\105\057\
+    \180\057\255\057\074\058\149\058\224\058\043\059\118\059\193\059\
+    \012\060\087\060\162\060\237\060\056\061\131\061\206\061\025\062\
+    \100\062\175\062\250\062\069\063\144\063\219\063\038\064\113\064\
+    \188\064\007\065\082\065\157\065\232\065\051\066\126\066\201\066\
+    \020\067\095\067\170\067\245\067\064\068\139\068\214\068\033\069\
+    \108\069\183\069\002\070\077\070\152\070\227\070\046\071\121\071\
+    \196\071\015\072\090\072\165\072\240\072\059\073\134\073\209\073\
+    \028\074\103\074\178\074\253\074\072\075\147\075\222\075\041\076\
+    \116\076\191\076\010\077\085\077\160\077\235\077\054\078\129\078\
+    \204\078\023\079\098\079\173\079\248\079\067\080\142\080\217\080\
+    \036\081\111\081\186\081\005\082\080\082\155\082\230\082\049\083\
+    \124\083\199\083\018\084\093\084\168\084\243\084\062\085\137\085\
+    \128\255\132\085\196\085\004\086\068\086\132\086\196\086\004\087\
+    \068\087\132\087\058\088\250\255\234\087\115\019\171\088\235\088\
+    \043\089\043\089\107\089\251\255\252\255\253\255\103\002\099\002\
+    \255\255\254\255\171\089\235\089\043\090\107\090\171\090\235\090\
+    \043\091\107\091\171\091";
+  Lexing.lex_backtrk =
+   "\255\255\255\255\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\255\255\255\255\255\255\128\000\126\000\125\000\131\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\131\000\131\000\060\000\060\000\058\000\
+    \033\000\025\000\023\000\022\000\020\000\019\000\018\000\017\000\
+    \016\000\015\000\013\000\012\000\255\255\010\000\014\000\008\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\026\000\255\255\255\255\027\000\255\255\
+    \028\000\255\255\059\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\029\000\255\255\255\255\255\255\030\000\255\255\
+    \255\255\031\000\021\000\255\255\032\000\255\255\255\255\255\255\
+    \123\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\061\000\255\255\255\255\060\000\255\255\061\000\255\255\
+    \061\000\255\255\061\000\255\255\255\255\061\000\255\255\061\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\066\000\066\000\066\000\255\255\255\255\
+    \255\255\121\000\121\000\121\000\121\000\121\000\121\000\067\000\
+    \068\000\121\000\121\000\121\000\069\000\255\255\121\000\121\000\
+    \071\000\121\000\121\000\072\000\255\255\121\000\121\000\121\000\
+    \074\000\121\000\121\000\121\000\121\000\121\000\075\000\121\000\
+    \076\000\121\000\121\000\077\000\121\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\078\000\121\000\121\000\121\000\121\000\
+    \079\000\082\000\121\000\121\000\121\000\080\000\121\000\121\000\
+    \121\000\121\000\081\000\121\000\121\000\083\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\084\000\121\000\121\000\
+    \121\000\121\000\121\000\085\000\086\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\087\000\121\000\088\000\
+    \121\000\091\000\121\000\089\000\121\000\121\000\121\000\090\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\092\000\121\000\
+    \121\000\121\000\121\000\121\000\093\000\121\000\095\000\100\000\
+    \121\000\121\000\094\000\121\000\121\000\121\000\099\000\121\000\
+    \121\000\121\000\121\000\096\000\121\000\121\000\097\000\121\000\
+    \098\000\121\000\121\000\121\000\121\000\121\000\101\000\102\000\
+    \121\000\103\000\121\000\121\000\121\000\120\000\121\000\121\000\
+    \121\000\104\000\121\000\121\000\121\000\105\000\121\000\121\000\
+    \121\000\106\000\121\000\121\000\121\000\121\000\107\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\108\000\121\000\
+    \121\000\121\000\109\000\121\000\121\000\121\000\110\000\121\000\
+    \121\000\121\000\111\000\121\000\121\000\121\000\121\000\121\000\
+    \112\000\115\000\121\000\121\000\113\000\121\000\121\000\121\000\
+    \121\000\121\000\121\000\114\000\121\000\116\000\121\000\117\000\
+    \121\000\121\000\121\000\121\000\118\000\121\000\119\000\122\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\255\255\255\255\255\255\004\000\004\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255";
+  Lexing.lex_default =
+   "\001\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\000\000\000\000\000\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\168\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\255\255\255\255\000\000\000\000\255\255\000\000\
+    \255\255\000\000\255\255\255\255\000\000\000\000\255\255\000\000\
+    \000\000\000\000\255\255\000\000\000\000\000\000\255\255\000\000\
+    \000\000\255\255\255\255\000\000\255\255\000\000\000\000\000\000\
+    \096\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\
+    \255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\
+    \168\000\186\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\000\000\255\255\168\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\163\001\000\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\000\000\000\000\000\000\255\255\255\255\
+    \000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255";
+  Lexing.lex_trans =
+   "\009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\014\000\011\000\009\000\009\000\012\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \013\000\051\000\035\000\040\000\009\000\044\000\043\000\036\000\
+    \063\000\062\000\046\000\048\000\056\000\047\000\053\000\045\000\
+    \038\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\037\000\055\000\057\000\054\000\050\000\049\000\052\000\
+    \015\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\061\000\009\000\060\000\041\000\039\000\
+    \009\000\034\000\033\000\032\000\031\000\030\000\029\000\016\000\
+    \016\000\028\000\016\000\016\000\024\000\026\000\025\000\027\000\
+    \023\000\022\000\021\000\020\000\019\000\016\000\018\000\017\000\
+    \016\000\016\000\016\000\059\000\042\000\058\000\009\000\009\000\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \144\001\013\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \007\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\006\000\005\000\005\000\
+    \004\000\002\000\002\000\002\000\003\000\014\000\119\000\118\000\
+    \116\000\117\000\115\000\114\000\079\000\078\000\077\000\076\000\
+    \010\000\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\064\000\072\000\069\000\070\000\143\001\
+    \071\000\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\068\000\073\000\067\000\
+    \065\000\066\000\080\000\083\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\087\000\094\000\
+    \093\000\159\000\016\000\162\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \190\000\169\001\168\001\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\137\001\136\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\134\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\117\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\116\001\016\000\016\000\118\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\115\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\098\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\097\001\016\000\016\000\096\001\016\000\
+    \095\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\090\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\086\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\075\001\016\000\016\000\074\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\067\001\016\000\016\000\016\000\
+    \066\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\065\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\061\001\016\000\016\000\
+    \016\000\016\000\016\000\060\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \055\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\048\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \049\001\016\000\016\000\016\000\016\000\016\000\047\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\027\001\026\001\016\000\
+    \016\000\016\000\016\000\016\000\024\001\025\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\002\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\001\001\016\000\
+    \016\000\000\001\016\000\016\000\255\000\016\000\016\000\254\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\251\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\242\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\241\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\219\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\218\000\
+    \016\000\016\000\217\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \213\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\196\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\195\000\
+    \016\000\016\000\016\000\016\000\194\000\016\000\016\000\016\000\
+    \193\000\016\000\016\000\016\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\159\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\000\000\121\000\167\000\037\000\
+    \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\095\000\089\000\086\000\000\000\082\000\096\000\090\000\
+    \092\000\000\000\000\000\000\000\120\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\160\000\097\000\000\000\000\000\000\000\
+    \000\000\000\000\088\000\085\000\084\000\081\000\000\000\000\000\
+    \091\000\000\000\000\000\000\000\000\000\000\000\123\000\000\000\
+    \000\000\000\000\000\000\000\000\120\000\000\000\000\000\000\000\
+    \169\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\074\000\037\000\037\000\037\000\
+    \037\000\037\000\037\000\037\000\037\000\037\000\037\000\000\000\
+    \000\000\000\000\000\000\165\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\175\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\174\000\173\000\173\000\172\000\170\000\170\000\170\000\
+    \171\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\166\000\138\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\000\000\000\000\
+    \000\000\000\000\000\000\138\000\138\000\000\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\139\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\000\000\136\000\000\000\136\000\
+    \000\000\075\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\145\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \144\000\143\000\143\000\142\000\140\000\140\000\140\000\141\000\
+    \121\000\000\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\037\000\037\000\037\000\000\000\000\000\000\000\255\255\
+    \000\000\000\000\000\000\131\000\000\000\131\000\000\000\120\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\000\000\000\000\000\000\000\000\
+    \000\000\123\000\000\000\000\000\000\000\000\000\000\000\120\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\122\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\103\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\102\000\101\000\101\000\100\000\098\000\098\000\
+    \098\000\099\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\000\000\120\000\000\000\000\000\000\000\000\000\
+    \000\000\124\000\124\000\124\000\124\000\124\000\124\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\130\000\130\000\120\000\000\000\000\000\000\000\000\000\
+    \000\000\124\000\124\000\124\000\124\000\124\000\124\000\126\000\
+    \000\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\000\000\000\000\000\000\132\000\000\000\
+    \000\000\000\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\125\000\133\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\000\000\000\000\000\000\000\000\
+    \127\000\000\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\125\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\125\000\000\000\000\000\000\000\000\000\000\000\
+    \124\000\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\000\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\124\000\124\000\124\000\124\000\124\000\124\000\000\000\
+    \000\000\000\000\125\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\000\000\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \120\000\124\000\124\000\124\000\124\000\124\000\124\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\125\000\000\000\
+    \000\000\000\000\134\000\000\000\000\000\000\000\000\000\000\000\
+    \120\000\000\000\000\000\000\000\000\000\129\000\000\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\125\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \135\000\135\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \000\000\138\000\000\000\000\000\000\000\137\000\138\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\
+    \157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\000\000\000\000\
+    \000\000\000\000\000\000\138\000\000\000\000\000\000\000\000\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\138\000\000\000\000\000\
+    \000\000\138\000\000\000\138\000\156\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\
+    \138\000\138\000\138\000\138\000\138\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\158\000\158\000\158\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\161\000\161\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\000\000\000\000\000\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\158\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\158\000\158\000\158\000\000\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \000\000\000\000\000\000\158\000\158\000\158\000\158\000\158\000\
+    \158\000\000\000\000\000\000\000\000\000\000\000\000\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\000\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\164\000\000\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\163\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\138\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\163\000\163\000\163\000\
+    \163\000\163\000\163\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\000\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\000\000\000\000\167\000\188\000\000\000\
+    \000\000\000\000\000\000\188\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\000\
+    \188\000\000\000\000\000\000\000\000\000\189\000\189\000\189\000\
+    \189\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\188\000\000\000\000\000\000\000\188\000\000\000\
+    \188\000\187\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\165\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\175\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \174\000\173\000\173\000\172\000\170\000\170\000\170\000\171\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\166\000\255\255\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\000\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\165\000\165\000\165\000\
+    \165\000\165\000\165\000\165\000\165\000\000\000\000\000\167\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\168\000\168\000\168\000\168\000\168\000\168\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\000\000\000\000\
+    \000\000\168\000\168\000\168\000\168\000\168\000\168\000\000\000\
+    \000\000\169\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\165\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\175\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\174\000\173\000\173\000\172\000\170\000\170\000\
+    \170\000\171\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\166\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\192\000\000\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\191\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\168\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\191\000\191\000\191\000\191\000\
+    \191\000\191\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\209\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\201\000\
+    \016\000\016\000\016\000\016\000\016\000\202\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\200\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\197\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\198\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\199\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\206\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\203\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\204\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\205\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\207\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\208\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\210\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\211\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\212\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \214\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\215\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\216\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\229\000\228\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\225\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \221\000\220\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\223\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \222\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\224\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\226\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\227\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\236\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\230\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\231\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\232\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\233\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\234\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\235\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\237\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\238\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\239\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\240\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\243\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\244\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\245\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\246\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\247\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\248\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\249\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\250\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \252\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\253\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\022\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \013\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\012\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\006\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\003\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \004\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\005\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\007\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\008\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\009\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\010\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\011\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \014\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\015\001\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\017\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\018\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\019\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\020\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\021\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\023\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\039\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\032\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \028\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\029\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\030\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\031\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\033\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\034\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\035\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\036\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\037\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\038\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\041\001\016\000\016\000\
+    \040\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\045\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \042\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\043\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \044\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\046\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\051\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\050\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\052\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\053\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\054\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\056\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\057\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\058\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\059\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\063\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\062\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\064\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\072\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\071\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\068\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\069\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\070\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\073\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\082\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\076\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\077\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\078\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\079\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\080\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\081\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\083\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\084\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\085\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\087\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\088\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\089\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\091\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\092\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\093\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\094\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\111\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\107\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \103\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\099\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\100\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\101\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\102\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\104\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \105\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\106\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\108\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\109\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\110\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\112\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\113\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\114\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\132\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\125\001\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\122\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\119\001\016\000\016\000\016\000\120\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\121\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\123\001\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\124\001\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\126\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\127\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\128\001\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \129\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \130\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\131\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\133\001\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \135\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \016\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\016\000\000\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \141\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \138\001\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\016\000\000\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\139\001\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\016\000\000\000\016\000\016\000\
+    \016\000\016\000\140\001\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\000\000\000\000\000\000\000\000\016\000\
+    \000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\000\000\000\000\
+    \000\000\000\000\016\000\000\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\142\001\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\000\000\000\000\000\000\000\000\
+    \143\001\000\000\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\009\000\009\000\009\000\009\000\
+    \009\000\009\000\009\000\009\000\165\001\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\167\001\000\000\000\000\000\000\
+    \000\000\166\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\155\001\155\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\161\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\160\001\
+    \159\001\159\001\158\001\156\001\156\001\156\001\157\001\155\001\
+    \155\001\155\001\155\001\155\001\155\001\155\001\155\001\155\001\
+    \155\001\155\001\164\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\163\001\163\001\163\001\163\001\163\001\
+    \163\001\163\001\163\001\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000";
+  Lexing.lex_check =
+   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \002\000\002\000\002\000\002\000\002\000\002\000\002\000\002\000\
+    \012\000\013\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
+    \000\000\000\000\000\000\000\000\000\000\014\000\040\000\041\000\
+    \042\000\042\000\043\000\044\000\049\000\049\000\050\000\051\000\
+    \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\
+    \003\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\
+    \004\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\
+    \005\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\
+    \006\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\007\000\007\000\007\000\007\000\007\000\007\000\007\000\
+    \007\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\008\000\008\000\008\000\008\000\008\000\008\000\008\000\
+    \008\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\055\000\066\000\067\000\067\000\015\000\
+    \070\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\
+    \015\000\015\000\015\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\054\000\072\000\054\000\
+    \054\000\054\000\078\000\082\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\086\000\089\000\
+    \092\000\138\000\016\000\156\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\
+    \016\000\016\000\016\000\016\000\016\000\016\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \187\000\166\001\167\001\255\255\255\255\255\255\255\255\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\255\255\255\255\255\255\255\255\017\000\255\255\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\017\000\017\000\017\000\017\000\017\000\017\000\017\000\
+    \017\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\255\255\255\255\255\255\255\255\
+    \018\000\255\255\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\
+    \018\000\018\000\018\000\018\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\255\255\
+    \255\255\255\255\255\255\019\000\255\255\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\
+    \019\000\019\000\019\000\019\000\019\000\019\000\019\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\255\255\255\255\255\255\255\255\020\000\255\255\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\
+    \020\000\020\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\255\255\255\255\255\255\
+    \255\255\021\000\255\255\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\
+    \021\000\021\000\021\000\021\000\021\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \255\255\255\255\255\255\255\255\022\000\255\255\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \022\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\255\255\255\255\255\255\255\255\023\000\
+    \255\255\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\
+    \023\000\023\000\023\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\255\255\255\255\
+    \255\255\255\255\024\000\255\255\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\
+    \024\000\024\000\024\000\024\000\024\000\024\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\255\255\255\255\255\255\255\255\025\000\255\255\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\
+    \025\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\255\255\255\255\255\255\255\255\
+    \026\000\255\255\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\
+    \026\000\026\000\026\000\026\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\255\255\
+    \255\255\255\255\255\255\027\000\255\255\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\
+    \027\000\027\000\027\000\027\000\027\000\027\000\027\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\255\255\255\255\255\255\255\255\028\000\255\255\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\
+    \028\000\028\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\255\255\255\255\255\255\
+    \255\255\029\000\255\255\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\
+    \029\000\029\000\029\000\029\000\029\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \255\255\255\255\255\255\255\255\030\000\255\255\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\255\255\255\255\255\255\255\255\031\000\
+    \255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\
+    \031\000\031\000\031\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\255\255\255\255\
+    \255\255\255\255\032\000\255\255\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\032\000\032\000\
+    \032\000\032\000\032\000\032\000\032\000\032\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\255\255\255\255\255\255\255\255\033\000\255\255\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\
+    \033\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\255\255\255\255\255\255\255\255\
+    \034\000\255\255\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\034\000\034\000\034\000\034\000\
+    \034\000\034\000\034\000\034\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\158\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\255\255\037\000\035\000\037\000\
+    \037\000\037\000\037\000\037\000\037\000\037\000\037\000\037\000\
+    \037\000\045\000\046\000\047\000\255\255\048\000\045\000\046\000\
+    \090\000\255\255\255\255\255\255\037\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\158\000\045\000\255\255\255\255\255\255\
+    \255\255\255\255\046\000\047\000\047\000\048\000\255\255\255\255\
+    \090\000\255\255\255\255\255\255\255\255\255\255\037\000\255\255\
+    \255\255\255\255\255\255\255\255\037\000\255\255\255\255\255\255\
+    \035\000\053\000\053\000\053\000\053\000\053\000\053\000\053\000\
+    \053\000\053\000\053\000\075\000\075\000\075\000\075\000\075\000\
+    \075\000\075\000\075\000\075\000\075\000\123\000\123\000\123\000\
+    \123\000\123\000\123\000\123\000\123\000\123\000\123\000\255\255\
+    \255\255\255\255\255\255\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\035\000\035\000\035\000\
+    \035\000\035\000\035\000\035\000\035\000\036\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\
+    \099\000\099\000\099\000\099\000\099\000\099\000\255\255\255\255\
+    \255\255\255\255\255\255\036\000\036\000\255\255\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\074\000\074\000\074\000\074\000\074\000\074\000\
+    \074\000\074\000\074\000\074\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\102\000\102\000\102\000\102\000\
+    \102\000\102\000\102\000\102\000\255\255\120\000\255\255\120\000\
+    \255\255\074\000\120\000\120\000\120\000\120\000\120\000\120\000\
+    \120\000\120\000\120\000\120\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \036\000\036\000\036\000\036\000\036\000\036\000\036\000\036\000\
+    \038\000\255\255\038\000\038\000\038\000\038\000\038\000\038\000\
+    \038\000\038\000\038\000\038\000\255\255\255\255\255\255\096\000\
+    \255\255\255\255\255\255\125\000\255\255\125\000\255\255\038\000\
+    \125\000\125\000\125\000\125\000\125\000\125\000\125\000\125\000\
+    \125\000\125\000\131\000\131\000\131\000\131\000\131\000\131\000\
+    \131\000\131\000\131\000\131\000\255\255\255\255\255\255\255\255\
+    \255\255\038\000\255\255\255\255\255\255\255\255\255\255\038\000\
+    \255\255\255\255\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\038\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\255\255\255\255\255\255\
+    \255\255\039\000\255\255\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\
+    \039\000\039\000\039\000\039\000\039\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\096\000\096\000\
+    \096\000\096\000\096\000\096\000\096\000\096\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\098\000\098\000\
+    \098\000\098\000\098\000\098\000\098\000\098\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\
+    \100\000\100\000\100\000\100\000\100\000\100\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\101\000\101\000\
+    \101\000\101\000\101\000\101\000\101\000\101\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\103\000\103\000\
+    \103\000\103\000\103\000\103\000\103\000\103\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\104\000\104\000\
+    \104\000\104\000\104\000\104\000\104\000\104\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\105\000\105\000\
+    \105\000\105\000\105\000\105\000\105\000\105\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\106\000\106\000\
+    \106\000\106\000\106\000\106\000\106\000\106\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\107\000\107\000\
+    \107\000\107\000\107\000\107\000\107\000\107\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\108\000\108\000\
+    \108\000\108\000\108\000\108\000\108\000\108\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\109\000\109\000\
+    \109\000\109\000\109\000\109\000\109\000\109\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\110\000\110\000\
+    \110\000\110\000\110\000\110\000\110\000\110\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\111\000\111\000\
+    \111\000\111\000\111\000\111\000\111\000\111\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\112\000\112\000\
+    \112\000\112\000\112\000\112\000\112\000\112\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\113\000\113\000\
+    \113\000\113\000\113\000\113\000\113\000\113\000\121\000\121\000\
+    \121\000\121\000\121\000\121\000\121\000\121\000\121\000\121\000\
+    \122\000\122\000\122\000\122\000\122\000\122\000\122\000\122\000\
+    \122\000\122\000\255\255\121\000\255\255\255\255\255\255\255\255\
+    \255\255\122\000\122\000\122\000\122\000\122\000\122\000\130\000\
+    \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\
+    \130\000\132\000\132\000\132\000\132\000\132\000\132\000\132\000\
+    \132\000\132\000\132\000\121\000\255\255\255\255\255\255\255\255\
+    \255\255\122\000\122\000\122\000\122\000\122\000\122\000\124\000\
+    \255\255\124\000\124\000\124\000\124\000\124\000\124\000\124\000\
+    \124\000\124\000\124\000\255\255\255\255\255\255\130\000\255\255\
+    \255\255\255\255\124\000\124\000\124\000\124\000\124\000\124\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\124\000\134\000\134\000\134\000\134\000\134\000\134\000\
+    \134\000\134\000\134\000\134\000\255\255\255\255\255\255\255\255\
+    \124\000\255\255\124\000\124\000\124\000\124\000\124\000\124\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\124\000\126\000\126\000\126\000\126\000\126\000\126\000\
+    \126\000\126\000\126\000\126\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\126\000\126\000\126\000\126\000\126\000\
+    \126\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\126\000\255\255\255\255\255\255\255\255\255\255\
+    \127\000\127\000\127\000\127\000\127\000\127\000\127\000\127\000\
+    \127\000\127\000\255\255\126\000\126\000\126\000\126\000\126\000\
+    \126\000\127\000\127\000\127\000\127\000\127\000\127\000\255\255\
+    \255\255\255\255\126\000\133\000\133\000\133\000\133\000\133\000\
+    \133\000\133\000\133\000\133\000\133\000\255\255\128\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\128\000\128\000\128\000\
+    \133\000\127\000\127\000\127\000\127\000\127\000\127\000\128\000\
+    \128\000\128\000\128\000\128\000\128\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\128\000\255\255\
+    \255\255\255\255\133\000\255\255\255\255\255\255\255\255\255\255\
+    \133\000\255\255\255\255\255\255\255\255\128\000\255\255\128\000\
+    \128\000\128\000\128\000\128\000\128\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\128\000\129\000\
+    \129\000\129\000\129\000\129\000\129\000\129\000\129\000\129\000\
+    \129\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \129\000\129\000\129\000\129\000\129\000\129\000\135\000\135\000\
+    \135\000\135\000\135\000\135\000\135\000\135\000\135\000\135\000\
+    \136\000\136\000\136\000\136\000\136\000\136\000\136\000\136\000\
+    \136\000\136\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \129\000\129\000\129\000\129\000\129\000\129\000\137\000\137\000\
+    \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\
+    \255\255\139\000\255\255\255\255\255\255\135\000\139\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\139\000\
+    \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\
+    \139\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \139\000\139\000\139\000\139\000\139\000\139\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\
+    \141\000\141\000\141\000\141\000\141\000\141\000\255\255\255\255\
+    \255\255\255\255\255\255\139\000\255\255\255\255\255\255\255\255\
+    \139\000\139\000\139\000\139\000\139\000\139\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\139\000\255\255\255\255\
+    \255\255\139\000\255\255\139\000\139\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\
+    \140\000\140\000\140\000\140\000\140\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\142\000\142\000\142\000\
+    \142\000\142\000\142\000\142\000\142\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\143\000\143\000\143\000\
+    \143\000\143\000\143\000\143\000\143\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\144\000\144\000\144\000\
+    \144\000\144\000\144\000\144\000\144\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\145\000\145\000\145\000\
+    \145\000\145\000\145\000\145\000\145\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\146\000\146\000\146\000\
+    \146\000\146\000\146\000\146\000\146\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\147\000\147\000\147\000\
+    \147\000\147\000\147\000\147\000\147\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\148\000\148\000\148\000\
+    \148\000\148\000\148\000\148\000\148\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\149\000\149\000\149\000\
+    \149\000\149\000\149\000\149\000\149\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\
+    \150\000\150\000\150\000\150\000\150\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\151\000\151\000\151\000\
+    \151\000\151\000\151\000\151\000\151\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\152\000\152\000\152\000\
+    \152\000\152\000\152\000\152\000\152\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\
+    \153\000\153\000\153\000\153\000\153\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\
+    \154\000\154\000\154\000\154\000\154\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\155\000\155\000\155\000\
+    \155\000\155\000\155\000\155\000\155\000\157\000\157\000\157\000\
+    \157\000\157\000\157\000\157\000\157\000\157\000\157\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\157\000\157\000\
+    \157\000\157\000\157\000\157\000\160\000\160\000\160\000\160\000\
+    \160\000\160\000\160\000\160\000\160\000\160\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\160\000\160\000\160\000\
+    \160\000\160\000\160\000\255\255\255\255\255\255\157\000\157\000\
+    \157\000\157\000\157\000\157\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\161\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\161\000\161\000\161\000\255\255\160\000\160\000\160\000\
+    \160\000\160\000\160\000\161\000\161\000\161\000\161\000\161\000\
+    \161\000\162\000\162\000\162\000\162\000\162\000\162\000\162\000\
+    \162\000\162\000\162\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\162\000\162\000\162\000\162\000\162\000\162\000\
+    \255\255\255\255\255\255\161\000\161\000\161\000\161\000\161\000\
+    \161\000\255\255\255\255\255\255\255\255\255\255\255\255\163\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\163\000\163\000\
+    \163\000\255\255\162\000\162\000\162\000\162\000\162\000\162\000\
+    \163\000\163\000\163\000\163\000\163\000\163\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\171\000\171\000\
+    \171\000\171\000\171\000\171\000\171\000\171\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\163\000\255\255\
+    \163\000\163\000\163\000\163\000\163\000\163\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\164\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\164\000\164\000\164\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\163\000\164\000\164\000\164\000\
+    \164\000\164\000\164\000\157\001\157\001\157\001\157\001\157\001\
+    \157\001\157\001\157\001\157\001\157\001\157\001\157\001\157\001\
+    \157\001\157\001\157\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\164\000\164\000\164\000\
+    \164\000\164\000\164\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\255\255\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\255\255\255\255\168\000\169\000\255\255\
+    \255\255\255\255\255\255\169\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\169\000\169\000\169\000\169\000\
+    \169\000\169\000\169\000\169\000\169\000\169\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\169\000\169\000\169\000\
+    \169\000\169\000\169\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\168\000\
+    \169\000\255\255\255\255\255\255\255\255\169\000\169\000\169\000\
+    \169\000\169\000\169\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\169\000\255\255\255\255\255\255\169\000\255\255\
+    \169\000\169\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\
+    \168\000\168\000\168\000\168\000\169\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\170\000\170\000\170\000\
+    \170\000\170\000\170\000\170\000\170\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\172\000\172\000\172\000\
+    \172\000\172\000\172\000\172\000\172\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\173\000\173\000\173\000\
+    \173\000\173\000\173\000\173\000\173\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\
+    \174\000\174\000\174\000\174\000\174\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\
+    \175\000\175\000\175\000\175\000\175\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\176\000\176\000\176\000\
+    \176\000\176\000\176\000\176\000\176\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\
+    \177\000\177\000\177\000\177\000\177\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\178\000\178\000\178\000\
+    \178\000\178\000\178\000\178\000\178\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\
+    \179\000\179\000\179\000\179\000\179\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\180\000\180\000\180\000\
+    \180\000\180\000\180\000\180\000\180\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\
+    \181\000\181\000\181\000\181\000\181\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\182\000\182\000\182\000\
+    \182\000\182\000\182\000\182\000\182\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\
+    \183\000\183\000\183\000\183\000\183\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\
+    \184\000\184\000\184\000\184\000\184\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\185\000\185\000\185\000\
+    \185\000\185\000\185\000\185\000\185\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\255\255\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\255\255\255\255\188\000\
+    \189\000\189\000\189\000\189\000\189\000\189\000\189\000\189\000\
+    \189\000\189\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\189\000\189\000\189\000\189\000\189\000\189\000\190\000\
+    \190\000\190\000\190\000\190\000\190\000\190\000\190\000\190\000\
+    \190\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \190\000\190\000\190\000\190\000\190\000\190\000\255\255\255\255\
+    \255\255\189\000\189\000\189\000\189\000\189\000\189\000\255\255\
+    \255\255\188\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \190\000\190\000\190\000\190\000\190\000\190\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\188\000\188\000\
+    \188\000\188\000\188\000\188\000\188\000\188\000\191\000\191\000\
+    \191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\191\000\
+    \191\000\191\000\191\000\191\000\191\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\191\000\255\255\191\000\
+    \191\000\191\000\191\000\191\000\191\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\192\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\192\000\192\000\192\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\191\000\192\000\192\000\192\000\192\000\
+    \192\000\192\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\255\255\192\000\192\000\192\000\192\000\
+    \192\000\192\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\255\255\255\255\255\255\255\255\
+    \193\000\255\255\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\193\000\193\000\193\000\193\000\
+    \193\000\193\000\193\000\193\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\255\255\
+    \255\255\255\255\255\255\194\000\255\255\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\194\000\
+    \194\000\194\000\194\000\194\000\194\000\194\000\194\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\255\255\255\255\255\255\255\255\195\000\255\255\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\195\000\195\000\195\000\195\000\195\000\195\000\
+    \195\000\195\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\255\255\255\255\255\255\
+    \255\255\196\000\255\255\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\
+    \196\000\196\000\196\000\196\000\196\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \255\255\255\255\255\255\255\255\197\000\255\255\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\255\255\255\255\255\255\255\255\198\000\
+    \255\255\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\
+    \198\000\198\000\198\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\255\255\255\255\
+    \255\255\255\255\199\000\255\255\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\
+    \199\000\199\000\199\000\199\000\199\000\199\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\255\255\255\255\255\255\255\255\200\000\255\255\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\200\000\200\000\200\000\200\000\200\000\200\000\200\000\
+    \200\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\255\255\255\255\255\255\255\255\
+    \201\000\255\255\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\
+    \201\000\201\000\201\000\201\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\255\255\
+    \255\255\255\255\255\255\202\000\255\255\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\
+    \202\000\202\000\202\000\202\000\202\000\202\000\202\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\255\255\255\255\255\255\255\255\203\000\255\255\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\203\000\203\000\203\000\203\000\203\000\203\000\
+    \203\000\203\000\204\000\255\255\255\255\255\255\255\255\255\255\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\255\255\255\255\255\255\255\255\204\000\
+    \255\255\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\204\000\204\000\204\000\204\000\204\000\
+    \204\000\204\000\204\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\255\255\255\255\
+    \255\255\255\255\206\000\255\255\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\
+    \206\000\206\000\206\000\206\000\206\000\206\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\255\255\255\255\255\255\255\255\207\000\255\255\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\207\000\207\000\207\000\207\000\207\000\207\000\207\000\
+    \207\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\255\255\255\255\255\255\255\255\
+    \208\000\255\255\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\208\000\208\000\208\000\208\000\
+    \208\000\208\000\208\000\208\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\255\255\
+    \255\255\255\255\255\255\209\000\255\255\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\
+    \209\000\209\000\209\000\209\000\209\000\209\000\209\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\255\255\255\255\255\255\255\255\210\000\255\255\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\210\000\210\000\210\000\210\000\210\000\210\000\
+    \210\000\210\000\211\000\255\255\255\255\255\255\255\255\255\255\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\255\255\255\255\255\255\255\255\211\000\
+    \255\255\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\211\000\211\000\211\000\211\000\211\000\
+    \211\000\211\000\211\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\255\255\255\255\
+    \255\255\255\255\213\000\255\255\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\213\000\213\000\
+    \213\000\213\000\213\000\213\000\213\000\213\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\255\255\255\255\255\255\255\255\214\000\255\255\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\214\000\214\000\214\000\214\000\214\000\214\000\214\000\
+    \214\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\255\255\255\255\255\255\255\255\
+    \215\000\255\255\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\215\000\215\000\215\000\215\000\
+    \215\000\215\000\215\000\215\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\255\255\
+    \255\255\255\255\255\255\216\000\255\255\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\216\000\
+    \216\000\216\000\216\000\216\000\216\000\216\000\216\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\255\255\255\255\255\255\255\255\217\000\255\255\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\217\000\217\000\217\000\217\000\217\000\217\000\
+    \217\000\217\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\255\255\255\255\255\255\
+    \255\255\218\000\255\255\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\
+    \218\000\218\000\218\000\218\000\218\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \255\255\255\255\255\255\255\255\219\000\255\255\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\255\255\255\255\255\255\255\255\220\000\
+    \255\255\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\
+    \220\000\220\000\220\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\255\255\255\255\
+    \255\255\255\255\221\000\255\255\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\
+    \221\000\221\000\221\000\221\000\221\000\221\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\255\255\255\255\255\255\255\255\222\000\255\255\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\222\000\222\000\222\000\222\000\222\000\222\000\222\000\
+    \222\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\255\255\255\255\255\255\255\255\
+    \223\000\255\255\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\223\000\223\000\223\000\223\000\
+    \223\000\223\000\223\000\223\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\255\255\
+    \255\255\255\255\255\255\224\000\255\255\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\224\000\
+    \224\000\224\000\224\000\224\000\224\000\224\000\224\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\255\255\255\255\255\255\255\255\225\000\255\255\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\225\000\225\000\225\000\225\000\225\000\225\000\
+    \225\000\225\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\255\255\255\255\255\255\
+    \255\255\226\000\255\255\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\226\000\226\000\226\000\
+    \226\000\226\000\226\000\226\000\226\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \255\255\255\255\255\255\255\255\227\000\255\255\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \227\000\227\000\227\000\227\000\227\000\227\000\227\000\227\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\255\255\255\255\255\255\255\255\228\000\
+    \255\255\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\228\000\228\000\228\000\228\000\228\000\
+    \228\000\228\000\228\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\255\255\255\255\
+    \255\255\255\255\229\000\255\255\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\229\000\229\000\
+    \229\000\229\000\229\000\229\000\229\000\229\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\255\255\255\255\255\255\255\255\230\000\255\255\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\230\000\230\000\230\000\230\000\230\000\230\000\230\000\
+    \230\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\255\255\255\255\255\255\255\255\
+    \231\000\255\255\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\231\000\231\000\231\000\231\000\
+    \231\000\231\000\231\000\231\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\255\255\
+    \255\255\255\255\255\255\232\000\255\255\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\232\000\
+    \232\000\232\000\232\000\232\000\232\000\232\000\232\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\255\255\255\255\255\255\255\255\233\000\255\255\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\233\000\233\000\233\000\233\000\233\000\233\000\
+    \233\000\233\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\255\255\255\255\255\255\
+    \255\255\234\000\255\255\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\234\000\234\000\234\000\
+    \234\000\234\000\234\000\234\000\234\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \255\255\255\255\255\255\255\255\235\000\255\255\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \235\000\235\000\235\000\235\000\235\000\235\000\235\000\235\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\255\255\255\255\255\255\255\255\236\000\
+    \255\255\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\236\000\236\000\236\000\236\000\236\000\
+    \236\000\236\000\236\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\255\255\255\255\
+    \255\255\255\255\237\000\255\255\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\237\000\237\000\
+    \237\000\237\000\237\000\237\000\237\000\237\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\255\255\255\255\255\255\255\255\238\000\255\255\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\238\000\238\000\238\000\238\000\238\000\238\000\238\000\
+    \238\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\255\255\255\255\255\255\255\255\
+    \239\000\255\255\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\239\000\239\000\239\000\239\000\
+    \239\000\239\000\239\000\239\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\255\255\
+    \255\255\255\255\255\255\240\000\255\255\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\240\000\
+    \240\000\240\000\240\000\240\000\240\000\240\000\240\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\255\255\255\255\255\255\255\255\241\000\255\255\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\241\000\241\000\241\000\241\000\241\000\241\000\
+    \241\000\241\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\255\255\255\255\255\255\
+    \255\255\242\000\255\255\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\242\000\242\000\242\000\
+    \242\000\242\000\242\000\242\000\242\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \255\255\255\255\255\255\255\255\243\000\255\255\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \243\000\243\000\243\000\243\000\243\000\243\000\243\000\243\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\255\255\255\255\255\255\255\255\244\000\
+    \255\255\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\244\000\244\000\244\000\244\000\244\000\
+    \244\000\244\000\244\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\255\255\255\255\
+    \255\255\255\255\245\000\255\255\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\245\000\245\000\
+    \245\000\245\000\245\000\245\000\245\000\245\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\255\255\255\255\255\255\255\255\246\000\255\255\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\246\000\246\000\246\000\246\000\246\000\246\000\246\000\
+    \246\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\255\255\255\255\255\255\255\255\
+    \247\000\255\255\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\
+    \247\000\247\000\247\000\247\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\255\255\
+    \255\255\255\255\255\255\248\000\255\255\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\
+    \248\000\248\000\248\000\248\000\248\000\248\000\248\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\255\255\255\255\255\255\255\255\249\000\255\255\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\249\000\249\000\249\000\249\000\249\000\249\000\
+    \249\000\249\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\255\255\255\255\255\255\
+    \255\255\250\000\255\255\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\
+    \250\000\250\000\250\000\250\000\250\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \255\255\255\255\255\255\255\255\251\000\255\255\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\255\255\255\255\255\255\255\255\252\000\
+    \255\255\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\252\000\252\000\252\000\252\000\252\000\
+    \252\000\252\000\252\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\255\255\255\255\
+    \255\255\255\255\253\000\255\255\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\253\000\253\000\
+    \253\000\253\000\253\000\253\000\253\000\253\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\255\255\255\255\255\255\255\255\254\000\255\255\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\254\000\254\000\254\000\254\000\254\000\254\000\254\000\
+    \254\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\255\255\255\255\255\255\255\
+    \255\000\255\255\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\255\000\255\000\255\000\255\000\
+    \255\000\255\000\255\000\255\000\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\255\255\
+    \255\255\255\255\255\255\000\001\255\255\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\000\001\
+    \000\001\000\001\000\001\000\001\000\001\000\001\000\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\255\255\255\255\255\255\255\255\001\001\255\255\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\
+    \001\001\001\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\255\255\255\255\255\255\
+    \255\255\002\001\255\255\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\
+    \002\001\002\001\002\001\002\001\002\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \255\255\255\255\255\255\255\255\003\001\255\255\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\255\255\255\255\255\255\255\255\004\001\
+    \255\255\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\
+    \004\001\004\001\004\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\255\255\255\255\
+    \255\255\255\255\005\001\255\255\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\005\001\005\001\
+    \005\001\005\001\005\001\005\001\005\001\005\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\255\255\255\255\255\255\255\255\006\001\255\255\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\006\001\006\001\006\001\006\001\006\001\006\001\006\001\
+    \006\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\255\255\255\255\255\255\255\255\
+    \007\001\255\255\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\007\001\007\001\007\001\007\001\
+    \007\001\007\001\007\001\007\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\255\255\
+    \255\255\255\255\255\255\008\001\255\255\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\008\001\
+    \008\001\008\001\008\001\008\001\008\001\008\001\008\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\255\255\255\255\255\255\255\255\009\001\255\255\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\009\001\009\001\009\001\009\001\009\001\009\001\
+    \009\001\009\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\255\255\255\255\255\255\
+    \255\255\010\001\255\255\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\010\001\010\001\010\001\
+    \010\001\010\001\010\001\010\001\010\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \255\255\255\255\255\255\255\255\011\001\255\255\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \011\001\011\001\011\001\011\001\011\001\011\001\011\001\011\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\255\255\255\255\255\255\255\255\012\001\
+    \255\255\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\012\001\012\001\012\001\012\001\012\001\
+    \012\001\012\001\012\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\255\255\255\255\
+    \255\255\255\255\013\001\255\255\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\013\001\013\001\
+    \013\001\013\001\013\001\013\001\013\001\013\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\255\255\255\255\255\255\255\255\014\001\255\255\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\014\001\014\001\014\001\014\001\014\001\014\001\014\001\
+    \014\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\255\255\255\255\255\255\255\255\
+    \015\001\255\255\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\015\001\015\001\015\001\015\001\
+    \015\001\015\001\015\001\015\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\255\255\
+    \255\255\255\255\255\255\016\001\255\255\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\016\001\
+    \016\001\016\001\016\001\016\001\016\001\016\001\016\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\255\255\255\255\255\255\255\255\017\001\255\255\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\017\001\017\001\017\001\017\001\017\001\017\001\
+    \017\001\017\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\255\255\255\255\255\255\
+    \255\255\018\001\255\255\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\018\001\018\001\018\001\
+    \018\001\018\001\018\001\018\001\018\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \255\255\255\255\255\255\255\255\019\001\255\255\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \019\001\019\001\019\001\019\001\019\001\019\001\019\001\019\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\255\255\255\255\255\255\255\255\020\001\
+    \255\255\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\020\001\020\001\020\001\020\001\020\001\
+    \020\001\020\001\020\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\255\255\255\255\
+    \255\255\255\255\021\001\255\255\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\021\001\021\001\
+    \021\001\021\001\021\001\021\001\021\001\021\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\255\255\255\255\255\255\255\255\022\001\255\255\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\022\001\022\001\022\001\022\001\022\001\022\001\022\001\
+    \022\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\255\255\255\255\255\255\255\255\
+    \023\001\255\255\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\023\001\023\001\023\001\023\001\
+    \023\001\023\001\023\001\023\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\255\255\
+    \255\255\255\255\255\255\024\001\255\255\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\024\001\
+    \024\001\024\001\024\001\024\001\024\001\024\001\024\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\255\255\255\255\255\255\255\255\025\001\255\255\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\025\001\025\001\025\001\025\001\025\001\025\001\
+    \025\001\025\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\255\255\255\255\255\255\
+    \255\255\026\001\255\255\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\026\001\026\001\026\001\
+    \026\001\026\001\026\001\026\001\026\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \255\255\255\255\255\255\255\255\027\001\255\255\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \027\001\027\001\027\001\027\001\027\001\027\001\027\001\027\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\255\255\255\255\255\255\255\255\028\001\
+    \255\255\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\028\001\028\001\028\001\028\001\028\001\
+    \028\001\028\001\028\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\255\255\255\255\
+    \255\255\255\255\029\001\255\255\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\029\001\029\001\
+    \029\001\029\001\029\001\029\001\029\001\029\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\255\255\255\255\255\255\255\255\030\001\255\255\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\030\001\030\001\030\001\030\001\030\001\030\001\030\001\
+    \030\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\255\255\255\255\255\255\255\255\
+    \031\001\255\255\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\031\001\031\001\031\001\031\001\
+    \031\001\031\001\031\001\031\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\255\255\
+    \255\255\255\255\255\255\032\001\255\255\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\032\001\
+    \032\001\032\001\032\001\032\001\032\001\032\001\032\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\255\255\255\255\255\255\255\255\033\001\255\255\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\033\001\033\001\033\001\033\001\033\001\033\001\
+    \033\001\033\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\255\255\255\255\255\255\
+    \255\255\034\001\255\255\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\034\001\034\001\034\001\
+    \034\001\034\001\034\001\034\001\034\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \255\255\255\255\255\255\255\255\035\001\255\255\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \035\001\035\001\035\001\035\001\035\001\035\001\035\001\035\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\255\255\255\255\255\255\255\255\036\001\
+    \255\255\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\036\001\036\001\036\001\036\001\036\001\
+    \036\001\036\001\036\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\255\255\255\255\
+    \255\255\255\255\037\001\255\255\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\037\001\037\001\
+    \037\001\037\001\037\001\037\001\037\001\037\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\255\255\255\255\255\255\255\255\038\001\255\255\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\038\001\038\001\038\001\038\001\038\001\038\001\038\001\
+    \038\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\255\255\255\255\255\255\255\255\
+    \039\001\255\255\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\039\001\039\001\039\001\039\001\
+    \039\001\039\001\039\001\039\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\255\255\
+    \255\255\255\255\255\255\040\001\255\255\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\040\001\
+    \040\001\040\001\040\001\040\001\040\001\040\001\040\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\255\255\255\255\255\255\255\255\041\001\255\255\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\041\001\041\001\041\001\041\001\041\001\041\001\
+    \041\001\041\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\255\255\255\255\255\255\
+    \255\255\042\001\255\255\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\042\001\042\001\042\001\
+    \042\001\042\001\042\001\042\001\042\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \255\255\255\255\255\255\255\255\043\001\255\255\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \043\001\043\001\043\001\043\001\043\001\043\001\043\001\043\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\255\255\255\255\255\255\255\255\044\001\
+    \255\255\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\044\001\044\001\044\001\044\001\044\001\
+    \044\001\044\001\044\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\255\255\255\255\
+    \255\255\255\255\045\001\255\255\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\045\001\045\001\
+    \045\001\045\001\045\001\045\001\045\001\045\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\255\255\255\255\255\255\255\255\046\001\255\255\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\046\001\046\001\046\001\046\001\046\001\046\001\046\001\
+    \046\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\255\255\255\255\255\255\255\255\
+    \047\001\255\255\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\047\001\047\001\047\001\047\001\
+    \047\001\047\001\047\001\047\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\255\255\
+    \255\255\255\255\255\255\048\001\255\255\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\048\001\
+    \048\001\048\001\048\001\048\001\048\001\048\001\048\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\255\255\255\255\255\255\255\255\049\001\255\255\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\049\001\049\001\049\001\049\001\049\001\049\001\
+    \049\001\049\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\255\255\255\255\255\255\
+    \255\255\050\001\255\255\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\050\001\050\001\050\001\
+    \050\001\050\001\050\001\050\001\050\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \255\255\255\255\255\255\255\255\051\001\255\255\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \051\001\051\001\051\001\051\001\051\001\051\001\051\001\051\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\255\255\255\255\255\255\255\255\052\001\
+    \255\255\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\052\001\052\001\052\001\052\001\052\001\
+    \052\001\052\001\052\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\255\255\255\255\
+    \255\255\255\255\053\001\255\255\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\053\001\053\001\
+    \053\001\053\001\053\001\053\001\053\001\053\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\255\255\255\255\255\255\255\255\054\001\255\255\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\054\001\054\001\054\001\054\001\054\001\054\001\054\001\
+    \054\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\255\255\255\255\255\255\255\255\
+    \055\001\255\255\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\055\001\055\001\055\001\055\001\
+    \055\001\055\001\055\001\055\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\255\255\
+    \255\255\255\255\255\255\056\001\255\255\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\056\001\
+    \056\001\056\001\056\001\056\001\056\001\056\001\056\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\255\255\255\255\255\255\255\255\057\001\255\255\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\057\001\057\001\057\001\057\001\057\001\057\001\
+    \057\001\057\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\255\255\255\255\255\255\
+    \255\255\058\001\255\255\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\058\001\058\001\058\001\
+    \058\001\058\001\058\001\058\001\058\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \255\255\255\255\255\255\255\255\059\001\255\255\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \059\001\059\001\059\001\059\001\059\001\059\001\059\001\059\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\255\255\255\255\255\255\255\255\060\001\
+    \255\255\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\060\001\060\001\060\001\060\001\060\001\
+    \060\001\060\001\060\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\255\255\255\255\
+    \255\255\255\255\061\001\255\255\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\061\001\061\001\
+    \061\001\061\001\061\001\061\001\061\001\061\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\255\255\255\255\255\255\255\255\062\001\255\255\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\062\001\062\001\062\001\062\001\062\001\062\001\062\001\
+    \062\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\255\255\255\255\255\255\255\255\
+    \063\001\255\255\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\063\001\063\001\063\001\063\001\
+    \063\001\063\001\063\001\063\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\255\255\
+    \255\255\255\255\255\255\064\001\255\255\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\064\001\
+    \064\001\064\001\064\001\064\001\064\001\064\001\064\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\255\255\255\255\255\255\255\255\065\001\255\255\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\065\001\065\001\065\001\065\001\065\001\065\001\
+    \065\001\065\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\255\255\255\255\255\255\
+    \255\255\066\001\255\255\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\066\001\066\001\066\001\
+    \066\001\066\001\066\001\066\001\066\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \255\255\255\255\255\255\255\255\067\001\255\255\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \067\001\067\001\067\001\067\001\067\001\067\001\067\001\067\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\255\255\255\255\255\255\255\255\068\001\
+    \255\255\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\068\001\068\001\068\001\068\001\068\001\
+    \068\001\068\001\068\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\255\255\255\255\
+    \255\255\255\255\069\001\255\255\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\069\001\069\001\
+    \069\001\069\001\069\001\069\001\069\001\069\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\255\255\255\255\255\255\255\255\070\001\255\255\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\070\001\070\001\070\001\070\001\070\001\070\001\070\001\
+    \070\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\255\255\255\255\255\255\255\255\
+    \071\001\255\255\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\071\001\071\001\071\001\071\001\
+    \071\001\071\001\071\001\071\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\255\255\
+    \255\255\255\255\255\255\072\001\255\255\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\072\001\
+    \072\001\072\001\072\001\072\001\072\001\072\001\072\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\255\255\255\255\255\255\255\255\073\001\255\255\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\073\001\073\001\073\001\073\001\073\001\073\001\
+    \073\001\073\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\255\255\255\255\255\255\
+    \255\255\074\001\255\255\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\074\001\074\001\074\001\
+    \074\001\074\001\074\001\074\001\074\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \255\255\255\255\255\255\255\255\075\001\255\255\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \075\001\075\001\075\001\075\001\075\001\075\001\075\001\075\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\255\255\255\255\255\255\255\255\076\001\
+    \255\255\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\076\001\076\001\076\001\076\001\076\001\
+    \076\001\076\001\076\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\255\255\255\255\
+    \255\255\255\255\077\001\255\255\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\077\001\077\001\
+    \077\001\077\001\077\001\077\001\077\001\077\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\255\255\255\255\255\255\255\255\078\001\255\255\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\078\001\078\001\078\001\078\001\078\001\078\001\078\001\
+    \078\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\255\255\255\255\255\255\255\255\
+    \079\001\255\255\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\079\001\079\001\079\001\079\001\
+    \079\001\079\001\079\001\079\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\255\255\
+    \255\255\255\255\255\255\080\001\255\255\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\080\001\
+    \080\001\080\001\080\001\080\001\080\001\080\001\080\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\255\255\255\255\255\255\255\255\081\001\255\255\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\081\001\081\001\081\001\081\001\081\001\081\001\
+    \081\001\081\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\255\255\255\255\255\255\
+    \255\255\082\001\255\255\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\082\001\082\001\082\001\
+    \082\001\082\001\082\001\082\001\082\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \255\255\255\255\255\255\255\255\083\001\255\255\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \083\001\083\001\083\001\083\001\083\001\083\001\083\001\083\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\255\255\255\255\255\255\255\255\084\001\
+    \255\255\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\084\001\084\001\084\001\084\001\084\001\
+    \084\001\084\001\084\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\255\255\255\255\
+    \255\255\255\255\085\001\255\255\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\085\001\085\001\
+    \085\001\085\001\085\001\085\001\085\001\085\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\255\255\255\255\255\255\255\255\086\001\255\255\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\086\001\086\001\086\001\086\001\086\001\086\001\086\001\
+    \086\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\255\255\255\255\255\255\255\255\
+    \087\001\255\255\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\087\001\087\001\087\001\087\001\
+    \087\001\087\001\087\001\087\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\255\255\
+    \255\255\255\255\255\255\088\001\255\255\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\088\001\
+    \088\001\088\001\088\001\088\001\088\001\088\001\088\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\255\255\255\255\255\255\255\255\089\001\255\255\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\089\001\089\001\089\001\089\001\089\001\089\001\
+    \089\001\089\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\255\255\255\255\255\255\
+    \255\255\090\001\255\255\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\090\001\090\001\090\001\
+    \090\001\090\001\090\001\090\001\090\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \255\255\255\255\255\255\255\255\091\001\255\255\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \091\001\091\001\091\001\091\001\091\001\091\001\091\001\091\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\255\255\255\255\255\255\255\255\092\001\
+    \255\255\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\092\001\092\001\092\001\092\001\092\001\
+    \092\001\092\001\092\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\255\255\255\255\
+    \255\255\255\255\093\001\255\255\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\093\001\093\001\
+    \093\001\093\001\093\001\093\001\093\001\093\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\255\255\255\255\255\255\255\255\094\001\255\255\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\094\001\094\001\094\001\094\001\094\001\094\001\094\001\
+    \094\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\255\255\255\255\255\255\255\255\
+    \095\001\255\255\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\095\001\095\001\095\001\095\001\
+    \095\001\095\001\095\001\095\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\255\255\
+    \255\255\255\255\255\255\096\001\255\255\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\096\001\
+    \096\001\096\001\096\001\096\001\096\001\096\001\096\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\255\255\255\255\255\255\255\255\097\001\255\255\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\097\001\097\001\097\001\097\001\097\001\097\001\
+    \097\001\097\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\255\255\255\255\255\255\
+    \255\255\098\001\255\255\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\098\001\098\001\098\001\
+    \098\001\098\001\098\001\098\001\098\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \255\255\255\255\255\255\255\255\099\001\255\255\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \099\001\099\001\099\001\099\001\099\001\099\001\099\001\099\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\255\255\255\255\255\255\255\255\100\001\
+    \255\255\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\100\001\100\001\100\001\100\001\100\001\
+    \100\001\100\001\100\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\255\255\255\255\
+    \255\255\255\255\101\001\255\255\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\101\001\101\001\
+    \101\001\101\001\101\001\101\001\101\001\101\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\255\255\255\255\255\255\255\255\102\001\255\255\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\102\001\102\001\102\001\102\001\102\001\102\001\102\001\
+    \102\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\255\255\255\255\255\255\255\255\
+    \103\001\255\255\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\103\001\103\001\103\001\103\001\
+    \103\001\103\001\103\001\103\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\255\255\
+    \255\255\255\255\255\255\104\001\255\255\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\104\001\
+    \104\001\104\001\104\001\104\001\104\001\104\001\104\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\255\255\255\255\255\255\255\255\105\001\255\255\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\105\001\105\001\105\001\105\001\105\001\105\001\
+    \105\001\105\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\255\255\255\255\255\255\
+    \255\255\106\001\255\255\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\106\001\106\001\106\001\
+    \106\001\106\001\106\001\106\001\106\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \255\255\255\255\255\255\255\255\107\001\255\255\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \107\001\107\001\107\001\107\001\107\001\107\001\107\001\107\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\255\255\255\255\255\255\255\255\108\001\
+    \255\255\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\108\001\108\001\108\001\108\001\108\001\
+    \108\001\108\001\108\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\255\255\255\255\
+    \255\255\255\255\109\001\255\255\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\109\001\109\001\
+    \109\001\109\001\109\001\109\001\109\001\109\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\255\255\255\255\255\255\255\255\110\001\255\255\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\110\001\110\001\110\001\110\001\110\001\110\001\110\001\
+    \110\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\255\255\255\255\255\255\255\255\
+    \111\001\255\255\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\111\001\111\001\111\001\111\001\
+    \111\001\111\001\111\001\111\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\255\255\
+    \255\255\255\255\255\255\112\001\255\255\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\112\001\
+    \112\001\112\001\112\001\112\001\112\001\112\001\112\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\255\255\255\255\255\255\255\255\113\001\255\255\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\113\001\113\001\113\001\113\001\113\001\113\001\
+    \113\001\113\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\255\255\255\255\255\255\
+    \255\255\114\001\255\255\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\114\001\114\001\114\001\
+    \114\001\114\001\114\001\114\001\114\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \255\255\255\255\255\255\255\255\115\001\255\255\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \115\001\115\001\115\001\115\001\115\001\115\001\115\001\115\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\255\255\255\255\255\255\255\255\116\001\
+    \255\255\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\116\001\116\001\116\001\116\001\116\001\
+    \116\001\116\001\116\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\255\255\255\255\
+    \255\255\255\255\117\001\255\255\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\117\001\117\001\
+    \117\001\117\001\117\001\117\001\117\001\117\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\255\255\255\255\255\255\255\255\118\001\255\255\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\118\001\118\001\118\001\118\001\118\001\118\001\118\001\
+    \118\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\255\255\255\255\255\255\255\255\
+    \119\001\255\255\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\119\001\119\001\119\001\119\001\
+    \119\001\119\001\119\001\119\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\255\255\
+    \255\255\255\255\255\255\120\001\255\255\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\120\001\
+    \120\001\120\001\120\001\120\001\120\001\120\001\120\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\255\255\255\255\255\255\255\255\121\001\255\255\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\121\001\121\001\121\001\121\001\121\001\121\001\
+    \121\001\121\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\255\255\255\255\255\255\
+    \255\255\122\001\255\255\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\122\001\122\001\122\001\
+    \122\001\122\001\122\001\122\001\122\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \255\255\255\255\255\255\255\255\123\001\255\255\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \123\001\123\001\123\001\123\001\123\001\123\001\123\001\123\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\255\255\255\255\255\255\255\255\124\001\
+    \255\255\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\124\001\124\001\124\001\124\001\124\001\
+    \124\001\124\001\124\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\255\255\255\255\
+    \255\255\255\255\125\001\255\255\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\125\001\125\001\
+    \125\001\125\001\125\001\125\001\125\001\125\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\255\255\255\255\255\255\255\255\126\001\255\255\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\126\001\126\001\126\001\126\001\126\001\126\001\126\001\
+    \126\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\255\255\255\255\255\255\255\255\
+    \127\001\255\255\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\127\001\127\001\127\001\127\001\
+    \127\001\127\001\127\001\127\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\255\255\
+    \255\255\255\255\255\255\128\001\255\255\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\128\001\
+    \128\001\128\001\128\001\128\001\128\001\128\001\128\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\255\255\255\255\255\255\255\255\129\001\255\255\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\129\001\129\001\129\001\129\001\129\001\129\001\
+    \129\001\129\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\255\255\255\255\255\255\
+    \255\255\130\001\255\255\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\130\001\130\001\130\001\
+    \130\001\130\001\130\001\130\001\130\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \255\255\255\255\255\255\255\255\131\001\255\255\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \131\001\131\001\131\001\131\001\131\001\131\001\131\001\131\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\255\255\255\255\255\255\255\255\132\001\
+    \255\255\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\132\001\132\001\132\001\132\001\132\001\
+    \132\001\132\001\132\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\255\255\255\255\
+    \255\255\255\255\133\001\255\255\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\133\001\133\001\
+    \133\001\133\001\133\001\133\001\133\001\133\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\255\255\255\255\255\255\255\255\134\001\255\255\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\134\001\134\001\134\001\134\001\134\001\134\001\134\001\
+    \134\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\255\255\255\255\255\255\255\255\
+    \135\001\255\255\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\135\001\135\001\135\001\135\001\
+    \135\001\135\001\135\001\135\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\255\255\
+    \255\255\255\255\255\255\136\001\255\255\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\136\001\
+    \136\001\136\001\136\001\136\001\136\001\136\001\136\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\255\255\255\255\255\255\255\255\137\001\255\255\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\137\001\137\001\137\001\137\001\137\001\137\001\
+    \137\001\137\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\255\255\255\255\255\255\
+    \255\255\138\001\255\255\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\138\001\138\001\138\001\
+    \138\001\138\001\138\001\138\001\138\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \255\255\255\255\255\255\255\255\139\001\255\255\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \139\001\139\001\139\001\139\001\139\001\139\001\139\001\139\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\255\255\255\255\255\255\255\255\140\001\
+    \255\255\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\140\001\140\001\140\001\140\001\140\001\
+    \140\001\140\001\140\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\255\255\255\255\
+    \255\255\255\255\141\001\255\255\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\141\001\141\001\
+    \141\001\141\001\141\001\141\001\141\001\141\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\255\255\255\255\255\255\255\255\142\001\255\255\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\142\001\142\001\142\001\142\001\142\001\142\001\142\001\
+    \142\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\255\255\255\255\255\255\255\255\
+    \143\001\255\255\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\143\001\143\001\143\001\143\001\
+    \143\001\143\001\143\001\143\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\145\001\145\001\145\001\145\001\
+    \145\001\145\001\145\001\145\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\146\001\146\001\146\001\146\001\
+    \146\001\146\001\146\001\146\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\147\001\147\001\147\001\147\001\
+    \147\001\147\001\147\001\147\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\148\001\148\001\148\001\148\001\
+    \148\001\148\001\148\001\148\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\149\001\149\001\149\001\149\001\
+    \149\001\149\001\149\001\149\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\150\001\150\001\150\001\150\001\
+    \150\001\150\001\150\001\150\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\151\001\151\001\151\001\151\001\
+    \151\001\151\001\151\001\151\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\152\001\152\001\152\001\152\001\
+    \152\001\152\001\152\001\152\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\153\001\153\001\153\001\153\001\
+    \153\001\153\001\153\001\153\001\154\001\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\154\001\255\255\255\255\255\255\
+    \255\255\154\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\156\001\156\001\156\001\156\001\156\001\156\001\
+    \156\001\156\001\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\154\001\154\001\154\001\154\001\154\001\
+    \154\001\154\001\154\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\158\001\158\001\158\001\158\001\158\001\
+    \158\001\158\001\158\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\159\001\159\001\159\001\159\001\159\001\
+    \159\001\159\001\159\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\160\001\160\001\160\001\160\001\160\001\
+    \160\001\160\001\160\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\161\001\161\001\161\001\161\001\161\001\
+    \161\001\161\001\161\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\162\001\162\001\162\001\162\001\162\001\
+    \162\001\162\001\162\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\170\001\170\001\170\001\170\001\170\001\
+    \170\001\170\001\170\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\171\001\171\001\171\001\171\001\171\001\
+    \171\001\171\001\171\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\172\001\172\001\172\001\172\001\172\001\
+    \172\001\172\001\172\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\173\001\173\001\173\001\173\001\173\001\
+    \173\001\173\001\173\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\174\001\174\001\174\001\174\001\174\001\
+    \174\001\174\001\174\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\175\001\175\001\175\001\175\001\175\001\
+    \175\001\175\001\175\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\176\001\176\001\176\001\176\001\176\001\
+    \176\001\176\001\176\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\177\001\177\001\177\001\177\001\177\001\
+    \177\001\177\001\177\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\178\001\178\001\178\001\178\001\178\001\
+    \178\001\178\001\178\001\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\
+    \255\255\255\255\255\255\255\255";
+  Lexing.lex_base_code =
+   "";
+  Lexing.lex_backtrk_code =
+   "";
+  Lexing.lex_default_code =
+   "";
+  Lexing.lex_trans_code =
+   "";
+  Lexing.lex_check_code =
+   "";
+  Lexing.lex_code =
+   "";
+}
+
+let rec token mode lexbuf =
+   __ocaml_lex_token_rec mode lexbuf 0
+and __ocaml_lex_token_rec mode lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+# 120 "mo_frontend/source_lexer.mll"
+        ( LPAR )
+# 6195 "mo_frontend/source_lexer.ml"
+
+  | 1 ->
+# 121 "mo_frontend/source_lexer.mll"
+        ( RPAR )
+# 6200 "mo_frontend/source_lexer.ml"
+
+  | 2 ->
+# 122 "mo_frontend/source_lexer.mll"
+        ( LBRACKET )
+# 6205 "mo_frontend/source_lexer.ml"
+
+  | 3 ->
+# 123 "mo_frontend/source_lexer.mll"
+        ( RBRACKET )
+# 6210 "mo_frontend/source_lexer.ml"
+
+  | 4 ->
+# 124 "mo_frontend/source_lexer.mll"
+        ( LCURLY )
+# 6215 "mo_frontend/source_lexer.ml"
+
+  | 5 ->
+# 125 "mo_frontend/source_lexer.mll"
+        ( RCURLY )
+# 6220 "mo_frontend/source_lexer.ml"
+
+  | 6 ->
+# 126 "mo_frontend/source_lexer.mll"
+        ( SEMICOLON )
+# 6225 "mo_frontend/source_lexer.ml"
+
+  | 7 ->
+# 127 "mo_frontend/source_lexer.mll"
+        ( COMMA )
+# 6230 "mo_frontend/source_lexer.ml"
+
+  | 8 ->
+# 128 "mo_frontend/source_lexer.mll"
+        ( COLON )
+# 6235 "mo_frontend/source_lexer.ml"
+
+  | 9 ->
+# 129 "mo_frontend/source_lexer.mll"
+         ( SUB )
+# 6240 "mo_frontend/source_lexer.ml"
+
+  | 10 ->
+# 130 "mo_frontend/source_lexer.mll"
+        ( DOT )
+# 6245 "mo_frontend/source_lexer.ml"
+
+  | 11 ->
+# 131 "mo_frontend/source_lexer.mll"
+        ( QUEST )
+# 6250 "mo_frontend/source_lexer.ml"
+
+  | 12 ->
+# 132 "mo_frontend/source_lexer.mll"
+        ( BANG )
+# 6255 "mo_frontend/source_lexer.ml"
+
+  | 13 ->
+# 133 "mo_frontend/source_lexer.mll"
+        ( EQ )
+# 6260 "mo_frontend/source_lexer.ml"
+
+  | 14 ->
+# 134 "mo_frontend/source_lexer.mll"
+        ( LT )
+# 6265 "mo_frontend/source_lexer.ml"
+
+  | 15 ->
+# 135 "mo_frontend/source_lexer.mll"
+        ( GT )
+# 6270 "mo_frontend/source_lexer.ml"
+
+  | 16 ->
+# 136 "mo_frontend/source_lexer.mll"
+        ( ADDOP )
+# 6275 "mo_frontend/source_lexer.ml"
+
+  | 17 ->
+# 137 "mo_frontend/source_lexer.mll"
+        ( SUBOP )
+# 6280 "mo_frontend/source_lexer.ml"
+
+  | 18 ->
+# 138 "mo_frontend/source_lexer.mll"
+        ( MULOP )
+# 6285 "mo_frontend/source_lexer.ml"
+
+  | 19 ->
+# 139 "mo_frontend/source_lexer.mll"
+        ( DIVOP )
+# 6290 "mo_frontend/source_lexer.ml"
+
+  | 20 ->
+# 140 "mo_frontend/source_lexer.mll"
+        ( MODOP )
+# 6295 "mo_frontend/source_lexer.ml"
+
+  | 21 ->
+# 141 "mo_frontend/source_lexer.mll"
+         ( POWOP )
+# 6300 "mo_frontend/source_lexer.ml"
+
+  | 22 ->
+# 142 "mo_frontend/source_lexer.mll"
+        ( ANDOP )
+# 6305 "mo_frontend/source_lexer.ml"
+
+  | 23 ->
+# 143 "mo_frontend/source_lexer.mll"
+        ( OROP )
+# 6310 "mo_frontend/source_lexer.ml"
+
+  | 24 ->
+# 144 "mo_frontend/source_lexer.mll"
+         ( PIPE )
+# 6315 "mo_frontend/source_lexer.ml"
+
+  | 25 ->
+# 145 "mo_frontend/source_lexer.mll"
+        ( XOROP )
+# 6320 "mo_frontend/source_lexer.ml"
+
+  | 26 ->
+# 146 "mo_frontend/source_lexer.mll"
+         ( SHLOP )
+# 6325 "mo_frontend/source_lexer.ml"
+
+  | 27 ->
+# 147 "mo_frontend/source_lexer.mll"
+          ( ROTLOP )
+# 6330 "mo_frontend/source_lexer.ml"
+
+  | 28 ->
+# 148 "mo_frontend/source_lexer.mll"
+          ( ROTROP )
+# 6335 "mo_frontend/source_lexer.ml"
+
+  | 29 ->
+# 149 "mo_frontend/source_lexer.mll"
+         ( WRAPADDOP )
+# 6340 "mo_frontend/source_lexer.ml"
+
+  | 30 ->
+# 150 "mo_frontend/source_lexer.mll"
+         ( WRAPSUBOP )
+# 6345 "mo_frontend/source_lexer.ml"
+
+  | 31 ->
+# 151 "mo_frontend/source_lexer.mll"
+         ( WRAPMULOP )
+# 6350 "mo_frontend/source_lexer.ml"
+
+  | 32 ->
+# 152 "mo_frontend/source_lexer.mll"
+          ( WRAPPOWOP )
+# 6355 "mo_frontend/source_lexer.ml"
+
+  | 33 ->
+# 153 "mo_frontend/source_lexer.mll"
+        ( HASH )
+# 6360 "mo_frontend/source_lexer.ml"
+
+  | 34 ->
+# 155 "mo_frontend/source_lexer.mll"
+         ( EQOP )
+# 6365 "mo_frontend/source_lexer.ml"
+
+  | 35 ->
+# 156 "mo_frontend/source_lexer.mll"
+         ( NEQOP )
+# 6370 "mo_frontend/source_lexer.ml"
+
+  | 36 ->
+# 157 "mo_frontend/source_lexer.mll"
+         ( GEOP )
+# 6375 "mo_frontend/source_lexer.ml"
+
+  | 37 ->
+# 158 "mo_frontend/source_lexer.mll"
+         ( LEOP )
+# 6380 "mo_frontend/source_lexer.ml"
+
+  | 38 ->
+# 159 "mo_frontend/source_lexer.mll"
+         ( ASSIGN )
+# 6385 "mo_frontend/source_lexer.ml"
+
+  | 39 ->
+# 161 "mo_frontend/source_lexer.mll"
+         ( PLUSASSIGN )
+# 6390 "mo_frontend/source_lexer.ml"
+
+  | 40 ->
+# 162 "mo_frontend/source_lexer.mll"
+         ( MINUSASSIGN )
+# 6395 "mo_frontend/source_lexer.ml"
+
+  | 41 ->
+# 163 "mo_frontend/source_lexer.mll"
+         ( MULASSIGN )
+# 6400 "mo_frontend/source_lexer.ml"
+
+  | 42 ->
+# 164 "mo_frontend/source_lexer.mll"
+         ( DIVASSIGN )
+# 6405 "mo_frontend/source_lexer.ml"
+
+  | 43 ->
+# 165 "mo_frontend/source_lexer.mll"
+         ( MODASSIGN )
+# 6410 "mo_frontend/source_lexer.ml"
+
+  | 44 ->
+# 166 "mo_frontend/source_lexer.mll"
+          ( POWASSIGN )
+# 6415 "mo_frontend/source_lexer.ml"
+
+  | 45 ->
+# 167 "mo_frontend/source_lexer.mll"
+         ( ANDASSIGN )
+# 6420 "mo_frontend/source_lexer.ml"
+
+  | 46 ->
+# 168 "mo_frontend/source_lexer.mll"
+         ( ORASSIGN )
+# 6425 "mo_frontend/source_lexer.ml"
+
+  | 47 ->
+# 169 "mo_frontend/source_lexer.mll"
+         ( XORASSIGN )
+# 6430 "mo_frontend/source_lexer.ml"
+
+  | 48 ->
+# 170 "mo_frontend/source_lexer.mll"
+          ( SHLASSIGN )
+# 6435 "mo_frontend/source_lexer.ml"
+
+  | 49 ->
+# 171 "mo_frontend/source_lexer.mll"
+          ( SHRASSIGN )
+# 6440 "mo_frontend/source_lexer.ml"
+
+  | 50 ->
+# 172 "mo_frontend/source_lexer.mll"
+           ( ROTLASSIGN )
+# 6445 "mo_frontend/source_lexer.ml"
+
+  | 51 ->
+# 173 "mo_frontend/source_lexer.mll"
+           ( ROTRASSIGN )
+# 6450 "mo_frontend/source_lexer.ml"
+
+  | 52 ->
+# 174 "mo_frontend/source_lexer.mll"
+          ( WRAPADDASSIGN )
+# 6455 "mo_frontend/source_lexer.ml"
+
+  | 53 ->
+# 175 "mo_frontend/source_lexer.mll"
+          ( WRAPSUBASSIGN )
+# 6460 "mo_frontend/source_lexer.ml"
+
+  | 54 ->
+# 176 "mo_frontend/source_lexer.mll"
+          ( WRAPMULASSIGN )
+# 6465 "mo_frontend/source_lexer.ml"
+
+  | 55 ->
+# 177 "mo_frontend/source_lexer.mll"
+           ( WRAPPOWASSIGN )
+# 6470 "mo_frontend/source_lexer.ml"
+
+  | 56 ->
+# 178 "mo_frontend/source_lexer.mll"
+         ( CATASSIGN )
+# 6475 "mo_frontend/source_lexer.ml"
+
+  | 57 ->
+# 179 "mo_frontend/source_lexer.mll"
+         ( ARROW )
+# 6480 "mo_frontend/source_lexer.ml"
+
+  | 58 ->
+# 180 "mo_frontend/source_lexer.mll"
+        ( UNDERSCORE )
+# 6485 "mo_frontend/source_lexer.ml"
+
+  | 59 ->
+let
+# 182 "mo_frontend/source_lexer.mll"
+                s
+# 6491 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_start_pos + 1) lexbuf.Lexing.lex_curr_pos in
+# 182 "mo_frontend/source_lexer.mll"
+                   ( DOT_NUM s )
+# 6495 "mo_frontend/source_lexer.ml"
+
+  | 60 ->
+let
+# 183 "mo_frontend/source_lexer.mll"
+           s
+# 6501 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 183 "mo_frontend/source_lexer.mll"
+             ( NAT s )
+# 6505 "mo_frontend/source_lexer.ml"
+
+  | 61 ->
+let
+# 184 "mo_frontend/source_lexer.mll"
+             s
+# 6511 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 184 "mo_frontend/source_lexer.mll"
+               ( FLOAT s )
+# 6515 "mo_frontend/source_lexer.ml"
+
+  | 62 ->
+let
+# 185 "mo_frontend/source_lexer.mll"
+            s
+# 6521 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 185 "mo_frontend/source_lexer.mll"
+              ( CHAR (char lexbuf s) )
+# 6525 "mo_frontend/source_lexer.ml"
+
+  | 63 ->
+let
+# 186 "mo_frontend/source_lexer.mll"
+            s
+# 6531 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 186 "mo_frontend/source_lexer.mll"
+              ( TEXT (text lexbuf s) )
+# 6535 "mo_frontend/source_lexer.ml"
+
+  | 64 ->
+# 188 "mo_frontend/source_lexer.mll"
+    ( error lexbuf "unclosed text literal" )
+# 6540 "mo_frontend/source_lexer.ml"
+
+  | 65 ->
+# 190 "mo_frontend/source_lexer.mll"
+    ( error lexbuf "illegal control character in text literal" )
+# 6545 "mo_frontend/source_lexer.ml"
+
+  | 66 ->
+# 192 "mo_frontend/source_lexer.mll"
+    ( error_nest (Lexing.lexeme_end_p lexbuf) lexbuf "illegal escape" )
+# 6550 "mo_frontend/source_lexer.ml"
+
+  | 67 ->
+# 199 "mo_frontend/source_lexer.mll"
+            ( ACTOR )
+# 6555 "mo_frontend/source_lexer.ml"
+
+  | 68 ->
+# 200 "mo_frontend/source_lexer.mll"
+          ( AND )
+# 6560 "mo_frontend/source_lexer.ml"
+
+  | 69 ->
+# 201 "mo_frontend/source_lexer.mll"
+            ( ASYNC )
+# 6565 "mo_frontend/source_lexer.ml"
+
+  | 70 ->
+# 202 "mo_frontend/source_lexer.mll"
+             ( ASYNCSTAR )
+# 6570 "mo_frontend/source_lexer.ml"
+
+  | 71 ->
+# 203 "mo_frontend/source_lexer.mll"
+             ( ASSERT )
+# 6575 "mo_frontend/source_lexer.ml"
+
+  | 72 ->
+# 204 "mo_frontend/source_lexer.mll"
+            ( AWAIT )
+# 6580 "mo_frontend/source_lexer.ml"
+
+  | 73 ->
+# 205 "mo_frontend/source_lexer.mll"
+             ( AWAITSTAR )
+# 6585 "mo_frontend/source_lexer.ml"
+
+  | 74 ->
+# 206 "mo_frontend/source_lexer.mll"
+            ( BREAK )
+# 6590 "mo_frontend/source_lexer.ml"
+
+  | 75 ->
+# 207 "mo_frontend/source_lexer.mll"
+           ( CASE )
+# 6595 "mo_frontend/source_lexer.ml"
+
+  | 76 ->
+# 208 "mo_frontend/source_lexer.mll"
+            ( CATCH )
+# 6600 "mo_frontend/source_lexer.ml"
+
+  | 77 ->
+# 209 "mo_frontend/source_lexer.mll"
+            ( CLASS )
+# 6605 "mo_frontend/source_lexer.ml"
+
+  | 78 ->
+# 210 "mo_frontend/source_lexer.mll"
+                ( COMPOSITE )
+# 6610 "mo_frontend/source_lexer.ml"
+
+  | 79 ->
+# 211 "mo_frontend/source_lexer.mll"
+               ( CONTINUE )
+# 6615 "mo_frontend/source_lexer.ml"
+
+  | 80 ->
+# 212 "mo_frontend/source_lexer.mll"
+            ( DEBUG )
+# 6620 "mo_frontend/source_lexer.ml"
+
+  | 81 ->
+# 213 "mo_frontend/source_lexer.mll"
+                 ( DEBUG_SHOW )
+# 6625 "mo_frontend/source_lexer.ml"
+
+  | 82 ->
+# 214 "mo_frontend/source_lexer.mll"
+         ( DO )
+# 6630 "mo_frontend/source_lexer.ml"
+
+  | 83 ->
+# 215 "mo_frontend/source_lexer.mll"
+           ( ELSE )
+# 6635 "mo_frontend/source_lexer.ml"
+
+  | 84 ->
+# 216 "mo_frontend/source_lexer.mll"
+            ( BOOL false )
+# 6640 "mo_frontend/source_lexer.ml"
+
+  | 85 ->
+# 217 "mo_frontend/source_lexer.mll"
+               ( FLEXIBLE )
+# 6645 "mo_frontend/source_lexer.ml"
+
+  | 86 ->
+# 218 "mo_frontend/source_lexer.mll"
+          ( FOR )
+# 6650 "mo_frontend/source_lexer.ml"
+
+  | 87 ->
+# 219 "mo_frontend/source_lexer.mll"
+                  ( FROM_CANDID )
+# 6655 "mo_frontend/source_lexer.ml"
+
+  | 88 ->
+# 220 "mo_frontend/source_lexer.mll"
+           ( FUNC )
+# 6660 "mo_frontend/source_lexer.ml"
+
+  | 89 ->
+# 221 "mo_frontend/source_lexer.mll"
+         ( IF )
+# 6665 "mo_frontend/source_lexer.ml"
+
+  | 90 ->
+# 222 "mo_frontend/source_lexer.mll"
+             ( IGNORE )
+# 6670 "mo_frontend/source_lexer.ml"
+
+  | 91 ->
+# 223 "mo_frontend/source_lexer.mll"
+         ( IN )
+# 6675 "mo_frontend/source_lexer.ml"
+
+  | 92 ->
+let
+# 224 "mo_frontend/source_lexer.mll"
+                   s
+# 6681 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 9) in
+# 224 "mo_frontend/source_lexer.mll"
+                     ( if mode.verification then INVARIANT else ID s )
+# 6685 "mo_frontend/source_lexer.ml"
+
+  | 93 ->
+let
+# 225 "mo_frontend/source_lexer.mll"
+                 s
+# 6691 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 7) in
+# 225 "mo_frontend/source_lexer.mll"
+                   ( if mode.verification then IMPLIES else ID s )
+# 6695 "mo_frontend/source_lexer.ml"
+
+  | 94 ->
+let
+# 226 "mo_frontend/source_lexer.mll"
+             s
+# 6701 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 3) in
+# 226 "mo_frontend/source_lexer.mll"
+               ( if mode.verification then OLD else ID s )
+# 6705 "mo_frontend/source_lexer.ml"
+
+  | 95 ->
+# 227 "mo_frontend/source_lexer.mll"
+             ( IMPORT )
+# 6710 "mo_frontend/source_lexer.ml"
+
+  | 96 ->
+# 228 "mo_frontend/source_lexer.mll"
+             ( MODULE )
+# 6715 "mo_frontend/source_lexer.ml"
+
+  | 97 ->
+# 229 "mo_frontend/source_lexer.mll"
+          ( NOT )
+# 6720 "mo_frontend/source_lexer.ml"
+
+  | 98 ->
+# 230 "mo_frontend/source_lexer.mll"
+           ( NULL )
+# 6725 "mo_frontend/source_lexer.ml"
+
+  | 99 ->
+# 231 "mo_frontend/source_lexer.mll"
+             ( OBJECT )
+# 6730 "mo_frontend/source_lexer.ml"
+
+  | 100 ->
+# 232 "mo_frontend/source_lexer.mll"
+         ( OR )
+# 6735 "mo_frontend/source_lexer.ml"
+
+  | 101 ->
+# 233 "mo_frontend/source_lexer.mll"
+            ( LABEL )
+# 6740 "mo_frontend/source_lexer.ml"
+
+  | 102 ->
+# 234 "mo_frontend/source_lexer.mll"
+          ( LET )
+# 6745 "mo_frontend/source_lexer.ml"
+
+  | 103 ->
+# 235 "mo_frontend/source_lexer.mll"
+           ( LOOP )
+# 6750 "mo_frontend/source_lexer.ml"
+
+  | 104 ->
+# 236 "mo_frontend/source_lexer.mll"
+              ( PRIVATE )
+# 6755 "mo_frontend/source_lexer.ml"
+
+  | 105 ->
+# 237 "mo_frontend/source_lexer.mll"
+             ( PUBLIC )
+# 6760 "mo_frontend/source_lexer.ml"
+
+  | 106 ->
+# 238 "mo_frontend/source_lexer.mll"
+            ( QUERY )
+# 6765 "mo_frontend/source_lexer.ml"
+
+  | 107 ->
+# 239 "mo_frontend/source_lexer.mll"
+             ( RETURN )
+# 6770 "mo_frontend/source_lexer.ml"
+
+  | 108 ->
+# 240 "mo_frontend/source_lexer.mll"
+             ( SHARED )
+# 6775 "mo_frontend/source_lexer.ml"
+
+  | 109 ->
+# 241 "mo_frontend/source_lexer.mll"
+             ( STABLE )
+# 6780 "mo_frontend/source_lexer.ml"
+
+  | 110 ->
+# 242 "mo_frontend/source_lexer.mll"
+             ( SWITCH )
+# 6785 "mo_frontend/source_lexer.ml"
+
+  | 111 ->
+# 243 "mo_frontend/source_lexer.mll"
+             ( SYSTEM )
+# 6790 "mo_frontend/source_lexer.ml"
+
+  | 112 ->
+# 244 "mo_frontend/source_lexer.mll"
+          ( TRY )
+# 6795 "mo_frontend/source_lexer.ml"
+
+  | 113 ->
+# 245 "mo_frontend/source_lexer.mll"
+            ( THROW )
+# 6800 "mo_frontend/source_lexer.ml"
+
+  | 114 ->
+# 246 "mo_frontend/source_lexer.mll"
+                ( TO_CANDID )
+# 6805 "mo_frontend/source_lexer.ml"
+
+  | 115 ->
+# 247 "mo_frontend/source_lexer.mll"
+           ( BOOL true )
+# 6810 "mo_frontend/source_lexer.ml"
+
+  | 116 ->
+# 248 "mo_frontend/source_lexer.mll"
+           ( TYPE )
+# 6815 "mo_frontend/source_lexer.ml"
+
+  | 117 ->
+# 249 "mo_frontend/source_lexer.mll"
+          ( VAR )
+# 6820 "mo_frontend/source_lexer.ml"
+
+  | 118 ->
+# 250 "mo_frontend/source_lexer.mll"
+            ( WHILE )
+# 6825 "mo_frontend/source_lexer.ml"
+
+  | 119 ->
+# 251 "mo_frontend/source_lexer.mll"
+           ( WITH )
+# 6830 "mo_frontend/source_lexer.ml"
+
+  | 120 ->
+let
+# 253 "mo_frontend/source_lexer.mll"
+              s
+# 6836 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 4) in
+# 253 "mo_frontend/source_lexer.mll"
+                ( if mode.privileged then PRIM else ID s )
+# 6840 "mo_frontend/source_lexer.ml"
+
+  | 121 ->
+let
+# 254 "mo_frontend/source_lexer.mll"
+          s
+# 6846 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 254 "mo_frontend/source_lexer.mll"
+            ( ID s )
+# 6850 "mo_frontend/source_lexer.ml"
+
+  | 122 ->
+let
+# 255 "mo_frontend/source_lexer.mll"
+                     s
+# 6856 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 255 "mo_frontend/source_lexer.mll"
+                       ( if mode.privileged then ID s else error lexbuf "privileged identifier" )
+# 6860 "mo_frontend/source_lexer.ml"
+
+  | 123 ->
+let
+# 257 "mo_frontend/source_lexer.mll"
+                       s
+# 6866 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 257 "mo_frontend/source_lexer.mll"
+                         ( COMMENT s )
+# 6870 "mo_frontend/source_lexer.ml"
+
+  | 124 ->
+let
+# 258 "mo_frontend/source_lexer.mll"
+            s
+# 6876 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
+# 258 "mo_frontend/source_lexer.mll"
+              (
+    let buf = Buffer.create 100 in
+    Buffer.add_string buf s;
+    (comment buf (Lexing.lexeme_start_p lexbuf) lexbuf);
+    COMMENT (Buffer.contents buf)
+  )
+# 6885 "mo_frontend/source_lexer.ml"
+
+  | 125 ->
+let
+# 264 "mo_frontend/source_lexer.mll"
+             t
+# 6891 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 264 "mo_frontend/source_lexer.mll"
+               ( TAB (String.length t) )
+# 6895 "mo_frontend/source_lexer.ml"
+
+  | 126 ->
+let
+# 265 "mo_frontend/source_lexer.mll"
+            s
+# 6901 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 265 "mo_frontend/source_lexer.mll"
+              ( let len = String.length s in if len = 1 then SINGLESPACE else SPACE len )
+# 6905 "mo_frontend/source_lexer.ml"
+
+  | 127 ->
+# 266 "mo_frontend/source_lexer.mll"
+           ( Lexing.new_line lexbuf; LINEFEED CRLF )
+# 6910 "mo_frontend/source_lexer.ml"
+
+  | 128 ->
+# 267 "mo_frontend/source_lexer.mll"
+         ( Lexing.new_line lexbuf; LINEFEED CRLF )
+# 6915 "mo_frontend/source_lexer.ml"
+
+  | 129 ->
+# 268 "mo_frontend/source_lexer.mll"
+         ( Lexing.new_line lexbuf; LINEFEED LF )
+# 6920 "mo_frontend/source_lexer.ml"
+
+  | 130 ->
+# 269 "mo_frontend/source_lexer.mll"
+        ( EOF )
+# 6925 "mo_frontend/source_lexer.ml"
+
+  | 131 ->
+# 271 "mo_frontend/source_lexer.mll"
+         ( error lexbuf "malformed operator" )
+# 6930 "mo_frontend/source_lexer.ml"
+
+  | 132 ->
+# 272 "mo_frontend/source_lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 6935 "mo_frontend/source_lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_token_rec mode lexbuf __ocaml_lex_state
+
+and comment buf start lexbuf =
+   __ocaml_lex_comment_rec buf start lexbuf 410
+and __ocaml_lex_comment_rec buf start lexbuf __ocaml_lex_state =
+  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
+      | 0 ->
+let
+# 275 "mo_frontend/source_lexer.mll"
+            s
+# 6948 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
+# 275 "mo_frontend/source_lexer.mll"
+              ( Buffer.add_string buf s )
+# 6952 "mo_frontend/source_lexer.ml"
+
+  | 1 ->
+let
+# 276 "mo_frontend/source_lexer.mll"
+            s
+# 6958 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
+# 276 "mo_frontend/source_lexer.mll"
+              (
+    Buffer.add_string buf s;
+    comment buf (Lexing.lexeme_start_p lexbuf) lexbuf;
+    comment buf start lexbuf
+  )
+# 6966 "mo_frontend/source_lexer.ml"
+
+  | 2 ->
+let
+# 281 "mo_frontend/source_lexer.mll"
+            s
+# 6972 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
+# 281 "mo_frontend/source_lexer.mll"
+              (
+    Lexing.new_line lexbuf;
+    Buffer.add_char buf s;
+    comment buf start lexbuf
+  )
+# 6980 "mo_frontend/source_lexer.ml"
+
+  | 3 ->
+# 286 "mo_frontend/source_lexer.mll"
+        ( error_nest start lexbuf "unclosed comment" )
+# 6985 "mo_frontend/source_lexer.ml"
+
+  | 4 ->
+let
+# 287 "mo_frontend/source_lexer.mll"
+            s
+# 6991 "mo_frontend/source_lexer.ml"
+= Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
+# 287 "mo_frontend/source_lexer.mll"
+              (
+    Buffer.add_string buf s;
+    comment buf start lexbuf
+  )
+# 6998 "mo_frontend/source_lexer.ml"
+
+  | 5 ->
+# 291 "mo_frontend/source_lexer.mll"
+      ( error lexbuf "malformed UTF-8 encoding" )
+# 7003 "mo_frontend/source_lexer.ml"
+
+  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf;
+      __ocaml_lex_comment_rec buf start lexbuf __ocaml_lex_state
+
+;;
+
+
+
+
+ + + diff --git a/coverage/mo_frontend/source_token.ml.html b/coverage/mo_frontend/source_token.ml.html new file mode 100644 index 00000000000..777dd37fbf3 --- /dev/null +++ b/coverage/mo_frontend/source_token.ml.html @@ -0,0 +1,1419 @@ + + + + + source_token.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+
+
open Trivia
+
+type token =
+  | EOF
+  | DISALLOWED
+  | LET
+  | VAR
+  | LPAR
+  | RPAR
+  | LBRACKET
+  | RBRACKET
+  | LCURLY
+  | RCURLY
+  | AWAIT
+  | AWAITSTAR
+  | ASYNC
+  | ASYNCSTAR
+  | BREAK
+  | CASE
+  | CATCH
+  | CONTINUE
+  | LABEL
+  | DEBUG
+  | DO
+  | FLEXIBLE
+  | IF
+  | IGNORE
+  | IN
+  | ELSE
+  | SWITCH
+  | LOOP
+  | WHILE
+  | FOR
+  | RETURN
+  | SYSTEM
+  | STABLE
+  | TRY
+  | THROW
+  | WITH
+  | ARROW
+  | ASSIGN
+  | FUNC
+  | TYPE
+  | OBJECT
+  | ACTOR
+  | CLASS
+  | PUBLIC
+  | PRIVATE
+  | SHARED
+  | QUERY
+  | SEMICOLON
+  | COMMA
+  | COLON
+  | SUB
+  | DOT
+  | QUEST
+  | BANG
+  | AND
+  | OR
+  | IMPLIES
+  | OLD
+  | NOT
+  | IMPORT
+  | MODULE
+  | DEBUG_SHOW
+  | TO_CANDID
+  | FROM_CANDID
+  | ASSERT
+  | ADDOP
+  | SUBOP
+  | MULOP
+  | DIVOP
+  | MODOP
+  | POWOP
+  | WRAPADDOP
+  | WRAPSUBOP
+  | WRAPMULOP
+  | WRAPPOWOP
+  | WRAPADDASSIGN
+  | WRAPSUBASSIGN
+  | WRAPMULASSIGN
+  | WRAPPOWASSIGN
+  | ANDOP
+  | OROP
+  | XOROP
+  | SHLOP
+  | ROTLOP
+  | ROTROP
+  | EQOP
+  | NEQOP
+  | LEOP
+  | GEOP
+  | HASH
+  | EQ
+  | LT
+  | GT
+  | PLUSASSIGN
+  | MINUSASSIGN
+  | MULASSIGN
+  | DIVASSIGN
+  | MODASSIGN
+  | POWASSIGN
+  | CATASSIGN
+  | ANDASSIGN
+  | ORASSIGN
+  | XORASSIGN
+  | SHLASSIGN
+  | SHRASSIGN
+  | ROTLASSIGN
+  | ROTRASSIGN
+  | NULL
+  | DOT_NUM of string
+  | NAT of string
+  | FLOAT of string
+  | CHAR of Mo_values.Value.unicode
+  | BOOL of bool
+  | ID of string
+  | TEXT of string
+  | PRIM
+  | UNDERSCORE
+  | COMPOSITE
+  | INVARIANT
+  (* Trivia *)
+  | LINEFEED of line_feed
+  | SINGLESPACE
+  | SPACE of int
+  | TAB of int (* shudders *)
+  | COMMENT of string
+  | PIPE
+
+let to_parser_token :
+    token -> (Parser.token, line_feed trivia) result = function
+  | EOF -> Ok Parser.EOF
+  | DISALLOWED -> Ok Parser.DISALLOWED
+  | LET -> Ok Parser.LET
+  | VAR -> Ok Parser.VAR
+  | LPAR -> Ok Parser.LPAR
+  | RPAR -> Ok Parser.RPAR
+  | LBRACKET -> Ok Parser.LBRACKET
+  | RBRACKET -> Ok Parser.RBRACKET
+  | LCURLY -> Ok Parser.LCURLY
+  | RCURLY -> Ok Parser.RCURLY
+  | AWAIT -> Ok Parser.AWAIT
+  | AWAITSTAR -> Ok Parser.AWAITSTAR
+  | ASYNC -> Ok Parser.ASYNC
+  | ASYNCSTAR -> Ok Parser.ASYNCSTAR
+  | BREAK -> Ok Parser.BREAK
+  | CASE -> Ok Parser.CASE
+  | CATCH -> Ok Parser.CATCH
+  | CONTINUE -> Ok Parser.CONTINUE
+  | LABEL -> Ok Parser.LABEL
+  | DO -> Ok Parser.DO
+  | DEBUG -> Ok Parser.DEBUG
+  | FLEXIBLE -> Ok Parser.FLEXIBLE
+  | IF -> Ok Parser.IF
+  | IGNORE -> Ok Parser.IGNORE
+  | IN -> Ok Parser.IN
+  | ELSE -> Ok Parser.ELSE
+  | SWITCH -> Ok Parser.SWITCH
+  | LOOP -> Ok Parser.LOOP
+  | WHILE -> Ok Parser.WHILE
+  | FOR -> Ok Parser.FOR
+  | RETURN -> Ok Parser.RETURN
+  | TRY -> Ok Parser.TRY
+  | THROW -> Ok Parser.THROW
+  | WITH -> Ok Parser.WITH
+  | ARROW -> Ok Parser.ARROW
+  | ASSIGN -> Ok Parser.ASSIGN
+  | FUNC -> Ok Parser.FUNC
+  | TYPE -> Ok Parser.TYPE
+  | OBJECT -> Ok Parser.OBJECT
+  | ACTOR -> Ok Parser.ACTOR
+  | CLASS -> Ok Parser.CLASS
+  | PUBLIC -> Ok Parser.PUBLIC
+  | PRIVATE -> Ok Parser.PRIVATE
+  | SHARED -> Ok Parser.SHARED
+  | STABLE -> Ok Parser.STABLE
+  | SYSTEM -> Ok Parser.SYSTEM
+  | QUERY -> Ok Parser.QUERY
+  | SEMICOLON -> Ok Parser.SEMICOLON
+  | COMMA -> Ok Parser.COMMA
+  | COLON -> Ok Parser.COLON
+  | SUB -> Ok Parser.SUB
+  | DOT -> Ok Parser.DOT
+  | QUEST -> Ok Parser.QUEST
+  | BANG -> Ok Parser.BANG
+  | AND -> Ok Parser.AND
+  | OR -> Ok Parser.OR
+  | IMPLIES -> Ok Parser.IMPLIES
+  | OLD -> Ok Parser.OLD
+  | NOT -> Ok Parser.NOT
+  | IMPORT -> Ok Parser.IMPORT
+  | MODULE -> Ok Parser.MODULE
+  | DEBUG_SHOW -> Ok Parser.DEBUG_SHOW
+  | TO_CANDID -> Ok Parser.TO_CANDID
+  | FROM_CANDID -> Ok Parser.FROM_CANDID
+  | ASSERT -> Ok Parser.ASSERT
+  | ADDOP -> Ok Parser.ADDOP
+  | SUBOP -> Ok Parser.SUBOP
+  | MULOP -> Ok Parser.MULOP
+  | DIVOP -> Ok Parser.DIVOP
+  | MODOP -> Ok Parser.MODOP
+  | POWOP -> Ok Parser.POWOP
+  | WRAPADDOP -> Ok Parser.WRAPADDOP
+  | WRAPSUBOP -> Ok Parser.WRAPSUBOP
+  | WRAPMULOP -> Ok Parser.WRAPMULOP
+  | WRAPPOWOP -> Ok Parser.WRAPPOWOP
+  | WRAPADDASSIGN -> Ok Parser.WRAPADDASSIGN
+  | WRAPSUBASSIGN -> Ok Parser.WRAPSUBASSIGN
+  | WRAPMULASSIGN -> Ok Parser.WRAPMULASSIGN
+  | WRAPPOWASSIGN -> Ok Parser.WRAPPOWASSIGN
+  | ANDOP -> Ok Parser.ANDOP
+  | OROP -> Ok Parser.OROP
+  | XOROP -> Ok Parser.XOROP
+  | SHLOP -> Ok Parser.SHLOP
+  | ROTLOP -> Ok Parser.ROTLOP
+  | ROTROP -> Ok Parser.ROTROP
+  | EQOP -> Ok Parser.EQOP
+  | NEQOP -> Ok Parser.NEQOP
+  | LEOP -> Ok Parser.LEOP
+  | GEOP -> Ok Parser.GEOP
+  | HASH -> Ok Parser.HASH
+  | EQ -> Ok Parser.EQ
+  | LT -> Ok Parser.LT
+  | GT -> Ok Parser.GT
+  | PLUSASSIGN -> Ok Parser.PLUSASSIGN
+  | MINUSASSIGN -> Ok Parser.MINUSASSIGN
+  | MULASSIGN -> Ok Parser.MULASSIGN
+  | DIVASSIGN -> Ok Parser.DIVASSIGN
+  | MODASSIGN -> Ok Parser.MODASSIGN
+  | POWASSIGN -> Ok Parser.POWASSIGN
+  | CATASSIGN -> Ok Parser.CATASSIGN
+  | ANDASSIGN -> Ok Parser.ANDASSIGN
+  | ORASSIGN -> Ok Parser.ORASSIGN
+  | XORASSIGN -> Ok Parser.XORASSIGN
+  | SHLASSIGN -> Ok Parser.SHLASSIGN
+  | SHRASSIGN -> Ok Parser.SHRASSIGN
+  | ROTLASSIGN -> Ok Parser.ROTLASSIGN
+  | ROTRASSIGN -> Ok Parser.ROTRASSIGN
+  | NULL -> Ok Parser.NULL
+  | DOT_NUM s -> Ok (Parser.DOT_NUM s)
+  | NAT s -> Ok (Parser.NAT s)
+  | FLOAT s -> Ok (Parser.FLOAT s)
+  | CHAR u -> Ok (Parser.CHAR u)
+  | BOOL b -> Ok (Parser.BOOL b)
+  | ID s -> Ok (Parser.ID s)
+  | TEXT s -> Ok (Parser.TEXT s)
+  | PRIM -> Ok Parser.PRIM
+  | UNDERSCORE -> Ok Parser.UNDERSCORE
+  | COMPOSITE -> Ok Parser.COMPOSITE
+  | INVARIANT -> Ok Parser.INVARIANT
+  | PIPE -> Ok Parser.PIPE
+  (*Trivia *)
+  | SINGLESPACE -> Error (Space 1)
+  | SPACE n -> Error (Space n)
+  | LINEFEED lf -> Error (Line lf)
+  | TAB n -> Error (Tab n)
+  | COMMENT c -> Error (Comment c)
+
+let string_of_parser_token = function
+  | Parser.EOF -> "EOF"
+  | Parser.DISALLOWED -> "DISALLOWED"
+  | Parser.LET -> "LET"
+  | Parser.VAR -> "VAR"
+  | Parser.LPAR -> "LPAR"
+  | Parser.RPAR -> "RPAR"
+  | Parser.LBRACKET -> "LBRACKET"
+  | Parser.RBRACKET -> "RBRACKET"
+  | Parser.LCURLY -> "LCURLY"
+  | Parser.RCURLY -> "RCURLY"
+  | Parser.AWAIT -> "AWAIT"
+  | Parser.AWAITSTAR -> "AWAIT*"
+  | Parser.ASYNC -> "ASYNC"
+  | Parser.ASYNCSTAR -> "ASYNC*"
+  | Parser.BREAK -> "BREAK"
+  | Parser.CASE -> "CASE"
+  | Parser.CATCH -> "CATCH"
+  | Parser.CONTINUE -> "CONTINUE"
+  | Parser.LABEL -> "LABEL"
+  | Parser.DEBUG -> "DEBUG"
+  | Parser.DO -> "DO"
+  | Parser.FLEXIBLE -> "FLEXIBLE"
+  | Parser.IF -> "IF"
+  | Parser.IGNORE -> "IGNORE"
+  | Parser.IN -> "IN"
+  | Parser.ELSE -> "ELSE"
+  | Parser.SWITCH -> "SWITCH"
+  | Parser.LOOP -> "LOOP"
+  | Parser.WHILE -> "WHILE"
+  | Parser.FOR -> "FOR"
+  | Parser.RETURN -> "RETURN"
+  | Parser.TRY -> "TRY"
+  | Parser.THROW -> "THROW"
+  | Parser.WITH -> "WITH"
+  | Parser.ARROW -> "ARROW"
+  | Parser.ASSIGN -> "ASSIGN"
+  | Parser.FUNC -> "FUNC"
+  | Parser.TYPE -> "TYPE"
+  | Parser.OBJECT -> "OBJECT"
+  | Parser.ACTOR -> "ACTOR"
+  | Parser.CLASS -> "CLASS"
+  | Parser.PUBLIC -> "PUBLIC"
+  | Parser.PRIVATE -> "PRIVATE"
+  | Parser.SHARED -> "SHARED"
+  | Parser.STABLE -> "STABLE"
+  | Parser.SYSTEM -> "SYSTEM"
+  | Parser.QUERY -> "QUERY"
+  | Parser.SEMICOLON -> "SEMICOLON"
+  | Parser.SEMICOLON_EOL -> "SEMICOLON_EOL"
+  | Parser.COMMA -> "COMMA"
+  | Parser.COLON -> "COLON"
+  | Parser.SUB -> "SUB"
+  | Parser.DOT -> "DOT"
+  | Parser.QUEST -> "QUEST"
+  | Parser.BANG -> "BANG"
+  | Parser.AND -> "AND"
+  | Parser.OR -> "OR"
+  | Parser.NOT -> "NOT"
+  | Parser.IMPORT -> "IMPORT"
+  | Parser.MODULE -> "MODULE"
+  | Parser.DEBUG_SHOW -> "DEBUG_SHOW"
+  | Parser.TO_CANDID -> "TO_CANDID"
+  | Parser.FROM_CANDID -> "FROM_CANDID"
+  | Parser.ASSERT -> "ASSERT"
+  | Parser.ADDOP -> "ADDOP"
+  | Parser.SUBOP -> "SUBOP"
+  | Parser.MULOP -> "MULOP"
+  | Parser.DIVOP -> "DIVOP"
+  | Parser.MODOP -> "MODOP"
+  | Parser.POWOP -> "POWOP"
+  | Parser.WRAPADDOP -> "WRAPADDOP"
+  | Parser.WRAPSUBOP -> "WRAPSUBOP"
+  | Parser.WRAPMULOP -> "WRAPMULOP"
+  | Parser.WRAPPOWOP -> "WRAPPOWOP"
+  | Parser.WRAPADDASSIGN -> "WRAPADDASSIGN"
+  | Parser.WRAPSUBASSIGN -> "WRAPSUBASSIGN"
+  | Parser.WRAPMULASSIGN -> "WRAPMULASSIGN"
+  | Parser.WRAPPOWASSIGN -> "WRAPPOWASSIGN"
+  | Parser.ANDOP -> "ANDOP"
+  | Parser.OROP -> "OROP"
+  | Parser.XOROP -> "XOROP"
+  | Parser.SHLOP -> "SHLOP"
+  | Parser.SHROP -> "SHROP"
+  | Parser.ROTLOP -> "ROTLOP"
+  | Parser.ROTROP -> "ROTROP"
+  | Parser.EQOP -> "EQOP"
+  | Parser.NEQOP -> "NEQOP"
+  | Parser.LEOP -> "LEOP"
+  | Parser.LTOP -> "LTOP"
+  | Parser.GTOP -> "GTOP"
+  | Parser.GEOP -> "GEOP"
+  | Parser.HASH -> "HASH"
+  | Parser.EQ -> "EQ"
+  | Parser.LT -> "LT"
+  | Parser.GT -> "GT"
+  | Parser.PLUSASSIGN -> "PLUSASSIGN"
+  | Parser.MINUSASSIGN -> "MINUSASSIGN"
+  | Parser.MULASSIGN -> "MULASSIGN"
+  | Parser.DIVASSIGN -> "DIVASSIGN"
+  | Parser.MODASSIGN -> "MODASSIGN"
+  | Parser.POWASSIGN -> "POWASSIGN"
+  | Parser.CATASSIGN -> "CATASSIGN"
+  | Parser.ANDASSIGN -> "ANDASSIGN"
+  | Parser.ORASSIGN -> "ORASSIGN"
+  | Parser.XORASSIGN -> "XORASSIGN"
+  | Parser.SHLASSIGN -> "SHLASSIGN"
+  | Parser.SHRASSIGN -> "SHRASSIGN"
+  | Parser.ROTLASSIGN -> "ROTLASSIGN"
+  | Parser.ROTRASSIGN -> "ROTRASSIGN"
+  | Parser.NULL -> "NULL"
+  | Parser.DOT_NUM _ -> "DOT_NUM of string"
+  | Parser.NAT _ -> "NAT of string"
+  | Parser.FLOAT _ -> "FLOAT of string"
+  | Parser.CHAR _ -> "CHAR of Mo_values.Value.unicode"
+  | Parser.BOOL _ -> "BOOL of bool"
+  | Parser.ID _ -> "ID of string"
+  | Parser.TEXT _ -> "TEXT of string"
+  | Parser.PRIM -> "PRIM"
+  | Parser.UNDERSCORE -> "UNDERSCORE"
+  | Parser.COMPOSITE -> "COMPOSITE"
+  | Parser.INVARIANT -> "INVARIANT"
+  | Parser.IMPLIES -> "IMPLIES"
+  | Parser.OLD -> "OLD"
+  | Parser.PIPE -> "PIPE"
+
+let is_lineless_trivia : token -> void trivia option = function
+  | SINGLESPACE -> Some (Space 1)
+  | SPACE n -> Some (Space n)
+  | TAB n -> Some (Tab n)
+  | COMMENT c -> Some (Comment c)
+  | _ -> None
+
+let is_trivia : token -> line_feed trivia option = function
+  | LINEFEED lf -> Some (Line lf)
+  | t -> Option.map (map_trivia absurd) (is_lineless_trivia t)
+
+let is_whitespace : 'a trivia -> bool = function
+  | Space _ | Tab _ | Line _ -> true
+  | Comment _ -> false
+
+let is_line_feed : token -> bool = function
+  | LINEFEED _ -> true
+  | _ -> false
+
+type annotation = {
+  range : Lexing.position * Lexing.position;
+  leading_trivia : line_feed trivia list;
+  trailing_trivia : void trivia list;
+}
+
+let dummy_annotation = {
+   range = Lexing.dummy_pos, Lexing.dummy_pos;
+   leading_trivia = [];
+   trailing_trivia = [];
+}
+
+
+
+ + + diff --git a/coverage/mo_frontend/stability.ml.html b/coverage/mo_frontend/stability.ml.html new file mode 100644 index 00000000000..0a5adf5c4b1 --- /dev/null +++ b/coverage/mo_frontend/stability.ml.html @@ -0,0 +1,260 @@ + + + + + stability.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+
+
open Mo_types
+
+open Type
+
+(* Signature matching *)
+
+let cat = "Compatibility"
+
+(* signature matching with multiple error reporting
+   c.f. (simpler) Types.match_sig.
+*)
+
+let display_typ = Lib.Format.display Type.pp_typ
+
+let display_typ_expand = Lib.Format.display Type.pp_typ_expand
+
+let error_discard s tf =
+  Diag.add_msg s
+    (Diag.error_message Source.no_region "M0169" cat
+      (Format.asprintf "stable variable %s of previous type%a\ncannot be discarded; promote to type `Any` instead"
+        tf.lab
+        display_typ tf.typ))
+
+let error_sub s tf1 tf2 =
+  Diag.add_msg s
+    (Diag.error_message Source.no_region "M0170" cat
+      (Format.asprintf "stable variable %s of previous type%a\ncannot be consumed at new type%a"
+        tf1.lab
+        display_typ_expand tf1.typ
+        display_typ_expand tf2.typ))
+
+let error_mut s tf1 tf2 =
+  Diag.add_msg s
+    (Diag.error_message Source.no_region "M0171" cat
+      (Format.asprintf "stable variable %s changes mutability from previous type%a\nto new type %a"
+         tf1.lab
+         display_typ_expand tf1.typ
+         display_typ_expand tf2.typ))
+
+let match_stab_sig tfs1 tfs2 : unit Diag.result =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  let res = Diag.with_message_store (fun s ->
+    (* Should we insist on monotonic preservation of fields, or relax? *)
+    let rec go tfs1 tfs2 = match tfs1, tfs2 with
+      | [], _ ->
+        Some () (* no or additional fields ok *)
+      | tf1 :: tfs1', [] ->
+        error_discard s tf1;
+        go tfs1' []
+      | tf1::tfs1', tf2::tfs2' ->
+        (match Type.compare_field tf1 tf2 with
+         | 0 ->
+           (* Should we enforce equal mutability or not?
+              Seems unnecessary since upgrade is read-once *)
+            if Type.is_mut tf1.typ <> Type.is_mut tf2.typ then
+              error_mut s tf1 tf2;
+            if not (sub (as_immut tf1.typ) (as_immut tf2.typ)) then
+              error_sub s tf1 tf2;
+            go tfs1' tfs2'
+       | -1 ->
+          error_discard s tf1;
+          go tfs1' tfs2
+        | _ ->
+          go tfs1 tfs2' (* new field ok, recurse on tfs2' *)
+        )
+    in go tfs1 tfs2)
+  in
+  (* cross check with simpler definition *)
+  match res with
+  | Ok _ ->
+    assert (Type.match_stab_sig tfs1 tfs2);
+    res
+  | Error _ ->
+    assert (not (Type.match_stab_sig tfs1 tfs2));
+    res
+
+
+
+ + + diff --git a/coverage/mo_frontend/static.ml.html b/coverage/mo_frontend/static.ml.html new file mode 100644 index 00000000000..14d14f173b3 --- /dev/null +++ b/coverage/mo_frontend/static.ml.html @@ -0,0 +1,439 @@ + + + + + static.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+
+
(*
+This module implements the staticity check, needed for modules and imported
+files.
+
+The guiding principle is: Static expressions are expressions that can be
+compiled to values without evaluation.
+
+There is some mushiness around let-expressions and variables, which do form
+some kind of beta-reduction, and can actually cause loops, but are required to
+allow re-exporting names in modules.
+*)
+
+open Mo_def
+
+open Source
+open Syntax
+
+let err m at =
+  let open Diag in
+  add_msg m
+    (error_message
+       at
+       "M0014"
+       "type"
+       "non-static expression in library or module")
+
+let pat_err m at =
+  let open Diag in
+  add_msg m
+    (error_message
+       at
+       "M0015"
+       "type"
+       "only trivial patterns allowed in static expressions")
+
+let rec exp m e = match e.it with
+  (* Plain values *)
+  | (PrimE _ | LitE _ | ActorUrlE _ | FuncE _) -> ()
+  | (TagE (_, exp1) | OptE exp1) -> exp m exp1
+  | TupE es -> List.iter (exp m) es
+  | ArrayE (mut, es) ->
+    begin
+      match mut.it with
+      | Const ->  List.iter (exp m) es
+      | Var -> err m e.at
+    end
+  | ObjBlockE (_, _, dfs) -> dec_fields m dfs
+  | ObjE (bases, efs) -> List.iter (exp m) bases; exp_fields m efs
+
+  (* Variable access. Dangerous, due to loops. *)
+  | (VarE _ | ImportE _) -> ()
+
+  (* Projections. These are a form of evaluation. *)
+  | ProjE (exp1, _)
+  | DotE (exp1, _) -> exp m exp1
+  | IdxE (exp1, exp2) -> err m e.at
+
+  (* Transparent *)
+  | AnnotE (exp1, _) | IgnoreE exp1 | DoOptE exp1 -> exp m exp1
+  | BlockE ds -> List.iter (dec m) ds
+
+  (* Clearly non-static *)
+  | UnE _
+  | ShowE _
+  | ToCandidE _
+  | FromCandidE _
+  | NotE _
+  | AssertE _
+  | LabelE _
+  | BreakE _
+  | RetE _
+  | AsyncE _ (* TBR - Cmp could be static *)
+  | AwaitE _
+  | LoopE _
+  | BinE _
+  | RelE _
+  | AssignE _
+  | CallE _
+  | AndE _
+  | OrE _
+  | WhileE _
+  | ForE _
+  | DebugE _
+  | IfE _
+  | SwitchE _
+  | ThrowE _
+  | TryE _
+  | BangE _
+  | ImpliesE _
+  | OldE _
+  -> err m e.at
+
+and dec_fields m dfs = List.iter (fun df -> dec m df.it.dec) dfs
+
+and exp_fields m efs = List.iter (fun (ef : exp_field) ->
+  if ef.it.mut.it = Var then err m ef.at;
+  exp m ef.it.exp) efs
+
+and dec m d = match d.it with
+  | TypD _ | ClassD _ -> ()
+  | ExpD e -> exp m e
+  | LetD (p, e, fail) -> pat m p; exp m e; Option.iter (exp m) fail
+  | VarD _ -> err m d.at
+
+and pat m p = match p.it with
+  | (WildP | VarP _) -> ()
+
+  (*
+  If we allow projections above, then we should allow irrefutable
+  patterns here.
+  *)
+  | TupP ps -> List.iter (pat m) ps
+  | ObjP fs -> List.iter (fun (f : pat_field) -> pat m f.it.pat) fs
+
+  (* TODO:
+    claudio: what about singleton variant patterns? These are irrefutable too.
+    Andreas suggests simply allowing all patterns: "The worst that can happen is that the program
+    is immediately terminated, but that doesn't break anything semantically."
+  *)
+
+  (* Everything else is forbidden *)
+  | _ -> pat_err m p.at
+
+let prog p =
+  Diag.with_message_store (fun m -> List.iter (dec m) p.it; Some ())
+
+
+
+ + + diff --git a/coverage/mo_frontend/traversals.ml.html b/coverage/mo_frontend/traversals.ml.html new file mode 100644 index 00000000000..b32e1cef5c8 --- /dev/null +++ b/coverage/mo_frontend/traversals.ml.html @@ -0,0 +1,312 @@ + + + + + traversals.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+
+
open Mo_def
+open Syntax
+open Source
+
+let rec over_exp (f : exp -> exp) (exp : exp) : exp = match exp.it with
+  | ImportE _ | PrimE _ | VarE _ | LitE _ | ActorUrlE _ -> f exp
+  | UnE (x, y, exp1) -> f { exp with it = UnE (x, y, over_exp f exp1) }
+  | ShowE (x, exp1) -> f { exp with it = ShowE (x, over_exp f exp1) }
+  | ToCandidE exps ->  f { exp with it = ToCandidE (List.map (over_exp f) exps) }
+  | FromCandidE (exp1) -> f { exp with it = FromCandidE (over_exp f exp1) }
+  | ProjE (exp1, x) -> f { exp with it = ProjE (over_exp f exp1, x) }
+  | OptE exp1 -> f { exp with it = OptE (over_exp f exp1) }
+  | DoOptE exp1 -> f { exp with it = DoOptE (over_exp f exp1) }
+  | BangE exp1 -> f { exp with it = BangE (over_exp f exp1) }
+  | TagE (x, exp1) -> f { exp with it = TagE (x, over_exp f exp1) }
+  | DotE (exp1, x) -> f { exp with it = DotE (over_exp f exp1, x) }
+  | NotE exp1 -> f { exp with it = NotE (over_exp f exp1) }
+  | AssertE (how, exp1) -> f { exp with it = AssertE (how, over_exp f exp1) }
+  | LabelE (x, y, exp1) -> f { exp with it = LabelE (x, y, over_exp f exp1) }
+  | BreakE (x, exp1) -> f { exp with it = BreakE (x, over_exp f exp1) }
+  | RetE exp1 -> f { exp with it = RetE (over_exp f exp1) }
+  | AnnotE (exp1, x) -> f { exp with it = AnnotE (over_exp f exp1, x) }
+  | AsyncE (s, tb, exp1) -> f { exp with it = AsyncE (s, tb, over_exp f exp1) }
+  | AwaitE (s, exp1) -> f { exp with it = AwaitE (s, over_exp f exp1) }
+  | ThrowE exp1 -> f { exp with it = ThrowE (over_exp f exp1) }
+  | BinE (x, exp1, y, exp2) ->
+     f { exp with it = BinE (x, over_exp f exp1, y, over_exp f exp2) }
+  | IdxE (exp1, exp2) ->
+     f { exp with it = IdxE (over_exp f exp1, over_exp f exp2) }
+  | RelE (x, exp1, y, exp2) ->
+     f { exp with it = RelE (x, over_exp f exp1, y, over_exp f exp2) }
+  | AssignE (exp1, exp2) ->
+     f { exp with it = AssignE (over_exp f exp1, over_exp f exp2) }
+  | CallE (exp1, x, exp2) ->
+     f { exp with it = CallE (over_exp f exp1, x, over_exp f exp2) }
+  | AndE (exp1, exp2) ->
+     f { exp with it = AndE (over_exp f exp1, over_exp f exp2) }
+  | OrE (exp1, exp2) ->
+     f { exp with it = OrE (over_exp f exp1, over_exp f exp2) }
+  | ImpliesE (exp1, exp2) ->
+     f { exp with it = ImpliesE (over_exp f exp1, over_exp f exp2) }
+  | OldE exp1 -> f { exp with it = OldE (over_exp f exp1) }
+  | WhileE (exp1, exp2) ->
+     f { exp with it = WhileE (over_exp f exp1, over_exp f exp2) }
+  | LoopE (exp1, exp2_opt) ->
+     f { exp with it = LoopE (over_exp f exp1, Option.map (over_exp f) exp2_opt) }
+  | ForE (x, exp1, exp2) ->
+     f { exp with it = ForE (x, over_exp f exp1, over_exp f exp2) }
+  | DebugE exp1 ->
+     f { exp with it = DebugE (over_exp f exp1) }
+  | TupE exps ->
+     f { exp with it = TupE (List.map (over_exp f) exps) }
+  | ArrayE (x, exps) ->
+     f { exp with it = ArrayE (x, List.map (over_exp f) exps) }
+  | BlockE ds ->
+     f { exp with it = BlockE (List.map (over_dec f) ds) }
+  | ObjBlockE (x, t, dfs) ->
+     f { exp with it = ObjBlockE (x, t, List.map (over_dec_field f) dfs) }
+  | ObjE (bases, efs) ->
+     f { exp with it = ObjE (List.map (over_exp f) bases, List.map (over_exp_field f) efs) }
+  | IfE (exp1, exp2, exp3) ->
+     f { exp with it = IfE(over_exp f exp1, over_exp f exp2, over_exp f exp3) }
+  | TryE (exp1, cases) ->
+     f { exp with it = TryE (over_exp f exp1, List.map (over_case f) cases) }
+  | SwitchE (exp1, cases) ->
+     f { exp with it = SwitchE (over_exp f exp1, List.map (over_case f) cases) }
+  | FuncE (name, sort_pat, typ_binds, pat, typ_opt, sugar, exp1) ->
+     f { exp with it = FuncE (name, sort_pat, typ_binds, pat, typ_opt, sugar, over_exp f exp1) }
+  | IgnoreE exp1 ->
+     f { exp with it = IgnoreE (over_exp f exp1)}
+
+and over_dec (f : exp -> exp) (d : dec) : dec = match d.it with
+  | TypD _ -> d
+  | ExpD e -> { d with it = ExpD (over_exp f e)}
+  | VarD (x, e) ->
+     { d with it = VarD (x, over_exp f e)}
+  | LetD (x, e, fail) ->
+     { d with it = LetD (x, over_exp f e, Option.map (over_exp f) fail)}
+  | ClassD (sp, cid, tbs, p, t_o, s, id, dfs) ->
+     { d with it = ClassD (sp, cid, tbs, p, t_o, s, id, List.map (over_dec_field f) dfs)}
+
+and over_dec_field (f : exp -> exp) (df : dec_field) : dec_field =
+  { df with it = { df.it with dec = over_dec f df.it.dec } }
+
+and over_exp_field (f : exp -> exp) (ef : exp_field) : exp_field =
+  { ef with it = { ef.it with exp = over_exp f ef.it.exp } }
+
+and over_case (f : exp -> exp) (case : case) : case =
+  { case with it = { case.it with exp = over_exp f case.it.exp } }
+
+and over_prog (f : exp -> exp) (prog : prog) : prog =
+  { prog with it = List.map (over_dec f) prog.it }
+
+
+
+ + + diff --git a/coverage/mo_frontend/typing.ml.html b/coverage/mo_frontend/typing.ml.html new file mode 100644 index 00000000000..58bbe899eef --- /dev/null +++ b/coverage/mo_frontend/typing.ml.html @@ -0,0 +1,9346 @@ + + + + + typing.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+
+
open Mo_def
+open Mo_types
+open Mo_values
+module Flags = Mo_config.Flags
+
+open Syntax
+open Source
+
+module T = Type
+module A = Effect
+module C = Async_cap
+
+module S = Set.Make(String)
+
+(* Contexts  *)
+
+(* availability, used to mark actor constructors as unavailable in compiled code
+   FUTURE: mark unavailable, non-shared variables *)
+type avl = Available | Unavailable
+
+type lab_env = T.typ T.Env.t
+type ret_env = T.typ option
+type val_env  = (T.typ * Source.region * Scope.val_kind * avl) T.Env.t
+
+(* separate maps for values and types; entries only for _public_ elements *)
+type visibility_src = {depr : string option; id_region : Source.region; field_region : Source.region}
+type visibility_env = visibility_src T.Env.t * visibility_src T.Env.t
+
+let available env = T.Env.map (fun (ty, at, kind) -> (ty, at, kind, Available)) env
+
+let initial_scope =
+  { Scope.empty with
+    Scope.typ_env = T.Env.singleton T.default_scope_var C.top_cap;
+    Scope.con_env = T.ConSet.singleton C.top_cap;
+  }
+
+type unused_warnings = (string * Source.region * Scope.val_kind) List.t
+
+type env =
+  { vals : val_env;
+    libs : Scope.lib_env;
+    typs : Scope.typ_env;
+    cons : Scope.con_env;
+    objs : Scope.obj_env;
+    labs : lab_env;
+    rets : ret_env;
+    async : C.async_cap;
+    in_actor : bool;
+    in_prog : bool;
+    context : exp' list;
+    pre : bool;
+    weak : bool;
+    msgs : Diag.msg_store;
+    scopes : Source.region T.ConEnv.t;
+    check_unused : bool;
+    used_identifiers : S.t ref;
+    unused_warnings : unused_warnings ref;
+  }
+
+let env_of_scope msgs scope =
+  { vals = available scope.Scope.val_env;
+    libs = scope.Scope.lib_env;
+    typs = scope.Scope.typ_env;
+    cons = scope.Scope.con_env;
+    objs = T.Env.empty;
+    labs = T.Env.empty;
+    rets = None;
+    async = Async_cap.NullCap;
+    in_actor = false;
+    in_prog = true;
+    context = [];
+    pre = false;
+    weak = false;
+    msgs;
+    scopes = T.ConEnv.empty;
+    check_unused = true;
+    used_identifiers = ref S.empty;
+    unused_warnings = ref [];
+  }
+
+let use_identifier env id =
+  env.used_identifiers := S.add id !(env.used_identifiers)
+
+let is_unused_identifier env id =
+  not (S.mem id !(env.used_identifiers))
+
+let get_identifiers identifiers =
+  T.Env.fold (fun id _ set -> S.add id set) identifiers S.empty
+
+let equal_unused_warning first second = first = second
+
+let add_unused_warning env warning =
+  if List.find_opt (equal_unused_warning warning) !(env.unused_warnings) = None then
+    env.unused_warnings := warning::!(env.unused_warnings)
+  else ()
+
+let compare_unused_warning first second =
+  let (first_id, {left = first_left; right = first_right}, _) = first in
+  let (second_id, {left = second_left; right = second_right}, _) = second in
+  match compare first_left second_left with
+  | 0 ->
+    (match compare first_right second_right with
+     | 0 -> compare first_id second_id
+     | other -> other)
+  | other -> other
+
+let sorted_unused_warnings list = List.sort compare_unused_warning list
+
+let kind_of_field_pattern pf = match pf.it with
+  | { id; pat = { it = VarP pat_id; _ } } when id = pat_id -> Scope.FieldReference
+  | _ -> Scope.Declaration
+
+(* Error bookkeeping *)
+
+exception Recover
+
+let recover_with (x : 'a) (f : 'b -> 'a) (y : 'b) = try f y with Recover -> x
+let recover_opt f y = recover_with None (fun y -> Some (f y)) y
+let recover f y = recover_with () f y
+
+let display_lab = Lib.Format.display T.pp_lab
+
+let display_typ = Lib.Format.display T.pp_typ
+
+let display_typ_expand = Lib.Format.display T.pp_typ_expand
+
+let type_error at code text : Diag.message =
+  Diag.error_message at code "type" text
+
+let type_warning at code text : Diag.message =
+  Diag.warning_message at code "type" text
+
+let type_info at text : Diag.message =
+  Diag.info_message at "type" text
+
+let error env at code fmt =
+  Format.kasprintf
+    (fun s -> Diag.add_msg env.msgs (type_error at code s); raise Recover) fmt
+
+let local_error env at code fmt =
+  Format.kasprintf (fun s -> Diag.add_msg env.msgs (type_error at code s)) fmt
+
+let warn env at code fmt =
+  Format.kasprintf (fun s -> Diag.add_msg env.msgs (type_warning at code s)) fmt
+
+let info env at fmt =
+  Format.kasprintf (fun s -> Diag.add_msg env.msgs (type_info at s)) fmt
+
+let flag_of_compile_mode mode =
+  match mode with
+  | Flags.ICMode -> ""
+  | Flags.WASIMode -> " and flag -wasi-system-api"
+  | Flags.WasmMode -> " and flag -no-system-api"
+  | Flags.RefMode -> " and flag -ref-system-api"
+
+let diag_in type_diag modes env at code fmt =
+  let mode = !Flags.compile_mode in
+  if !Flags.compiled && List.mem mode modes then
+    begin
+      Printf.ksprintf
+        (fun s ->
+          let s =
+            Printf.sprintf "%s\n  (This is a limitation of the current version%s.)"
+            s
+            (flag_of_compile_mode mode)
+          in
+          Diag.add_msg env.msgs (type_diag at code s)) fmt;
+      true
+    end
+  else false
+
+let error_in modes env at code fmt =
+  if diag_in type_error modes env at code fmt then
+    raise Recover
+
+let plural cs = if T.ConSet.cardinal cs = 1 then "" else "s"
+
+let warn_lossy_bind_type env at bind t1 t2 =
+  if not T.(sub t1 t2 || sub t2 t1) then
+    warn env at "M0190" "pattern variable %s has larger type%a\nbecause its types in the pattern alternatives are unrelated smaller types:\ntype in left pattern is%a\ntype in right pattern is%a"
+      bind
+      display_typ_expand (T.lub t1 t2)
+      display_typ_expand t1
+      display_typ_expand t2
+
+(* Currently unused *)
+let _warn_in modes env at code fmt =
+  ignore (diag_in type_warning modes env at code fmt)
+
+(* Unused identifier detection *)
+
+let emit_unused_warnings env =
+  let emit (id, region, kind) = match kind with
+    | Scope.Declaration -> warn env region "M0194" "unused identifier %s (delete or rename to wildcard `_` or `_%s`)" id id
+    | Scope.FieldReference -> warn env region "M0198" "unused field %s in object pattern (delete or rewrite as `%s = _`)" id id
+  in
+  let list = sorted_unused_warnings !(env.unused_warnings) in
+  List.iter emit list
+
+let ignore_warning_for_id id =
+  if String.length id > 0 then
+    let prefix = String.get id 0 in
+    prefix = '_' || prefix = '@'
+  else
+    false
+
+let detect_unused env inner_identifiers =
+  if env.check_unused then
+    T.Env.iter (fun id (_, at, kind) ->
+      if (not (ignore_warning_for_id id)) && (is_unused_identifier env id) then
+        add_unused_warning env (id, at, kind)
+    ) inner_identifiers
+
+let enter_scope env : S.t =
+  !(env.used_identifiers)
+
+let leave_scope env inner_identifiers initial_usage =
+  detect_unused env inner_identifiers;
+  let inner_identifiers = get_identifiers inner_identifiers in
+  let unshadowed_usage = S.diff !(env.used_identifiers) inner_identifiers in
+  let final_usage = S.union initial_usage unshadowed_usage in
+  env.used_identifiers := final_usage
+
+(* Value environments *)
+
+let singleton id t = T.Env.singleton id.it (t, id.at, Scope.Declaration)
+let add_id val_env id t = T.Env.add id.it (t, id.at, Scope.Declaration) val_env
+
+(* Context extension *)
+
+let add_lab env x t = {env with labs = T.Env.add x t env.labs}
+
+let add_val env id t =
+  { env with vals = T.Env.add id.it (t, id.at, Scope.Declaration, Available) env.vals }
+
+let add_typs env xs cs =
+  { env with
+    typs = List.fold_right2 T.Env.add xs cs env.typs;
+    cons = List.fold_right T.ConSet.disjoint_add cs env.cons;
+  }
+
+let adjoin env scope =
+  { env with
+    vals = T.Env.adjoin env.vals (available scope.Scope.val_env);
+    libs = T.Env.adjoin env.libs scope.Scope.lib_env;
+    typs = T.Env.adjoin env.typs scope.Scope.typ_env;
+    cons = T.ConSet.union env.cons scope.Scope.con_env;
+    objs = T.Env.adjoin env.objs scope.Scope.obj_env;
+  }
+
+let adjoin_vals env ve = {env with vals = T.Env.adjoin env.vals (available ve)}
+let adjoin_typs env te ce =
+  { env with
+    typs = T.Env.adjoin env.typs te;
+    cons = T.ConSet.disjoint_union env.cons ce;
+  }
+
+let disjoint_union env at code fmt env1 env2 =
+  try T.Env.disjoint_union env1 env2
+  with T.Env.Clash k -> error env at code fmt k
+
+
+(* Coverage *)
+
+let coverage' warnOrError category env f x t at =
+  let uncovered, unreached = f x t in
+  List.iter (fun at -> warn env at "M0146" "this pattern is never matched") unreached;
+  if uncovered <> [] then
+    warnOrError env at "M0145"
+      ("this %s of type%a\ndoes not cover value\n  %s" : (_, _, _, _) format4 )
+      category
+      display_typ_expand t
+      (String.concat " or\n  " uncovered)
+
+let coverage_cases category env cases t at =
+  coverage' warn category env Coverage.check_cases cases t at
+
+let coverage_pat warnOrError env pat t =
+  coverage' warnOrError "pattern" env Coverage.check_pat pat t pat.at
+
+(* Types *)
+
+let check_ids env kind member ids = Lib.List.iter_pairs
+  (fun x y ->
+    if x.it = y.it
+    then error env y.at "M0018" "duplicate %s name %s in %s" member y.it kind;
+    if Hash.hash x.it = Hash.hash y.it
+    then error env y.at "M0019" "%s names %s and %s in %s have colliding hashes" member x.it y.it kind;
+  ) ids
+
+let infer_mut mut : T.typ -> T.typ =
+  match mut.it with
+  | Const -> fun t -> t
+  | Var -> fun t -> T.Mut t
+
+
+(* System method types *)
+
+let heartbeat_type =
+  T.(Func (Local, Returns, [scope_bind], [], [Async (Fut, Var (default_scope_var, 0), unit)]))
+
+let timer_type =
+  T.(Func (Local, Returns, [scope_bind],
+    [Func (Local, Returns, [], [Prim Nat64], [])],
+    [Async (Fut, Var (default_scope_var, 0), unit)]))
+
+let system_funcs tfs =
+  [
+    ("heartbeat", heartbeat_type);
+    ("timer", timer_type);
+    T.("preupgrade", Func (Local, Returns, [scope_bind], [], []));
+    T.("postupgrade", Func (Local, Returns, [scope_bind], [], []));
+    ("inspect",
+     (let msg_typ = T.decode_msg_typ tfs in
+      let record_typ =
+        T.(Obj (Object, List.sort compare_field
+           [{lab = "caller"; typ = principal; src = empty_src};
+            {lab = "arg"; typ = blob; src = empty_src};
+            {lab = "msg"; typ = msg_typ; src = empty_src}]))
+      in
+        T.(Func (Local, Returns, [],  [record_typ], [bool]))))
+  ]
+
+
+let check_closed env id k at =
+  let is_typ_param c =
+    match Cons.kind c with
+    | T.Def _
+    | T.Abs( _, T.Pre) -> false (* an approximated type constructor *)
+    | T.Abs( _, _) -> true in
+  let typ_params = T.ConSet.filter is_typ_param env.cons in
+  let cs_k = T.cons_kind k in
+  let free_params = T.ConSet.inter typ_params cs_k in
+  if not (T.ConSet.is_empty free_params) then
+    let op, sbs, st = T.strings_of_kind k in
+    error env at "M0137"
+      "type %s%s %s %s references type parameter%s %s from an outer scope"
+      id.it sbs op st
+      (plural free_params)
+      (String.concat ", " (T.ConSet.fold (fun c cs -> T.string_of_con c::cs) free_params []))
+
+(* Imports *)
+
+let check_import env at f ri =
+  let full_path =
+    match !ri with
+    | Unresolved -> error env at "M0020" "unresolved import %s" f
+    | LibPath {path=fp; _} -> fp
+    | IDLPath (fp, _) -> fp
+    | PrimPath -> "@prim"
+  in
+  match T.Env.find_opt full_path env.libs with
+  | Some T.Pre ->
+    error env at "M0021" "cannot infer type of forward import %s" f
+  | Some t -> t
+  | None -> error env at "M0022" "imported file %s not loaded" full_path
+
+
+(* Paths *)
+
+let rec check_obj_path env path : T.obj_sort * (T.field list) =
+  match T.promote (check_obj_path' env path) with
+  | T.Obj (s, fs) as t ->
+    path.note <- t;
+    (s, fs)
+  | t ->
+    error env path.at "M0023"
+      "expected module, object, or actor type, but path expression produces type%a"
+      display_typ_expand t
+
+and check_obj_path' env path : T.typ =
+  match path.it with
+  | IdH id ->
+    use_identifier env id.it;
+    (match T.Env.find_opt id.it env.vals with
+     | Some (T.Pre, _, _, _) ->
+       error env id.at "M0024" "cannot infer type of forward variable reference %s" id.it
+     | Some (t, _, _, Available) -> t
+     | Some (t, _, _, Unavailable) ->
+         error env id.at "M0025" "unavailable variable %s" id.it
+     | None -> error env id.at "M0026" "unbound variable %s" id.it
+    )
+  | DotH (path', id) ->
+    let s, fs = check_obj_path env path' in
+    match T.lookup_val_field id.it fs with
+    | T.Pre ->
+      error env id.at "M0027" "cannot infer type of forward field reference %s" id.it
+    | t -> t
+    | exception Invalid_argument _ ->
+      error env id.at "M0028" "field %s does not exist in type%a"
+        id.it display_typ_expand (T.Obj (s, fs))
+
+let rec check_typ_path env path : T.con =
+  let c = check_typ_path' env path in
+  path.note <- T.Typ c;
+  c
+
+and check_typ_path' env path : T.con =
+  match path.it with
+  | IdH id ->
+    use_identifier env id.it;
+    (match T.Env.find_opt id.it env.typs with
+    | Some c -> c
+    | None -> error env id.at "M0029" "unbound type %s" id.it
+    )
+  | DotH (path', id) ->
+    let s, fs = check_obj_path env path' in
+    match T.lookup_typ_field id.it fs with
+      | c ->
+        Option.iter
+          (warn env path.at "M0154" "type field %s is deprecated:\n%s" id.it)
+          (T.lookup_typ_deprecation id.it fs);
+        c
+      | exception Invalid_argument _ ->
+        error env id.at "M0030" "type field %s does not exist in type%a"
+          id.it display_typ_expand (T.Obj (s, fs))
+
+
+(* Type helpers *)
+
+let error_shared env t at code fmt =
+  match T.find_unshared t with
+  | None -> error env at code fmt
+  | Some t1 ->
+    let s =
+      Format.asprintf "\ntype%a\nis or contains non-shared type%a"
+        display_typ_expand t
+        display_typ_expand t1
+    in
+    Format.kasprintf (fun s1 -> Diag.add_msg env.msgs (type_error at code (s1^s)); raise Recover) fmt
+
+let as_domT t =
+  match t.Source.it with
+  | TupT tis -> List.map snd tis
+  | _ -> [t]
+
+let as_codomT sort t =
+  match sort, t.Source.it with
+  | T.Shared _,  AsyncT (T.Fut, _, t1) ->
+    T.Promises, as_domT t1
+  | _ -> T.Returns, as_domT t
+
+let check_shared_binds env at tbs =
+  (* should be ensured by desugaring parser *)
+  assert (List.length tbs > 0 &&
+            (List.hd(tbs)).T.sort = T.Scope);
+  (* shared functions can't have user declared type parameters *)
+  if List.length tbs > 1 then
+    error env at "M0180"
+      "shared function has unexpected type parameters"
+
+let check_shared_return env at sort c ts =
+  match sort, c, ts with
+  | T.Shared _, T.Promises,  _ -> ()
+  | T.Shared T.Write, T.Returns, [] -> ()
+  | T.Shared T.Write, _, _ -> error env at "M0035" "shared function must have syntactic return type '()' or 'async <typ>'"
+  | T.Shared T.Query, _, _ -> error env at "M0036" "shared query function must have syntactic return type 'async <typ>'"
+  | _ -> ()
+
+let region_of_scope env typ =
+  match T.normalize typ with
+  | T.Con(c,_) ->
+    T.ConEnv.find_opt c env.scopes
+  | _ -> None
+
+let string_of_region r =
+  let open Source in
+  let { left; right } = r in
+  let basename = if left.file = "" then "" else Filename.basename left.file in
+  Source.string_of_region
+    { left =  { left with file = basename };
+      right = { right with file = basename } }
+
+let associated_region env typ at =
+  match region_of_scope env typ with
+  | Some r ->
+    Printf.sprintf "\n  scope %s is %s" (T.string_of_typ_expand typ) (string_of_region r);
+  | None ->
+    if T.eq typ (T.Con(C.top_cap,[])) then
+      Printf.sprintf "\n  scope %s is the global scope" (T.string_of_typ_expand typ)
+    else ""
+
+let scope_info env typ at =
+  match region_of_scope env typ with
+  | Some r ->
+    let s = {left = r.left; right = r.left} in
+    let l = { r.right with column = r.right.column - 1 } in
+    let e = {left = l; right = l} in
+    info env s "start of scope %s mentioned in error at %s"
+      (T.string_of_typ_expand typ) (string_of_region at);
+    info env e "end of scope %s mentioned in error at %s"
+      (T.string_of_typ_expand typ) (string_of_region at);
+  | None -> ()
+
+let infer_async_cap env sort cs tbs body_opt at =
+  let open T in
+  match sort, cs, tbs with
+  | Shared Write, c::_,  { T.sort = Scope; _ }::_ ->
+    { env with typs = Env.add default_scope_var c env.typs;
+               scopes = ConEnv.add c at env.scopes;
+               async = C.AsyncCap c }
+  | Shared Query, c::_,  { sort = Scope; _ }::_ ->
+    { env with typs = Env.add default_scope_var c env.typs;
+               scopes = ConEnv.add c at env.scopes;
+               async = C.QueryCap c }
+  | Shared Composite, c::_,  { sort = Scope; _ }::_ ->
+    { env with typs = Env.add default_scope_var c env.typs;
+               scopes = ConEnv.add c at env.scopes;
+               async = C.CompositeCap c }
+  | Shared _, _, _ -> assert false (* impossible given sugaring *)
+  | Local, c::_,  { sort = Scope; _ }::_ ->
+    let async = match body_opt with
+      | Some exp when not (is_asyncE exp) -> C.SystemCap c
+      | _ -> C.AsyncCap c
+    in
+    { env with typs = Env.add default_scope_var c env.typs;
+               scopes = ConEnv.add c at env.scopes;
+               async }
+  | _ -> { env with async = C.NullCap }
+
+let check_AsyncCap env s at : T.typ * (T.con -> C.async_cap) =
+   match env.async with
+   | C.AwaitCap c
+   | C.AsyncCap c -> T.Con(c, []), fun c' -> C.AwaitCap c'
+   | C.CompositeCap c -> T.Con(c, []), fun c' -> C.CompositeAwaitCap c'
+   | C.QueryCap c -> T.Con(c, []), fun _c' -> C.ErrorCap
+   | C.ErrorCap ->
+      local_error env at "M0037" "misplaced %s; a query cannot contain an %s" s s;
+      T.Con(C.bogus_cap,[]), fun c -> C.NullCap
+   | C.(NullCap | SystemCap _) ->
+      local_error env at "M0037" "misplaced %s; try enclosing in an async function" s;
+      T.Con(C.bogus_cap,[]), fun c -> C.NullCap
+   | C.CompositeAwaitCap _ ->
+      local_error env at "M0037" "misplaced %s; a composite query cannot contain an %s" s s;
+      T.Con(C.bogus_cap,[]), fun c -> C.NullCap
+
+let check_AwaitCap env s at =
+   match env.async with
+   | C.(AwaitCap c
+        | CompositeAwaitCap c) -> T.Con(c, [])
+   | C.AsyncCap _
+   | C.QueryCap _
+   | C.CompositeCap _
+     ->
+      local_error env at "M0038" "misplaced %s; try enclosing in an async expression" s;
+      T.Con(C.bogus_cap,[])
+   | C.(ErrorCap | NullCap | SystemCap _) ->
+      local_error env at "M0038" "misplaced %s" s;
+      T.Con(C.bogus_cap,[])
+
+let check_ErrorCap env s at =
+   match env.async with
+   | C.AwaitCap c -> ()
+   | C.ErrorCap -> ()
+   | C.CompositeAwaitCap c -> ()
+   | C.AsyncCap _
+   | C.QueryCap _
+   | C.CompositeCap _ ->
+     local_error env at "M0039" "misplaced %s; try enclosing in an async expression or query function" s
+   | C.(NullCap | SystemCap _) ->
+     local_error env at "M0039" "misplaced %s" s
+
+and scope_of_env env =
+  C.(match env.async with
+     | AsyncCap c
+     | QueryCap c
+     | CompositeCap c
+     | CompositeAwaitCap c
+     | AwaitCap c
+     | SystemCap c -> Some (T.Con(c, []))
+     | ErrorCap | NullCap -> None)
+
+let infer_class_cap env obj_sort (tbs : T.bind list) cs =
+  match tbs, cs with
+  | T.{sort = T.Scope; _} :: tbs', c :: cs' ->
+    (* HACK:
+       choosing top_cap just to support compilation of actor classes
+       which currently won't have any binding for c
+    *)
+    let c = if obj_sort = T.Actor then C.top_cap else c in
+    C.SystemCap c,
+    tbs',
+    cs'
+  | _ ->
+    C.NullCap, tbs, cs
+
+(* Types *)
+
+let rec check_typ env (typ : typ) : T.typ =
+  let t = check_typ' env typ in
+  typ.note <- t;
+  t
+
+and check_typ' env typ : T.typ =
+  match typ.it with
+  | PathT (path, typs) ->
+    let c = check_typ_path env path in
+    let ts = List.map (check_typ env) typs in
+    let T.Def (tbs, _) | T.Abs (tbs, _) = Cons.kind c in
+    let tbs' = List.map (fun tb -> { tb with T.bound = T.open_ ts tb.T.bound }) tbs in
+    check_typ_bounds env tbs' ts (List.map (fun typ -> typ.at) typs) typ.at;
+    T.Con (c, ts)
+  | PrimT "Any" -> T.Any
+  | PrimT "None" -> T.Non
+  | PrimT s ->
+    (try T.Prim (T.prim s) with Invalid_argument _ ->
+      error env typ.at "M0040" "unknown primitive type"
+    )
+  | ArrayT (mut, typ) ->
+    let t = check_typ env typ in
+    T.Array (infer_mut mut t)
+  | TupT typs ->
+    T.Tup (List.map (fun (_, t) -> check_typ env t) typs)
+  | FuncT (sort, binds, typ1, typ2) ->
+    let cs, tbs, te, ce = check_typ_binds env binds in
+    let env' = infer_async_cap (adjoin_typs env te ce) sort.it cs tbs None typ.at in
+    let typs1 = as_domT typ1 in
+    let c, typs2 = as_codomT sort.it typ2 in
+    let ts1 = List.map (check_typ env') typs1 in
+    let ts2 = List.map (check_typ env') typs2 in
+    check_shared_return env typ2.at sort.it c ts2;
+    if not env.pre && Type.is_shared_sort sort.it then begin
+      check_shared_binds env typ.at tbs;
+      let t1 = T.seq ts1 in
+      if not (T.shared t1) then
+        error_shared env t1 typ1.at "M0031" "shared function has non-shared parameter type%a"
+          display_typ_expand t1;
+      List.iter (fun t ->
+        if not (T.shared t) then
+          error_shared env t typ.at "M0032"
+            "shared function has non-shared return type%a"
+            display_typ_expand t;
+      ) ts2;
+      match c, ts2 with
+      | T.Returns, [] when sort.it = T.Shared T.Write -> ()
+      | T.Promises, _ -> ()
+      | _ ->
+        error env typ2.at "M0041"
+          "shared function has non-async result type%a"
+          display_typ_expand (T.seq ts2)
+      end;
+    T.Func (sort.it, c, T.close_binds cs tbs, List.map (T.close cs) ts1, List.map (T.close cs) ts2)
+  | OptT typ ->
+    T.Opt (check_typ env typ)
+  | VariantT tags ->
+    check_ids env "variant type" "tag"
+      (List.map (fun (tag : typ_tag) -> tag.it.tag) tags);
+    let fs = List.map (check_typ_tag env) tags in
+    T.Variant (List.sort T.compare_field fs)
+  | AsyncT (s, typ0, typ) ->
+    let t0 = check_typ env typ0 in
+    let t = check_typ env typ in
+    if not env.pre && not (T.shared t) then
+      error_shared env t typ.at
+        "M0033" "async has non-shared content type%a"
+        display_typ_expand t;
+    T.Async (s, t0, t)
+  | ObjT (sort, fields) ->
+    check_ids env "object type" "field"
+      (List.filter_map (fun (field : typ_field) ->
+        match field.it with ValF (x, _, _) -> Some x | _ -> None
+      ) fields);
+    check_ids env "object type" "type field"
+      (List.filter_map (fun (field : typ_field) ->
+        match field.it with TypF (x, _, _) -> Some x | _ -> None
+      ) fields);
+    let fs = List.map (check_typ_field env sort.it) fields in
+    T.Obj (sort.it, List.sort T.compare_field fs)
+  | AndT (typ1, typ2) ->
+    let t1 = check_typ env typ1 in
+    let t2 = check_typ env typ2 in
+    let t = try T.glb t1 t2 with T.PreEncountered ->
+      error env typ2.at "M0168"
+        "cannot compute intersection of types containing recursive or forward references to other type definitions"
+    in
+    if not env.pre && T.sub t T.Non && not (T.sub t1 T.Non || T.sub t2 T.Non) then
+      warn env typ.at "M0166"
+        "this intersection results in type%a\nbecause operand types are inconsistent,\nleft operand is%a\nright operand is%a"
+        display_typ t
+        display_typ_expand t1
+        display_typ_expand t2;
+    t
+  | OrT (typ1, typ2) ->
+    let t1 = check_typ env typ1 in
+    let t2 = check_typ env typ2 in
+    let t = try T.lub t1 t2 with T.PreEncountered ->
+      error env typ2.at "M0168"
+        "cannot compute union of types containing recursive or forward references to other type definitions"
+    in
+    if not env.pre && T.sub T.Any t && not (T.sub T.Any t1 || T.sub T.Any t2) then
+      warn env typ.at "M0167"
+        "this union results in type%a\nbecause operand types are inconsistent,\nleft operand is%a\nright operand is%a"
+        display_typ t
+        display_typ_expand t1
+        display_typ_expand t2;
+    t
+  | ParT typ ->
+    check_typ env typ
+  | NamedT (_, typ) ->
+    check_typ env typ
+
+and check_typ_def env at (id, typ_binds, typ) : T.kind =
+  let cs, tbs, te, ce = check_typ_binds {env with pre = true} typ_binds in
+  let env' = adjoin_typs env te ce in
+  let t = check_typ env' typ in
+  let k = T.Def (T.close_binds cs tbs, T.close cs t) in
+  check_closed env id k at;
+  k
+
+and check_typ_field env s typ_field : T.field = match typ_field.it with
+  | ValF (id, typ, mut) ->
+    let t = infer_mut mut (check_typ env typ) in
+    if not env.pre && s = T.Actor then begin
+      if not (T.is_shared_func t) then
+        error env typ.at "M0042" "actor field %s must have shared function type, but has type\n  %s"
+          id.it (T.string_of_typ_expand t)
+    end;
+    T.{lab = id.it; typ = t; src = empty_src}
+  | TypF (id, typ_binds, typ) ->
+    let k = check_typ_def env typ_field.at (id, typ_binds, typ) in
+    let c = Cons.fresh id.it k in
+    T.{lab = id.it; typ = Typ c; src = empty_src}
+
+and check_typ_tag env typ_tag =
+  let {tag; typ} = typ_tag.it in
+  let t = check_typ env typ in
+  T.{lab = tag.it; typ = t; src = empty_src}
+
+and check_typ_binds_acyclic env typ_binds cs ts  =
+  let n = List.length cs in
+  let ce = List.fold_right2 T.ConEnv.add cs ts T.ConEnv.empty in
+  let chase typ_bind c =
+    let rec chase i ts c' =
+      if i > n then
+        error env typ_bind.at "M0043" "type parameter %s has cyclic bounds %s"
+          (T.string_of_con c)
+          (String.concat " <: " (List.map T.string_of_typ ts)) (List.rev ts)
+      else
+        match T.ConEnv.find_opt c' ce with
+        | None -> ()
+        | Some t ->
+          (match T.normalize t with
+           | T.Con (c'', []) as t' ->
+             chase (i+1) (t'::ts) c''
+           | _ -> ())
+    in chase 0 [] c
+  in List.iter2 chase typ_binds cs
+
+and check_typ_bind_sorts env tbs =
+  (* assert, don't error, since this should be a syntactic invariant of parsing *)
+  List.iteri (fun i tb -> assert (i = 0 || (tb.T.sort = T.Type))) tbs;
+
+and check_typ_binds env typ_binds : T.con list * T.bind list * Scope.typ_env * Scope.con_env =
+  let xs = List.map (fun typ_bind -> typ_bind.it.var.it) typ_binds in
+  let cs =
+    List.map2 (fun x tb ->
+      match tb.note with
+      | Some c -> c
+      | None -> Cons.fresh x (T.Abs ([], T.Pre))) xs typ_binds in
+  let te = List.fold_left2 (fun te typ_bind c ->
+      let id = typ_bind.it.var in
+      if T.Env.mem id.it te then
+        error env id.at "M0044" "duplicate type name %s in type parameter list" id.it;
+      T.Env.add id.it c te
+    ) T.Env.empty typ_binds cs in
+  let pre_env' = add_typs {env with pre = true} xs cs  in
+  let tbs = List.map (fun typ_bind ->
+    { T.var = typ_bind.it.var.it;
+      T.sort = typ_bind.it.sort.it;
+      T.bound = check_typ pre_env' typ_bind.it.bound }) typ_binds
+  in
+  check_typ_bind_sorts env tbs;
+  let ts = List.map (fun tb -> tb.T.bound) tbs in
+  check_typ_binds_acyclic env typ_binds cs ts;
+  let ks = List.map (fun t -> T.Abs ([], t)) ts in
+  List.iter2 (fun c k ->
+    match Cons.kind c with
+    | T.Abs (_, T.Pre) -> T.set_kind c k
+    | k' -> assert (T.eq_kind k k')
+  ) cs ks;
+  let env' = add_typs env xs cs in
+  let _ = List.map (fun typ_bind -> check_typ env' typ_bind.it.bound) typ_binds in
+  List.iter2 (fun typ_bind c -> typ_bind.note <- Some c) typ_binds cs;
+  cs, tbs, te, T.ConSet.of_list cs
+
+and check_typ_bind env typ_bind : T.con * T.bind * Scope.typ_env * Scope.con_env =
+  match check_typ_binds env [typ_bind] with
+  | [c], [tb], te, cs -> c, tb, te, cs
+  | _ -> assert false
+
+and check_typ_bounds env (tbs : T.bind list) (ts : T.typ list) ats at =
+  let pars = List.length tbs in
+  let args = List.length ts in
+  if pars <> args then begin
+    let consider_scope x = match tbs with
+      | hd :: _ when hd.T.sort = T.Scope -> x - 1
+      | _ -> x in
+    error env at "M0045"
+      "wrong number of type arguments: expected %d but got %d"
+      (consider_scope pars)
+      (consider_scope args)
+    end;
+  let rec go tbs' ts' ats' =
+    match tbs', ts', ats' with
+    | tb::tbs', t::ts', at'::ats' ->
+      if not env.pre then
+        let u = T.open_ ts tb.T.bound in
+        if not (T.sub t u) then
+          local_error env at' "M0046"
+            "type argument%a\ndoes not match parameter bound%a"
+            display_typ_expand t
+            display_typ_expand u;
+        go tbs' ts' ats'
+    | [], [], [] -> ()
+    | _  -> assert false
+  in go tbs ts ats
+
+(* Check type definitions productive and non-expansive *)
+and check_con_env env at ce =
+  let cs = Productive.non_productive ce in
+  if not (T.ConSet.is_empty cs) then
+    error env at "M0157" "block contains non-productive definition%s %s"
+      (plural cs)
+      (String.concat ", " (List.sort compare (List.map Cons.name (T.ConSet.elements cs))));
+
+  begin match Mo_types.Expansive.is_expansive ce with
+  | None -> ()
+  | Some msg ->
+    error env at "M0156" "block contains expansive type definitions%s" msg
+  end;
+
+and infer_inst env sort tbs typs t_ret at =
+  let ts = List.map (check_typ env) typs in
+  let ats = List.map (fun typ -> typ.at) typs in
+  match tbs, typs with
+  | {T.bound; sort = T.Scope; _}::tbs', typs' ->
+    assert (List.for_all (fun tb -> tb.T.sort = T.Type) tbs');
+    (match env.async with
+     | cap when sort = T.Local && not (T.is_async t_ret) ->
+       begin
+         match cap with
+         | C.(SystemCap c | AwaitCap c | AsyncCap c) ->
+           (T.Con(c, [])::ts, at::ats)
+         | _ ->
+          if not env.pre then
+            local_error env at "M0197"
+              "`system` capability required, but not available\n (need an enclosing async expression or function body or explicit `system` type parameter)";
+          (T.Con(C.bogus_cap, [])::ts, at::ats)
+       end
+     | C.(AwaitCap c | AsyncCap c) when T.(sort = Shared Query || sort = Shared Write || sort = Local) ->
+        (T.Con(c, [])::ts, at::ats)
+     | C.(AwaitCap c | AsyncCap c) when sort = T.(Shared Composite) ->
+        error env at "M0186"
+         "composite send capability required, but not available\n  (cannot call a `composite query` function from a non-`composite query` function)"
+     | C.(CompositeAwaitCap c | CompositeCap c) ->
+       begin
+         match sort with
+         | T.(Shared (Composite | Query)) ->
+           (T.Con(c, [])::ts, at::ats)
+         | T.(Shared Write | Local) ->
+           error env at "M0187"
+             "send capability required, but not available\n  (cannot call a `shared` function from a `composite query` function; only calls to `query` and `composite query` functions are allowed)"
+       end
+     | C.ErrorCap
+     | C.QueryCap _ ->
+        error env at "M0188"
+         "send capability required, but not available\n  (cannot call a `shared` function from a `query` function)"
+     | C.NullCap
+     | _ ->
+        error env at "M0047"
+          "send capability required, but not available\n (need an enclosing async expression or function body)"
+    )
+  | tbs', typs' ->
+    assert (List.for_all (fun tb -> tb.T.sort = T.Type) tbs');
+    ts, ats
+
+and check_inst_bounds env sort tbs inst t_ret at =
+  let ts, ats = infer_inst env sort tbs inst t_ret at in
+  check_typ_bounds env tbs ts ats at;
+  ts
+
+
+(* Subgrammar of explicitly typed expressions *)
+
+(* Roughly, this defines the sublanguage of expressions whose inferred type
+   is determined by explicit type annotations or previously defined identifiers,
+   or by expressions whose type is unambiguous and can be weakened only to Any
+   or via lossy width subtyping on records.
+
+   The intuition is that for an explicit expression, the inferred type is a
+   "good enough" choice to resolve overloading of operators that have it as
+   an operand.
+
+   Specifically, this excludes expression forms that are either overloaded
+   or have a principal type like None or Null, that are subtypes of other
+   non-trivial types. These must be excluded so that examples like the
+   following do not run into checking mode with a type that is too small:
+
+     null == ?0
+     [] == [0]
+     (break) == 0
+*)
+
+let is_explicit_lit l =
+  match l with
+  | BoolLit _ -> true
+  | _ -> false
+
+let rec is_explicit_pat p =
+  match p.it with
+  | WildP | VarP _ -> false
+  | LitP l | SignP (_, l) -> is_explicit_lit !l
+  | OptP p1 | TagP (_, p1) | ParP p1 -> is_explicit_pat p1
+  | TupP ps -> List.for_all is_explicit_pat ps
+  | ObjP pfs -> List.for_all (fun (pf : pat_field) -> is_explicit_pat pf.it.pat) pfs
+  | AltP (p1, p2) -> is_explicit_pat p1 && is_explicit_pat p2
+  | AnnotP _ -> true
+
+let rec is_explicit_exp e =
+  match e.it with
+  | PrimE _ | ActorUrlE _
+  | TagE _
+  | BreakE _ | RetE _ | ThrowE _ ->
+    false
+  | VarE _
+  | RelE _ | NotE _ | AndE _ | OrE _ | ImpliesE _ | OldE _ | ShowE _ | ToCandidE _ | FromCandidE _
+  | AssignE _ | IgnoreE _ | AssertE _ | DebugE _
+  | WhileE _ | ForE _
+  | AnnotE _ | ImportE _ ->
+    true
+  | LitE l -> is_explicit_lit !l
+  | UnE (_, _, e1) | OptE e1 | DoOptE e1
+  | ProjE (e1, _) | DotE (e1, _) | BangE e1 | IdxE (e1, _) | CallE (e1, _, _)
+  | LabelE (_, _, e1) | AsyncE (_, _, e1) | AwaitE (_, e1) ->
+    is_explicit_exp e1
+  | BinE (_, e1, _, e2) | IfE (_, e1, e2) ->
+    is_explicit_exp e1 || is_explicit_exp e2
+  | TupE es -> List.for_all is_explicit_exp es
+  | ObjE (bases, efs) ->
+    List.(for_all is_explicit_exp bases
+          && for_all (fun (ef : exp_field) -> is_explicit_exp ef.it.exp) efs)
+  | ObjBlockE (_, _, dfs) ->
+    List.for_all (fun (df : dec_field) -> is_explicit_dec df.it.dec) dfs
+  | ArrayE (_, es) -> List.exists is_explicit_exp es
+  | SwitchE (e1, cs) | TryE (e1, cs) ->
+    is_explicit_exp e1 &&
+    List.exists (fun (c : case) -> is_explicit_exp c.it.exp) cs
+  | BlockE ds -> List.for_all is_explicit_dec ds
+  | FuncE (_, _, _, p, t_opt, _, _) -> is_explicit_pat p && t_opt <> None
+  | LoopE (_, e_opt) -> e_opt <> None
+
+and is_explicit_dec d =
+  match d.it with
+  | ExpD e | LetD (_, e, _) | VarD (_, e) -> is_explicit_exp e
+  | TypD _ -> true
+  | ClassD (_, _, _, p, _, _, _, dfs) ->
+    is_explicit_pat p &&
+    List.for_all (fun (df : dec_field) -> is_explicit_dec df.it.dec) dfs
+
+
+(* Literals *)
+
+let check_lit_val env t of_string at s =
+  try of_string s with Invalid_argument _ ->
+    error env at "M0048" "literal out of range for type %s"
+      (T.string_of_typ (T.Prim t))
+
+let check_nat env = check_lit_val env T.Nat Numerics.Nat.of_string
+let check_nat8 env = check_lit_val env T.Nat8 Numerics.Nat8.of_string
+let check_nat16 env = check_lit_val env T.Nat16 Numerics.Nat16.of_string
+let check_nat32 env = check_lit_val env T.Nat32 Numerics.Nat32.of_string
+let check_nat64 env = check_lit_val env T.Nat64 Numerics.Nat64.of_string
+let check_int env = check_lit_val env T.Int Numerics.Int.of_string
+let check_int8 env = check_lit_val env T.Int8 Numerics.Int_8.of_string
+let check_int16 env = check_lit_val env T.Int16 Numerics.Int_16.of_string
+let check_int32 env = check_lit_val env T.Int32 Numerics.Int_32.of_string
+let check_int64 env = check_lit_val env T.Int64 Numerics.Int_64.of_string
+let check_float env = check_lit_val env T.Float Numerics.Float.of_string
+
+let check_text env at s =
+  if not (Lib.Utf8.is_valid s) then
+    local_error env at "M0049" "string literal \"%s\": is not valid utf8" (String.escaped s);
+  s
+
+let infer_lit env lit at : T.prim =
+  match !lit with
+  | NullLit -> T.Null
+  | BoolLit _ -> T.Bool
+  | NatLit _ -> T.Nat
+  | Nat8Lit _ -> T.Nat8
+  | Nat16Lit _ -> T.Nat16
+  | Nat32Lit _ -> T.Nat32
+  | Nat64Lit _ -> T.Nat64
+  | IntLit _ -> T.Int
+  | Int8Lit _ -> T.Int8
+  | Int16Lit _ -> T.Int16
+  | Int32Lit _ -> T.Int32
+  | Int64Lit _ -> T.Int64
+  | FloatLit _ -> T.Float
+  | CharLit _ -> T.Char
+  | TextLit _ -> T.Text
+  | BlobLit _ -> T.Blob
+  | PreLit (s, T.Nat) ->
+    lit := NatLit (check_nat env at s); (* default *)
+    T.Nat
+  | PreLit (s, T.Int) ->
+    lit := IntLit (check_int env at s); (* default *)
+    T.Int
+  | PreLit (s, T.Float) ->
+    lit := FloatLit (check_float env at s); (* default *)
+    T.Float
+  | PreLit (s, T.Text) ->
+    lit := TextLit (check_text env at s); (* default *)
+    T.Text
+  | PreLit _ ->
+    assert false
+
+let check_lit env t lit at =
+  match t, !lit with
+  | T.Prim T.Nat, PreLit (s, T.Nat) ->
+    lit := NatLit (check_nat env at s)
+  | T.Prim T.Nat8, PreLit (s, T.Nat) ->
+    lit := Nat8Lit (check_nat8 env at s)
+  | T.Prim T.Nat16, PreLit (s, T.Nat) ->
+    lit := Nat16Lit (check_nat16 env at s)
+  | T.Prim T.Nat32, PreLit (s, T.Nat) ->
+    lit := Nat32Lit (check_nat32 env at s)
+  | T.Prim T.Nat64, PreLit (s, T.Nat) ->
+    lit := Nat64Lit (check_nat64 env at s)
+  | T.Prim T.Int, PreLit (s, (T.Nat | T.Int)) ->
+    lit := IntLit (check_int env at s)
+  | T.Prim T.Int8, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int8Lit (check_int8 env at s)
+  | T.Prim T.Int16, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int16Lit (check_int16 env at s)
+  | T.Prim T.Int32, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int32Lit (check_int32 env at s)
+  | T.Prim T.Int64, PreLit (s, (T.Nat | T.Int)) ->
+    lit := Int64Lit (check_int64 env at s)
+  | T.Prim T.Float, PreLit (s, (T.Nat | T.Int | T.Float)) ->
+    lit := FloatLit (check_float env at s)
+  | T.Prim T.Blob, PreLit (s, T.Text) ->
+    lit := BlobLit s
+  | t, _ ->
+    let t' = T.Prim (infer_lit env lit at) in
+    if not (T.sub t' t) then
+      error env at "M0050"
+        "literal of type%a\ndoes not have expected type%a"
+        display_typ t'
+        display_typ_expand t
+
+
+(* Coercions *)
+
+let array_obj t =
+  let open T in
+  let immut t =
+    [ {lab = "get";  typ = Func (Local, Returns, [], [Prim Nat], [t]); src = empty_src};
+      {lab = "size";  typ = Func (Local, Returns, [], [], [Prim Nat]); src = empty_src};
+      {lab = "keys"; typ = Func (Local, Returns, [], [], [iter_obj (Prim Nat)]); src = empty_src};
+      {lab = "vals"; typ = Func (Local, Returns, [], [], [iter_obj t]); src = empty_src};
+    ] in
+  let mut t = immut t @
+    [ {lab = "put"; typ = Func (Local, Returns, [], [Prim Nat; t], []); src = empty_src} ] in
+  Object,
+  List.sort compare_field (match t with Mut t' -> mut t' | t -> immut t)
+
+let blob_obj () =
+  let open T in
+  Object,
+  [ {lab = "vals"; typ = Func (Local, Returns, [], [], [iter_obj (Prim Nat8)]); src = empty_src};
+    {lab = "size";  typ = Func (Local, Returns, [], [], [Prim Nat]); src = empty_src};
+  ]
+
+let text_obj () =
+  let open T in
+  Object,
+  [ {lab = "chars"; typ = Func (Local, Returns, [], [], [iter_obj (Prim Char)]); src = empty_src};
+    {lab = "size";  typ = Func (Local, Returns, [], [], [Prim Nat]); src = empty_src};
+  ]
+
+
+(* Expressions *)
+
+let error_duplicate env kind id =
+  error env id.at "M0051" "duplicate definition for %s%s in block" kind id.it
+
+
+let error_bin_op env at t1 t2 =
+  error env at "M0060"
+    "operator is not defined for operand types%a\nand%a"
+    display_typ_expand t1
+    display_typ_expand t2
+
+let rec infer_exp env exp : T.typ =
+  infer_exp' T.as_immut env exp
+
+and infer_exp_mut env exp : T.typ =
+  infer_exp' Fun.id env exp
+
+and infer_exp_promote env exp : T.typ =
+  let t = infer_exp env exp in
+  let t' = T.promote t in
+  if t' = T.Pre then
+    error env exp.at "M0053"
+      "cannot infer type of expression while trying to infer surrounding class type,\nbecause its type is a forward reference to type%a"
+      display_typ_expand t;
+  t'
+
+and infer_exp' f env exp : T.typ =
+  assert (exp.note.note_typ = T.Pre);
+  let t = infer_exp'' env exp in
+  assert (t <> T.Pre);
+  let t' = f t in
+  if not env.pre then begin
+    assert (T.normalize t' <> T.Pre);
+    let e = A.infer_effect_exp exp in
+    exp.note <- {note_typ = T.normalize t'; note_eff = e}
+  end;
+  t'
+
+and infer_exp'' env exp : T.typ =
+  let context = env.context in
+  let in_actor = env.in_actor in
+  let env = {env with in_actor = false; in_prog = false; context = exp.it::env.context} in
+  match exp.it with
+  | PrimE _ ->
+    error env exp.at "M0054" "cannot infer type of primitive"
+  | VarE id ->
+    use_identifier env id.it;
+    (match T.Env.find_opt id.it env.vals with
+    | Some (T.Pre, _, _, _) ->
+      error env id.at "M0055" "cannot infer type of forward variable %s" id.it;
+    | Some (t, _, _, Unavailable) ->
+      if !Flags.compiled then
+        error env id.at "M0056" "variable %s is in scope but not available in compiled code" id.it
+      else t
+    | Some (t, _, _, Available) -> t
+    | None ->
+      error env id.at "M0057" "unbound variable %s" id.it
+    )
+  | LitE lit ->
+    T.Prim (infer_lit env lit exp.at)
+  | ActorUrlE exp' ->
+    if not env.pre then check_exp_strong env T.text exp';
+    error env exp.at "M0058" "no type can be inferred for actor reference"
+  | UnE (ot, op, exp1) ->
+    let t1 = infer_exp_promote env exp1 in
+    let t = Operator.type_unop op t1 in
+    if not env.pre then begin
+      assert (!ot = Type.Pre);
+      if not (Operator.has_unop op t) then
+        error env exp.at "M0059" "operator is not defined for operand type%a"
+          display_typ_expand t;
+      ot := t;
+    end;
+    t
+  | BinE (ot, exp1, op, exp2) ->
+    let t1, t2 = infer_bin_exp env exp1 exp2 in
+    let t = Operator.type_binop op (T.lub (T.promote t1) (T.promote t2)) in
+    if not env.pre then begin
+      assert (!ot = Type.Pre);
+      if not (Operator.has_binop op t) then
+        error_bin_op env exp.at t1 t2
+      else if op = Operator.SubOp && T.eq t T.nat then
+        warn env exp.at "M0155" "operator may trap for inferred type%a"
+          display_typ_expand t;
+      ot := t
+    end;
+    t
+  | RelE (ot, exp1, op, exp2) ->
+    if not env.pre then begin
+      assert (!ot = Type.Pre);
+      let t1, t2 = infer_bin_exp env exp1 exp2 in
+      let t = Operator.type_relop op (T.lub (T.promote t1) (T.promote t2)) in
+      if not (Operator.has_relop op t) then
+        error_bin_op env exp.at t1 t2;
+      if not (T.eq t t1 || T.eq t t2) && not (T.sub T.nat t1 && T.sub T.nat t2) then
+        if T.eq t1 t2 then
+          warn env exp.at "M0061"
+            "comparing abstract type%a\nto itself at supertype%a"
+            display_typ_expand t1
+            display_typ_expand t
+        else
+          warn env exp.at "M0062"
+            "comparing incompatible types%a\nand%a\nat common supertype%a"
+            display_typ_expand t1
+            display_typ_expand t2
+            display_typ_expand t;
+      ot := t;
+    end;
+    T.bool
+  | ShowE (ot, exp1) ->
+    if not env.pre then begin
+      let t = infer_exp_promote env exp1 in
+      if not (Show.can_show t) then
+        error env exp.at "M0063" "show is not defined for operand type%a"
+          display_typ_expand t;
+      ot := t
+    end;
+    T.text
+  | ToCandidE exps ->
+    if not env.pre then begin
+        let ts = List.map (infer_exp env) exps in
+        if not (T.shared (T.seq ts)) then
+          error env exp.at "M0175" "to_candid argument must have shared type, but instead has non-shared type%a"
+            display_typ_expand (T.seq ts);
+      end;
+    T.Prim T.Blob
+  | FromCandidE exp1 ->
+    error env exp.at "M0176" "from_candid requires but is missing a known type (from context)"
+  | TupE exps ->
+    let ts = List.map (infer_exp env) exps in
+    T.Tup ts
+  | OptE exp1 ->
+    let t1 = infer_exp env exp1 in
+    T.Opt t1
+  | DoOptE exp1 ->
+    let env' = add_lab env "!" (T.Prim T.Null) in
+    let t1 = infer_exp env' exp1 in
+    T.Opt t1
+  | BangE exp1 ->
+    begin
+      let t1 = infer_exp_promote env exp1 in
+      if Option.is_none (T.Env.find_opt "!" env.labs) then
+        local_error env exp.at "M0064" "misplaced '!' (no enclosing 'do ? { ... }' expression)";
+      try
+        T.as_opt_sub t1
+      with Invalid_argument _ ->
+        error env exp1.at "M0065"
+          "expected option type before '!', but expression produces type%a"
+          display_typ_expand t1
+    end
+  | TagE (id, exp1) ->
+    let t1 = infer_exp env exp1 in
+    T.Variant [T.{lab = id.it; typ = t1; src = empty_src}]
+  | ProjE (exp1, n) ->
+    let t1 = infer_exp_promote env exp1 in
+    (try
+      let ts = T.as_tup_sub n t1 in
+      match List.nth_opt ts n with
+      | Some t -> t
+      | None ->
+        error env exp.at "M0066" "tuple projection %n is out of bounds for type%a"
+          n
+          display_typ_expand t1
+    with Invalid_argument _ ->
+      error env exp1.at "M0067"
+        "expected tuple type, but expression produces type%a"
+        display_typ_expand t1
+    )
+  | ObjBlockE (obj_sort, typ_opt, dec_fields) ->
+    if obj_sort.it = T.Actor then begin
+      error_in [Flags.WASIMode; Flags.WasmMode] env exp.at "M0068"
+        "actors are not supported";
+      match context with
+      | (AsyncE _ :: AwaitE _ :: _ :: _ ) ->
+         error_in [Flags.ICMode; Flags.RefMode] env exp.at "M0069"
+           "non-toplevel actor; an actor can only be declared at the toplevel of a program"
+      | _ -> ()
+    end;
+    let env' =
+      if obj_sort.it = T.Actor then
+        { env with
+          in_actor = true;
+          async = C.SystemCap C.top_cap }
+      else env
+    in
+    let t = infer_obj env' obj_sort.it dec_fields exp.at in
+    begin match env.pre, typ_opt with
+      | false, Some typ ->
+        let t' = check_typ env' typ in
+        if not (T.sub t t') then
+          local_error env exp.at "M0192"
+            "body of type%a\ndoes not match expected type%a"
+            display_typ_expand t
+            display_typ_expand t'
+      | _ -> ()
+    end;
+    t
+  | ObjE (exp_bases, exp_fields) ->
+    let open List in
+    check_ids env "object" "field"
+      (map (fun (ef : exp_field) -> ef.it.id) exp_fields);
+    let fts = map (infer_exp_field env) exp_fields in
+    let bases = map (fun b -> infer_exp_promote env b, b) exp_bases in
+    let homonymous_fields ft1 ft2 = T.compare_field ft1 ft2 = 0 in
+
+    (* removing explicit fields from the bases *)
+    let strip (base_t, base) =
+      let s, base_fts =
+        try T.as_obj base_t with Invalid_argument _ ->
+          error env base.at "M0093"
+            "expected object type, but expression produces type%a"
+            display_typ_expand base_t in
+      (* forbid actors as bases *)
+      if s = T.Actor then
+        error env base.at "M0178"
+          "actors cannot serve as bases in record extensions";
+      T.(Obj (Object, filter (fun ft -> not (exists (homonymous_fields ft) fts)) base_fts))
+    in
+    let stripped_bases = map strip bases in
+
+    let ambiguous_fields ft1 ft2 =
+      homonymous_fields ft1 ft2 &&
+      (* allow equivalent type fields *)
+      T.(match ft1.typ, ft2.typ with
+         (* homonymous type fields are ambiguous when unequal *)
+         | Typ c1, Typ c2 ->  not (T.eq ft1.typ ft2.typ)
+         (* homonymous value fields are always ambiguous *)
+         | _ -> true)
+    in
+
+    (* field disjointness of stripped bases *)
+    let rec disjoint = function
+      | [] | [_] -> ()
+      | (h, h_exp) :: t ->
+        let avoid ft =
+          let avoid_fields b b_fts =
+            if exists (ambiguous_fields ft) b_fts then
+              begin
+                let frag_typ, frag_sug = match ft.T.typ with
+                  | T.Typ c -> "type ", ""
+                  | _ -> "", " (consider overwriting)" in
+                info env h_exp.at "%sfield also present in base, here%s" frag_typ frag_sug;
+                error env b.at "M0177"
+                  "ambiguous %sfield in base%a"
+                  frag_typ
+                  display_lab ft.T.lab
+              end in
+          iter (fun (b_t, b) -> avoid_fields b (T.as_obj b_t |> snd)) t in
+        iter avoid (T.as_obj h |> snd);
+        disjoint t in
+    disjoint (map2 (fun b_t b -> b_t, b) stripped_bases exp_bases);
+
+    (* do not allow var fields for now (to avoid aliasing) *)
+    begin if not (!Flags.experimental_field_aliasing) then
+      let immutable_base b_typ b_exp =
+        let constant_field (ft : T.field) =
+          if T.(is_mut ft.typ) then
+            begin
+              info env b_exp.at "overwrite field to resolve error";
+              error env b_exp.at "M0179"
+                "base has non-aliasable var field%a"
+                display_lab ft.T.lab
+            end
+        in
+        iter constant_field (T.as_obj b_typ |> snd)
+      in
+      iter2 immutable_base stripped_bases exp_bases
+    end;
+    let t_base = T.(fold_left glb (Obj (Object, [])) stripped_bases) in
+    T.(glb t_base (Obj (Object, sort T.compare_field fts)))
+  | DotE (exp1, id) ->
+    let t1 = infer_exp_promote env exp1 in
+    let _s, tfs =
+      try T.as_obj_sub [id.it] t1 with Invalid_argument _ ->
+      try array_obj (T.as_array_sub t1) with Invalid_argument _ ->
+      try blob_obj (T.as_prim_sub T.Blob t1) with Invalid_argument _ ->
+      try text_obj (T.as_prim_sub T.Text t1) with Invalid_argument _ ->
+        error env exp1.at "M0070"
+          "expected object type, but expression produces type%a"
+          display_typ_expand t1
+    in
+    (match T.lookup_val_field id.it tfs with
+    | T.Pre ->
+      error env exp.at "M0071"
+        "cannot infer type of forward field reference %s"
+        id.it
+    | t ->
+      Option.iter
+        (warn env exp.at "M0154" "field %s is deprecated:\n%s" id.it)
+        (T.lookup_val_deprecation id.it tfs);
+      t
+    | exception Invalid_argument _ ->
+      error env exp1.at "M0072"
+        "field %s does not exist in type%a"
+        id.it
+        display_typ_expand t1
+    )
+  | AssignE (exp1, exp2) ->
+    if not env.pre then begin
+      let t1 = infer_exp_mut env exp1 in
+      try
+        let t2 = T.as_mut t1 in
+        check_exp_strong env t2 exp2
+      with Invalid_argument _ ->
+        error env exp.at "M0073" "expected mutable assignment target";
+    end;
+    T.unit
+  | ArrayE (mut, exps) ->
+    let ts = List.map (infer_exp env) exps in
+    let t1 = List.fold_left T.lub T.Non ts in
+    if not env.pre && inconsistent t1 ts then
+      warn env exp.at "M0074"
+        "this array has type%a\nbecause elements have inconsistent types"
+        display_typ (T.Array t1);
+    T.Array (match mut.it with Const -> t1 | Var -> T.Mut t1)
+  | IdxE (exp1, exp2) ->
+    let t1 = infer_exp_promote env exp1 in
+    (try
+      let t = T.as_array_sub t1 in
+      if not env.pre then check_exp_strong env T.nat exp2;
+      t
+    with Invalid_argument _ ->
+      error env exp1.at "M0075"
+        "expected array type, but expression produces type%a"
+        display_typ_expand t1
+    )
+  | FuncE (_, shared_pat, typ_binds, pat, typ_opt, _sugar, exp1) ->
+    if not env.pre && not in_actor && T.is_shared_sort shared_pat.it then begin
+      error_in [Flags.WASIMode; Flags.WasmMode] env exp1.at "M0076"
+        "shared functions are not supported";
+      if not in_actor then
+        error_in [Flags.ICMode; Flags.RefMode] env exp1.at "M0077"
+          "a shared function is only allowed as a public field of an actor";
+    end;
+    let typ = match typ_opt with
+      | Some typ -> typ
+      | None -> {it = TupT []; at = no_region; note = T.Pre}
+    in
+    let sort, ve = check_shared_pat env shared_pat in
+    let cs, tbs, te, ce = check_typ_binds env typ_binds in
+    let c, ts2 = as_codomT sort typ in
+    check_shared_return env typ.at sort c ts2;
+    let env' = infer_async_cap (adjoin_typs env te ce) sort cs tbs (Some exp1) exp.at in
+    let t1, ve1 = infer_pat_exhaustive (if T.is_shared_sort sort then local_error else warn) env' pat in
+    let ve2 = T.Env.adjoin ve ve1 in
+    let ts2 = List.map (check_typ env') ts2 in
+    typ.note <- T.seq ts2; (* HACK *)
+    let codom = T.codom c (fun () -> T.Con(List.hd cs,[])) ts2 in
+    if not env.pre then begin
+      let env'' =
+        { env' with
+          labs = T.Env.empty;
+          rets = Some codom;
+          (* async = None; *) }
+      in
+      let initial_usage = enter_scope env'' in
+      check_exp_strong (adjoin_vals env'' ve2) codom exp1;
+      leave_scope env ve2 initial_usage;
+      if Type.is_shared_sort sort then begin
+        check_shared_binds env exp.at tbs;
+        if not (T.shared t1) then
+          error_shared env t1 pat.at "M0031"
+            "shared function has non-shared parameter type%a"
+            display_typ_expand t1;
+        List.iter (fun t ->
+          if not (T.shared t) then
+            error_shared env t typ.at "M0032"
+              "shared function has non-shared return type%a"
+              display_typ_expand t;
+        ) ts2;
+        match c, ts2 with
+        | T.Returns, [] when sort = T.Shared T.Write ->
+          if not (is_ignore_asyncE exp1) then
+            error env exp1.at "M0078"
+              "shared function with () result type has unexpected body:\n  the body must either be of sugared form '{ ... }' \n  or explicit form '= ignore ((async ...) : async ())'"
+        | T.Promises, _ ->
+          if not (is_asyncE exp1) then
+            error env exp1.at "M0079"
+              "shared function with async result type has non-async body"
+        | _ ->
+          error env typ.at "M0041" "shared function has non-async result type%a"
+            display_typ_expand codom
+      end
+    end;
+    let ts1 = match pat.it with TupP _ -> T.seq_of_tup t1 | _ -> [t1] in
+    T.Func (sort, c, T.close_binds cs tbs, List.map (T.close cs) ts1, List.map (T.close cs) ts2)
+  | CallE (exp1, inst, exp2) ->
+    infer_call env exp1 inst exp2 exp.at None
+  | BlockE decs ->
+    let t, _ = infer_block env decs exp.at false in
+    t
+  | NotE exp1 ->
+    if not env.pre then check_exp_strong env T.bool exp1;
+    T.bool
+  | AndE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.bool
+  | OrE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.bool
+  | ImpliesE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.bool
+  | OldE exp1 ->
+    infer_exp_promote env exp1
+  | IfE (exp1, exp2, exp3) ->
+    if not env.pre then check_exp_strong env T.bool exp1;
+    let t2 = infer_exp env exp2 in
+    let t3 = infer_exp env exp3 in
+    let t = T.lub t2 t3 in
+    if not env.pre && inconsistent t [t2; t3] then
+      warn env exp.at "M0081"
+        "this if has type%a\nbecause branches have inconsistent types,\ntrue produces%a\nfalse produces%a"
+        display_typ t
+        display_typ_expand t2
+        display_typ_expand t3;
+    t
+  | SwitchE (exp1, cases) ->
+    let t1 = infer_exp_promote env exp1 in
+    let t = infer_cases env t1 T.Non cases in
+    if not env.pre then
+      coverage_cases "switch" env cases t1 exp.at;
+    t
+  | TryE (exp1, cases) ->
+    let t1 = infer_exp env exp1 in
+    let t2 = infer_cases env T.catch T.Non cases in
+    if not env.pre then begin
+      check_ErrorCap env "try" exp.at;
+      coverage_cases "try handler" env cases T.catch exp.at
+    end;
+    T.lub t1 t2
+  | WhileE (exp1, exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.bool exp1;
+      check_exp_strong env T.unit exp2
+    end;
+    T.unit
+  | LoopE (exp1, None) ->
+    if not env.pre then begin
+      check_exp_strong env T.unit exp1
+    end;
+    T.Non
+  | LoopE (exp1, Some exp2) ->
+    if not env.pre then begin
+      check_exp_strong env T.unit exp1;
+      check_exp_strong env T.bool exp2
+    end;
+    T.unit
+  | ForE (pat, exp1, exp2) ->
+    if not env.pre then begin
+      let t1 = infer_exp_promote env exp1 in
+      (try
+        let _, tfs = T.as_obj_sub ["next"] t1 in
+        let t = T.lookup_val_field "next" tfs in
+        let t1, t2 = T.as_mono_func_sub t in
+        if not (T.sub T.unit t1) then raise (Invalid_argument "");
+        let t2' = T.as_opt_sub t2 in
+        let ve = check_pat_exhaustive warn env t2' pat in
+        check_exp_strong (adjoin_vals env ve) T.unit exp2
+      with Invalid_argument _ | Not_found ->
+        local_error env exp1.at "M0082"
+          "expected iterable type, but expression has type%a"
+          display_typ_expand t1
+      );
+    end;
+    T.unit
+  | LabelE (id, typ, exp1) ->
+    let t = check_typ env typ in
+    if not env.pre then check_exp (add_lab env id.it t) t exp1;
+    t
+  | DebugE exp1 ->
+    if not env.pre then check_exp_strong env T.unit exp1;
+    T.unit
+  | BreakE (id, exp1) ->
+    (match T.Env.find_opt id.it env.labs with
+    | Some t ->
+      if not env.pre then check_exp env t exp1
+    | None ->
+      let name =
+        match String.split_on_char ' ' id.it with
+        | ["continue"; name] -> name
+        | _ -> id.it
+      in local_error env id.at "M0083" "unbound label %s" name
+    );
+    T.Non
+  | RetE exp1 ->
+    if not env.pre then begin
+      match env.rets with
+      | Some T.Pre ->
+        local_error env exp.at "M0084" "cannot infer return type"
+      | Some t ->
+        check_exp_strong env t exp1
+      | None ->
+        local_error env exp.at "M0085" "misplaced return"
+    end;
+    T.Non
+  | ThrowE exp1 ->
+    if not env.pre then begin
+      check_ErrorCap env "throw" exp.at;
+      check_exp_strong env T.throw exp1
+    end;
+    T.Non
+  | AsyncE (s, typ_bind, exp1) ->
+    error_in [Flags.WASIMode; Flags.WasmMode] env exp1.at "M0086"
+      "async expressions are not supported";
+    let t1, next_cap = check_AsyncCap env "async expression" exp.at in
+    let c, tb, ce, cs = check_typ_bind env typ_bind in
+    let ce_scope = T.Env.add T.default_scope_var c ce in (* pun scope var with c *)
+    let env' =
+      {(adjoin_typs env ce_scope cs) with
+        labs = T.Env.empty;
+        rets = Some T.Pre;
+        async = next_cap c;
+        scopes = T.ConEnv.add c exp.at env.scopes } in
+    let t = infer_exp env' exp1 in
+    let t' = T.open_ [t1] (T.close [c] t)  in
+    if not (T.shared t') then
+      error_shared env t' exp1.at "M0033" "async type has non-shared content type%a"
+        display_typ_expand t';
+    T.Async (s, t1, t')
+  | AwaitE (s, exp1) ->
+    let t0 = check_AwaitCap env "await" exp.at in
+    let t1 = infer_exp_promote env exp1 in
+    (try
+       let (t2, t3) = T.as_async_sub s t0 t1 in
+       if not (T.eq t0 t2) then begin
+          local_error env exp1.at "M0087"
+            "ill-scoped await: expected async type from current scope %s, found async type from other scope %s%s%s"
+           (T.string_of_typ_expand t0)
+           (T.string_of_typ_expand t2)
+           (associated_region env t0 exp.at)
+           (associated_region env t2 exp.at);
+         scope_info env t0 exp.at;
+         scope_info env t2 exp.at;
+       end;
+       t3
+     with Invalid_argument _ ->
+       error env exp1.at "M0088"
+         "expected async%s type, but expression has type%a%s"
+         (if s = T.Fut then "" else "*")
+         display_typ_expand t1
+         (if T.is_async t1 then
+            (if s = T.Fut then
+              "\nUse keyword 'await*' (not 'await') to consume this type."
+            else
+              "\nUse keyword 'await' (not 'await*') to consume this type.")
+          else "")
+    )
+  | AssertE (_, exp1) ->
+    if not env.pre then check_exp_strong env T.bool exp1;
+    T.unit
+  | AnnotE (exp1, typ) ->
+    let t = check_typ env typ in
+    if not env.pre then check_exp_strong env t exp1;
+    t
+  | IgnoreE exp1 ->
+    if not env.pre then begin
+      check_exp_strong env T.Any exp1;
+      if T.sub exp1.note.note_typ T.unit then
+        warn env exp.at "M0089" "redundant ignore, operand already has type ()"
+    end;
+    T.unit
+  | ImportE (f, ri) ->
+    check_import env exp.at f ri
+
+and infer_bin_exp env exp1 exp2 =
+  match is_explicit_exp exp1, is_explicit_exp exp2 with
+  | true, false ->
+    let t1 = T.normalize (infer_exp env exp1) in
+    if not env.pre then check_exp_weak env t1 exp2;
+    t1, t1
+  | false, true ->
+    let t2 = T.normalize (infer_exp env exp2) in
+    if not env.pre then check_exp_weak env t2 exp1;
+    t2, t2
+  | _ ->
+    let t1 = T.normalize (infer_exp env exp1) in
+    let t2 = T.normalize (infer_exp env exp2) in
+    t1, t2
+
+and infer_exp_field env rf =
+  let { mut; id; exp } = rf.it in
+  let t = infer_exp env exp in
+  let t1 = if mut.it = Syntax.Var then T.Mut t else t in
+  T.{ lab = id.it; typ = t1; src = empty_src }
+
+and check_exp_strong env t exp =
+  check_exp {env with weak = false} t exp
+
+and check_exp_weak env t exp =
+  check_exp {env with weak = true} t exp
+
+and check_exp env t exp =
+  assert (not env.pre);
+  assert (exp.note.note_typ = T.Pre);
+  assert (t <> T.Pre);
+  let t' = check_exp' env (T.normalize t) exp in
+  let e = A.infer_effect_exp exp in
+  exp.note <- {note_typ = t'; note_eff = e}
+
+and check_exp' env0 t exp : T.typ =
+  let env = {env0 with in_prog = false; in_actor = false; context = exp.it :: env0.context } in
+  match exp.it, t with
+  | PrimE s, T.Func _ ->
+    t
+  | LitE lit, _ ->
+    check_lit env t lit exp.at;
+    t
+  | ActorUrlE exp', t' ->
+    check_exp_strong env T.text exp';
+    begin match T.normalize t' with
+    | T.(Obj (Actor, _)) -> t'
+    | _ -> error env exp.at "M0090" "actor reference must have an actor type"
+    end
+  | UnE (ot, op, exp1), _ when Operator.has_unop op t ->
+    ot := t;
+    check_exp env t exp1;
+    t
+  | BinE (ot, exp1, op, exp2), _ when Operator.has_binop op t ->
+    ot := t;
+    check_exp env t exp1;
+    check_exp env t exp2;
+    if env.weak && op = Operator.SubOp && T.eq t T.nat then
+      warn env exp.at "M0155" "operator may trap for inferred type%a"
+        display_typ_expand t;
+    t
+  | ToCandidE exps, _ ->
+    if not env.pre then begin
+      let ts = List.map (infer_exp env) exps in
+      if not (T.sub (T.Prim T.Blob) t) then
+        error env exp.at "M0172" "to_candid produces a Blob that is not a subtype of%a"
+          display_typ_expand t;
+      if not (T.shared (T.seq ts)) then
+          error env exp.at "M0173" "to_candid argument must have shared type, but instead has non-shared type%a"
+          display_typ_expand (T.seq ts);
+      end;
+    T.Prim T.Blob
+  | FromCandidE exp1, t when T.shared t && T.is_opt t ->
+    check_exp env (T.Prim T.Blob) exp1;
+    t
+  | FromCandidE _, t ->
+      error env exp.at "M0174" "from_candid produces an optional shared type, not type%a"
+        display_typ_expand t
+  | TupE exps, T.Tup ts when List.length exps = List.length ts ->
+    List.iter2 (check_exp env) ts exps;
+    t
+  | ObjE ([], exp_fields), T.Obj(T.Object, fts) -> (* TODO: infer bases? Default does a decent job. *)
+    check_ids env "object" "field"
+      (List.map (fun (ef : exp_field) -> ef.it.id) exp_fields);
+    List.iter (fun ef -> check_exp_field env ef fts) exp_fields;
+    List.iter (fun ft ->
+      if not (List.exists (fun (ef : exp_field) -> ft.T.lab = ef.it.id.it) exp_fields)
+      then local_error env exp.at "M0151"
+        "object literal is missing field %s from expected type%a"
+        ft.T.lab
+        display_typ_expand t;
+    ) fts;
+    t
+  | OptE exp1, _ when T.is_opt t ->
+    check_exp env (T.as_opt t) exp1;
+    t
+  | DoOptE exp1, _ when T.is_opt t ->
+    let env' = add_lab env "!" (T.Prim T.Null) in
+    check_exp env' (T.as_opt t) exp1;
+    t
+  | BangE exp1, t ->
+    if Option.is_none (T.Env.find_opt "!" env.labs) then
+      local_error env exp.at "M0064" "misplaced '!' (no enclosing 'do ? { ... }' expression)";
+    check_exp env (T.Opt t) exp1;
+    t
+  | ArrayE (mut, exps), T.Array t' ->
+    if (mut.it = Var) <> T.is_mut t' then
+      local_error env exp.at "M0091"
+        "%smutable array expression cannot produce expected type%a"
+        (if mut.it = Const then "im" else "")
+        display_typ_expand (T.Array t');
+    List.iter (check_exp env (T.as_immut t')) exps;
+    t
+  | AsyncE (s1, tb, exp1), T.Async (s2, t1', t') ->
+    error_in [Flags.WASIMode; Flags.WasmMode] env exp1.at "M0086"
+      "async expressions are not supported";
+    let t1, next_cap = check_AsyncCap env "async expression" exp.at in
+    if s1 <> s2 then begin
+      local_error env exp.at "M0183"
+        "async expression cannot produce expected async type %a.\n%s"
+        display_typ_expand t
+        (if s2 = T.Fut then
+          "Use keyword 'async' (not 'async*') to produce the expected type."
+         else
+          "Use keyword 'async*' (not 'async') to produce the expected type.")
+    end;
+    if not (T.eq t1 t1') then begin
+      local_error env exp.at "M0092"
+        "async at scope%a\ncannot produce expected scope%a%s%s"
+        display_typ_expand t1
+        display_typ_expand t1'
+        (associated_region env t1 exp.at) (*FIX ME?*)
+        (associated_region env t1' exp.at);
+      scope_info env t1 exp.at;
+      scope_info env t1' exp.at
+    end;
+    let c, tb, ce, cs = check_typ_bind env tb in
+    let ce_scope = T.Env.add T.default_scope_var c ce in (* pun scope var with c *)
+    let env' =
+      {(adjoin_typs env ce_scope cs) with
+        labs = T.Env.empty;
+        rets = Some t';
+        async = next_cap c;
+        scopes = T.ConEnv.add c exp.at env.scopes;
+      } in
+    check_exp env' t' exp1;
+    t
+  | BlockE decs, _ ->
+    ignore (check_block env t decs exp.at);
+    t
+  | IfE (exp1, exp2, exp3), _ ->
+    check_exp_strong env T.bool exp1;
+    check_exp env t exp2;
+    check_exp env t exp3;
+    t
+  | SwitchE (exp1, cases), _ ->
+    let t1 = infer_exp_promote env exp1 in
+    check_cases env t1 t cases;
+    coverage_cases "switch" env cases t1 exp.at;
+    t
+  | TryE (exp1, cases), _ ->
+    check_ErrorCap env "try" exp.at;
+    check_exp env t exp1;
+    check_cases env T.catch t cases;
+    coverage_cases "try handler" env cases T.catch exp.at;
+    t
+  (* TODO: allow shared with one scope par *)
+  | FuncE (_, shared_pat,  [], pat, typ_opt, _sugar, exp), T.Func (s, c, [], ts1, ts2) ->
+    let sort, ve = check_shared_pat env shared_pat in
+    if not env.pre && not env0.in_actor && T.is_shared_sort sort then
+      error_in [Flags.ICMode; Flags.RefMode] env exp.at "M0077"
+        "a shared function is only allowed as a public field of an actor";
+    let ve1 = check_pat_exhaustive (if T.is_shared_sort sort then local_error else warn) env (T.seq ts1) pat in
+    let ve2 = T.Env.adjoin ve ve1 in
+    let codom = T.codom c (fun () -> assert false) ts2 in
+    let t2 = match typ_opt with
+      | None -> codom
+      | Some typ -> check_typ env typ
+    in
+    if sort <> s then
+      error env exp.at "M0094"
+        "%sshared function does not match expected %sshared function type"
+        (if sort = T.Local then "non-" else "")
+        (if s = T.Local then "non-" else "");
+    if not (T.sub t2 codom) then
+      error env exp.at "M0095"
+        "function return type%a\ndoes not match expected return type%a"
+        display_typ_expand t2
+        display_typ_expand codom;
+    let env' =
+      { env with
+        labs = T.Env.empty;
+        rets = Some t2;
+        async = C.NullCap; }
+    in
+    check_exp_strong (adjoin_vals env' ve2) t2 exp;
+    t
+  | CallE (exp1, inst, exp2), _ ->
+    let t' = infer_call env exp1 inst exp2 exp.at (Some t) in
+    if not (T.sub t' t) then
+      local_error env0 exp.at "M0096"
+        "expression of type%a\ncannot produce expected type%a"
+        display_typ_expand t'
+        display_typ_expand t;
+    t'
+  | TagE (id, exp1), T.Variant fs when List.exists (fun T.{lab; _} -> lab = id.it) fs ->
+    let {T.typ; _} = List.find (fun T.{lab; typ;_} -> lab = id.it) fs in
+    check_exp env typ exp1 ;
+    t
+  | _ ->
+    let t' = infer_exp env0 exp in
+    if not (T.sub t' t) then
+      local_error env0 exp.at "M0096"
+        "expression of type%a\ncannot produce expected type%a"
+        display_typ_expand t'
+        display_typ_expand t;
+    t'
+
+and check_exp_field env (ef : exp_field) fts =
+  let { mut; id; exp } = ef.it in
+  let ft_opt = List.find_opt (fun ft -> ft.T.lab = id.it) fts in
+  match ft_opt with
+  | Some { T.typ = T.Mut t; _ } ->
+    if mut.it <> Syntax.Var then
+      error env ef.at "M0149" "expected mutable 'var' field %s of type%a\nbut found immutable field (insert 'var'?)"
+        id.it
+        display_typ t;
+    check_exp env t exp
+  | Some { T.typ = t; _ } ->
+    if mut.it = Syntax.Var then
+      error env ef.at "M0150" "expected immutable field %s of type%a\nbut found mutable 'var' field (delete 'var'?)"
+        id.it
+        display_typ t;
+    check_exp env t exp
+  | None ->
+    ignore (infer_exp env exp)
+
+and infer_call env exp1 inst exp2 at t_expect_opt =
+  let n = match inst.it with None -> 0 | Some (_, typs) -> List.length typs in
+  let t1 = infer_exp_promote env exp1 in
+  let sort, tbs, t_arg, t_ret =
+    try T.as_func_sub T.Local n t1
+    with Invalid_argument _ ->
+      local_error env exp1.at "M0097"
+        "expected function type, but expression produces type%a"
+        display_typ_expand t1;
+      if inst.it = None then
+        info env (Source.between exp1.at exp2.at)
+          "this looks like an unintended function call, perhaps a missing ';'?";
+      T.as_func_sub T.Local n T.Non
+  in
+  let ts, t_arg', t_ret' =
+    match tbs, inst.it with
+    | [], (None | Some (_, []))  (* no inference required *)
+    | [T.{sort = Scope;_}], _  (* special case to allow t_arg driven overload resolution *)
+    | _, Some _ ->
+      (* explicit instantiation, check argument against instantiated domain *)
+      let typs = match inst.it with None -> [] | Some (_, typs) -> typs in
+      let ts = check_inst_bounds env sort tbs typs t_ret at in
+      let t_arg' = T.open_ ts t_arg in
+      let t_ret' = T.open_ ts t_ret in
+      if not env.pre then check_exp_strong env t_arg' exp2;
+      ts, t_arg', t_ret'
+    | _::_, None -> (* implicit, infer *)
+      let t2 = infer_exp env exp2 in
+      try
+        (* i.e. exists minimal ts .
+                t2 <: open_ ts t_arg /\
+                t_expect_opt == Some t -> open ts_ t_ret <: t *)
+        let ts =
+          Bi_match.bi_match_call
+            (scope_of_env env)
+            (tbs, t_arg, t_ret)
+            t2
+            t_expect_opt
+        in
+        let t_arg' = T.open_ ts t_arg in
+        let t_ret' = T.open_ ts t_ret in
+(*
+        if not env.pre then
+          info env at "inferred instantiation <%s>"
+            (String.concat ", " (List.map T.string_of_typ ts));
+*)
+        ts, t_arg', t_ret'
+      with Bi_match.Bimatch msg ->
+        error env at "M0098"
+          "cannot implicitly instantiate function of type%a\nto argument of type%a%s\nbecause %s"
+          display_typ t1
+          display_typ t2
+          (match t_expect_opt with
+           | None -> ""
+           | Some t ->
+             Format.asprintf "\nto produce result of type%a" display_typ t)
+          msg
+  in
+  inst.note <- ts;
+  if not env.pre then begin
+    if Type.is_shared_sort sort then begin
+      if not (T.concrete t_arg') then
+        error env exp1.at "M0099"
+          "shared function argument contains abstract type%a"
+          display_typ_expand t_arg';
+      if not (T.concrete t_ret') then
+        error env exp2.at "M0100"
+          "shared function call result contains abstract type%a"
+          display_typ_expand t_ret';
+    end;
+    match T.(is_shared_sort sort || is_async t_ret'), inst.it, tbs with
+    | false, Some (true, _), ([] | T.{ sort = Type; _ } :: _) ->
+       local_error env inst.at "M0196" "unexpected `system` capability (try deleting it)"
+    | false, (None | Some (false, _)), T.{ sort = Scope; _ } :: _ ->
+       warn env at "M0195" "this function call implicitly requires `system` capability and may perform undesired actions (please review the call and provide a type instantiation `<system%s>` to suppress this warning)" (if List.length tbs = 1 then "" else ", ...")
+    | _ -> ()
+  end;
+  (* note t_ret' <: t checked by caller if necessary *)
+  t_ret'
+
+
+(* Cases *)
+
+and infer_cases env t_pat t cases : T.typ =
+  List.fold_left (infer_case env t_pat) t cases
+
+and infer_case env t_pat t case =
+  let {pat; exp} = case.it in
+  let ve = check_pat env t_pat pat in
+  let initial_usage = enter_scope env in
+  let t' = recover_with T.Non (infer_exp (adjoin_vals env ve)) exp in
+  leave_scope env ve initial_usage;
+  let t'' = T.lub t t' in
+  if not env.pre && inconsistent t'' [t; t'] then
+    warn env case.at "M0101"
+      "the switch has type%a\nbecause branches have inconsistent types,\nthis case produces type%a\nthe previous produce type%a"
+      display_typ t''
+      display_typ_expand t
+      display_typ_expand t';
+  t''
+
+and check_cases env t_pat t cases =
+  List.iter (check_case env t_pat t) cases
+
+and check_case env t_pat t case =
+  let {pat; exp} = case.it in
+  let ve = check_pat env t_pat pat in
+  recover (check_exp (adjoin_vals env ve) t) exp
+
+and inconsistent t ts =
+  T.opaque t && not (List.exists T.opaque ts)
+
+
+(* Patterns *)
+
+and infer_pat_exhaustive warnOrError env pat : T.typ * Scope.val_env =
+  let t, ve = infer_pat env pat in
+  if not env.pre then
+    coverage_pat warnOrError env pat t;
+  t, ve
+
+and infer_pat env pat : T.typ * Scope.val_env =
+  assert (pat.note = T.Pre);
+  let t, ve = infer_pat' env pat in
+  if not env.pre then
+    pat.note <- T.normalize t;
+  t, ve
+
+and infer_pat' env pat : T.typ * Scope.val_env =
+  match pat.it with
+  | WildP ->
+    error env pat.at "M0102" "cannot infer type of wildcard"
+  | VarP _ ->
+    error env pat.at "M0103" "cannot infer type of variable"
+  | LitP lit ->
+    T.Prim (infer_lit env lit pat.at), T.Env.empty
+  | SignP (op, lit) ->
+    let t1 = T.Prim (infer_lit env lit pat.at) in
+    let t = Operator.type_unop op t1 in
+    if not (Operator.has_unop op t) then
+      error env pat.at "M0059" "operator is not defined for operand type%a"
+        display_typ_expand t;
+    t, T.Env.empty
+  | TupP pats ->
+    let ts, ve = infer_pats pat.at env pats [] T.Env.empty in
+    T.Tup ts, ve
+  | ObjP pfs ->
+    let (s, tfs), ve = infer_pat_fields pat.at env pfs [] T.Env.empty in
+    T.Obj (s, tfs), ve
+  | OptP pat1 ->
+    let t1, ve = infer_pat env pat1 in
+    T.Opt t1, ve
+  | TagP (id, pat1) ->
+    let t1, ve = infer_pat env pat1 in
+    T.Variant [T.{lab = id.it; typ = t1; src = empty_src}], ve
+  | AltP (pat1, pat2) ->
+    error env pat.at "M0184"
+        "cannot infer the type of this or-pattern, please add a type annotation";
+    (*let t1, ve1 = infer_pat env pat1 in
+    let t2, ve2 = infer_pat env pat2 in
+    let t = T.lub t1 t2 in
+    if not (T.compatible t1 t2) then
+      error env pat.at "M0104"
+        "pattern branches have incompatible types,\nleft consumes%a\nright consumes%a"
+        display_typ_expand t1
+        display_typ_expand t2;
+    if T.Env.keys ve1 <> T.Env.keys ve2 then
+      error env pat.at "M0189" "different set of bindings in pattern alternatives";
+    if not env.pre then T.Env.(iter (fun k t1 -> warn_lossy_bind_type env pat.at k t1 (find k ve2))) ve1;
+    t, T.Env.merge (fun _ -> Lib.Option.map2 T.lub) ve1 ve2*)
+  | AnnotP (pat1, typ) ->
+    let t = check_typ env typ in
+    t, check_pat env t pat1
+  | ParP pat1 ->
+    infer_pat env pat1
+
+and infer_pats at env pats ts ve : T.typ list * Scope.val_env =
+  match pats with
+  | [] -> List.rev ts, ve
+  | pat::pats' ->
+    let t, ve1 = infer_pat env pat in
+    let ve' = disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+    infer_pats at env pats' (t::ts) ve'
+
+and infer_pat_fields at env pfs ts ve : (T.obj_sort * T.field list) * Scope.val_env =
+  match pfs with
+  | [] -> (T.Object, List.sort T.compare_field ts), ve
+  | pf::pfs' ->
+    let typ, ve1 = infer_pat env pf.it.pat in
+    let ve' = disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+    infer_pat_fields at env pfs' (T.{ lab = pf.it.id.it; typ; src = empty_src }::ts) ve'
+
+and check_shared_pat env shared_pat : T.func_sort * Scope.val_env =
+  match shared_pat.it with
+  | T.Local -> T.Local, T.Env.empty
+  | T.Shared (ss, pat) ->
+    if pat.it <> WildP then
+      error_in [Flags.WASIMode; Flags.WasmMode] env pat.at "M0106" "shared function cannot take a context pattern";
+    T.Shared ss, check_pat_exhaustive local_error env T.ctxt pat
+
+and check_class_shared_pat env shared_pat obj_sort : Scope.val_env =
+  match shared_pat.it, obj_sort.it with
+  | T.Local, (T.Module | T.Object) -> T.Env.empty
+  | T.Local, T.Actor ->
+    T.Env.empty (* error instead? That's a breaking change *)
+  | T.Shared (mode, pat), sort ->
+    if sort <> T.Actor then
+      error env pat.at "M0107" "non-actor class cannot take a context pattern";
+    if pat.it <> WildP then
+      error_in [Flags.WASIMode; Flags.WasmMode] env pat.at "M0108" "actor class cannot take a context pattern";
+    if mode = T.Query then
+      error env shared_pat.at "M0109" "class cannot be a query";
+    check_pat_exhaustive local_error env T.ctxt pat
+  | _, T.Memory -> assert false
+
+
+and check_pat_exhaustive warnOrError env t pat : Scope.val_env =
+  let ve = check_pat env t pat in
+  if not env.pre then
+    coverage_pat warnOrError env pat t;
+  ve
+
+and check_pat env t pat : Scope.val_env =
+  check_pat_aux env t pat Scope.Declaration
+
+and check_pat_aux env t pat val_kind : Scope.val_env =
+  assert (pat.note = T.Pre);
+  if t = T.Pre then snd (infer_pat env pat) else
+  let t' = T.normalize t in
+  let ve = check_pat_aux' env t' pat val_kind in
+  if not env.pre then pat.note <- t';
+  ve
+
+and check_pat_aux' env t pat val_kind : Scope.val_env =
+  assert (t <> T.Pre);
+  match pat.it with
+  | WildP ->
+    T.Env.empty
+  | VarP id ->
+    T.Env.singleton id.it (t, id.at, val_kind)
+  | LitP lit ->
+    if not env.pre then begin
+      let t' = if T.eq t T.nat then T.int else t in  (* account for Nat <: Int *)
+      if T.opaque t' then
+        error env pat.at "M0110" "literal pattern cannot consume expected type%a"
+          display_typ_expand t;
+      if T.sub t' T.Non
+      then ignore (infer_lit env lit pat.at)
+      else check_lit env t' lit pat.at
+    end;
+    T.Env.empty
+  | SignP (op, lit) ->
+    if not env.pre then begin
+      let t' = if T.eq t T.nat then T.int else t in  (* account for Nat <: Int *)
+      if not (Operator.has_unop op (T.promote t)) then
+        error env pat.at "M0111" "operator pattern cannot consume expected type%a"
+          display_typ_expand t;
+      if T.sub t' T.Non
+      then ignore (infer_lit env lit pat.at)
+      else check_lit env t' lit pat.at
+    end;
+    T.Env.empty
+  | TupP pats ->
+    let ts = try T.as_tup_sub (List.length pats) t with Invalid_argument _ ->
+      error env pat.at "M0112" "tuple pattern cannot consume expected type%a"
+         display_typ_expand t
+    in check_pats env ts pats T.Env.empty pat.at
+  | ObjP pfs ->
+    let pfs' = List.stable_sort compare_pat_field pfs in
+    let s, tfs =
+      try T.as_obj_sub (List.map (fun (pf : pat_field) -> pf.it.id.it) pfs') t
+      with Invalid_argument _ ->
+        error env pat.at "M0113" "object pattern cannot consume expected type%a"
+          display_typ_expand t
+    in
+    if not env.pre && s = T.Actor then
+      local_error env pat.at "M0114" "object pattern cannot consume actor type%a"
+        display_typ_expand t;
+    check_pat_fields env t tfs pfs' T.Env.empty pat.at
+  | OptP pat1 ->
+    let t1 = try T.as_opt_sub t with Invalid_argument _ ->
+      error env pat.at "M0115" "option pattern cannot consume expected type%a"
+        display_typ_expand t
+    in check_pat env t1 pat1
+  | TagP (id, pat1) ->
+    let t1 =
+      try
+        match T.lookup_val_field_opt id.it (T.as_variant_sub id.it t) with
+        | Some t1 -> t1
+        | None -> T.Non
+      with Invalid_argument _ ->
+        error env pat.at "M0116" "variant pattern cannot consume expected type%a"
+          display_typ_expand t
+    in check_pat env t1 pat1
+  | AltP (pat1, pat2) ->
+    let ve1 = check_pat env t pat1 in
+    let ve2 = check_pat env t pat2 in
+    if T.Env.keys ve1 <> T.Env.keys ve2 then
+      error env pat.at "M0189" "different set of bindings in pattern alternatives";
+    T.Env.(iter (fun k (t1, _, _) ->
+      let (t2, _, _) = find k ve2 in
+      warn_lossy_bind_type env pat.at k t1 t2)
+    ) ve1;
+    let merge_entries (t1, at1, kind1) (t2, at2, kind2) = (T.lub t1 t2, at1, kind1) in
+    T.Env.merge (fun _ -> Lib.Option.map2 merge_entries) ve1 ve2
+  | AnnotP (pat1, typ) ->
+    let t' = check_typ env typ in
+    if not (T.sub t t') then
+      error env pat.at "M0117"
+        "pattern of type%a\ncannot consume expected type%a"
+        display_typ_expand t'
+        display_typ_expand t;
+    check_pat env t' pat1
+  | ParP pat1 ->
+    check_pat env t pat1
+
+(*
+Consider:
+
+  case (P : A) : B
+
+
+(P : A) :<= B  iff
+1: B <: A   P :<= B
+2: A <: B   P :<= A
+3: B <: A   P :<= A
+4: A <: B   P :<= B
+
+1 is implemented, allows
+
+  case ({x} : {}) : {x}  // type annotations are reversed for patterns
+  case (1 : Int) : Nat   // type annotations are reversed for patterns
+  case (x : Int) : Nat   // type annotations are reversed for patterns
+
+2 would allow
+
+  case ({x} : {x}) : {}  // unsound, x does not exist
+
+3 would allow
+
+  case (-1 : Int) : Nat  // breaks coverage checking
+
+4 would allow
+
+  case (x : Nat) : Int  // x is Int, harmless but misleading
+
+Alternative: pass in two types?
+*)
+and check_pats env ts pats ve at : Scope.val_env =
+  let ts_len = List.length ts in
+  let pats_len = List.length pats in
+  let rec go ts pats ve =
+    match ts, pats with
+    | [], [] -> ve
+    | t::ts', pat::pats' ->
+        let ve1 = check_pat env t pat in
+        let ve' = disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+        go ts' pats' ve'
+    | _, _ ->
+        error env at "M0118" "tuple pattern has %i components but expected type has %i"
+          pats_len ts_len
+  in
+  go ts pats ve
+
+and check_pat_fields env t tfs pfs ve at : Scope.val_env =
+  match tfs, pfs with
+  | _, [] -> ve
+  | [], pf::_ ->
+    error env pf.at "M0119"
+      "object field %s is not contained in expected type%a"
+      pf.it.id.it
+      display_typ_expand t
+  | T.{lab; typ = Typ _; _}::tfs', _ ->  (* TODO: remove the namespace hack *)
+    check_pat_fields env t tfs' pfs ve at
+  | T.{lab; typ; src}::tfs', pf::pfs' ->
+    match compare pf.it.id.it lab with
+    | -1 -> check_pat_fields env t [] pfs ve at
+    | +1 -> check_pat_fields env t tfs' pfs ve at
+    | _ ->
+      if T.is_mut typ then
+        error env pf.at "M0120" "cannot pattern match mutable field %s" lab;
+      Option.iter (warn env pf.at "M0154" "type field %s is deprecated:\n%s" lab) src.T.depr;
+      let val_kind = kind_of_field_pattern pf in
+      let ve1 = check_pat_aux env typ pf.it.pat val_kind in
+      let ve' =
+        disjoint_union env at "M0017" "duplicate binding for %s in pattern" ve ve1 in
+      match pfs' with
+      | pf'::_ when pf'.it.id.it = lab ->
+        error env pf'.at "M0121" "duplicate field %s in object pattern" lab
+      | _ -> check_pat_fields env t tfs' pfs' ve' at
+
+and compare_pat_field pf1 pf2 = compare pf1.it.id.it pf2.it.id.it
+
+(* Objects *)
+
+and pub_fields dec_fields : visibility_env =
+  List.fold_right pub_field dec_fields (T.Env.empty, T.Env.empty)
+
+and pub_field dec_field xs : visibility_env =
+  match dec_field.it with
+  | {vis = { it = Public depr; _}; dec; _} -> pub_dec T.{depr = depr; region = dec_field.at} dec xs
+  | _ -> xs
+
+and pub_dec src dec xs : visibility_env =
+  match dec.it with
+  | ExpD _ -> xs
+  | LetD (pat, _, _) -> pub_pat src pat xs
+  | VarD (id, _) -> pub_val_id src id xs
+  | ClassD (_, id, _, _, _, _, _, _) ->
+    pub_val_id src {id with note = ()} (pub_typ_id src id xs)
+  | TypD (id, _, _) -> pub_typ_id src id xs
+
+and pub_pat src pat xs : visibility_env =
+  match pat.it with
+  | WildP | LitP _ | SignP _ -> xs
+  | VarP id -> pub_val_id src id xs
+  | TupP pats -> List.fold_right (pub_pat src) pats xs
+  | ObjP pfs -> List.fold_right (pub_pat_field src) pfs xs
+  | AltP (pat1, _)
+  | OptP pat1
+  | TagP (_, pat1)
+  | AnnotP (pat1, _)
+  | ParP pat1 -> pub_pat src pat1 xs
+
+and pub_pat_field src pf xs =
+  pub_pat src pf.it.pat xs
+
+and pub_typ_id src id (xs, ys) : visibility_env =
+  (T.Env.add id.it T.{depr = src.depr; id_region = id.at; field_region = src.region} xs, ys)
+
+and pub_val_id src id (xs, ys) : visibility_env =
+  (xs, T.Env.add id.it T.{depr = src.depr; id_region = id.at; field_region = src.region} ys)
+
+
+(* Object/Scope transformations *)
+
+(* TODO: remove by merging conenv and valenv or by separating typ_fields *)
+
+and object_of_scope env sort dec_fields scope at =
+  let pub_typ, pub_val = pub_fields dec_fields in
+  let tfs =
+    T.Env.fold
+      (fun id c tfs ->
+        match T.Env.find_opt id pub_typ with
+        | Some src -> T.{lab = id; typ = T.Typ c; src = {depr = src.depr; region = src.field_region}}::tfs
+        | _ -> tfs
+      ) scope.Scope.typ_env  []
+  in
+  let tfs' =
+    T.Env.fold
+      (fun id (t, _, _) tfs ->
+        match T.Env.find_opt id pub_val with
+        | Some src -> T.{lab = id; typ = t; src = {depr = src.depr; region = src.field_region}}::tfs
+        | _ -> tfs
+      ) scope.Scope.val_env tfs
+  in
+
+  Lib.List.iter_pairs
+    (fun x y ->
+      if not (T.is_typ x.T.typ) && not (T.is_typ y.T.typ) &&
+         Hash.hash x.T.lab = Hash.hash y.T.lab
+      then error env at "M0122" "field names %s and %s in %sobject type have colliding hashes"
+        x.T.lab y.T.lab (T.string_of_obj_sort sort);
+    ) tfs';
+
+  T.Obj (sort, List.sort T.compare_field tfs')
+
+and is_actor_method dec : bool = match dec.it with
+  | LetD ({it = VarP _; _}, {it = FuncE (_, shared_pat, _, _, _, _, _); _}, _) ->
+    T.is_shared_sort shared_pat.it
+  | _ -> false
+
+and is_typ_dec dec : bool = match dec.it with
+  | TypD _ -> true
+  | _ -> false
+
+and infer_obj env s dec_fields at : T.typ =
+  let private_fields =
+    let scope = List.filter (fun field -> is_private field.it.vis) dec_fields
+    |> List.map (fun field -> field.it.dec)
+    |> gather_block_decs env in
+    get_identifiers scope.Scope.val_env
+  in
+  let private_identifiers identifiers =
+    T.Env.filter (fun id _ -> S.mem id private_fields) identifiers
+  in
+  let env =
+    if s <> T.Actor then
+      { env with in_actor = false }
+    else
+      { env with
+        in_actor = true;
+        labs = T.Env.empty;
+        rets = None;
+      }
+  in
+  let decs = List.map (fun (df : dec_field) -> df.it.dec) dec_fields in
+  let initial_usage = enter_scope env in
+  let _, scope = infer_block env decs at false in
+  let t = object_of_scope env s dec_fields scope at in
+  leave_scope env (private_identifiers scope.Scope.val_env) initial_usage;
+  let (_, tfs) = T.as_obj t in
+  if not env.pre then begin
+    if s = T.Actor then begin
+      List.iter (fun T.{lab; typ; _} ->
+        if not (T.is_typ typ) && not (T.is_shared_func typ) then
+          let _, pub_val = pub_fields dec_fields in
+          error env ((T.Env.find lab pub_val).id_region) "M0124"
+            "public actor field %s has non-shared function type%a"
+            lab
+            display_typ_expand typ
+      ) tfs;
+      List.iter (fun df ->
+        if is_public df.it.vis && not (is_actor_method df.it.dec) && not (is_typ_dec df.it.dec) then
+          local_error env df.it.dec.at "M0125"
+            "public actor field needs to be a manifest function"
+      ) dec_fields;
+      List.iter (fun df ->
+        if df.it.vis.it = Syntax.Private && is_actor_method df.it.dec then
+          error_in [Flags.ICMode; Flags.RefMode] env df.it.dec.at "M0126"
+            "a shared function cannot be private"
+      ) dec_fields;
+    end;
+    if s = T.Module then Static.dec_fields env.msgs dec_fields;
+    check_system_fields env s scope tfs dec_fields;
+    check_stab env s scope dec_fields;
+  end;
+  t
+
+and check_system_fields env sort scope tfs dec_fields =
+  List.iter (fun df ->
+    match sort, df.it.vis.it, df.it.dec.it with
+    | T.Actor, vis,
+      LetD({ it = VarP id; _ },
+           { it = FuncE _; _ },
+           _) ->
+      begin
+        match List.assoc_opt id.it (system_funcs tfs) with
+        | Some t ->
+          (* TBR why does Stable.md require this to be a manifest function, not just any expression of appropriate type?  *)
+          if vis = System then
+            begin
+              let (t1, _, _) = T.Env.find id.it scope.Scope.val_env in
+              if not (T.sub t1 t) then
+                local_error env df.at "M0127" "system function %s is declared with type%a\ninstead of expected type%a" id.it
+                   display_typ t1
+                   display_typ t
+              else if id.it = "timer" && not !Mo_config.Flags.global_timer then
+                local_error env df.at "M0182" "system function timer is present but -no-timer flag is specified"
+            end
+          else warn env id.at "M0128" "this function has the name of a system method, but is declared without system visibility and will not be called by the system"
+        | None ->
+          if vis = System then
+            local_error env id.at "M0129" "unexpected system method named %s, expected %s"
+              id.it (String.concat " or " (List.map fst (system_funcs tfs)))
+          else ()
+      end
+    | _, System, _ ->
+      local_error env df.it.vis.at "M0130" "misplaced system visibility, did you mean private?"
+    | _ -> ())
+  dec_fields
+
+and stable_pat pat =
+  match pat.it with
+  | VarP _ -> true
+  | ParP pat'
+  | AnnotP (pat', _) -> stable_pat pat'
+  | _ -> false
+
+and check_stab env sort scope dec_fields =
+  let check_stable id at =
+    match T.Env.find_opt id scope.Scope.val_env with
+    | None -> assert false
+    | Some (t, _, _) ->
+      let t1 = T.as_immut t in
+      if not (T.stable t1) then
+        local_error env at "M0131"
+          "variable %s is declared stable but has non-stable type%a" id
+          display_typ t1
+  in
+  let idss = List.map (fun df ->
+    match sort, df.it.stab, df.it.dec.it with
+    | (T.Object | T.Module), None, _ -> []
+    | (T.Object | T.Module), Some stab, _ ->
+      local_error env stab.at "M0132"
+        "misplaced stability declaration on field of non-actor";
+      []
+    | T.Actor, Some {it = Stable; _}, VarD (id, _) ->
+      check_stable id.it id.at;
+      [id]
+    | T.Actor, Some {it = Stable; _}, LetD (pat, _, _) when stable_pat pat ->
+      let ids = T.Env.keys (gather_pat env T.Env.empty pat) in
+      List.iter (fun id -> check_stable id pat.at) ids;
+      List.map (fun id -> {it = id; at = pat.at; note = ()}) ids;
+    | T.Actor, Some {it = Flexible; _} , (VarD _ | LetD _) -> []
+    | T.Actor, Some stab, _ ->
+      local_error env stab.at "M0133"
+        "misplaced stability modifier: allowed on var or simple let declarations only";
+      []
+    | _ -> []) dec_fields
+  in
+  check_ids env "actor type" "stable variable" (List.concat idss)
+
+
+(* Blocks and Declarations *)
+
+and infer_block env decs at check_unused : T.typ * Scope.scope =
+  let initial_usage = enter_scope env in
+  let scope = infer_block_decs env decs at in
+  let env' = adjoin env scope in
+  (* HACK: when compiling to IC, mark class constructors as unavailable *)
+  let ve = match !Flags.compile_mode with
+    | Flags.(ICMode | RefMode) ->
+      List.fold_left (fun ve' dec ->
+        match dec.it with
+        | ClassD(_, id, _, _, _, { it = T.Actor; _}, _, _) ->
+          T.Env.mapi (fun id' (typ, at, kind, avl) ->
+            (typ, at, kind, if id' = id.it then Unavailable else avl)) ve'
+        | _ -> ve') env'.vals decs
+    | _ -> env'.vals
+  in
+  let t = infer_block_exps { env' with vals = ve } decs in
+  if check_unused then
+    leave_scope env scope.Scope.val_env initial_usage
+  else ();
+  t, scope
+
+and infer_block_decs env decs at : Scope.t =
+  let scope = gather_block_decs env decs in
+  let env' = adjoin {env with pre = true} scope in
+  let scope_ce = infer_block_typdecs env' decs in
+  check_con_env env' at scope_ce.Scope.con_env;
+  let env'' = adjoin {env' with pre = env.pre} scope_ce in
+  let _scope_ce = infer_block_typdecs env'' decs in
+  (* TBR: assertion does not work for types with binders, due to stamping *)
+  (* assert (scope_ce = _scope_ce); *)
+  infer_block_valdecs (adjoin env'' scope_ce) decs scope_ce
+
+and infer_block_exps env decs : T.typ =
+  match decs with
+  | [] -> T.unit
+  | [dec] -> infer_dec env dec
+  | dec::decs' ->
+    if not env.pre then recover (check_dec env T.unit) dec;
+    infer_block_exps env decs'
+
+and infer_dec env dec : T.typ =
+  let t =
+  match dec.it with
+  | ExpD exp -> infer_exp env exp
+  | LetD (pat, exp, None) -> 
+    (* For developer convenience, ignore top-level actor and module identifiers in unused detection. *)
+    (if env.in_prog && (CompUnit.is_actor_def exp || CompUnit.is_module_def exp) then
+      match pat.it with
+      | VarP id -> use_identifier env id.it
+      | _ -> ());
+    infer_exp env exp
+  | LetD (_, exp, Some fail) ->
+    if not env.pre then
+      check_exp env T.Non fail;
+    infer_exp env exp
+  | VarD (_, exp) ->
+    if not env.pre then ignore (infer_exp env exp);
+    T.unit
+  | ClassD (shared_pat, id, typ_binds, pat, typ_opt, obj_sort, self_id, dec_fields) ->
+    let (t, _, _, _) = T.Env.find id.it env.vals in
+    if not env.pre then begin
+      let c = T.Env.find id.it env.typs in
+      let ve0 = check_class_shared_pat env shared_pat obj_sort in
+      let cs, tbs, te, ce = check_typ_binds env typ_binds in
+      let env' = adjoin_typs env te ce in
+      let in_actor = obj_sort.it = T.Actor in
+      (* Top-level actor class identifier is implicitly public and thus considered used. *)
+      if env.in_prog && in_actor then use_identifier env id.it;
+      let t_pat, ve =
+        infer_pat_exhaustive (if in_actor then error else warn) env' pat
+      in
+      if in_actor && not (T.shared t_pat) then
+        error_shared env t_pat pat.at "M0034"
+          "shared constructor has non-shared parameter type%a"
+          display_typ_expand t_pat;
+      let env'' = adjoin_vals (adjoin_vals env' ve0) ve in
+      let async_cap, _, class_cs = infer_class_cap env obj_sort.it tbs cs in
+      let self_typ = T.Con (c, List.map (fun c -> T.Con (c, [])) class_cs) in
+      let env''' =
+        { (add_val env'' self_id self_typ) with
+          labs = T.Env.empty;
+          rets = None;
+          async = async_cap;
+          in_actor;
+        }
+      in
+      let initial_usage = enter_scope env''' in
+      let t' = infer_obj { env''' with check_unused = true } obj_sort.it dec_fields dec.at in
+      leave_scope env ve initial_usage;
+      match typ_opt, obj_sort.it with
+      | None, _ -> ()
+      | Some { it = AsyncT (T.Fut, _, typ); at; _ }, T.Actor
+      | Some ({ at; _ } as typ), T.(Module | Object) ->
+        if at = Source.no_region then
+          warn env dec.at "M0135"
+            "actor classes with non non-async return types are deprecated; please declare the return type as 'async ...'";
+        let t'' = check_typ env'' typ in
+        if not (T.sub t' t'') then
+          local_error env dec.at "M0134"
+            "class body of type%a\ndoes not match expected type%a"
+            display_typ_expand t'
+            display_typ_expand t''
+      | Some typ, T.Actor ->
+         local_error env dec.at "M0193" "actor class has non-async return type"
+      | _, T.Memory -> assert false
+    end;
+    T.normalize t
+  | TypD _ ->
+    T.unit
+  in
+  let eff = A.infer_effect_dec dec in
+  dec.note <- {note_typ = t; note_eff = eff};
+  t
+
+
+and check_block env t decs at : Scope.t =
+  let initial_usage = enter_scope env in
+  let scope = infer_block_decs env decs at in
+  check_block_exps (adjoin env scope) t decs at;
+  leave_scope env scope.Scope.val_env initial_usage;
+  scope
+
+and check_block_exps env t decs at =
+  match decs with
+  | [] ->
+    if not (T.sub T.unit t) then
+      local_error env at "M0136" "empty block cannot produce expected type%a"
+        display_typ_expand t
+  | [dec] ->
+    check_dec env t dec
+  | dec::decs' ->
+    recover (check_dec env T.unit) dec;
+    recover (check_block_exps env t decs') at
+
+and check_dec env t dec =
+  match dec.it with
+  | ExpD exp ->
+    check_exp env t exp;
+    dec.note <- exp.note
+  | _ ->
+    let t' = infer_dec env dec in
+    if not (T.eq t T.unit || T.sub t' t) then
+      local_error env dec.at "M0096"
+        "expression of type%a\ncannot produce expected type%a"
+        display_typ_expand t'
+        display_typ_expand t
+
+and infer_val_path env exp : T.typ option =
+  match exp.it with
+  | ImportE (f, ri) ->
+    Some (check_import env exp.at f ri)
+  | VarE id ->
+    (match T.Env.find_opt id.it env.vals with (* TBR: return None for Unavailable? *)
+     | Some (t, _, _, _) -> Some t
+     | _ -> None)
+  | DotE (path, id) ->
+    (match infer_val_path env path with
+     | None -> None
+     | Some t ->
+       match T.promote t with
+       | T.Obj ( _, flds) ->
+         (try Some (T.lookup_val_field id.it flds)
+         with Invalid_argument _ -> None)
+       | _ -> None
+    )
+  | AnnotE (_, typ) ->
+    Some (check_typ {env with pre = true}  typ)
+  | _ -> None
+
+
+(* Pass 1: collect:
+   * type identifiers and their arity,
+   * object identifiers and their fields (if known) (recursively)
+   * other value identifiers at type T.Pre
+*)
+and gather_block_decs env decs : Scope.t =
+  List.fold_left (gather_dec env) Scope.empty decs
+
+and gather_dec env scope dec : Scope.t =
+  match dec.it with
+  | ExpD _ -> scope
+  (* TODO: generalize beyond let <id> = <obje> *)
+  | LetD (
+      {it = VarP id; _},
+      ( {it = ObjBlockE (obj_sort, _, dec_fields); at; _}
+      | {it = AwaitE (_,{ it = AsyncE (_, _, {it = ObjBlockE ({ it = Type.Actor; _} as obj_sort, _, dec_fields); at; _}) ; _  }); _ }),
+       _
+    ) ->
+    let decs = List.map (fun df -> df.it.dec) dec_fields in
+    let open Scope in
+    if T.Env.mem id.it scope.val_env then
+      error_duplicate env "" id;
+    let scope' = gather_block_decs env decs in
+    let ve' = add_id scope.val_env id (object_of_scope env obj_sort.it dec_fields scope' at) in
+    let obj_env = T.Env.add id.it scope' scope.obj_env in
+    { val_env = ve';
+      typ_env = scope.typ_env;
+      lib_env = scope.lib_env;
+      con_env = scope.con_env;
+      obj_env = obj_env
+    }
+  | LetD (pat, _, _) -> Scope.adjoin_val_env scope (gather_pat env scope.Scope.val_env pat)
+  | VarD (id, _) -> Scope.adjoin_val_env scope (gather_id env scope.Scope.val_env id Scope.Declaration)
+  | TypD (id, binds, _) | ClassD (_, id, binds, _, _, _, _, _) ->
+    let open Scope in
+    if T.Env.mem id.it scope.typ_env then
+      error_duplicate env "type " id;
+    let binds' = match binds with
+      | bind::binds when bind.it.sort.it = T.Scope ->
+        binds
+      | _ -> binds
+    in
+    let pre_tbs = List.map (fun bind ->
+      { T.var = bind.it.var.it;
+        T.sort = T.Type;
+        T.bound = T.Pre })
+      binds'
+    in
+    let pre_k = T.Abs (pre_tbs, T.Pre) in
+    let c = match id.note with
+      | None -> let c = Cons.fresh id.it pre_k in id.note <- Some c; c
+      | Some c -> c
+    in
+    let val_env = match dec.it with
+      | ClassD _ ->
+        if T.Env.mem id.it scope.val_env then
+          error_duplicate env "" id;
+        add_id scope.val_env id T.Pre
+      | _ -> scope.val_env
+    in
+    { val_env;
+      typ_env = T.Env.add id.it c scope.typ_env;
+      con_env = T.ConSet.disjoint_add c scope.con_env;
+      lib_env = scope.lib_env;
+      obj_env = scope.obj_env;
+    }
+
+and gather_pat env ve pat : Scope.val_env =
+   gather_pat_aux env Scope.Declaration ve pat
+
+and gather_pat_aux env val_kind ve pat : Scope.val_env =
+  match pat.it with
+  | WildP | LitP _ | SignP _ -> ve
+  | VarP id -> gather_id env ve id val_kind
+  | TupP pats -> List.fold_left (gather_pat env) ve pats
+  | ObjP pfs -> List.fold_left (gather_pat_field env) ve pfs
+  | TagP (_, pat1) | AltP (pat1, _) | OptP pat1
+  | AnnotP (pat1, _) | ParP pat1 -> gather_pat env ve pat1
+
+and gather_pat_field env ve pf : Scope.val_env =
+  let val_kind = kind_of_field_pattern pf in
+  gather_pat_aux env val_kind ve pf.it.pat
+
+and gather_id env ve id val_kind : Scope.val_env =
+  if T.Env.mem id.it ve then
+    error_duplicate env "" id;
+  T.Env.add id.it (T.Pre, id.at, val_kind) ve
+
+(* Pass 2 and 3: infer type definitions *)
+and infer_block_typdecs env decs : Scope.t =
+  let _env', scope =
+    List.fold_left (fun (env, scope) dec ->
+      let scope' = infer_dec_typdecs env dec in
+      adjoin env scope', Scope.adjoin scope scope'
+    ) (env, Scope.empty) decs
+  in scope
+
+and infer_dec_typdecs env dec : Scope.t =
+  match dec.it with
+  (* TODO: generalize beyond let <id> = <obje> *)
+  | LetD (
+      {it = VarP id; _},
+      ( {it = ObjBlockE (obj_sort, _t, dec_fields); at; _}
+      | {it = AwaitE (_, { it = AsyncE (_, _, {it = ObjBlockE ({ it = Type.Actor; _} as obj_sort, _t, dec_fields); at; _}) ; _  }); _ }),
+        _
+    ) ->
+    let decs = List.map (fun {it = {vis; dec; _}; _} -> dec) dec_fields in
+    let scope = T.Env.find id.it env.objs in
+    let env' = adjoin env scope in
+    let obj_scope_typs = infer_block_typdecs env' decs in
+    let obj_scope = Scope.adjoin scope obj_scope_typs in
+    Scope.{ empty with
+      con_env = obj_scope.con_env;
+      val_env = singleton id (object_of_scope env obj_sort.it dec_fields obj_scope at);
+      obj_env = T.Env.singleton id.it obj_scope
+    }
+  (* TODO: generalize beyond let <id> = <valpath> *)
+  | LetD ({it = VarP id; _}, exp, _) ->
+    (match infer_val_path env exp with
+     | None -> Scope.empty
+     | Some t ->
+       let open Scope in
+       match T.promote t with
+       | T.Obj (_, _) as t' -> { Scope.empty with val_env = singleton id t' }
+       | _ -> { Scope.empty with val_env = singleton id T.Pre }
+    )
+  | LetD _ | ExpD _ | VarD _ ->
+    Scope.empty
+  | TypD (id, typ_binds, typ) ->
+    let k = check_typ_def env dec.at (id, typ_binds, typ) in
+    let c = T.Env.find id.it env.typs in
+    Scope.{ empty with
+      typ_env = T.Env.singleton id.it c;
+      con_env = infer_id_typdecs id c k;
+    }
+  | ClassD (shared_pat, id, binds, pat, _typ_opt, obj_sort, self_id, dec_fields) ->
+    let c = T.Env.find id.it env.typs in
+    let ve0 = check_class_shared_pat {env with pre = true} shared_pat obj_sort in
+    let cs, tbs, te, ce = check_typ_binds {env with pre = true} binds in
+    let env' = adjoin_typs (adjoin_vals {env with pre = true} ve0) te ce in
+    let _, ve = infer_pat env' pat in
+    let in_actor = obj_sort.it = T.Actor in
+    let async_cap, class_tbs, class_cs = infer_class_cap env obj_sort.it tbs cs in
+    let self_typ = T.Con (c, List.map (fun c -> T.Con (c, [])) class_cs) in
+    let env'' =
+     { (add_val (adjoin_vals env' ve) self_id self_typ) with
+          labs = T.Env.empty;
+          rets = None;
+          async = async_cap;
+          in_actor}
+    in
+    let t = infer_obj { env'' with check_unused = false } obj_sort.it dec_fields dec.at in
+    let k = T.Def (T.close_binds class_cs class_tbs, T.close class_cs t) in
+    check_closed env id k dec.at;
+    Scope.{ empty with
+      typ_env = T.Env.singleton id.it c;
+      con_env = infer_id_typdecs id c k;
+    }
+
+and infer_id_typdecs id c k : Scope.con_env =
+  assert (match k with T.Abs (_, T.Pre) -> false | _ -> true);
+  (match Cons.kind c with
+  | T.Abs (_, T.Pre) -> T.set_kind c k; id.note <- Some c
+  | k' -> assert (T.eq_kind k' k) (* may diverge on expansive types *)
+  );
+  T.ConSet.singleton c
+
+(* Pass 4: infer value types *)
+and infer_block_valdecs env decs scope : Scope.t =
+  let _, scope' =
+    List.fold_left (fun (env, scope) dec ->
+      let scope' = infer_dec_valdecs env dec in
+      adjoin env scope', Scope.adjoin scope scope'
+    ) (env, scope) decs
+  in scope'
+
+and is_import d =
+  match d.it with
+  | LetD (_, {it = ImportE _; _}, None) -> true
+  | _ -> false
+
+and infer_dec_valdecs env dec : Scope.t =
+  match dec.it with
+  | ExpD _ ->
+    Scope.empty
+  (* TODO: generalize beyond let <id> = <obje> *)
+  | LetD (
+      {it = VarP id; _} as pat,
+      ( {it = ObjBlockE (obj_sort, _t, dec_fields); at; _}
+      | {it = AwaitE (_, { it = AsyncE (_, _, {it = ObjBlockE ({ it = Type.Actor; _} as obj_sort, _t, dec_fields); at; _}) ; _ }); _ }),
+        _
+    ) ->
+    let decs = List.map (fun df -> df.it.dec) dec_fields in
+    let obj_scope = T.Env.find id.it env.objs in
+    let obj_scope' =
+      infer_block_valdecs
+        (adjoin {env with pre = true} obj_scope)
+        decs obj_scope
+    in
+    let obj_typ = object_of_scope env obj_sort.it dec_fields obj_scope' at in
+    let _ve = check_pat env obj_typ pat in
+    Scope.{empty with val_env = singleton id obj_typ}
+  | LetD (pat, exp, fail) ->
+    let t = infer_exp {env with pre = true; check_unused = false} exp in
+    let ve' = match fail with
+      | None -> check_pat_exhaustive (if is_import dec then local_error else warn) env t pat
+      | Some _ -> check_pat env t pat
+    in
+    Scope.{empty with val_env = ve'}
+  | VarD (id, exp) ->
+    let t = infer_exp {env with pre = true} exp in
+    Scope.{empty with val_env = singleton id (T.Mut t)}
+  | TypD (id, _, _) ->
+    let c = Option.get id.note in
+    Scope.{ empty with
+      typ_env = T.Env.singleton id.it c;
+      con_env = T.ConSet.singleton c;
+    }
+  | ClassD (_shared_pat, id, typ_binds, pat, _, obj_sort, _, _) ->
+    if obj_sort.it = T.Actor then begin
+      error_in [Flags.WASIMode; Flags.WasmMode] env dec.at "M0138" "actor classes are not supported";
+      if not env.in_prog then
+        error_in [Flags.ICMode; Flags.RefMode] env dec.at "M0139"
+          "inner actor classes are not supported yet; any actor class must come last in your program";
+      if not (List.length typ_binds = 1) then
+        local_error env dec.at "M0140"
+          "actor classes with type parameters are not supported yet";
+    end;
+    let cs, tbs, te, ce = check_typ_binds env typ_binds in
+    let env' = adjoin_typs env te ce in
+    let c = T.Env.find id.it env.typs in
+    let t1, _ = infer_pat {env' with pre = true} pat in
+    let ts1 = match pat.it with TupP _ -> T.seq_of_tup t1 | _ -> [t1] in
+    let class_tbs, _,  class_cs = infer_class_cap env obj_sort.it tbs cs in
+    let obj_typ = T.Con (c, List.map (fun c -> T.Con (c, [])) class_cs) in
+    let t2 =
+      if obj_sort.it = T.Actor then
+        T.Async (T.Fut, T.Con (List.hd cs, []), obj_typ)
+      else obj_typ
+    in
+    let t = T.Func (T.Local, T.Returns, T.close_binds cs tbs,
+      List.map (T.close cs) ts1,
+      [T.close cs t2])
+    in
+    Scope.{ empty with
+      val_env = singleton id t;
+      typ_env = T.Env.singleton id.it c;
+      con_env = T.ConSet.singleton c;
+    }
+
+
+(* Programs *)
+
+let infer_prog scope pkg_opt async_cap prog : (T.typ * Scope.t) Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun prog ->
+          let env0 = env_of_scope msgs scope in
+          let env = {
+             env0 with async = async_cap;
+          } in
+          let res = infer_block env prog.it prog.at true in
+          if pkg_opt = None then emit_unused_warnings env;
+          res
+        ) prog
+    )
+
+let is_actor_dec d =
+  match d.it with
+  | ExpD e
+  | LetD (_, e, _) -> CompUnit.is_actor_def e
+  | ClassD (shared_pat, id, typ_binds, pat, typ_opt, obj_sort, self_id, dec_fields) ->
+    obj_sort.it = T.Actor
+  | _ -> false
+
+let check_actors scope progs : unit Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt (fun progs ->
+        let prog = (CompUnit.combine_progs progs).it in
+        let env = env_of_scope msgs scope in
+        let rec go ds = function
+          | [] -> ()
+          | (d::ds') when is_actor_dec d ->
+            if ds <> [] || ds' <> []  then
+              error_in [Flags.ICMode; Flags.RefMode] env d.at "M0141"
+                "an actor or actor class must be the only non-imported declaration in a program"
+          | (d::ds') when is_import d -> go ds ds'
+          | (d::ds') -> go (d::ds) ds'
+        in
+        go [] prog
+        ) progs
+    )
+
+let check_lib scope pkg_opt lib : Scope.t Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun lib ->
+          let env = env_of_scope msgs scope in
+          let { imports; body = cub; _ } = lib.it in
+          let (imp_ds, ds) = CompUnit.decs_of_lib lib in
+          let typ, _ = infer_block env (imp_ds @ ds) lib.at false in
+          List.iter2 (fun import imp_d -> import.note <- imp_d.note.note_typ) imports imp_ds;
+          cub.note <- {note_typ = typ; note_eff = T.Triv};
+          let imp_typ = match cub.it with
+            | ModuleU _ ->
+              if cub.at = no_region then begin
+                let r = Source.({
+                  left = { no_pos with file = lib.note.filename };
+                  right = { no_pos with file = lib.note.filename }})
+                in
+                warn env r "M0142" "deprecated syntax: an imported library should be a module or named actor class"
+              end;
+              typ
+            | ActorClassU  (sp, id, tbs, p, _, self_id, dec_fields) ->
+              if is_anon_id id then
+                error env cub.at "M0143" "bad import: imported actor class cannot be anonymous";
+              let cs = List.map (fun tb -> Option.get tb.note) tbs in
+              let ts = List.map (fun c -> T.Con(c, [])) cs in
+              let fun_typ = typ in
+              let ts1, class_typ =
+                match T.normalize fun_typ with
+                | T.Func (sort, control, _, ts1, [t2]) ->
+                  let t2 = T.normalize (T.open_ ts t2) in
+                  (match t2 with
+                   | T.Async (_, _, class_typ) -> List.map (T.open_ ts) ts1, class_typ
+                   | _ -> assert false)
+                | _ -> assert false
+              in
+              let con = Cons.fresh id.it (T.Def([], class_typ)) in
+              T.(obj Module [
+                (id.it, Typ con);
+                (id.it, fun_typ);
+                ("system", obj Module [id.it, install_typ (List.map (close cs) ts1) class_typ])
+              ])
+            | ActorU _ ->
+              error env cub.at "M0144" "bad import: expected a module or actor class but found an actor"
+            | ProgU _ ->
+              (* this shouldn't really happen, as an imported program should be rewritten to a module *)
+              error env cub.at "M0000" "compiler bug: expected a module or actor class but found a program, i.e. a sequence of declarations"
+          in
+          if pkg_opt = None then emit_unused_warnings env;
+          Scope.lib lib.note.filename imp_typ
+        ) lib
+    )
+
+let check_stab_sig scope sig_ : (T.field list) Diag.result =
+  Diag.with_message_store
+    (fun msgs ->
+      recover_opt
+        (fun (decs, sfs) ->
+          let env = env_of_scope msgs scope in
+          let scope = infer_block_decs env decs sig_.at in
+          let env1 = adjoin env scope in
+          check_ids env "object type" "field"
+            (List.filter_map (fun (field : typ_field) ->
+                 match field.it with ValF (id, _, _) -> Some id | _ -> None)
+               sfs);
+          check_ids env "object type" "type field"
+            (List.filter_map (fun (field : typ_field) ->
+                 match field.it with TypF (id, _, _) -> Some id | _ -> None)
+               sfs);
+          let _ = List.map (check_typ_field {env1 with pre = true} T.Object) sfs in
+          let fs = List.map (check_typ_field {env1 with pre = false} T.Object) sfs in
+          List.iter (fun (field : Syntax.typ_field) ->
+              match field.it with
+              | TypF _ -> ()
+              | ValF (id, typ, _) ->
+                if not (T.stable typ.note) then
+                   error env id.at "M0131" "variable %s is declared stable but has non-stable type%a"
+                   id.it
+                   display_typ typ.note)
+            sfs;
+          List.sort T.compare_field fs
+        ) sig_.it
+    )
+
+
+
+ + + diff --git a/coverage/mo_frontend/variance.ml.html b/coverage/mo_frontend/variance.ml.html new file mode 100644 index 00000000000..f997c5e5a55 --- /dev/null +++ b/coverage/mo_frontend/variance.ml.html @@ -0,0 +1,284 @@ + + + + + variance.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+
+
(* Variance (of type variables) in a type *)
+open Mo_types
+open Type
+
+(* NB: Polarities form a simple lattice with
+      Invariant
+     /        \
+    Covariant  Contravariant
+     \        /
+      Bivariant
+*)
+type t = Bivariant | Covariant | Contravariant | Invariant
+
+
+(* Least upper bound of two polarities *)
+let join p1 p2 =
+  match p1, p2 with
+  | other, Bivariant
+  | Bivariant, other -> other
+  | Covariant, Contravariant
+  | Contravariant, Covariant -> Invariant
+  | other, Invariant -> Invariant
+  | Invariant, other -> Invariant
+  | Covariant, Covariant ->  Covariant
+  | Contravariant, Contravariant -> Contravariant
+
+let flip p =
+    match p with
+    | Bivariant -> Bivariant
+    | Covariant -> Contravariant
+    | Contravariant -> Covariant
+    | Invariant -> Invariant
+
+module PS = Set.Make
+ (struct
+    type pol = t (* rename to avoid capture below *)
+    type t = pol * typ
+    let compare (p1, t1) (p2, t2) =
+      match compare p1 p2 with
+      | 0 -> Ord.compare t1 t2
+      | ord -> ord
+  end)
+
+let variances cons t =
+  let map = ref
+    (ConSet.fold (fun c ce -> ConEnv.add c Bivariant ce) cons ConEnv.empty)
+  in
+  let seen = ref PS.empty in
+  let rec go p t =
+    if PS.mem (p,t) !seen then ()
+    else begin
+      seen := PS.add (p,t) !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim _ | Any | Non -> ()
+      | Con (c, []) when ConSet.mem c cons ->
+        map := ConEnv.add c (join p (ConEnv.find c !map)) (!map)
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> ()
+        | Def (_, t) -> go p (open_ ts t)) (* TBR this may fail to terminate *)
+      | Array t | Opt t -> go p t
+      | Mut t -> go Invariant t
+      | Async (s, t1, t2) ->
+        go Invariant t1;
+        go p t2
+      | Tup ts -> List.iter (go p) ts
+      | Obj (_, fs) | Variant fs -> List.iter (fun f -> go p f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) ->
+        let ts = open_binds tbs in
+        List.iter (fun tb ->
+          go Invariant (open_ ts tb.bound)) tbs; (* bounds are invariant *)
+        List.iter (go (flip p)) (List.map (open_ ts) ts1);
+        List.iter (go p) (List.map (open_ ts) ts2)
+      | Typ c -> () (* TBR  assumed closed *)
+    end
+  in
+  go Covariant t;
+  !map
+
+
+
+ + + diff --git a/coverage/mo_idl/idl_to_mo.ml.html b/coverage/mo_idl/idl_to_mo.ml.html new file mode 100644 index 00000000000..f8760671820 --- /dev/null +++ b/coverage/mo_idl/idl_to_mo.ml.html @@ -0,0 +1,444 @@ + + + + + idl_to_mo.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+
+
open Idllib.Syntax
+open Idllib.Exception
+open Source
+module M = Mo_types.Type
+module I = Idllib.Typing
+
+
+let check_prim at p =
+  match p with
+  | Null -> M.Prim M.Null
+  | Bool -> M.Prim M.Bool
+  | Int -> M.Prim M.Int
+  | Int8 -> M.Prim M.Int8
+  | Int16 -> M.Prim M.Int16
+  | Int32 -> M.Prim M.Int32
+  | Int64 -> M.Prim M.Int64
+  | Nat -> M.Prim M.Nat
+  | Nat8 -> M.Prim M.Nat8
+  | Nat16 -> M.Prim M.Nat16
+  | Nat32 -> M.Prim M.Nat32
+  | Nat64 -> M.Prim M.Nat64
+  | Float32 -> raise (UnsupportedCandidFeature
+     (Diag.error_message at "M0161" "import"
+       "Candid 'float32' type cannot be imported as a Motoko type"))
+  | Float64 -> M.Prim M.Float
+  | Text -> M.Prim M.Text
+  | Reserved -> M.Any
+  | Empty -> M.Non
+
+let check_modes ms =
+  match ms with
+  | [] -> (M.Write, M.Promises)
+  | [{it=Oneway; _}] -> (M.Write, M.Returns)
+  | [{it=Query; _}] -> (M.Query, M.Promises)
+  | [{it=Composite; _}] -> (M.Composite, M.Promises)
+  | _ -> assert false
+
+let check_label lab : M.lab =
+  match lab.it with
+  | Named name -> Idllib.Escape.escape name
+  | Id id -> Idllib.Escape.escape_num id
+  | Unnamed id -> Idllib.Escape.escape_num id
+
+let is_tuple fs =
+  List.length fs > 1 &&
+    let fs = List.mapi (fun i f -> (i, f)) fs in
+    List.for_all (fun (i, f) ->
+        match f.it.label.it with
+        | Unnamed id -> Lib.Uint32.to_int id = i
+        | _ -> false) fs
+
+let rec check_typ' env occs t =
+  match t.it with
+  | PrimT p -> check_prim t.at p
+  | PrincipalT -> M.Prim M.Principal
+  | VarT {it=id; _} ->
+     (match M.Env.find_opt id !occs with
+      | None ->
+         let con = Mo_types.Cons.fresh id (M.Abs ([], M.Pre)) in
+         let res_t = M.Con (con, []) in
+         occs := M.Env.add id res_t !occs;
+         let t' = I.Env.find id env in
+         let t' = check_typ' env occs t' in
+         M.set_kind con (M.Def ([], t'));
+         res_t
+      | Some t -> t
+     )
+  | OptT t -> M.Opt (check_typ' env occs t)
+  | VecT t -> M.Array (check_typ' env occs t)
+  | BlobT -> M.Prim M.Blob
+  | RecordT fs ->
+     if is_tuple fs then
+       M.Tup (List.map (fun f -> check_typ' env occs f.it.typ) fs)
+     else
+       let fs = List.map (check_field env occs) fs in
+       M.Obj (M.Object, List.sort M.compare_field fs)
+  | VariantT fs ->
+     let fs = List.map (check_variant_field env occs) fs in
+     M.Variant (List.sort M.compare_field fs)
+  | FuncT (ms, ts1, ts2) ->
+     let (s, c) = check_modes ms in
+     M.Func (M.Shared s, c, [M.scope_bind], check_typs' env occs ts1, check_typs' env occs ts2)
+  | ServT ms ->
+     let fs = List.map (check_meth env occs) ms in
+     M.Obj (M.Actor, List.sort M.compare_field fs)
+  | ClassT _ -> raise (UnsupportedCandidFeature
+     (Diag.error_message t.at "M0162" "import" "Candid service constructor type not supported as Motoko type"))
+  | PreT -> assert false
+and check_typs' env occs ts = List.map (check_typ' env occs) ts
+and check_field env occs f =
+  M.{lab = check_label f.it.label; typ = check_typ' env occs f.it.typ; src = empty_src}
+and check_variant_field env occs f =
+  match f.it.typ.it with
+  | PrimT Null -> M.{lab = check_label f.it.label; typ = M.Tup []; src = empty_src}
+  | _ -> check_field env occs f
+and check_meth env occs (m: typ_meth) =
+  M.{lab = Idllib.Escape.escape_method m.it.var.at m.it.var.it; typ = check_typ' env occs m.it.meth; src = empty_src}
+
+let check_prog (env: typ I.Env.t) actor : M.typ =
+  let occs = ref M.Env.empty in
+  let fs = match actor with
+    | Some {it=ServT ms; _} ->
+      List.map (check_meth env occs) ms
+    | Some {it=ClassT (ts1, t); at; _} ->
+      (*@HACK: import service constructors as instantiated services *)
+      (*TODO: fix dfx to derive the correct instantiated candid instead *)
+      begin
+        let t' = check_typ' env occs t in
+        match M.normalize t' with
+        | M.Obj (M.Actor, fs) ->
+          Diag.print_messages [Diag.warning_message at "M0185" "import"
+            "importing Candid service constructor as instantiated service"];
+          fs
+        | _ -> assert false
+      end
+    | None -> assert false
+    | _ -> assert false
+  (* TODO: why do we only check and include the mentioned types (occs),
+     and not all of the .did declared ones (available to the caller), if not mentioned here? *)
+  in
+  let fs1 = M.Env.fold (fun id t fs ->
+       match t with
+       | M.Con (c, _) ->
+          (* TODO: consider adding deprecation as types can disappear even
+             across compatible .dids *)
+          M.{lab = id; typ = M.Typ c; src = empty_src}::fs
+       | _ -> assert false) !occs fs in
+  M.Obj (M.Actor, List.sort M.compare_field fs1)
+
+let check_typ env t = check_typ' env (ref M.Env.empty) t
+let check_typs env t = check_typs' env (ref M.Env.empty) t
+
+
+
+ + + diff --git a/coverage/mo_idl/mo_to_idl.ml.html b/coverage/mo_idl/mo_to_idl.ml.html new file mode 100644 index 00000000000..c57b4744e3b --- /dev/null +++ b/coverage/mo_idl/mo_to_idl.ml.html @@ -0,0 +1,726 @@ + + + + + mo_to_idl.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+
+
open Mo_def
+open Mo_types
+
+open Source
+open Trivia
+open Type
+module E = Syntax
+module I = Idllib.Syntax
+
+(* use a functor to allocate temporary shared state *)
+module MakeState() = struct
+
+  let env = ref Env.empty
+
+  (* For monomorphization *)
+  module Stamp = Type.ConEnv
+  let stamp = ref Stamp.empty
+
+  module TypeMap = Map.Make (struct type t = con * typ list let compare = compare end)
+  let type_map = ref TypeMap.empty
+
+  let normalize_name name =
+    String.map (fun c ->
+        if c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'
+        then c else '_'
+      ) name
+
+  let monomorphize_con vs c =
+    let name = normalize_name (Cons.name c) in
+    match Cons.kind c with
+    | Def _ ->
+      let id = (c, vs) in
+      let (k, n) =
+        match TypeMap.find_opt id !type_map with
+        | None ->
+          (match Stamp.find_opt c !stamp with
+           | None ->
+             let keys = Stamp.keys !stamp in
+             let k = List.length (List.filter (fun d -> Cons.name c = Cons.name d) keys) in
+             stamp := Stamp.add c (k, 0) !stamp;
+             type_map := TypeMap.add id (k, 0) !type_map;
+             (k, 0)
+           | Some (k, n) ->
+             stamp := Stamp.add c (k, n + 1) !stamp;
+             type_map := TypeMap.add id (k, n + 1) !type_map;
+             (k, n + 1))
+        | Some (k, n) -> (k, n)
+      in
+      begin
+        match (k, n) with
+        | (0, 0) -> name
+        | (0, n) when n > 0 -> Printf.sprintf "%s_%d" name n
+        | (k, 0) when k > 0 -> Printf.sprintf "%s__%d" name k
+        | (k, n) when k > 0 && n > 0 -> Printf.sprintf "%s__%d_%d" name k n
+        | _ -> assert false
+      end
+    | _ -> assert false
+
+  let prim = function
+    | Null -> I.PrimT I.Null
+    | Bool -> I.PrimT I.Bool
+    | Nat -> I.PrimT I.Nat
+    | Nat8 -> I.PrimT I.Nat8
+    | Nat16 -> I.PrimT I.Nat16
+    | Nat32 -> I.PrimT I.Nat32
+    | Nat64 -> I.PrimT I.Nat64
+    | Int -> I.PrimT I.Int
+    | Int8 -> I.PrimT I.Int8
+    | Int16 -> I.PrimT I.Int16
+    | Int32 -> I.PrimT I.Int32
+    | Int64 -> I.PrimT I.Int64
+    | Float -> I.PrimT I.Float64
+    | Char -> I.PrimT I.Nat32
+    | Text -> I.PrimT I.Text
+    | Blob -> I.BlobT
+    | Principal -> I.PrincipalT
+    | Region
+    | Error -> assert false
+
+  let rec typ t =
+    (match t with
+    | Any -> I.PrimT I.Reserved
+    | Non -> I.PrimT I.Empty
+    | Prim p -> prim p
+    | Var (s, i) -> assert false
+    | Con (c, ts) ->
+       (match Cons.kind c with
+        | Def (_, t) ->
+           (match (open_ ts t) with
+            | Prim p -> prim p
+            | Any -> I.PrimT I.Reserved
+            | Non -> I.PrimT I.Empty
+            | t ->
+               let id = monomorphize_con ts c in
+               if not (Env.mem id !env) then
+                 begin
+                   env := Env.add id (I.PreT @@ no_region) !env;
+                   let t = typ (normalize t) in
+                   env := Env.add id t !env
+                 end;
+               I.VarT (id @@ no_region))
+        | _ -> assert false)
+    | Typ c -> assert false
+    | Tup ts ->
+       if ts = [] then
+         I.PrimT I.Null
+       else
+         I.RecordT (tuple ts)
+    | Array t -> I.VecT (typ t)
+    | Opt t -> I.OptT (typ t)
+    | Obj (Object, fs) ->
+       I.RecordT (fields fs)
+    | Obj (Actor, fs) -> I.ServT (meths fs)
+    | Obj (Module, _) -> assert false
+    | Obj (Memory, _) -> assert false
+    | Variant fs ->
+       I.VariantT (fields fs)
+    | Func (Shared s, c, tbs, ts1, ts2) ->
+       let nons = List.map (fun _ -> Non) tbs in
+       let ts1, ts2 =
+         (List.map (open_ nons) ts1,
+          List.map (open_ nons) ts2) in
+       let t1 = args ts1 in
+       (match ts2, c with
+       | [], Returns -> I.FuncT ([I.Oneway @@ no_region], t1, [])
+       | ts, Promises ->
+         I.FuncT (
+           (match s with
+            | Query -> [I.Query @@ no_region]
+            | Composite -> [I.Composite @@ no_region]
+            | Write -> []),
+           t1, args ts)
+       | _ -> assert false)
+    | Func _
+    | Async _
+    | Mut _
+    | Pre -> assert false
+    ) @@ no_region
+  and field {lab; typ = t; src = {region; _}} =
+    let open Idllib.Escape in
+    match unescape lab with
+    | Nat nat ->
+       I.{label = I.Id nat @@ no_region; typ = typ t} @@ region
+    | Id id ->
+       I.{label = I.Named id @@ no_region; typ = typ t} @@ region
+  and fields fs =
+    List.map field
+      (List.filter (fun f -> not (is_typ f.typ)) fs)
+  and tuple ts =
+    List.mapi (fun i x ->
+        let id = Lib.Uint32.of_int i in
+        I.{label = I.Unnamed id @@ no_region; typ = typ x} @@ no_region
+      ) ts
+  and args ts =
+    List.map typ ts
+  and meths fs =
+    List.fold_right (fun f list ->
+        match f.typ with
+        | Typ c ->
+           list
+        | _ ->
+           let meth =
+             I.{var = Idllib.Escape.unescape_method f.lab @@ no_region;
+                meth = typ f.typ} @@ f.src.region in
+           meth :: list
+      ) fs []
+
+  let is_actor_con c =
+    match Cons.kind c with
+    | Def ([], Obj (Actor, _)) -> true
+    | _ -> false
+
+  let chase_decs env =
+    ConSet.iter (fun c ->
+        if is_actor_con c then ignore (typ (Con (c,[])))
+      ) env.Scope.con_env
+
+  let gather_decs () =
+    Env.fold (fun id t list ->
+        (* TODO: pass corresponding Motoko source region? *)
+        let dec = I.TypD (id @@ no_region, t) @@ no_region in
+        dec::list
+      ) !env []
+
+
+  let actor prog =
+    let open E in
+    let { body = cub; _ } = (CompUnit.comp_unit_of_prog false prog).it in
+    match cub.it with
+    | ProgU _ | ModuleU _ -> None
+    | ActorU _ -> Some (typ cub.note.note_typ)
+    | ActorClassU _ ->
+       (match normalize cub.note.note_typ with
+        | Func (Local, Returns, [tb], ts1, [t2]) ->
+          let args = List.map typ (List.map (open_ [Non]) ts1) in
+          let (_, _, rng) = as_async (normalize (open_ [Non] t2)) in
+          let actor = typ rng in
+          Some (I.ClassT (args, actor) @@ cub.at)
+        | _ -> assert false
+       )
+
+end
+
+let prog (progs, senv) : I.prog =
+  let prog = CompUnit.combine_progs progs in
+  let trivia = prog.note.E.trivia in
+  let open MakeState() in
+  let actor = actor prog in
+  if actor = None then chase_decs senv;
+  let decs = gather_decs () in
+  let it = I.{decs; actor} in
+  {it; at = prog.at; note = I.{filename = ""; trivia}}
+
+let of_actor_type t : I.prog =
+  let open MakeState() in
+  let actor = Some (typ t) in
+  let decs = gather_decs () in
+  let prog = I.{decs; actor} in
+  {it = prog; at = no_region; note = I.{filename = ""; trivia = empty_triv_table}}
+
+let of_service_type ts t : I.typ list * I.prog =
+  let open MakeState() in
+  let args = List.map typ ts  in
+  let actor = Some (typ t) in
+  let decs = gather_decs () in
+  let prog = I.{decs; actor} in
+  args,
+  {it = prog; at = no_region; note = I.{filename = ""; trivia = empty_triv_table}}
+
+
+
+ + + diff --git a/coverage/mo_interpreter/interpret.ml.html b/coverage/mo_interpreter/interpret.ml.html new file mode 100644 index 00000000000..ff647266b96 --- /dev/null +++ b/coverage/mo_interpreter/interpret.ml.html @@ -0,0 +1,3671 @@ + + + + + interpret.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+
+
open Mo_def
+open Mo_values
+open Mo_types
+open Mo_config
+
+open Syntax
+open Source
+
+module V = Value
+module T = Type
+module CC = Call_conv
+
+(* Context *)
+
+type val_env = V.def V.Env.t
+type lib_env = V.value V.Env.t
+type lab_env = V.value V.cont V.Env.t
+type ret_env = V.value V.cont option
+type throw_env = V.value V.cont option
+type actor_env = V.value V.Env.t ref (* indexed by actor ids *)
+
+(* The actor heap.
+    NB: A cut-down ManagementCanister with id "" is added later, to enjoy access to logging facilities.
+*)
+let state = ref V.Env.empty
+
+type flags =
+  { trace : bool;
+    print_depth : int
+  }
+
+type scope =
+  { val_env: V.def V.Env.t;
+    lib_env: V.value V.Env.t;
+  }
+
+type env =
+  { flags : flags;
+    vals : val_env;
+    labs : lab_env;
+    libs : lib_env;
+    rets : ret_env;
+    throws : throw_env;
+    self : V.actor_id;
+    actor_env : actor_env;
+  }
+
+let adjoin_scope scope1 scope2 =
+  { val_env = V.Env.adjoin scope1.val_env scope2.val_env;
+    lib_env = V.Env.adjoin scope1.lib_env scope2.lib_env;
+  }
+
+let adjoin_vals env ve = { env with vals = V.Env.adjoin env.vals ve }
+
+let empty_scope = { val_env = V.Env.empty; lib_env = V.Env.empty }
+
+let lib_scope f v scope : scope =
+  { scope with lib_env = V.Env.add f v scope.lib_env }
+
+let env_of_scope flags ae scope =
+  { flags;
+    vals = scope.val_env;
+    libs = scope.lib_env;
+    labs = V.Env.empty;
+    rets = None;
+    throws = None;
+    self = V.top_id;
+    actor_env = ae;
+  }
+
+let context env = V.Blob env.self
+
+(* Error handling *)
+
+exception Trap of Source.region * string
+exception Cancel of string
+
+let trap at fmt = Printf.ksprintf (fun s -> raise (Trap (at, s))) fmt
+
+let find id env =
+  try V.Env.find id env
+  with Not_found ->
+    let dom = V.Env.keys env in
+    trap no_region "unbound identifier %s in domain %s" id (String.concat " " dom)
+
+(* Tracing *)
+
+let trace_depth = ref 0
+
+let trace fmt =
+  Printf.ksprintf (fun s ->
+    Printf.printf "%s%s\n%!" (String.make (2 * !trace_depth) ' ') s
+  ) fmt
+
+let string_of_val env = V.string_of_val env.flags.print_depth T.Non
+let string_of_def flags = V.string_of_def flags.print_depth T.Non
+let string_of_arg env = function
+  | V.Tup _ as v -> string_of_val env v
+  | v -> "(" ^ string_of_val env v ^ ")"
+
+
+(* Debugging aids *)
+
+let last_env = ref (env_of_scope {trace = false; print_depth = 2} state empty_scope)
+let last_region = ref Source.no_region
+
+let print_exn flags exn =
+  let trace = Printexc.get_backtrace () in
+  Printf.printf "%!";
+  let at = Source.string_of_region !last_region in
+  Printf.eprintf "%s: internal error, %s\n" at (Printexc.to_string exn);
+  Printf.eprintf "\nLast environment:\n";
+  Value.Env.iter (fun x d -> Printf.eprintf "%s = %s\n" x (string_of_def flags d))
+    !last_env.vals;
+  Printf.eprintf "\n";
+  Printf.eprintf "%s" trace;
+  Printf.eprintf "%!"
+
+(* Scheduling *)
+
+let step_total = ref 0
+let step_limit = ref 0
+
+module Scheduler =
+struct
+  let q : (unit -> unit) Queue.t = Queue.create ()
+
+  let queue work = Queue.add work q
+  let yield () =
+    trace_depth := 0;
+    try Queue.take q () with Trap (at, msg) ->
+      Printf.eprintf "%s: execution error, %s\n" (Source.string_of_region at) msg
+  let rec run () =
+    if not (Queue.is_empty q) then (yield (); run ())
+
+  let tmp : (unit -> unit) Queue.t = Queue.create ()
+  let bounce work =
+    (* add work to *front* of queue *)
+    Queue.transfer q tmp;
+    Queue.add work q;
+    Queue.transfer tmp q
+
+  let interval = 128
+  let count = ref interval
+  let trampoline3 f x y z =
+    if !Flags.ocaml_js then begin
+        step_total := (!step_total) + 1;
+        if !step_total = !step_limit then raise (Cancel "interpreter reached step limit");
+        if !count <= 0 then begin
+            count := interval;
+            bounce (fun () -> f x y z);
+          end
+        else begin
+            count := (!count) - 1;
+            f x y z
+          end
+      end
+    else f x y z
+end
+
+
+(* Async auxiliary functions *)
+
+let make_async () : V.async =
+  {V.result = Lib.Promise.make (); waiters = []}
+
+let get_async async (k : V.value V.cont) (r : V.value V.cont) =
+  match Lib.Promise.value_opt async.V.result with
+  | Some (V.Ok v) -> k v
+  | Some (V.Error v) -> r v
+  | None -> async.V.waiters <- (k,r)::async.V.waiters
+
+let set_async async v =
+  List.iter (fun (k,_) -> Scheduler.queue (fun () -> k v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Ok v);
+  async.V.waiters <- []
+
+let reject_async async v =
+  List.iter (fun (_,k) -> Scheduler.queue (fun () -> k v)) async.V.waiters;
+  Lib.Promise.fulfill async.V.result (V.Error v);
+  async.V.waiters <- []
+
+let reply async v =
+  Scheduler.queue (fun () -> set_async async v)
+
+let reject async v =
+  match v with
+  | V.Tup [ _code; message ] ->
+    (* mask the error code before rejecting *)
+    Scheduler.queue
+      (fun () -> reject_async async (V.Tup [V.Variant("canister_reject", V.unit); message]))
+  | _ -> assert false
+
+let async env at (f: (V.value V.cont) -> (V.value V.cont) -> unit) (k : V.value V.cont) =
+    let async = make_async () in
+    let k' = reply async in
+    let r  = reject async in
+    if env.flags.trace then trace "-> async %s" (string_of_region at);
+    Scheduler.queue (fun () ->
+      if env.flags.trace then trace "<- async %s" (string_of_region at);
+      incr trace_depth;
+      f (fun v ->
+        if env.flags.trace then trace "<= %s" (string_of_val env v);
+        decr trace_depth;
+        k' v)
+        r
+    );
+    k (V.Async async)
+
+let await env at async k =
+  if env.flags.trace then trace "=> await %s" (string_of_region at);
+  decr trace_depth;
+  get_async async (fun v ->
+    Scheduler.queue (fun () ->
+      if env.flags.trace then
+        trace "<- await %s%s" (string_of_region at) (string_of_arg env v);
+      incr trace_depth;
+      k v
+      )
+    )
+    (let r = Option.get (env.throws) in
+     fun v ->
+       Scheduler.queue (fun () ->
+         if env.flags.trace then
+           trace "<- await %s threw %s" (string_of_region at) (string_of_arg env v);
+         incr trace_depth;
+         r v))
+
+let make_unit_message env id v =
+  let open CC in
+  let call_conv, f = V.as_func v in
+  match call_conv with
+  | {sort = T.Shared s; n_res = 0; _} ->
+    Value.message_func s call_conv.n_args f
+  | _ -> (* assert false *)
+    failwith ("unexpected call_conv " ^ (string_of_call_conv call_conv))
+
+let make_async_message env id v =
+  let open CC in
+  let call_conv, f = V.as_func v in
+  match call_conv with
+  | {sort = T.Shared s; control = T.Promises; _} ->
+    Value.async_func s call_conv.n_args call_conv.n_res f
+  | _ -> (* assert false *)
+    failwith ("unexpected call_conv " ^ (string_of_call_conv call_conv))
+
+
+let make_message env name t v : V.value =
+  match t with
+  | T.Func (_, T.Returns, _, _, _) -> make_unit_message env name v
+  | T.Func (_, T.Promises, _, _, _) -> make_async_message env name v
+  | _ -> (* assert false *)
+    failwith (Printf.sprintf "actorfield: %s %s" name (T.string_of_typ t))
+
+
+(* Literals *)
+
+let interpret_lit env lit : V.value =
+  match !lit with
+  | NullLit -> V.Null
+  | BoolLit b -> V.Bool b
+  | NatLit n -> V.Int n
+  | Nat8Lit n -> V.Nat8 n
+  | Nat16Lit n -> V.Nat16 n
+  | Nat32Lit n -> V.Nat32 n
+  | Nat64Lit n -> V.Nat64 n
+  | IntLit i -> V.Int i
+  | Int8Lit i -> V.Int8 i
+  | Int16Lit i -> V.Int16 i
+  | Int32Lit i -> V.Int32 i
+  | Int64Lit i -> V.Int64 i
+  | FloatLit f -> V.Float f
+  | CharLit c -> V.Char c
+  | TextLit s -> V.Text s
+  | BlobLit b -> V.Blob b
+  | PreLit _ -> assert false
+
+
+(* Overloaded dot implementations *)
+
+let array_get a at =
+  V.local_func 1 1 (fun c v k ->
+    let n = V.as_int v in
+    if Numerics.Nat.lt n (Numerics.Nat.of_int (Array.length a))
+    then k (a.(Numerics.Nat.to_int n))
+    else trap at "array index out of bounds"
+  )
+
+let array_put a at =
+  V.local_func 2 0 (fun c v k ->
+    let v1, v2 = V.as_pair v in
+    let n = V.as_int v1 in
+    if Numerics.Nat.lt n (Numerics.Nat.of_int (Array.length a))
+    then k (a.(Numerics.Nat.to_int n) <- v2; V.Tup [])
+    else trap at "array index out of bounds"
+  )
+
+let array_size a at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    k (V.Int (Numerics.Nat.of_int (Array.length a)))
+  )
+
+let array_keys a at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = Array.length a
+        then k' V.Null
+        else let v = V.Opt (V.Int (Numerics.Nat.of_int !i)) in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let array_vals a at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = Array.length a
+        then k' V.Null
+        else
+          let wi = match a.(!i) with
+            | V.Mut r -> !r
+            | w -> w in
+          let v = V.Opt wi in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let blob_vals t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = String.length t
+        then k' V.Null
+        else let v = V.Opt V.(Nat8 (Numerics.Nat8.of_int (Char.code (String.get t !i)))) in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let blob_size t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    k (V.Int (Numerics.Nat.of_int (String.length t)))
+  )
+
+let text_chars t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    let i = ref 0 in
+    let s = Lib.Utf8.decode t in
+    let next =
+      V.local_func 0 1 (fun c v k' ->
+        if !i = List.length s
+        then k' V.Null
+        else let v = V.Opt (V.Char (List.nth s !i)) in incr i; k' v
+      )
+    in k (V.Obj (V.Env.singleton "next" next))
+  )
+
+let text_len t at =
+  V.local_func 0 1 (fun c v k ->
+    V.as_unit v;
+    k (V.Int (Numerics.Nat.of_int (List.length (Lib.Utf8.decode t))))
+  )
+
+(* Expressions *)
+
+let check_call_conv exp call_conv =
+  let open CC in
+  let exp_call_conv = call_conv_of_typ exp.note.note_typ in
+  if not (exp_call_conv = call_conv) then
+    failwith (Printf.sprintf
+      "call_conv mismatch: function %s of type %s expecting %s, found %s"
+      (Wasm.Sexpr.to_string 80 (Arrange.exp exp))
+      (T.string_of_typ exp.note.note_typ)
+      (string_of_call_conv exp_call_conv)
+      (string_of_call_conv call_conv)
+    )
+
+let check_call_conv_arg env exp v call_conv =
+  let open CC in
+  if call_conv.n_args <> 1 then
+  let es = try V.as_tup v with Invalid_argument _ ->
+    failwith (Printf.sprintf
+      "call %s: calling convention %s cannot handle non-tuple value %s"
+      (Wasm.Sexpr.to_string 80 (Arrange.exp exp))
+      (string_of_call_conv call_conv)
+      (string_of_val env v)
+    )
+  in
+  if List.length es <> call_conv.n_args then
+    failwith (Printf.sprintf
+      "call %s: calling convention %s got tuple of wrong length %s"
+      (Wasm.Sexpr.to_string 80 (Arrange.exp exp))
+      (string_of_call_conv call_conv)
+      (string_of_val env v)
+    )
+
+let rec interpret_exp env exp (k : V.value V.cont) =
+  Scheduler.trampoline3
+    interpret_exp_mut env exp (function V.Mut r -> k !r | v -> k v)
+
+and interpret_exp_mut env exp (k : V.value V.cont) =
+  last_region := exp.at;
+  last_env := env;
+  Profiler.bump_region exp.at ;
+  match exp.it with
+  | PrimE s ->
+    k (V.Func (CC.call_conv_of_typ exp.note.note_typ,
+       Prim.prim { Prim.trap = trap exp.at "%s" } s
+    ))
+  | VarE id ->
+    begin match Lib.Promise.value_opt (find id.it env.vals) with
+    | Some v -> k v
+    | None -> trap exp.at "accessing identifier before its definition"
+    end
+  | ImportE (f, ri) ->
+    (match !ri with
+    | Unresolved -> assert false
+    | LibPath {path; _} ->
+      k (find path env.libs)
+    | IDLPath _ -> trap exp.at "actor import"
+    | PrimPath -> k (find "@prim" env.libs)
+    )
+  | LitE lit ->
+    k (interpret_lit env lit)
+  | ActorUrlE url ->
+    interpret_exp env url (fun v1 ->
+      let url_text = V.as_text v1 in
+      match Ic.Url.decode_principal url_text with
+      (* create placeholder functions (see #3683) *)
+      | Ok bytes ->
+        if String.length bytes > 29 then
+          trap exp.at "blob too long for actor principal"
+        else
+          k (V.Blob bytes)
+      | Error e -> trap exp.at "could not parse %S as an actor reference: %s"  (V.as_text v1) e
+    )
+  | UnE (ot, op, exp1) ->
+    interpret_exp env exp1
+      (fun v1 ->
+        k (try Operator.unop op !ot v1 with Invalid_argument s -> trap exp.at "%s" s))
+  | BinE (ot, exp1, op, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (try Operator.binop op !ot v1 v2 with _ ->
+          trap exp.at "arithmetic overflow")
+      )
+    )
+  | ToCandidE _ -> invalid_arg "to do: ToCandidE"
+  | FromCandidE _ -> invalid_arg "to do: FromCandidE"
+  | ShowE (ot, exp1) ->
+    interpret_exp env exp1 (fun v ->
+      if Show.can_show !ot
+      then k (Value.Text (Show.show_val !ot v))
+      else raise (Invalid_argument "debug_show"))
+  | RelE (ot, exp1, op, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (Operator.relop op !ot v1 v2)
+      )
+    )
+  | TupE exps ->
+    interpret_exps env exps [] (fun vs -> k (V.Tup vs))
+  | OptE exp1 ->
+    interpret_exp env exp1 (fun v1 -> k (V.Opt v1))
+  | DoOptE exp1 ->
+    let env' = { env with labs = V.Env.add "!" k env.labs } in
+    interpret_exp env' exp1 (fun v1 -> k (V.Opt v1))
+  | BangE exp1 ->
+    interpret_exp env exp1 (fun v1 ->
+      match v1 with
+      | V.Opt v2 -> k v2
+      | V.Null -> find "!" env.labs v1
+      | _ -> assert false)
+  | ProjE (exp1, n) ->
+    interpret_exp env exp1 (fun v1 -> k (List.nth (V.as_tup v1) n))
+  | ObjBlockE (obj_sort, _, dec_fields) ->
+    interpret_obj env obj_sort.it dec_fields k
+  | ObjE (exp_bases, exp_fields) ->
+    let fields fld_env = interpret_exp_fields env exp_fields fld_env (fun env -> k (V.Obj env)) in
+    let open V.Env in
+    let merges =
+      List.fold_left
+        (merge (fun _ l r -> match l, r with | l, None -> l | None, r -> r | _ -> assert false))
+        empty in
+    (* remove dynamic fields not present in the type as well as overwritten fields *)
+    let labs = List.map (fun (f : Syntax.exp_field) -> f.it.id.it) exp_fields in
+    let tys = List.(map (fun b ->
+                         T.as_obj b.note.note_typ |>
+                         snd |>
+                         filter (fun f -> not (mem f.T.lab labs)))) exp_bases in
+    let strip vs =
+      let known fs k _ = List.exists (fun { T.lab; _ } -> k = lab) fs in
+      List.map2 (fun fs v -> filter (known fs) (V.as_obj v)) tys vs in
+    interpret_exps env exp_bases [] (fun objs -> fields (merges (strip objs)))
+  | TagE (i, exp1) ->
+    interpret_exp env exp1 (fun v1 -> k (V.Variant (i.it, v1)))
+  | DotE (exp1, id) ->
+    interpret_exp env exp1 (fun v1 ->
+      match v1 with
+      | V.Obj fs ->
+        k (find id.it fs)
+      | V.Blob aid when T.sub exp1.note.note_typ (T.Obj (T.Actor, [])) ->
+        begin match V.Env.find_opt aid !(env.actor_env) with
+        (* not quite correct: On the platform, you can invoke and get a reject *)
+        | None -> trap exp.at "Unkown actor \"%s\"" aid
+        | Some actor_value ->
+          let fs = V.as_obj actor_value in
+          match V.Env.find_opt id.it fs with
+          | None -> trap exp.at "Actor \"%s\" has no method \"%s\"" aid id.it
+          | Some field_value -> k field_value
+        end
+      | V.Array vs ->
+        let f = match id.it with
+          | "size" -> array_size
+          | "get" -> array_get
+          | "put" -> array_put
+          | "keys" -> array_keys
+          | "vals" -> array_vals
+          | s -> assert false
+        in k (f vs exp.at)
+      | V.Text s ->
+        let f = match id.it with
+          | "size" -> text_len
+          | "chars" -> text_chars
+          | s -> assert false
+        in k (f s exp.at)
+      | V.Blob b when T.sub exp1.note.note_typ (T.blob)->
+        let f = match id.it with
+          | "size" -> blob_size
+          | "vals" -> blob_vals
+          | s -> assert false
+        in k (f b exp.at)
+      | _ -> assert false
+    )
+  | AssignE (exp1, exp2) ->
+    interpret_exp_mut env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        V.as_mut v1 := v2; k V.unit
+      )
+    )
+  | ArrayE (mut, exps) ->
+    interpret_exps env exps [] (fun vs ->
+      let vs' =
+        match mut.it with
+        | Var -> List.map (fun v -> V.Mut (ref v)) vs
+        | Const -> vs
+      in k (V.Array (Array.of_list vs'))
+    )
+  | IdxE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k (try (V.as_array v1).(Numerics.Int.to_int (V.as_int v2))
+           with Invalid_argument s -> trap exp.at "%s" s)
+      )
+    )
+  | FuncE (name, shared_pat, _typbinds, pat, _typ, _sugar, exp2) ->
+    let f = interpret_func env name shared_pat pat (fun env' -> interpret_exp env' exp2) in
+    let v = V.Func (CC.call_conv_of_typ exp.note.note_typ, f) in
+    let v' =
+      match shared_pat.it with
+      | T.Shared _ -> make_message env name exp.note.note_typ v
+      | T.Local -> v
+    in k v'
+  | CallE (exp1, typs, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        let call_conv, f = V.as_func v1 in
+        check_call_conv exp1 call_conv;
+        check_call_conv_arg env exp v2 call_conv;
+        last_region := exp.at; (* in case the following throws *)
+        let c = context env in
+        f c v2 k
+      )
+    )
+  | BlockE decs ->
+    let k' =
+      if T.is_unit exp.note.note_typ (* TODO: peeking at types violates erasure semantics, revisit! *)
+      then (fun _v -> k V.unit)
+      else k
+    in
+    interpret_block env decs None k'
+  | NotE exp1 ->
+    interpret_exp env exp1 (fun v1 -> k (V.Bool (not (V.as_bool v1))))
+  | AndE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k
+      else k v1
+    )
+  | OrE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then k v1
+      else interpret_exp env exp2 k
+    )
+  | ImpliesE (exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_exp env exp2 (fun v2 ->
+        k V.(Bool (as_bool v1 <= as_bool v2))
+      )
+    )
+  | OldE exp1 ->
+    interpret_exp env exp1 (fun v1 -> k v1)
+  | IfE (exp1, exp2, exp3) ->
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k
+      else interpret_exp env exp3 k
+    )
+  | SwitchE (exp1, cases) ->
+    interpret_exp env exp1 (fun v1 ->
+      interpret_cases env cases exp.at v1 k
+      )
+  | TryE (exp1, cases) ->
+    let k' = fun v1 -> interpret_catches env cases exp.at v1 k in
+    let env' = { env with throws = Some k' } in
+    interpret_exp env' exp1 k
+  | WhileE (exp1, exp2) ->
+    let k_continue = fun v -> V.as_unit v; interpret_exp env exp k in
+    interpret_exp env exp1 (fun v1 ->
+      if V.as_bool v1
+      then interpret_exp env exp2 k_continue
+      else k V.unit
+    )
+  | LoopE (exp1, None) ->
+    interpret_exp env exp1 (fun v -> V.as_unit v; interpret_exp env exp k)
+  | LoopE (exp1, Some exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      V.as_unit v1;
+      interpret_exp env exp2 (fun v2 ->
+        if V.as_bool v2
+        then interpret_exp env exp k
+        else k V.unit
+      )
+    )
+  | ForE (pat, exp1, exp2) ->
+    interpret_exp env exp1 (fun v1 ->
+      let fs = V.as_obj v1 in
+      let _, next = V.as_func (find "next" fs) in
+      let rec k_continue = fun v ->
+        V.as_unit v;
+        next (context env) V.unit (fun v' ->
+          match v' with
+          | V.Opt v1 ->
+            (match match_pat pat v1 with
+            | None ->
+              trap pat.at "value %s does not match pattern" (string_of_val env v')
+            | Some ve ->
+              interpret_exp (adjoin_vals env ve) exp2 k_continue
+            )
+          | V.Null -> k V.unit
+          | _ -> assert false
+        )
+      in k_continue V.unit
+    )
+  | LabelE (id, _typ, exp1) ->
+    let env' = {env with labs = V.Env.add id.it k env.labs} in
+    Profiler.bump_label id.at id.it ;
+    interpret_exp env' exp1 k
+  | BreakE (id, exp1) ->
+    interpret_exp env exp1 (find id.it env.labs)
+  | DebugE exp1 ->
+    if !Mo_config.Flags.release_mode then k V.unit else interpret_exp env exp1 k
+  | RetE exp1 ->
+    interpret_exp env exp1 (Option.get env.rets)
+  | ThrowE exp1 ->
+    interpret_exp env exp1 (Option.get env.throws)
+  | AsyncE (T.Fut, _, exp1) ->
+    async env
+      exp.at
+      (fun k' r ->
+        let env' = {env with labs = V.Env.empty; rets = Some k'; throws = Some r}
+        in interpret_exp env' exp1 k')
+      k
+  | AsyncE (T.Cmp, _, exp1) ->
+    k (V.Comp (fun k' r ->
+      let env' = {env with labs = V.Env.empty; rets = Some k'; throws = Some r}
+      in interpret_exp env' exp1 k'))
+  | AwaitE (T.Fut, exp1) ->
+    interpret_exp env exp1
+      (fun v1 -> await env exp.at (V.as_async v1) k)
+  | AwaitE (T.Cmp, exp1) ->
+    interpret_exp env exp1
+      (fun v1 -> (V.as_comp v1) k (Option.get env.throws))
+  | AssertE (Runtime, exp1) ->
+    interpret_exp env exp1 (fun v ->
+      if V.as_bool v
+      then k V.unit
+      else trap exp.at "assertion failure"
+    )
+  | AssertE (_, exp1) -> k V.unit
+  | AnnotE (exp1, _typ) ->
+    interpret_exp env exp1 k
+  | IgnoreE exp1 ->
+    interpret_exp env exp1 (fun _v -> k V.unit)
+
+and interpret_exps env exps vs (k : V.value list V.cont) =
+  match exps with
+  | [] -> k (List.rev vs)
+  | exp::exps' ->
+    interpret_exp env exp (fun v -> interpret_exps env exps' (v::vs) k)
+
+(* Objects *)
+
+and interpret_exp_fields env exp_fields fld_env (k : V.value V.Env.t V.cont) =
+  match exp_fields with
+  | [] -> k fld_env
+  | exp_field::exp_fields' ->
+    interpret_exp env exp_field.it.exp (fun v ->
+      let fv = match exp_field.it.mut.it with
+          | Syntax.Var -> V.Mut (ref v)
+          | Syntax.Const -> v
+      in
+      interpret_exp_fields env exp_fields' (V.Env.add exp_field.it.id.it fv fld_env) k)
+
+(* Cases *)
+
+and interpret_cases env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    trap at "switch value %s does not match any case" (string_of_val env v)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_cases env cases' at v k
+
+(* Catches *)
+
+and interpret_catches env cases at v (k : V.value V.cont) =
+  match cases with
+  | [] ->
+    Option.get env.throws v (* re-throw v *)
+  | {it = {pat; exp}; at; _}::cases' ->
+    match match_pat pat v with
+    | Some ve -> interpret_exp (adjoin_vals env ve) exp k
+    | None -> interpret_catches env cases' at v k
+
+(* Patterns *)
+
+and declare_id id =
+  V.Env.singleton id.it (Lib.Promise.make ())
+
+and declare_pat pat : val_env =
+  match pat.it with
+  | WildP | LitP _ | SignP _ ->  V.Env.empty
+  | VarP id -> declare_id id
+  | TupP pats -> declare_pats pats V.Env.empty
+  | ObjP pfs -> declare_pat_fields pfs V.Env.empty
+  | OptP pat1
+  | TagP (_, pat1)
+  | AltP (pat1, _) (* pat2 has the same identifiers *)
+  | AnnotP (pat1, _)
+  | ParP pat1 -> declare_pat pat1
+
+and declare_pats pats ve : val_env =
+  match pats with
+  | [] -> ve
+  | pat::pats' ->
+    let ve' = declare_pat pat in
+    declare_pats pats' (V.Env.adjoin ve ve')
+
+and declare_pat_fields pfs ve : val_env =
+  match pfs with
+  | [] -> ve
+  | pf::pfs' ->
+    let ve' = declare_pat pf.it.pat in
+    declare_pat_fields pfs' (V.Env.adjoin ve ve')
+
+and define_id env id v =
+  define_id' env id.it v
+
+and define_id' env id v =
+  Lib.Promise.fulfill (find id env.vals) v
+
+and define_pat env pat v =
+  match match_pat pat v with
+  | Some ve ->
+     V.Env.iter (fun id d  -> define_id' env id (Lib.Promise.value d)) ve;
+     true
+  | None ->
+     false
+
+and match_lit lit v : bool =
+  match !lit, v with
+  | NullLit, V.Null -> true
+  | BoolLit b, V.Bool b' -> b = b'
+  | NatLit n, V.Int n' -> Numerics.Int.eq n n'
+  | Nat8Lit n, V.Nat8 n' -> Numerics.Nat8.eq n n'
+  | Nat16Lit n, V.Nat16 n' -> Numerics.Nat16.eq n n'
+  | Nat32Lit n, V.Nat32 n' -> Numerics.Nat32.eq n n'
+  | Nat64Lit n, V.Nat64 n' -> Numerics.Nat64.eq n n'
+  | IntLit i, V.Int i' -> Numerics.Int.eq i i'
+  | Int8Lit i, V.Int8 i' -> Numerics.Int_8.eq i i'
+  | Int16Lit i, V.Int16 i' -> Numerics.Int_16.eq i i'
+  | Int32Lit i, V.Int32 i' -> Numerics.Int_32.eq i i'
+  | Int64Lit i, V.Int64 i' -> Numerics.Int_64.eq i i'
+  | FloatLit z, V.Float z' -> z = z'
+  | CharLit c, V.Char c' -> c = c'
+  | TextLit u, V.Text u' -> u = u'
+  | BlobLit b, V.Blob b' -> b = b'
+  | PreLit _, _ -> assert false
+  | _ -> false
+
+and match_pat pat v : val_env option =
+  match pat.it with
+  | WildP -> Some V.Env.empty
+  | VarP id -> Some (V.Env.singleton id.it (Lib.Promise.make_fulfilled v))
+  | LitP lit ->
+    if match_lit lit v
+    then Some V.Env.empty
+    else None
+  | SignP (op, lit) ->
+    let t = T.as_immut pat.note in
+    match_pat {pat with it = LitP lit} (Operator.unop op t v)
+  | TupP pats ->
+    match_pats pats (V.as_tup v) V.Env.empty
+  | ObjP pfs ->
+    match_pat_fields pfs (V.as_obj v) V.Env.empty
+  | OptP pat1 ->
+    (match v with
+    | V.Opt v1 -> match_pat pat1 v1
+    | V.Null -> None
+    | _ -> assert false
+    )
+  | TagP (i, pat1) ->
+    let k, v1 = V.as_variant v in
+    if i.it = k
+    then match_pat pat1 v1
+    else None
+  | AltP (pat1, pat2) ->
+    (match match_pat pat1 v with
+    | None -> match_pat pat2 v
+    | some -> some
+    )
+  | AnnotP (pat1, _)
+  | ParP pat1 ->
+    match_pat pat1 v
+
+and match_pats pats vs ve : val_env option =
+  match pats, vs with
+  | [], [] -> Some ve
+  | pat::pats', v::vs' ->
+    (match match_pat pat v with
+    | Some ve' -> match_pats pats' vs' (V.Env.adjoin ve ve')
+    | None -> None
+    )
+  | _ -> assert false
+
+and match_pat_fields pfs vs ve : val_env option =
+  match pfs with
+  | [] -> Some ve
+  | pf::pfs' ->
+    let v = V.Env.find pf.it.id.it vs in
+    begin match match_pat pf.it.pat v with
+    | Some ve' -> match_pat_fields pfs' vs (V.Env.adjoin ve ve')
+    | None -> None
+    end
+
+and match_shared_pat env shared_pat c =
+  match shared_pat.it, c with
+  | T.Local, _ -> V.Env.empty
+  | T.Shared (_, pat), v ->
+    (match match_pat pat v with
+     | None ->
+       (* shouldn't occur with our irrefutable patterns, but may in future *)
+       trap pat.at "context value %s does not match context pattern" (string_of_val env v)
+     | Some ve1 ->
+       ve1)
+
+(* Objects *)
+
+and interpret_obj env obj_sort dec_fields (k : V.value V.cont) =
+  match obj_sort with
+  | T.Actor ->
+     let self = V.fresh_id() in
+     let ve_ex, ve_in = declare_dec_fields dec_fields V.Env.empty V.Env.empty in
+     let env' = adjoin_vals { env with self = self } ve_in in
+     interpret_dec_fields env' dec_fields ve_ex
+     (fun obj ->
+        (env.actor_env := V.Env.add self obj !(env.actor_env);
+          k (V.Blob self)))
+  | _ ->
+     let ve_ex, ve_in = declare_dec_fields dec_fields V.Env.empty V.Env.empty in
+     let env' = adjoin_vals env ve_in in
+     interpret_dec_fields env' dec_fields ve_ex k
+
+and declare_dec_fields dec_fields ve_ex ve_in : val_env * val_env =
+  match dec_fields with
+  | [] -> ve_ex, ve_in
+  | {it = {dec; vis; _}; _}::dec_fields' ->
+    let ve' = declare_dec dec in
+    let ve_ex' = if vis.it = Private then ve_ex else V.Env.adjoin ve_ex ve' in
+    let ve_in' = V.Env.adjoin ve_in ve' in
+    declare_dec_fields dec_fields' ve_ex' ve_in'
+
+and interpret_dec_fields env dec_fields ve (k : V.value V.cont) =
+  match dec_fields with
+  | [] ->
+    let obj = V.Obj (V.Env.map Lib.Promise.value ve) in
+    k obj
+  | {it = {dec; _}; _}::dec_fields' ->
+    interpret_dec env dec (fun _v -> interpret_dec_fields env dec_fields' ve k)
+
+
+(* Blocks and Declarations *)
+
+and interpret_block env decs ro (k : V.value V.cont) =
+  let ve = declare_decs decs V.Env.empty in
+  Option.iter (fun r -> r := ve) ro;
+  interpret_decs (adjoin_vals env ve) decs k
+
+
+and declare_dec dec : val_env =
+  match dec.it with
+  | ExpD _
+  | TypD _ -> V.Env.empty
+  | LetD (pat, _, _) -> declare_pat pat
+  | VarD (id, _) -> declare_id id
+  | ClassD (_, id, _, _, _, _, _, _) -> declare_id {id with note = ()}
+
+and declare_decs decs ve : val_env =
+  match decs with
+  | [] -> ve
+  | dec::decs' ->
+    let ve' = declare_dec dec in
+    declare_decs decs' (V.Env.adjoin ve ve')
+
+
+and interpret_dec env dec (k : V.value V.cont) =
+  match dec.it with
+  | ExpD exp ->
+    interpret_exp env exp k
+  | LetD (pat, exp, fail) ->
+    interpret_exp env exp (fun v ->
+      if define_pat env pat v then
+        k v
+      else
+        match fail with
+        | Some fail -> interpret_exp env fail (fun _ -> assert false)
+        | None -> trap pat.at "value %s does not match pattern" (string_of_val env v)
+    )
+  | VarD (id, exp) ->
+    interpret_exp env exp (fun v ->
+      define_id env id (V.Mut (ref v));
+      k V.unit
+    )
+  | TypD _ ->
+    k V.unit
+  | ClassD (shared_pat, id, _typbinds, pat, _typ_opt, obj_sort, id', dec_fields) ->
+    let f = interpret_func env id.it shared_pat pat (fun env' k' ->
+      if obj_sort.it <> T.Actor then
+        let env'' = adjoin_vals env' (declare_id id') in
+        interpret_obj env'' obj_sort.it dec_fields (fun v' ->
+          define_id env'' id' v';
+          k' v')
+      else
+        async env' Source.no_region
+          (fun k'' r ->
+            let env'' = adjoin_vals env' (declare_id id') in
+            let env''' = { env'' with
+              labs = V.Env.empty;
+              rets = Some k'';
+              throws = Some r }
+            in
+            interpret_obj env''' obj_sort.it dec_fields (fun v' ->
+              define_id env''' id' v';
+              k'' v'))
+          k')
+    in
+    let v = V.Func (CC.call_conv_of_typ dec.note.note_typ, f) in
+    define_id env {id with note = ()} v;
+    k v
+
+and interpret_decs env decs (k : V.value V.cont) =
+  match decs with
+  | [] -> k V.unit
+  | [dec] -> interpret_dec env dec k
+  | dec::decs' ->
+    interpret_dec env dec (fun _v -> interpret_decs env decs' k)
+
+and interpret_func env name shared_pat pat f c v (k : V.value V.cont) =
+  if env.flags.trace then trace "%s%s" name (string_of_arg env v);
+  let v1 = V.Obj (V.Env.singleton "caller" c) in
+  let ve1 = match_shared_pat env shared_pat v1 in
+  match match_pat pat v with
+  | None ->
+    trap pat.at "argument value %s does not match parameter list" (string_of_val env v)
+  | Some ve2 ->
+    incr trace_depth;
+    let k' = fun v' ->
+      if env.flags.trace then trace "<= %s" (string_of_val env v');
+      decr trace_depth;
+      k v'
+    in
+    let env' =
+      { env with
+        vals = V.Env.adjoin env.vals (V.Env.adjoin ve1 ve2);
+        libs = env.libs;
+        labs = V.Env.empty;
+        rets = Some k';
+      }
+    in f env' k'
+
+(* Programs *)
+
+let ensure_management_canister env =
+  if V.Env.mem "" (!(env.actor_env))
+  then ()
+  else
+    env.actor_env :=
+      V.Env.add
+        (* ManagementCanister with raw_rand (only) *)
+        ""
+        (V.Obj
+           (V.Env.singleton "raw_rand"
+              (V.async_func (T.Write) 0 1
+                 (fun c v k ->
+                   async env
+                     Source.no_region
+                     (fun k' r ->
+                       k' (V.Blob (V.Blob.rand32 ())))
+                     k))))
+        !(env.actor_env)
+
+let interpret_prog flags scope p : (V.value * scope) option =
+  step_total := 0;
+  let state = state in
+  try
+    let env =
+      { (env_of_scope flags state scope) with
+        throws = Some (fun v -> trap !last_region "uncaught throw") } in
+    ensure_management_canister env;
+    trace_depth := 0;
+    let vo = ref None in
+    let ve = ref V.Env.empty in
+    Scheduler.queue (fun () ->
+      interpret_block env p.it (Some ve) (fun v -> vo := Some v)
+    );
+    Scheduler.run ();
+    let scope = { val_env = !ve; lib_env = scope.lib_env } in
+    match !vo with
+    | Some v -> Some (v, scope)
+    | None -> None
+  with
+  | Cancel s ->
+    Printf.eprintf "cancelled: %s\n" s;
+    None
+  | exn ->
+    (* For debugging, should never happen. *)
+    print_exn flags exn;
+    None
+
+
+(* Libraries *)
+
+(* Import a module unchanged, and a class constructor as an asynchronous function.
+   The conversion will be unnecessary once we declare classes as asynchronous. *)
+let import_lib env lib =
+  let { body = cub; _ } = lib.it in
+  match cub.it with
+  | Syntax.ModuleU _ ->
+    fun v -> v
+  | Syntax.ActorClassU (_sp, id, _tbs, _p, _typ, _self_id, _dec_fields) ->
+    fun v -> V.Obj (V.Env.from_list
+      [ (id.it, v);
+        ("system",
+         V.Obj (V.Env.singleton id.it (
+          V.local_func 1 1 (fun c w k ->
+            let tag, w1 = V.as_variant w in
+            let o = V.as_obj w1 in
+            if tag = "new" && V.Env.find "settings" o = V.Null
+            then k v
+            else trap cub.at "actor class configuration unsupported in interpreter")))) ])
+  | _ -> assert false
+
+
+let interpret_lib flags scope lib : scope =
+  let env = env_of_scope flags state scope in
+  trace_depth := 0;
+  let vo = ref None in
+  let ve = ref V.Env.empty in
+  Scheduler.queue (fun () ->
+    let import = import_lib env lib in
+    let (imp_decs, decs) = CompUnit.decs_of_lib lib in
+    interpret_block env (imp_decs @ decs) (Some ve) (fun v ->
+      vo := Some (import v))
+  );
+  Scheduler.run ();
+  lib_scope lib.note.filename (Option.get !vo) scope
+
+
+
+ + + diff --git a/coverage/mo_types/arrange_type.ml.html b/coverage/mo_types/arrange_type.ml.html new file mode 100644 index 00000000000..975f164895e --- /dev/null +++ b/coverage/mo_types/arrange_type.ml.html @@ -0,0 +1,297 @@ + + + + + arrange_type.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+
+
open Type
+open Wasm.Sexpr
+
+let ($$) head inner = Node (head, inner)
+
+let control = function
+  | Returns -> "Returns"
+  | Promises -> "Promises"
+  | Replies -> "Replies"
+
+let obj_sort = function
+  | Object -> Atom "Object"
+  | Actor -> Atom "Actor"
+  | Module -> Atom "Module"
+  | Memory -> Atom "Memory"
+
+let func_sort = function
+  | Local -> "Local"
+  | Shared Write -> "Shared"
+  | Shared Query -> "Shared Query"
+  | Shared Composite -> "Shared Composite"
+
+let prim = function
+  | Null -> Atom "Null"
+  | Bool -> Atom "Bool"
+  | Nat -> Atom "Nat"
+  | Nat8 -> Atom "Nat8"
+  | Nat16 -> Atom "Nat16"
+  | Nat32 -> Atom "Nat32"
+  | Nat64 -> Atom "Nat64"
+  | Int -> Atom "Int"
+  | Int8 -> Atom "Int8"
+  | Int16 -> Atom "Int16"
+  | Int32 -> Atom "Int32"
+  | Int64 -> Atom "Int64"
+  | Float -> Atom "Float"
+  | Char -> Atom "Char"
+  | Text -> Atom "Text"
+  | Blob -> Atom "Blob"
+  | Error -> Atom "Error"
+  | Principal -> Atom "Principal"
+  | Region -> Atom "Region"
+
+let con c = Atom (Type.string_of_con c)
+
+let rec typ = function
+  | Var (s, i)             -> "Var" $$ [Atom s; Atom (string_of_int i)]
+  | Con (c, ts)            -> "Con" $$ (con c::List.map typ ts)
+  | Prim p                 -> "Prim" $$ [prim p]
+  | Obj (s, tfs)           -> "Obj" $$ [obj_sort s] @ List.map typ_field tfs
+  | Array t                -> "Array" $$ [typ t]
+  | Opt t                  -> "Opt" $$ [typ t]
+  | Variant tfs            -> "Variant" $$ List.map typ_field tfs
+  | Tup ts                 -> "Tup" $$ List.map typ ts
+  | Func (s, c, tbs, at, rt) ->
+    "Func" $$ [Atom (func_sort s); Atom (control c)] @
+      List.map typ_bind tbs @ [ "" $$ (List.map typ at); "" $$ (List.map typ rt)]
+  | Async (Fut, t1, t2)    -> "Async" $$ [typ t1; typ t2]
+  | Async (Cmp, t1, t2)    -> "Async*" $$ [typ t1; typ t2]
+  | Mut t                  -> "Mut" $$ [typ t]
+  | Any                    -> Atom "Any"
+  | Non                    -> Atom "Non"
+  | Pre                    -> Atom "Pre"
+  | Typ c                  -> "Typ" $$ [con c]
+
+and typ_bind (tb : Type.bind) =
+  tb.var $$ [typ tb.bound]
+
+and typ_field (tf : Type.field) =
+  tf.lab $$ [typ tf.typ]
+
+
+
+ + + diff --git a/coverage/mo_types/async_cap.ml.html b/coverage/mo_types/async_cap.ml.html new file mode 100644 index 00000000000..196e5a8e065 --- /dev/null +++ b/coverage/mo_types/async_cap.ml.html @@ -0,0 +1,89 @@ + + + + + async_cap.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+
+
(* Async capabilities *)
+module T = Type
+
+type async_cap =
+  | QueryCap of T.con  (* can (query) async (i.e. in a shared query func) *)
+  | ErrorCap           (* can try, catch  (i.e. in the async body of shared query func) *)
+  | AsyncCap of T.con  (* can async, send (i.e. in a func of async type or shared func) *)
+  | AwaitCap of T.con  (* can async, send, try, catch, await (i.e. in an async expression *)
+  | SystemCap of T.con   (* can call protected system functions (e,g, addCycles<system>(...), setTimer<system>(...) *)
+  | NullCap            (* none of the above *)
+  | CompositeCap of T.con (* can (query) async (i.e. in a shared composite query func) *)
+  | CompositeAwaitCap of T.con (* can send a (composite or vanilla) query, try, catch, await (i.e. in a composite query func) *)
+
+let top_cap = Cons.fresh "$top-level" (T.Def([],T.Any))
+
+let bogus_cap = Cons.fresh "$bogus" (T.Def([],T.Non))
+
+let initial_cap () = AwaitCap top_cap
+
+
+
+ + + diff --git a/coverage/mo_types/cons.ml.html b/coverage/mo_types/cons.ml.html new file mode 100644 index 00000000000..4316fca3fc4 --- /dev/null +++ b/coverage/mo_types/cons.ml.html @@ -0,0 +1,191 @@ + + + + + cons.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+
+
(*
+The kind field is a reference to break the recursion in open_binds,
+and to allow the multiple passes in typing. These go through Type.set_kind
+with additional safeguards.
+
+Besides these two use-cases, the kind should not be mutated, and treated like
+immutable data.
+
+This module interface guarantees that constructors with the same stamp have the
+same ref.
+*)
+
+type 'a con = {name : string; stamp : int; kind : 'a ref}
+type 'a t = 'a con
+
+module Stamps = Env.Make(String)
+
+let stamps : int Stamps.t ref = ref Stamps.empty
+
+let session f =
+  let original = !stamps in
+  try let result = f () in
+       stamps := original;
+       result
+  with e -> begin
+     stamps := original;
+     raise e
+  end
+
+let fresh_stamp name =
+  let n = Lib.Option.get (Stamps.find_opt name !stamps) 0 in
+  stamps := Stamps.add name (n + 1) !stamps;
+  n
+
+let fresh name k = {name; stamp = fresh_stamp name; kind = ref k}
+let clone c k = {c with stamp = fresh_stamp c.name; kind = ref k}
+
+let kind c = !(c.kind)
+let unsafe_set_kind c k = c.kind := k
+
+let name c = c.name
+
+let to_string show_stamps sep c =
+  if not show_stamps || c.stamp = 0 then c.name else Printf.sprintf "%s%s%i" c.name sep c.stamp
+
+let eq c1 c2 = c1.stamp = c2.stamp && c1.name = c2.name
+
+let compare c1 c2 =
+  match Int.compare c1.stamp c2.stamp with
+  | 0 -> String.compare c1.name c2.name
+  | ord -> ord
+
+
+
+ + + diff --git a/coverage/mo_types/expansive.ml.html b/coverage/mo_types/expansive.ml.html new file mode 100644 index 00000000000..50e2d7db163 --- /dev/null +++ b/coverage/mo_types/expansive.ml.html @@ -0,0 +1,679 @@ + + + + + expansive.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+
+
open Type
+
+(*
+
+  Check the non-expansiveness criterion identified first by Viroli and
+  adopted by Pierce and Kennedy [1] to ensure termination of sub-typing
+  in *nominal* type systems with generics and subtyping.
+
+  Given a set of mutually recursive type definitions, construct a graph
+  whose vertices are the formal parameters (identified by position),
+  `C#i`, and two sorts of labeled edges:
+
+  * an occurrence of parameter `C#i` as immediate `j`-th argument to
+    type `D<..,C#i,..>`, adds a (non-expansive) 0-labeled edge `C#i -0->D#j`.
+
+  * an occurrence of parameter `C#i` as a proper sub-term of the `j`-th
+    argument to type `D<...,T[C#i],..>` adds an (expansive) 1-labeled
+    edge `C#i -1-> D#j`.
+
+  The graph is expansive iff it contains a cycle with at least one
+  expansive edge.
+
+  Non-expansiveness (hopefully) ensures that the set of types
+  encountered during sub-typing, and added to the visited set, is
+  finite. In nominal systems, a visited set is used to reject a
+  cyclic sub-type check, but in our co-inductive setting, it is used
+  to succeed a cyclic check. In either case, it is used to terminate the
+  procedure, which is what we care about.
+
+  To detect the existence of a cycle, we construct the plain graph
+  obtained by deleting labels (possibly identifying edges), compute
+  its strongly connected components (sccs), and then check whether
+  there is a 1-weighted edge (in the original graph) connecting any
+  two vertices of the *same* component of the sccs.
+
+  [1] Andrew Kennedy Benjamin C. Pierce
+  International Workshop on Foundations and Developments of Object-Oriented Languages (FOOL/WOOD),
+  January 2007
+
+  https://www.microsoft.com/en-us/research/publication/on-decidability-of-nominal-subtyping-with-variance/
+
+*)
+
+let debug = false (* set to 1 to show graph in error message *)
+
+(* Collecting type constructors *)
+
+module Vertex = struct
+  type t = Type.con * int
+  let compare (c,i) (d,j) =
+  match Cons.compare c d with
+  | 0 -> compare i j
+  | n -> n
+end
+
+module Edge = struct
+  type t = Vertex.t * int * Vertex.t
+  let compare (c1, w1, d1) (c2, w2, d2) =
+  match Vertex.compare c1 c2 with
+  | 0 ->
+    begin
+      match compare w1 w2 with
+      | 0 -> Vertex.compare d1 d2
+      | n -> n
+    end
+  | n -> n
+end
+
+module VertexSet = Set.Make(Vertex)
+
+module EdgeSet = Set.Make(Edge)
+
+let string_of_vertex (c, i) = Printf.sprintf "(%s,%i)" (Cons.name c) i
+
+let string_of_vertices vs =
+  Printf.sprintf "{ %s }" (String.concat "," (List.map string_of_vertex (VertexSet.elements vs)))
+
+let string_of_edge (ci,w,dj) =
+  Printf.sprintf ("%s -%i-> %s") (string_of_vertex ci) w (string_of_vertex dj)
+
+let string_of_edges es =
+  Printf.sprintf "{ %s }" (String.concat "," (List.map string_of_edge (EdgeSet.elements es)))
+
+let edges_typ cs c (es : EdgeSet.t) t : EdgeSet.t =
+  let rec go_typs i exp non es ts =
+    List.fold_left (go_typ i exp non) es ts
+  and go_typ i exp non es = function
+    | Var (s, j) when j >= i  ->
+      let ci = (c, j - i) in
+      let es1 = VertexSet.fold (fun dj es -> EdgeSet.add (ci, 1, dj) es) exp es in
+      let es2 = VertexSet.fold (fun dj es -> EdgeSet.add (ci, 0, dj) es) non es1 in
+      es2
+    | Var (s, j) ->
+      assert (j < i);
+      es
+    | (Prim _ | Any | Non | Pre ) -> es
+    | Con (d, ts) when ConSet.mem d cs ->
+      let exp1 = VertexSet.union exp non in
+      let _, es = List.fold_left
+        (fun (k, es) t ->
+          (k + 1,
+           go_typ i exp1 (VertexSet.singleton (d, k)) es t))
+        (0, es)
+        ts
+      in
+      es
+    | Con (_, ts) (* Cons from outer scopes are assumed to be non-expansive *)
+    | Tup ts ->
+      go_typs i (VertexSet.union exp non) VertexSet.empty es ts
+    | (Opt t1 | Mut t1 | Array t1) ->
+      go_typ i (VertexSet.union exp non) VertexSet.empty es t1
+    | Async (s, t1, t2) ->
+      go_typs i (VertexSet.union exp non) VertexSet.empty es [t1;t2]
+    | Func (s, _c, tbs, ts1, ts2) ->
+      let i1 = i + List.length tbs in
+      let exp1 = VertexSet.union exp non in
+      let es1 = go_typs i1 exp1 VertexSet.empty es
+        (List.map (fun tb -> tb.bound) tbs)
+      in
+      let es2 = go_typs i1 exp1 VertexSet.empty es1 ts1
+      in
+      go_typs i1 exp1 VertexSet.empty es2 ts2
+    | (Obj (_, fs) | Variant fs) ->
+      go_typs i (VertexSet.union exp non) VertexSet.empty es
+        (List.map (fun f -> f.typ) fs)
+    | Typ c ->
+      (* Since constructors must be closed, no further edges possible *)
+      es
+  in
+  go_typ 0 VertexSet.empty VertexSet.empty es t
+
+let edges_con cs c es : EdgeSet.t =
+  match Cons.kind c with
+  | Def (tbs, t) ->
+    (* It's not clear we actually need to consider parameters bounds, since, unlike
+       function type parameters, they don't introduce new subgoals during subtyping.
+       But let's be conservative and consider them, until we find out that that's undesirable
+       and know its safe to ignore them here. *)
+    let es1 = List.fold_left (fun es tb ->
+      edges_typ cs c es tb.bound) es tbs
+    in
+    edges_typ cs c es1 t
+  | Abs (tbs, t) ->
+    assert false
+
+let edges cs = ConSet.fold (edges_con cs) cs EdgeSet.empty
+
+let vertices cs =
+  ConSet.fold
+    (fun c vs ->
+      match Cons.kind c with
+      | Def (tbs, t) ->
+        let ws = List.mapi (fun i _tb -> (c, i)) tbs in
+        List.fold_left (fun vs v -> VertexSet.add v vs) vs ws
+      | Abs (tbs, t) ->
+        assert false) cs VertexSet.empty
+
+module VertexMap = Map.Make(Vertex)
+
+module Scc = Scc.Make(Vertex)
+
+let string_of_sccs sccs =
+  Printf.sprintf "{ %s }" (String.concat ","
+   (List.map string_of_vertices sccs))
+
+module Pretty = MakePretty(ElideStamps)
+
+let is_expansive cs =
+  (* Collect vertices and labeled edges *)
+  let vs = vertices cs in
+  let es = edges cs in
+  (* Compute the strongly connected components (ignoring edge labels) *)
+  let unlabeled_es = EdgeSet.fold
+    (fun (ci, w, dj) -> Scc.EdgeSet.add (ci, dj)) es Scc.EdgeSet.empty
+  in
+  let vss = Scc.scc vs unlabeled_es in
+
+  (* Map each vertex to the number of its component *)
+  let component = List.fold_left (fun m (vs, i) ->
+    VertexSet.fold (fun v m -> VertexMap.add v i m) vs m)
+    VertexMap.empty (List.mapi (fun i vs -> (vs, i)) vss)
+  in
+
+  (* The constructor are expansive if some component (cycle) contains
+     an edge with non-zero weight *)
+  let e_opt = List.find_opt
+    (fun (ci, w, dj) ->
+      w > 0 && VertexMap.find ci component = VertexMap.find dj component)
+    (EdgeSet.elements es)
+  in
+  match e_opt with
+  | None -> None
+  | Some ((c,i), _, (d,j)) ->
+    (* Construct an error messages with optional debug info *)
+    let op, sbs, st = Pretty.strings_of_kind (Cons.kind c) in
+    let def = Printf.sprintf "type %s%s %s %s" (Cons.name c) sbs op st in
+    let x = match Cons.kind c with Def(tbs, _) | Abs(tbs, _) ->
+      (List.nth tbs i).var in
+    let dys = match Cons.kind d with Def(tbs, _) | Abs(tbs, _) ->
+      Printf.sprintf "%s<%s>" (Cons.name d)
+        (String.concat "," (List.mapi (fun k _ ->
+          if i = k then "-" ^ x ^"-" else "_") tbs))
+    in
+    Some (Printf.sprintf
+      ":\n  %s\nis expansive, because %s occurs as an indirect argument of recursive type %s.\n(%s would be allowed as an immediate argument, but cannot be part of a larger type expression.)%s"
+      def x dys x
+      (if debug then
+         Printf.sprintf
+           "\n  vertices:\n    %s\n  edges:\n    %s\n  components:\n    %s"
+           (string_of_vertices vs) (string_of_edges es) (string_of_sccs vss)
+       else ""))
+
+
+
+ + + diff --git a/coverage/mo_types/hash.ml.html b/coverage/mo_types/hash.ml.html new file mode 100644 index 00000000000..97d81ae2caa --- /dev/null +++ b/coverage/mo_types/hash.ml.html @@ -0,0 +1,71 @@ + + + + + hash.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+
+
(*
+We hash field names using the following hash function,
+which results in values [0..2^31-1]
+*)
+
+let hash : string -> int32 = fun s ->
+  let open Int32 in
+  let sum = ref zero in
+  for i = 0 to String.length s - 1 do
+    sum := add (mul (!sum) (of_int 223)) (of_int (Char.code (s.[i])))
+  done;
+  logand (shift_right_logical minus_one 1) (!sum)
+
+
+
+ + + diff --git a/coverage/mo_types/productive.ml.html b/coverage/mo_types/productive.ml.html new file mode 100644 index 00000000000..0d8eaa69625 --- /dev/null +++ b/coverage/mo_types/productive.ml.html @@ -0,0 +1,240 @@ + + + + + productive.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+
+
open Type
+
+(*
+  Maintain a map from con to info = {Nonproductive, Productive, Param n}`.
+  After the analysis, this map says, for all type constructors, whether they are  really unproductive, productive, or if their unfolding is equal to one of their parameters.
+* Maintain a set of type definitions under scrutiny
+* For each type definition:
+  * If it is already in the memo map, use that result. Else analyze it as follows, updating the memo map afterwards.
+  * If it is already in the set, we have found a loop. Mark it as `unproductive`. Else add to the setduring the next step.
+  * Consider its RHS:
+    * If it is a concrete type, return `Productive`.
+    * If it is the nth type parameter, return `Param n`
+    * If it is a type application `T<t1,…,tn>`, recurse.
+      * If recursion returns `Productive` or `Nonproductive`, return that.
+      * If recursion returns `Param n`, loop to “Consider its RHS”, as if `tn`
+        is the RHS.
+*)
+
+type info =
+  | Nonproductive
+  | Productive
+  | Param of int
+
+let non_productive cs =
+  let map = ref ConEnv.empty in
+  let rec rhs cs = function
+    | Pre
+    | Mut _ | Typ _ ->
+      assert false (* body of a Def shouldn't be 2nd class *)
+    | Var (s, j) ->
+      Param j
+    | Con (d, ts) ->
+      begin
+        visit_con cs d;
+        match ConEnv.find d (!map) with
+        | Param n ->
+          begin
+          match Cons.kind d with
+          | Def (tbs, t) ->
+            assert (n < List.length tbs); (* assume types are arity-correct *)
+            rhs cs (List.nth ts n)
+          | Abs (tbs, t) ->
+            (* we could assert here since Defs should be closed *)
+            Productive
+          end
+        | info -> info
+      end
+    | _ ->  (* anything else is productive *)
+      Productive
+
+  and visit_con cs c =
+    match ConEnv.find_opt c (!map) with
+    | Some info -> ()
+    | None ->
+      let info =
+        if ConSet.mem c cs then
+          Nonproductive
+        else
+          let t = match Cons.kind c with
+            | Def (_, t) -> t
+            | _ -> assert false
+          in
+          rhs (ConSet.add c cs) t
+      in
+      map := ConEnv.add c info !map
+  in
+  ConSet.iter (visit_con ConSet.empty) cs;
+  ConSet.filter (fun c -> ConEnv.find c !map = Nonproductive) cs
+
+
+
+ + + diff --git a/coverage/mo_types/scope.ml.html b/coverage/mo_types/scope.ml.html new file mode 100644 index 00000000000..d0723420d03 --- /dev/null +++ b/coverage/mo_types/scope.ml.html @@ -0,0 +1,170 @@ + + + + + scope.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+
+
module T = Type
+
+(* Scopes *)
+
+(* For improved warning messages during unused detection:
+   - An identifier of a declaration can be renamed, e.g. prefixed by '_'.
+   - The field identifier in a field pattern cannot be renamed but can be bound to a new pattern. *)
+type val_kind = Declaration | FieldReference
+
+type val_env = (T.typ * Source.region * val_kind) T.Env.t
+type lib_env = T.typ T.Env.t
+type typ_env = T.con T.Env.t
+type con_env = T.ConSet.t
+
+type obj_env = scope T.Env.t  (* internal object scopes *)
+
+and scope =
+  { val_env : val_env;
+    lib_env : lib_env;
+    typ_env : typ_env;
+    con_env : con_env;
+    obj_env : obj_env;
+  }
+and t = scope
+
+let empty : scope =
+  { val_env = T.Env.empty;
+    lib_env = T.Env.empty;
+    typ_env = T.Env.empty;
+    con_env = T.ConSet.empty;
+    obj_env = T.Env.empty;
+  }
+
+let adjoin scope1 scope2 =
+  { val_env = T.Env.adjoin scope1.val_env scope2.val_env;
+    lib_env = T.Env.adjoin scope1.lib_env scope2.lib_env;
+    typ_env = T.Env.adjoin scope1.typ_env scope2.typ_env;
+    con_env = T.ConSet.union scope1.con_env scope2.con_env;
+    obj_env = T.Env.adjoin scope1.obj_env scope2.obj_env;
+  }
+
+let adjoin_val_env scope ve = {scope with val_env = T.Env.adjoin scope.val_env ve}
+
+let lib f t =
+  { empty with lib_env = T.Env.add f t empty.lib_env }
+
+
+
+ + + diff --git a/coverage/mo_types/typ_hash.ml.html b/coverage/mo_types/typ_hash.ml.html new file mode 100644 index 00000000000..bfd1ded086e --- /dev/null +++ b/coverage/mo_types/typ_hash.ml.html @@ -0,0 +1,628 @@ + + + + + typ_hash.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+
+
open ExpGraph
+open Type
+
+(*
+This module exports a function
+
+  typ_hash : typ -> string
+
+with these properties
+ - Its domain are closed types
+ - It does not support abstract types (for now)
+ - It does not support type parameters (for now)
+ - Type.eq t1 t2 = (typ_hash t1 = typ_hash t2)
+ - The output is readable yet compact
+
+
+The output format does not matter hugely (equality is what counts), but here is
+a little reading advice:
+
+ * Nullary types are described a single letter, or few letters:
+
+     Nat: N
+     Int8: i8
+     (): u
+
+ * Unary type constructors just prefix their type argument
+
+     ?Nat: ?N
+     [Blob]: vB
+     [Mut Text]: Vt
+
+ * Tuples put parentheses around the component types, without separator:
+
+     (Int, ?Bool, Text) = (I?bt)
+
+ * Objects and variants have comma-separated lists of label-type-pairs:
+
+     {foo : Int; var bar : Text} = r(foo:I,bar!:t)
+     {#tag : Int} = v(tag:I)
+
+   The various object forms are indicated after the r:
+
+     module {foo : Int; var bar : Text} = rm(foo:I,bar!:t)
+
+ * Functions:
+
+     shared (Int, Bool) -> Text = Fs(Ib)(t)
+
+ * Types that occur more than once are prefixed with a number when seen first,
+   and later referenced by that number:
+
+     ([mut Int]) -> ([mut Int]) = F(1=VI)(!1)
+
+     type List = ?(Nat,List)
+     (List, ?List) = (1=?(N!1)?!1)
+
+     type List<A> = ?(Nat,List<A>)
+     List<N> = 1=?(N!1)
+
+For this encoding to be injective, it must be prefix free, i.e.
+
+  ∀ t1 t2 s. typ_hash t1 = (typ_hash t2 ^ s) ⟹ eq t1 t2 = true
+
+*)
+
+(* A hint about how to print the node *)
+type arity = Nullary | Unary | Nary | Labeled of string list | TwoSeq of int
+
+(*
+Type construtors are (mostly) described by a single letter.
+NB: This code better be prefix-free. Hence capital N, otherwise n8=u
+is a bit ambigous
+*)
+
+let prim = function
+  | Null -> "z"
+  | Bool -> "b"
+  | Nat -> "N"
+  | Nat8 -> "n8"
+  | Nat16 -> "n16"
+  | Nat32 -> "n32"
+  | Nat64 -> "n64"
+  | Int -> "I"
+  | Int8 -> "i8"
+  | Int16 -> "i16"
+  | Int32 -> "i32"
+  | Int64 -> "i64"
+  | Float -> "f"
+  | Char -> "c"
+  | Text -> "t"
+  | Blob -> "B"
+  | Error -> "E"
+  | Principal -> "P"
+  | Region -> "R"
+
+let rec go = function
+  | Prim p -> ((Nullary, prim p), [])
+  | Any -> ((Nullary, "a"), [])
+  | Non -> ((Nullary, "e"), []) (* e for empty *)
+  | Opt t -> ((Unary, "?"), [t])
+  | Tup [] -> ((Nullary, "u"), [])
+  | Tup ts -> ((Nary, ""), ts)
+  | Array (Mut t) -> ((Unary, "V"), [t])
+  | Array t -> ((Unary, "v"), [t])
+
+  (* Here we pretend we support first-class mutable values;
+     this is useful for stable serialization *)
+  | Mut t -> ((Unary, "M"), [t])
+
+  | Obj (s, fs) ->
+    ( ( Labeled (List.map (fun f -> f.lab ^ if is_mut f.typ then "!" else "") fs),
+        (match s with Object -> "r" | Module -> "rm" | Memory -> "rs" | Actor -> "ra")
+      )
+    , List.map (fun f -> as_immut f.typ) fs
+    )
+  | Variant fs ->
+    ( ( Labeled (List.map (fun f -> f.lab) fs),
+        "v"
+      )
+    , List.map (fun f -> f.typ) fs
+    )
+
+  | Func (s, c, tbs, ts1, ts2) ->
+    List.iter (fun bind -> assert (bind.sort = Scope)) tbs;
+    ( ( TwoSeq (List.length ts1),
+        "F" ^
+        (match s with Local -> "" | Shared Query -> "q" | Shared Write -> "s" | Shared Composite -> "C") ^
+        (match c with Returns -> "" | Promises -> "p" | Replies -> "r")
+      )
+    , ts1 @ ts2
+    )
+  | Async _ -> raise (Invalid_argument "typ_hash: Only supports serializable data")
+
+  | Con _ as t -> go (normalize t)
+  | Pre -> assert false
+  | Var _ -> assert false
+  | Typ _ -> assert false
+
+let paren xs = "(" ^ String.concat "" xs ^ ")"
+
+let of_con (a, k) args =
+  match a, args with
+  | Nullary, _ ->
+    assert (args = []);
+    k
+  | Unary, [a] ->
+    k ^ a
+  | Unary, _ ->
+    assert false
+  | Nary, _ ->
+    k ^ paren args
+  | Labeled ls, _ ->
+    k ^ "(" ^ String.concat "," (List.map2 (fun l a -> l ^ ":" ^ a) ls args) ^ ")"
+  | TwoSeq n, _->
+    let (a1, a2) = Lib.List.split_at n args in
+    k ^ paren a1 ^ paren a2
+
+let of_ref i x =
+  Int.to_string i ^ "=" ^ x
+
+let of_def i =
+  "!" ^ Int.to_string i
+
+let typ_hash : typ -> string =
+  fun t -> t |> unfold go |> canonicalize |> fold of_con of_ref of_def
+
+let typ_seq_hash : typ list -> string = fun ts ->
+  String.concat "" (List.map typ_hash ts)
+
+
+(* Some small unit tests *)
+
+[@@@warning "-32"]
+let test t expected =
+  let actual = typ_hash t in
+  if actual = expected then
+    true
+  else
+    (Printf.printf "\nExpected:\n  %s\nbut got:\n  %s\n" expected actual; false)
+
+let%test "monolist" =
+  let con = Cons.fresh "List" (Abs ([], Pre))  in
+  let t = Con (con, []) in
+  Cons.unsafe_set_kind con (Def ([], Opt (Tup [nat; t])));
+  test t "0=?(N!0)"
+
+let%test "polylist" =
+  let con = Cons.fresh "List" (Abs ([], Pre))  in
+  let bind = { var = "T"; sort = Type; bound = Any } in
+  let v = Var ("T", 0) in
+  Cons.unsafe_set_kind con (Def ([bind], Opt (Tup [v; Con (con, [v])])));
+  let t = Con (con, [nat]) in
+  test t "0=?(N!0)"
+
+
+
+ + + diff --git a/coverage/mo_types/type.ml.html b/coverage/mo_types/type.ml.html new file mode 100644 index 00000000000..e29a9bfec95 --- /dev/null +++ b/coverage/mo_types/type.ml.html @@ -0,0 +1,5712 @@ + + + + + type.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+
+
(* Representation *)
+type lab = string
+type var = string
+
+type control =
+  | Returns        (* regular local function or one-shot shared function *)
+  | Promises       (* shared function producing a future value upon call *)
+  | Replies        (* (IR only): responds asynchronously using `reply` *)
+
+type obj_sort =
+   Object
+ | Actor
+ | Module
+ | Memory          (* (codegen only): stable memory serialization format *)
+
+type async_sort = Fut | Cmp
+type shared_sort = Query | Write | Composite
+type 'a shared = Local | Shared of 'a
+type func_sort = shared_sort shared
+type eff = Triv | Await
+
+type prim =
+  | Null
+  | Bool
+  | Nat
+  | Nat8
+  | Nat16
+  | Nat32
+  | Nat64
+  | Int
+  | Int8
+  | Int16
+  | Int32
+  | Int64
+  | Float
+  | Char
+  | Text
+  | Blob (* IR use: Packed representation, vec u8 IDL type *)
+  | Error
+  | Principal
+  | Region
+
+type t = typ
+and typ =
+  | Var of var * int                          (* variable *)
+  | Con of con * typ list                     (* constructor *)
+  | Prim of prim                              (* primitive *)
+  | Obj of obj_sort * field list              (* object *)
+  | Variant of field list                     (* variant *)
+  | Array of typ                              (* array *)
+  | Opt of typ                                (* option *)
+  | Tup of typ list                           (* tuple *)
+  | Func of func_sort * control * bind list * typ list * typ list  (* function *)
+  | Async of async_sort * scope * typ                      (* future *)
+  | Mut of typ                                (* mutable type *)
+  | Any                                       (* top *)
+  | Non                                       (* bottom *)
+  | Typ of con                                (* type (field of module) *)
+  | Pre                                       (* pre-type *)
+
+and scope = typ
+and bind_sort = Scope | Type
+
+and bind = {var : var; sort: bind_sort; bound : typ}
+and src = {depr : string option; region : Source.region}
+and field = {lab : lab; typ : typ; src : src}
+
+and con = kind Cons.t
+and kind =
+  | Def of bind list * typ
+  | Abs of bind list * typ
+
+let empty_src = {depr = None; region = Source.no_region}
+
+(* Efficient comparison *)
+let tag_prim = function
+  | Null -> 0
+  | Bool -> 1
+  | Nat -> 2
+  | Nat8 -> 3
+  | Nat16 -> 4
+  | Nat32 -> 5
+  | Nat64 -> 6
+  | Int -> 7
+  | Int8 -> 8
+  | Int16 -> 9
+  | Int32 -> 10
+  | Int64 -> 11
+  | Float -> 12
+  | Char -> 13
+  | Text -> 14
+  | Blob -> 15
+  | Error -> 16
+  | Principal -> 17
+  | Region -> 18
+
+let tag_func_sort = function
+  | Local -> 0
+  | Shared Write -> 1
+  | Shared Query -> 2
+  | Shared Composite -> 3
+
+let tag_obj_sort = function
+  | Object -> 0
+  | Module -> 1
+  | Actor -> 2
+  | Memory -> 3
+
+let tag_control = function
+  | Returns -> 0
+  | Promises -> 1
+  | Replies -> 2
+
+let tag = function
+  | Prim _ -> 0
+  | Var _ -> 1
+  | Con _ -> 2
+  | Array _ -> 3
+  | Tup _ -> 4
+  | Func _ -> 5
+  | Opt _ -> 6
+  | Async _ -> 7
+  | Obj _ -> 8
+  | Variant _ -> 9
+  | Mut _ -> 10
+  | Any -> 11
+  | Non -> 12
+  | Pre -> 13
+  | Typ _ -> 14
+
+let compare_prim p1 p2 =
+  let d = tag_prim p1 - tag_prim p2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_control c1 c2 =
+  let d = tag_control c1 - tag_control c2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_async_sort s1 s2 =
+  match s1, s2 with
+  | Fut, Fut
+  | Cmp, Cmp -> 0
+  | Fut, Cmp -> -1
+  | Cmp, Fut -> 1
+
+let compare_obj_sort s1 s2 =
+  let d = tag_obj_sort s1 - tag_obj_sort s2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_func_sort s1 s2 =
+  let d = tag_func_sort s1 - tag_func_sort s2 in
+  if d > 0 then 1 else if d < 0 then -1 else 0
+
+let compare_bind_sort s1 s2 =
+  match s1, s2 with
+  | Type, Type
+  | Scope, Scope -> 0
+  | Type, Scope -> -1
+  | Scope, Type -> 1
+
+let compare_src s1 s2 =
+  match (s1.depr, s2.depr) with
+  | None, None -> 0
+  | Some d1, Some d2 -> String.compare d1 d2
+  | None, Some _ -> -1
+  | _ -> 1
+
+let rec compare_typ (t1 : typ) (t2 : typ) =
+  if t1 == t2 then 0
+  else match (t1, t2) with
+  | Prim p1, Prim p2 ->
+    compare_prim p1 p2
+  | Var (s1, i1), Var (s2, i2) ->
+    (match Int.compare i1 i2 with
+     | 0 -> String.compare s1 s2
+     | ord -> ord)
+  | Con (c1, ts1), Con (c2, ts2) ->
+    (match Cons.compare c1 c2 with
+     | 0 -> compare_typs ts1 ts2
+     | ord -> ord)
+  | Array t1, Array t2 ->
+    compare_typ t1 t2
+  | Tup ts1, Tup ts2 ->
+    compare_typs ts1 ts2
+  | Func (s1, c1, tbs1, ts11, ts12),
+    Func (s2, c2, tbs2, ts21, ts22) ->
+    (match compare_func_sort s1 s2 with
+     | 0 ->
+       (match compare_control c1 c2 with
+        | 0 ->
+          (match compare_tbs tbs1 tbs2 with
+           | 0 ->
+             (match compare_typs ts11 ts21 with
+             | 0 -> compare_typs ts12 ts22
+             | ord -> ord)
+           | ord -> ord)
+        | ord -> ord)
+     | ord -> ord)
+  | Opt t1, Opt t2 -> compare_typ t1 t2
+  | Async (s1, t11, t12) , Async (s2, t21, t22) ->
+    (match compare_async_sort s1 s2 with
+     | 0 -> (match compare_typ t11 t21 with
+             | 0 -> compare_typ t12 t22
+             | ord -> ord)
+     | ord -> ord)
+  | Obj (s1, fs1), Obj (s2, fs2) ->
+    (match compare_obj_sort s1 s2 with
+     | 0 -> compare_flds fs1 fs2
+     | ord -> ord)
+  | Variant fs1, Variant fs2 ->
+    compare_flds fs1 fs2
+  | Mut t1, Mut t2 ->
+    compare_typ t1 t2
+  | Any, Any
+  | Non, Non
+  | Pre, Pre -> 0
+  | Typ c1, Typ c2 -> Cons.compare c1 c2
+  | _ -> Int.compare (tag t1) (tag t2)
+
+and compare_tb tb1 tb2 =
+  match String.compare tb1.var tb2.var with
+  | 0 ->
+    (match compare_typ tb1.bound tb2.bound with
+     | 0 -> compare_bind_sort tb1.sort tb2.sort
+     | ord -> ord)
+  | ord ->  ord
+
+and compare_tbs tbs1 tbs2 =
+  match (tbs1, tbs2) with
+  | [], [] -> 0
+  | [], (_::_) -> -1
+  | (_::_, []) -> 1
+  | (tb1::tbs1, tb2 :: tbs2) ->
+    (match compare_tb tb1 tb2 with
+     | 0 -> compare_tbs tbs1 tbs2
+     | ord -> ord)
+
+and compare_fld fld1 fld2 =
+  match String.compare fld1.lab fld2.lab with
+  | 0 ->
+    (match compare_typ fld1.typ fld2.typ with
+     | 0 -> compare_src fld1.src fld2.src
+     | ord -> ord)
+  | ord -> ord
+
+and compare_flds flds1 flds2 =
+  match (flds1, flds2) with
+  | [], [] -> 0
+  | [], (_::_) -> -1
+  | (_::_, []) -> 1
+  | (fld1::flds1, fld2 :: flds2) ->
+    (match compare_fld fld1 fld2 with
+     | 0 -> compare_flds flds1 flds2
+     | ord -> ord)
+
+and compare_typs ts1 ts2 =
+  match (ts1, ts2) with
+  | [], [] -> 0
+  | [], (_::_) -> -1
+  | (t1::ts1, t2 :: ts2) ->
+    (match compare_typ t1 t2 with
+     | 0 -> compare_typs ts1 ts2
+     | ord -> ord)
+  | _ -> 1
+
+
+let compare_rel (t1, t2) (u1, u2) =
+  match compare_typ (t1 : typ) (u1 : typ) with
+  | 0 -> compare_typ (t2 : typ) (u2 : typ)
+  | ord -> ord
+
+(* Syntactic orderings *)
+
+module Ord = struct
+  type t = typ
+  let compare = compare_typ
+end
+
+module OrdPair = struct
+  type t = typ * typ
+  let compare = compare_rel
+end
+
+(* Function sorts *)
+
+let is_shared_sort sort = sort <> Local
+
+(* Constructors *)
+
+let set_kind c k =
+  match Cons.kind c with
+  | Abs (_, Pre) -> Cons.unsafe_set_kind c k
+  | _ -> raise (Invalid_argument "set_kind")
+
+module ConEnv = Env.Make(struct type t = con let compare = Cons.compare end)
+
+module ConSet = ConEnv.Dom
+
+
+(* Field ordering *)
+
+let compare_field f1 f2 =
+  match f1,f2 with
+  | {lab = l1; typ = Typ _; _}, {lab = l2; typ = Typ _; _} -> compare l1 l2
+  | {lab = l1; typ = Typ _; _}, {lab = l2; typ = _; _} -> -1
+  | {lab = l1; typ = _; _}, {lab = l2; typ = Typ _; _} -> 1
+  | {lab = l1; typ = _; _}, {lab = l2; typ = _; _} -> compare l1 l2
+
+
+(* Short-hands *)
+
+let unit = Tup []
+let bool = Prim Bool
+let nat = Prim Nat
+let nat64 = Prim Nat64
+let int = Prim Int
+let text = Prim Text
+let blob = Prim Blob
+let error = Prim Error
+let char = Prim Char
+let principal = Prim Principal
+let region = Prim Region
+
+let fields flds =
+  List.sort compare_field
+    (List.map (fun (lab, typ) -> {lab; typ; src = empty_src}) flds)
+
+let obj sort flds =
+  Obj (sort, fields flds)
+
+let sum flds =
+  Variant (fields flds)
+
+let throwErrorCodes = List.sort compare_field [
+  { lab = "canister_reject"; typ = unit; src = empty_src}
+]
+
+let call_error = Obj(Object,[{ lab = "err_code"; typ = Prim Nat32; src = empty_src}])
+
+let catchErrorCodes = List.sort compare_field (
+  throwErrorCodes @ [
+    { lab = "system_fatal"; typ = unit; src = empty_src};
+    { lab = "system_transient"; typ = unit; src = empty_src};
+    { lab = "destination_invalid"; typ = unit; src = empty_src};
+    { lab = "canister_error"; typ = unit; src = empty_src};
+    { lab = "future"; typ = Prim Nat32; src = empty_src};
+    { lab = "call_error"; typ = call_error; src = empty_src};
+  ])
+
+let throw = Prim Error
+let catch = Prim Error
+
+(* Shared call context *)
+
+let caller = principal
+let ctxt = Obj (Object,[{ lab = "caller"; typ = caller; src = empty_src}])
+
+let prim = function
+  | "Null" -> Null
+  | "Bool" -> Bool
+  | "Nat" -> Nat
+  | "Nat8" -> Nat8
+  | "Nat16" -> Nat16
+  | "Nat32" -> Nat32
+  | "Nat64" -> Nat64
+  | "Int" -> Int
+  | "Int8" -> Int8
+  | "Int16" -> Int16
+  | "Int32" -> Int32
+  | "Int64" -> Int64
+  | "Float" -> Float
+  | "Char" -> Char
+  | "Text" -> Text
+  | "Blob" -> Blob
+  | "Error" -> Error
+  | "Principal" -> Principal
+  | "Region" -> Region
+  | s -> raise (Invalid_argument ("Type.prim: " ^ s))
+
+let seq = function [t] -> t | ts -> Tup ts
+
+let codom c to_scope ts2 =  match c with
+  | Promises -> Async (Fut, to_scope(), seq ts2)
+  | Returns -> seq ts2
+  | Replies -> Tup []
+
+(* Coercions *)
+
+let iter_obj t =
+  Obj (Object,
+    [{lab = "next"; typ = Func (Local, Returns, [], [], [Opt t]); src = empty_src}])
+
+
+(* Shifting *)
+
+let rec shift i n t =
+  match t with
+  | Prim _ -> t
+  | Var (s, j) -> Var (s, if j < i then j else j + n)
+  | Con (c, ts) -> Con (c, List.map (shift i n) ts)
+  | Array t -> Array (shift i n t)
+  | Tup ts -> Tup (List.map (shift i n) ts)
+  | Func (s, c, tbs, ts1, ts2) ->
+    let i' = i + List.length tbs in
+    Func (s, c, List.map (shift_bind i' n) tbs, List.map (shift i' n) ts1, List.map (shift i' n) ts2)
+  | Opt t -> Opt (shift i n t)
+  | Async (s, t1, t2) -> Async (s, shift i n t1, shift i n t2)
+  | Obj (s, fs) -> Obj (s, List.map (shift_field n i) fs)
+  | Variant fs -> Variant (List.map (shift_field n i) fs)
+  | Mut t -> Mut (shift i n t)
+  | Any -> Any
+  | Non -> Non
+  | Pre -> Pre
+  | Typ c -> Typ c
+
+and shift_bind i n tb =
+  {tb with bound = shift i n tb.bound}
+
+and shift_field i n {lab; typ; src} =
+  {lab; typ = shift i n typ; src}
+
+(*
+and shift_kind i n k =
+  match k with
+  | Def (tbs, t) ->
+    let i' = i + List.length tbs in
+    Def (List.map (shift_bind i' n) tbs, shift i' n t)
+  | Abs (tbs, t) ->
+    let i' = i + List.length tbs in
+    Abs (List.map (shift_bind i' n) tbs, shift i' n t)
+ *)
+
+
+(* First-order substitution *)
+
+let rec subst sigma t =
+  if sigma = ConEnv.empty then t else
+  match t with
+  | Prim _
+  | Var _ -> t
+  | Con (c, ts) ->
+    (match ConEnv.find_opt c sigma with
+    | Some t -> assert (List.length ts = 0); t
+    | None -> Con (c, List.map (subst sigma) ts)
+    )
+  | Array t -> Array (subst sigma t)
+  | Tup ts -> Tup (List.map (subst sigma) ts)
+  | Func (s, c, tbs, ts1, ts2) ->
+    let sigma' = ConEnv.map (shift 0 (List.length tbs)) sigma in
+    Func (s, c, List.map (subst_bind sigma') tbs,
+          List.map (subst sigma') ts1, List.map (subst sigma') ts2)
+  | Opt t -> Opt (subst sigma t)
+  | Async (s, t1, t2) -> Async (s, subst sigma t1, subst sigma t2)
+  | Obj (s, fs) -> Obj (s, List.map (subst_field sigma) fs)
+  | Variant fs -> Variant (List.map (subst_field sigma) fs)
+  | Mut t -> Mut (subst sigma t)
+  | Any -> Any
+  | Non -> Non
+  | Pre -> Pre
+  | Typ c -> Typ c (* NB: this is incorrect unless we ensure dom(sigma) \cap FV(c.kind) = {}
+                      For now, we could do this by ensuring all type definitions are closed,
+                      in particular, type components defined within the scope of an enclosing
+                      type parameter cannot mention that parameter
+                      (but can mention other (closed) type constructors).
+                    *)
+
+and subst_bind sigma tb =
+  { tb with bound = subst sigma tb.bound}
+
+and subst_field sigma {lab; typ; src} =
+  {lab; typ = subst sigma typ; src}
+
+(*
+and subst_kind sigma k =
+  match k with
+  | Def (tbs, t) ->
+    let sigma' = ConEnv.map (shift 0 (List.length tbs)) sigma in
+    Def (List.map (subst_bind sigma') tbs, subst sigma' t)
+  | Abs (tbs, t) ->
+    let sigma' = ConEnv.map (shift 0 (List.length tbs)) sigma in
+    Abs (List.map (subst_bind sigma') tbs, subst sigma' t)
+ *)
+
+(* Handling binders *)
+
+let close cs t =
+  if cs = [] then t else
+  let ts = List.mapi (fun i c -> Var (Cons.name c, i)) cs in
+  let sigma = List.fold_right2 ConEnv.add cs ts ConEnv.empty in
+  subst sigma t
+
+let close_binds cs tbs =
+  if cs = [] then tbs else
+  List.map (fun tb -> { tb with bound = close cs tb.bound })  tbs
+
+
+let rec open' i ts t =
+  match t with
+  | Prim _ -> t
+  | Var (_, j) -> if j < i then t else List.nth ts (j - i)
+  | Con (c, ts') -> Con (c, List.map (open' i ts) ts')
+  | Array t -> Array (open' i ts t)
+  | Tup ts' -> Tup (List.map (open' i ts) ts')
+  | Func (s, c, tbs, ts1, ts2) ->
+    let i' = i + List.length tbs in
+    Func (s, c, List.map (open_bind i' ts) tbs, List.map (open' i' ts) ts1, List.map (open' i' ts) ts2)
+  | Opt t -> Opt (open' i ts t)
+  | Async (s, t1, t2) -> Async (s, open' i ts t1, open' i ts t2)
+  | Obj (s, fs) -> Obj (s, List.map (open_field i ts) fs)
+  | Variant fs -> Variant (List.map (open_field i ts) fs)
+  | Mut t -> Mut (open' i ts t)
+  | Any -> Any
+  | Non -> Non
+  | Pre -> Pre
+  | Typ c -> Typ c
+
+and open_bind i ts tb  =
+  {tb with bound = open' i ts tb.bound}
+
+and open_field i ts {lab; typ; src} =
+  {lab; typ = open' i ts typ; src}
+
+(*
+and open_kind i ts k =
+  match k with
+  | Def (tbs, t) ->
+    let i' = i + List.length tbs in
+    Def (List.map (open_bind i' ts) tbs, open' i' ts t)
+  | Abs (tbs, t) ->
+    let i' = i + List.length tbs in
+    Abs (List.map (open_bind i' ts) tbs, open' i' ts t)
+*)
+
+let open_ ts t =
+  if ts = [] then t else
+  open' 0 ts t
+
+let open_binds tbs =
+  if tbs = [] then [] else
+  let cs = List.map (fun {var; _} -> Cons.fresh var (Abs ([], Pre))) tbs in
+  let ts = List.map (fun c -> Con (c, [])) cs in
+  let ks = List.map (fun {bound; _} -> Abs ([], open_ ts bound)) tbs in
+  List.iter2 set_kind cs ks;
+  ts
+
+
+(* Normalization and Classification *)
+
+let reduce tbs t ts =
+  assert (List.length ts = List.length tbs);
+  open_ ts t
+
+let rec normalize = function
+  | Con (con, ts) as t ->
+    (match Cons.kind con with
+    | Def (tbs, t) -> normalize (reduce tbs t ts)
+    | _ -> t
+    )
+  | Mut t -> Mut (normalize t)
+  | t -> t
+
+let rec promote = function
+  | Con (con, ts) ->
+    let Def (tbs, t) | Abs (tbs, t) = Cons.kind con
+    in promote (reduce tbs t ts)
+  | t -> t
+
+
+(* Projections *)
+
+let is_non = function Non -> true | _ -> false
+let is_prim p = function Prim p' -> p = p' | _ -> false
+let is_obj = function Obj _ -> true | _ -> false
+let is_module = function Obj (Module, _) -> true | _ -> false
+let is_variant = function Variant _ -> true | _ -> false
+let is_array = function Array _ -> true | _ -> false
+let is_opt = function Opt _ -> true | _ -> false
+let is_tup = function Tup _ -> true | _ -> false
+let is_unit = function Tup [] -> true | _ -> false
+let is_pair = function Tup [_; _] -> true | _ -> false
+let is_func = function Func _ -> true | _ -> false
+let is_async = function Async _ -> true | _ -> false
+let is_mut = function Mut _ -> true | _ -> false
+let is_typ = function Typ _ -> true | _ -> false
+let is_con = function Con _ -> true | _ -> false
+
+let invalid s = raise (Invalid_argument ("Type." ^ s))
+
+let as_prim p = function Prim p' when p = p' -> () | _ -> invalid "as_prim"
+let as_obj = function Obj (s, tfs) -> s, tfs | _ -> invalid "as_obj"
+let as_array = function Array t -> t | _ -> invalid "as_array"
+let as_opt = function Opt t -> t | _ -> invalid "as_opt"
+let as_variant = function Variant fs -> fs | _ -> invalid "as_variant"
+let as_tup = function Tup ts -> ts | _ -> invalid "as_tup"
+let as_unit = function Tup [] -> () | _ -> invalid "as_unit"
+let as_pair = function Tup [t1; t2] -> t1, t2 | _ -> invalid "as_pair"
+let as_func = function Func (s, c, tbs, ts1, ts2) -> s, c, tbs, ts1, ts2 | _ -> invalid "as_func"
+let as_async = function Async (s, t1, t2) -> (s, t1, t2) | _ -> invalid "as_async"
+let as_mut = function Mut t -> t | _ -> invalid "as_mut"
+let as_immut = function Mut t -> t | t -> t
+let as_typ = function Typ c -> c | _ -> invalid "as_typ"
+let as_con = function Con (c, ts) -> c, ts | _ -> invalid "as_con"
+
+let as_seq t =
+  match normalize t with
+  | Tup ts -> ts
+  | t -> [t]
+
+let seq_of_tup t =
+  match normalize t with
+  | Tup ts -> ts
+  | t -> invalid "seq_of_tup"
+
+let arity t =
+  match normalize t with
+  | Tup ts -> List.length ts
+  | t -> 1
+
+let as_prim_sub p t = match promote t with
+  | Prim p' when p = p' -> ()
+  | Non -> ()
+  | _ -> invalid "as_prim_sub"
+let as_obj_sub ls t = match promote t with
+  | Obj (s, tfs) -> s, tfs
+  | Non -> Object, List.map (fun l -> {lab = l; typ = Non; src = empty_src}) ls
+  | _ -> invalid "as_obj_sub"
+let as_variant_sub l t = match promote t with
+  | Variant tfs -> tfs
+  | Non -> [{lab = l; typ = Non; src = empty_src}]
+  | _ -> invalid "as_variant_sub"
+let as_array_sub t = match promote t with
+  | Array t -> t
+  | Non -> Non
+  | _ -> invalid "as_array_sub"
+let as_opt_sub t = match promote t with
+  | Opt t -> t
+  | Prim Null -> Non
+  | Non -> Non
+  | _ -> invalid "as_opt_sub"
+let as_tup_sub n t = match promote t with
+  | Tup ts -> ts
+  | Non -> Lib.List.make n Non
+  | _ -> invalid "as_tup_sub"
+let as_unit_sub t = match promote t with
+  | Tup []
+  | Non -> ()
+  | _ -> invalid "as_unit_sub"
+let as_pair_sub t = match promote t with
+  | Tup [t1; t2] -> t1, t2
+  | Non -> Non, Non
+  | _ -> invalid "as_pair_sub"
+let as_func_sub default_s default_arity t = match promote t with
+  | Func (s, c, tbs, ts1, ts2) ->
+    s, tbs, seq ts1, codom c (fun () -> Var((List.hd tbs).var, 0)) ts2
+  | Non -> default_s, Lib.List.make default_arity {var = "X"; sort = Type; bound = Any}, Any, Non
+  | _ -> invalid "as_func_sub"
+let as_mono_func_sub t = match promote t with
+  | Func (_, _, [], ts1, ts2) -> seq ts1, seq ts2
+  | Non -> Any, Non
+  | _ -> invalid "as_func_sub"
+let as_async_sub s default_scope t = match promote t with
+  | Async (s0, t1, t2) when s = s0 -> (t1, t2)
+  | Non -> default_scope, Non (* TBR *)
+  | _ -> invalid "as_async_sub"
+
+let is_immutable_obj obj_type =
+  let _, fields = as_obj_sub [] obj_type in
+  List.for_all (fun f -> not (is_mut f.typ)) fields
+
+
+let lookup_val_field_opt l tfs =
+  let is_lab = function {typ = Typ _; _} -> false | {lab; _} -> lab = l in
+  match List.find_opt is_lab tfs with
+  | Some tf -> Some tf.typ
+  | None -> None
+
+let lookup_typ_field_opt l tfs =
+  let is_lab = function {typ = Typ _; lab; _} -> lab = l | _ -> false in
+  match List.find_opt is_lab tfs with
+  | Some {typ = Typ c; _} -> Some c
+  | _ -> None
+
+let lookup_val_field l tfs =
+  match lookup_val_field_opt l tfs with
+  | Some t -> t
+  | None -> invalid "lookup_val_field"
+
+let lookup_typ_field l tfs =
+  match lookup_typ_field_opt l tfs with
+  | Some c -> c
+  | _ -> invalid "lookup_typ_field"
+
+
+let lookup_val_deprecation l tfs =
+  let is_lab = function {typ = Typ _; _} -> false | {lab; _} -> lab = l in
+  match List.find_opt is_lab tfs with
+  | Some {src = {depr; _}; _} -> depr
+  | None -> invalid "lookup_val_deprecation"
+
+let lookup_typ_deprecation l tfs =
+  let is_lab = function {typ = Typ _; lab; _} -> lab = l | _ -> false in
+  match List.find_opt is_lab tfs with
+  | Some {src = {depr; _}; _} -> depr
+  | _ -> invalid "lookup_typ_deprecation"
+
+
+(* Span *)
+
+let rec span = function
+  | Var _ | Pre -> assert false
+  | Con _ as t -> span (promote t)
+  | Prim Null -> Some 1
+  | Prim Bool -> Some 2
+  | Prim (Nat | Int | Float | Text | Blob | Error | Principal | Region) -> None
+  | Prim (Nat8 | Int8) -> Some 0x100
+  | Prim (Nat16 | Int16) -> Some 0x10000
+  | Prim (Nat32 | Int32 | Nat64 | Int64 | Char) -> None  (* for all practical purposes *)
+  | Obj _ | Tup _ | Async _ -> Some 1
+  | Variant fs -> Some (List.length fs)
+  | Array _ | Func _ | Any -> None
+  | Opt _ -> Some 2
+  | Mut t -> span t
+  | Non -> Some 0
+  | Typ _ -> Some 1
+
+
+(* Collecting type constructors *)
+
+(* Parameter `inTyp` controls whether to count a constructor, `c`,  that only occurs as an argument of
+   `Typ` field, `Typ c`, but not in its own unfolding.
+   Set to false to avoid emitting redundant bindings in stable signature.
+*)
+
+let rec cons' inTyp t cs =
+  match t with
+  | Var _ | Prim _ | Any | Non | Pre -> cs
+  | Con (c, ts) ->
+    List.fold_right (cons' inTyp) ts (cons_con inTyp c cs)
+  | Opt t | Mut t | Array t ->
+    cons' inTyp t cs
+  | Async (_, t1, t2) ->
+    cons' inTyp t2 (cons' inTyp t1 cs)
+  | Tup ts -> List.fold_right (cons' inTyp) ts cs
+  | Func (s, c, tbs, ts1, ts2) ->
+    let cs = List.fold_right (cons_bind inTyp) tbs cs in
+    let cs = List.fold_right (cons' inTyp) ts1 cs in
+    List.fold_right (cons' inTyp) ts2 cs
+  | Obj (_, fs) | Variant fs ->
+    List.fold_right (cons_field inTyp) fs cs
+  | Typ c ->
+    if inTyp then
+      cons_con inTyp c cs
+    else
+      (* don't add c unless mentioned in Cons.kind c *)
+      cons_kind' inTyp (Cons.kind c) cs
+
+and cons_con inTyp c cs =
+  if ConSet.mem c cs
+  then cs
+  else cons_kind' inTyp (Cons.kind c) (ConSet.add c cs)
+
+and cons_bind inTyp tb cs =
+  cons' inTyp tb.bound cs
+
+and cons_field inTyp {lab; typ; src} cs =
+  cons' inTyp typ cs
+
+and cons_kind' inTyp k cs =
+  match k with
+  | Def (tbs, t)
+  | Abs (tbs, t) ->
+    cons' inTyp t (List.fold_right (cons_bind inTyp) tbs cs)
+
+let cons t = cons' true t ConSet.empty
+let cons_kind k = cons_kind' true k ConSet.empty
+
+(* Checking for concrete types *)
+
+module S = Set.Make (Ord)
+
+(*
+This check is a stop-gap measure until we have an IDL strategy that
+allows polymorphic types, see #250. It is not what we desire for Motoko.
+*)
+
+let concrete t =
+  let seen = ref S.empty in
+  let rec go t =
+    S.mem t !seen ||
+    begin
+      seen := S.add t !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim _ | Any | Non -> true
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> false
+        | Def (_, t) -> go (open_ ts t) (* TBR this may fail to terminate *)
+        )
+      | Array t | Opt t | Mut t -> go t
+      | Async (s, t1, t2) -> go t2 (* t1 is a phantom type *)
+      | Tup ts -> List.for_all go ts
+      | Obj (_, fs) | Variant fs -> List.for_all (fun f -> go f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) ->
+        let ts = open_binds tbs in
+        List.for_all go (List.map (open_ ts) ts1) &&
+        List.for_all go (List.map (open_ ts) ts2)
+      | Typ c -> (* assumes type defs are closed *)
+        true (* so we can transmit actors with typ fields *)
+    end
+  in go t
+
+(* stable or shared *)
+let serializable allow_mut t =
+  let seen = ref S.empty in
+  let rec go t =
+    S.mem t !seen ||
+    begin
+      seen := S.add t !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim Error -> false
+      | Prim Region -> allow_mut (* stable, but not shared *)
+      | Any | Non | Prim _ | Typ _ -> true
+      | Async _ -> false
+      | Mut t -> allow_mut && go t
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> false
+        | Def (_, t) -> go (open_ ts t) (* TBR this may fail to terminate *)
+        )
+      | Array t | Opt t -> go t
+      | Tup ts -> List.for_all go ts
+      | Obj (s, fs) ->
+        (match s with
+         | Actor -> true
+         | Module -> false (* TODO(1452) make modules sharable *)
+         | Object | Memory -> List.for_all (fun f -> go f.typ) fs)
+      | Variant fs -> List.for_all (fun f -> go f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) -> is_shared_sort s
+    end
+  in go t
+
+(* Find the first unshared subexpression in a type *)
+let find_unshared t =
+  let seen = ref S.empty in
+  let rec go t =
+    if S.mem t !seen then None else
+    begin
+      seen := S.add t !seen;
+      match t with
+      | Var _ | Pre -> assert false
+      | Prim Error -> Some t
+      | Any | Non | Prim _ | Typ _ -> None
+      | Async _ | Mut _ -> Some t
+      | Con (c, ts) ->
+        (match Cons.kind c with
+        | Abs _ -> None
+        | Def (_, t) -> go (open_ ts t) (* TBR this may fail to terminate *)
+        )
+      | Array t | Opt t -> go t
+      | Tup ts -> List.find_map go ts
+      | Obj (s, fs) ->
+        (match s with
+         | Actor -> None
+         | Module -> Some t (* TODO(1452) make modules sharable *)
+         | Object ->
+           List.find_map (fun f -> go f.typ) fs
+         | Memory -> assert false)
+      | Variant fs -> List.find_map (fun f -> go f.typ) fs
+      | Func (s, c, tbs, ts1, ts2) ->
+        if is_shared_sort s
+        then None
+        else Some t
+    end
+  in go t
+
+let is_shared_func typ =
+  match promote typ with
+  | Func (Shared _, _, _, _, _) -> true
+  | _ -> false
+
+let is_local_async_func typ =
+  match promote typ with
+  | Func
+      (Local, Returns,
+       { sort = Scope; _ }::_,
+       _,
+       [Async (Fut, Var (_ ,0), _)]) ->
+    true
+  | _ ->
+    false
+
+let shared t = serializable false t
+let stable t = serializable true t
+
+
+(* Forward declare
+   TODO: haul string_of_typ before the lub/glb business, if possible *)
+let str = ref (fun _ -> failwith "")
+
+
+(* Equivalence & Subtyping *)
+
+exception PreEncountered
+
+
+module SS = Set.Make (OrdPair)
+
+let rel_list p rel eq xs1 xs2 =
+  try List.for_all2 (p rel eq) xs1 xs2 with Invalid_argument _ -> false
+
+let rec rel_typ rel eq t1 t2 =
+  t1 == t2 || SS.mem (t1, t2) !rel || begin
+  rel := SS.add (t1, t2) !rel;
+  match t1, t2 with
+  (* Second-class types first, since they mustn't relate to Any/Non *)
+  | Pre, _ | _, Pre ->
+    raise PreEncountered
+  | Mut t1', Mut t2' ->
+    eq_typ rel eq t1' t2'
+  | Typ c1, Typ c2 ->
+    eq_con eq c1 c2
+  | Mut _, _ | _, Mut _
+  | Typ _, _ | _, Typ _ ->
+    false
+  | Any, Any ->
+    true
+  | _, Any when rel != eq ->
+    true
+  | Non, Non ->
+    true
+  | Non, _ when rel != eq ->
+    true
+  | Con (con1, ts1), Con (con2, ts2) ->
+    (match Cons.kind con1, Cons.kind con2 with
+    | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+      rel_typ rel eq (open_ ts1 t) t2
+    | _, Def (tbs, t) -> (* TBR this may fail to terminate *)
+      rel_typ rel eq t1 (open_ ts2 t)
+    | _ when Cons.eq con1 con2 ->
+      rel_list eq_typ rel eq ts1 ts2
+    | Abs (tbs, t), _ when rel != eq ->
+      rel_typ rel eq (open_ ts1 t) t2
+    | _ ->
+      false
+    )
+  | Con (con1, ts1), t2 ->
+    (match Cons.kind con1, t2 with
+    | Def (tbs, t), _ -> (* TBR this may fail to terminate *)
+      rel_typ rel eq (open_ ts1 t) t2
+    | Abs (tbs, t), _ when rel != eq ->
+      rel_typ rel eq (open_ ts1 t) t2
+    | _ -> false
+    )
+  | t1, Con (con2, ts2) ->
+    (match Cons.kind con2 with
+    | Def (tbs, t) -> (* TBR this may fail to terminate *)
+      rel_typ rel eq t1 (open_ ts2 t)
+    | _ -> false
+    )
+  | Prim p1, Prim p2 when p1 = p2 ->
+    true
+  | Prim p1, Prim p2 when rel != eq ->
+    p1 = Nat && p2 = Int
+  | Obj (s1, tfs1), Obj (s2, tfs2) ->
+    s1 = s2 &&
+    rel_fields rel eq tfs1 tfs2
+  | Array t1', Array t2' ->
+    rel_typ rel eq t1' t2'
+  | Opt t1', Opt t2' ->
+    rel_typ rel eq t1' t2'
+  | Prim Null, Opt t2' when rel != eq ->
+    true
+  | Variant fs1, Variant fs2 ->
+    rel_tags rel eq fs1 fs2
+  | Tup ts1, Tup ts2 ->
+    rel_list rel_typ rel eq ts1 ts2
+  | Func (s1, c1, tbs1, t11, t12), Func (s2, c2, tbs2, t21, t22) ->
+    s1 = s2 && c1 = c2 &&
+    (match rel_binds eq eq tbs1 tbs2 with
+    | Some ts ->
+      rel_list rel_typ rel eq (List.map (open_ ts) t21) (List.map (open_ ts) t11) &&
+      rel_list rel_typ rel eq (List.map (open_ ts) t12) (List.map (open_ ts) t22)
+    | None -> false
+    )
+  | Async (s1, t11, t12), Async (s2, t21, t22) ->
+    s1 = s2 &&
+    eq_typ rel eq t11 t21 &&
+    rel_typ rel eq t12 t22
+  | _, _ -> false
+  end
+
+and rel_fields rel eq tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], [] ->
+    true
+  | _, [] when rel != eq ->
+    true
+  | tf1::tfs1', tf2::tfs2' ->
+    (match compare_field tf1 tf2 with
+    | 0 ->
+      rel_typ rel eq tf1.typ tf2.typ &&
+      rel_fields rel eq tfs1' tfs2'
+    | -1 when rel != eq ->
+      rel_fields rel eq tfs1' tfs2
+    | _ -> false
+    )
+  | _, _ -> false
+
+and rel_tags rel eq tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], [] ->
+    true
+  | [], _ when rel != eq ->
+    true
+  | tf1::tfs1', tf2::tfs2' ->
+    (match compare_field tf1 tf2 with
+    | 0 ->
+      rel_typ rel eq tf1.typ tf2.typ &&
+      rel_tags rel eq tfs1' tfs2'
+    | +1 when rel != eq ->
+      rel_tags rel eq tfs1 tfs2'
+    | _ -> false
+    )
+  | _, _ -> false
+
+and rel_binds rel eq tbs1 tbs2 =
+  let ts = open_binds tbs2 in
+  if rel_list (rel_bind ts) rel eq tbs2 tbs1
+  then Some ts
+  else None
+
+and rel_bind ts rel eq tb1 tb2 =
+  tb1.sort == tb2.sort &&
+  rel_typ rel eq (open_ ts tb1.bound) (open_ ts tb2.bound)
+
+and eq_typ rel eq t1 t2 = rel_typ eq eq t1 t2
+
+and eq t1 t2 : bool =
+  let eq = ref SS.empty in eq_typ eq eq t1 t2
+
+and sub t1 t2 : bool =
+  rel_typ (ref SS.empty) (ref SS.empty) t1 t2
+
+and eq_binds tbs1 tbs2 =
+  let eq = ref SS.empty in rel_binds eq eq tbs1 tbs2 <> None
+
+and eq_kind' eq k1 k2 : bool =
+  match k1, k2 with
+  | Def (tbs1, t1), Def (tbs2, t2)
+  | Abs (tbs1, t1), Abs (tbs2, t2) ->
+    (match rel_binds eq eq tbs1 tbs2 with
+    | Some ts -> eq_typ eq eq (open_ ts t1) (open_ ts t2)
+    | None -> false
+    )
+  | _ -> false
+
+and eq_con eq c1 c2 =
+  match Cons.kind c1, Cons.kind c2 with
+  | (Def (tbs1, t1)) as k1, (Def (tbs2, t2) as k2) ->
+    eq_kind' eq k1 k2
+  | Abs _, Abs _ ->
+    Cons.eq c1 c2
+  | Def (tbs1, t1), Abs (tbs2, t2)
+  | Abs (tbs2, t2), Def (tbs1, t1) ->
+    (match rel_binds eq eq tbs1 tbs2 with
+    | Some ts -> eq_typ eq eq (open_ ts t1) (Con (c2, ts))
+    | None -> false
+    )
+
+let eq_kind k1 k2 : bool = eq_kind' (ref SS.empty) k1 k2
+
+
+(* Compatibility *)
+
+let compatible_list p co xs1 xs2 =
+  try List.for_all2 (p co) xs1 xs2 with Invalid_argument _ -> false
+
+let rec compatible_typ co t1 t2 =
+  t1 == t2 || SS.mem (t1, t2) !co || begin
+  co := SS.add (t1, t2) !co;
+  match promote t1, promote t2 with
+  | Pre, _ | _, Pre ->
+    assert false
+  | Mut t1', Mut t2' ->
+    compatible_typ co t1' t2'
+  | Typ _, Typ _ ->
+    true
+  | Mut _, _ | _, Mut _
+  | Typ _, _ | _, Typ _ ->
+    false
+  | Any, Any ->
+    true
+  | Any, _ | _, Any ->
+    false
+  | Non, _ | _, Non ->
+    true
+  | Prim p1, Prim p2 when p1 = p2 ->
+    true
+  | Prim (Nat | Int), Prim (Nat | Int) ->
+    true
+  | Array t1', Array t2' ->
+    compatible_typ co t1' t2'
+  | Tup ts1, Tup ts2 ->
+    compatible_list compatible_typ co ts1 ts2
+  | Obj (s1, tfs1), Obj (s2, tfs2) ->
+    s1 = s2 &&
+    compatible_fields co tfs1 tfs2
+  | Opt t1', Opt t2' ->
+    compatible_typ co t1' t2'
+  | Prim Null, Opt _ | Opt _, Prim Null  ->
+    true
+  | Variant tfs1, Variant tfs2 ->
+    compatible_tags co tfs1 tfs2
+  | Async (s1, t11, t12), Async (s2, t21, t22) ->
+    s1 = s2 &&
+    compatible_typ co t11 t21 && (* TBR *)
+    compatible_typ co t12 t22
+  | Func _, Func _ ->
+    true
+  | _, _ ->
+    false
+  end
+
+and compatible_fields co tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], [] -> true
+  | tf1::tfs1', tf2::tfs2' ->
+    tf1.lab = tf2.lab && compatible_typ co tf1.typ tf2.typ &&
+    compatible_fields co tfs1' tfs2'
+  | _, _ -> false
+
+and compatible_tags co tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  match tfs1, tfs2 with
+  | [], _ | _, [] -> true
+  | tf1::tfs1', tf2::tfs2' ->
+    match compare_field tf1 tf2 with
+    | -1 -> compatible_tags co tfs1' tfs2
+    | +1 -> compatible_tags co tfs1 tfs2'
+    | _ -> compatible_typ co tf1.typ tf2.typ && compatible_tags co tfs1' tfs2'
+
+and compatible t1 t2 : bool =
+  compatible_typ (ref SS.empty) t1 t2
+
+
+let opaque t = compatible t Any
+
+
+(* Inhabitance *)
+
+let rec inhabited_typ co t =
+  S.mem t !co || begin
+  co := S.add t !co;
+  match promote t with
+  | Pre -> assert false
+  | Non -> false
+  | Any | Prim _ | Array _ | Opt _ | Async _ | Func _ | Typ _ -> true
+  | Mut t' -> inhabited_typ co t'
+  | Tup ts -> List.for_all (inhabited_typ co) ts
+  | Obj (_, tfs) -> List.for_all (inhabited_field co) tfs
+  | Variant tfs -> List.exists (inhabited_field co) tfs
+  | Var _ -> true  (* TODO(rossberg): consider bound *)
+  | Con (c, ts) ->
+    match Cons.kind c with
+    | Def (tbs, t') -> (* TBR this may fail to terminate *)
+      inhabited_typ co (open_ ts t')
+    | Abs (tbs, t') ->
+      inhabited_typ co t'
+  end
+
+and inhabited_field co tf = inhabited_typ co tf.typ
+
+and inhabited t : bool = inhabited_typ (ref S.empty) t
+
+let rec singleton_typ co t =
+  S.mem t !co || begin
+  co := S.add t !co;
+  match normalize t with
+  | Pre -> assert false
+  | Prim Null | Any -> true
+  | Tup ts -> List.for_all (singleton_typ co) ts
+  | Obj ((Object|Memory|Module), fs) -> List.for_all (singleton_field co) fs
+  | Variant [f] -> singleton_field co f
+
+  | Non -> false
+  | Prim _ | Array _ | Opt _ | Async _ | Func _ | Typ _ -> false
+  | Mut t' -> false
+  | Obj (_, _) -> false
+  | Variant _ -> false
+  | Var _ -> false
+  | Con _ -> false
+  end
+
+and singleton_field co tf = singleton_typ co tf.typ
+
+and singleton t : bool = singleton_typ (ref S.empty) t
+
+
+(* Least upper bound and greatest lower bound *)
+
+module M = Map.Make (OrdPair)
+
+exception Mismatch
+
+let rec combine rel lubs glbs t1 t2 =
+  assert (rel == lubs || rel == glbs);
+  if t1 == t2 then t1 else
+  match M.find_opt (t1, t2) !rel with
+  | Some t -> t
+  | _ when eq t1 t2 ->
+    let t = if is_con t2 then t2 else t1 in
+    rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+    t
+  | _ ->
+    match t1, t2 with
+    | Pre, _ | _, Pre ->
+      raise PreEncountered
+    | Mut _, _ | _, Mut _
+    | Typ _, _ | _, Typ _ ->
+      raise Mismatch
+    | Any, t | t, Any ->
+      if rel == lubs then Any else t
+    | Non, t | t, Non ->
+      if rel == lubs then t else Non
+    | Prim Nat, Prim Int
+    | Prim Int, Prim Nat ->
+      Prim (if rel == lubs then Int else Nat)
+    | Opt t1', Opt t2' ->
+      Opt (combine rel lubs glbs t1' t2')
+    | (Opt _ as t), (Prim Null as t')
+    | (Prim Null as t'), (Opt _ as t) ->
+      if rel == lubs then t else t'
+    | Array t1', Array t2' ->
+      (try Array (combine rel lubs glbs t1' t2')
+      with Mismatch -> if rel == lubs then Any else Non)
+    | Variant t1', Variant t2' ->
+      Variant (combine_tags rel lubs glbs t1' t2')
+    | Tup ts1, Tup ts2 when List.(length ts1 = length ts2) ->
+      Tup (List.map2 (combine rel lubs glbs) ts1 ts2)
+    | Obj (s1, tf1), Obj (s2, tf2) when s1 = s2 ->
+      (try Obj (s1, combine_fields rel lubs glbs tf1 tf2)
+      with Mismatch -> assert (rel == glbs); Non)
+    | Func (s1, c1, bs1, ts11, ts12), Func (s2, c2, bs2, ts21, ts22) when
+        s1 = s2 && c1 = c2 && eq_binds bs1 bs2 &&
+        List.(length ts11 = length ts21 && length ts12 = length ts22) ->
+      let ts = open_binds bs1 in
+      let cs = List.map (fun t -> fst (as_con t)) ts in
+      let opened = List.map (open_ ts) in
+      let closed = List.map (close cs) in
+      let rel' = if rel == lubs then glbs else lubs in
+      Func (
+        s1, c1, bs1,
+        closed (List.map2 (combine rel' lubs glbs) (opened ts11) (opened ts21)),
+        closed (List.map2 (combine rel lubs glbs) (opened ts12) (opened ts22))
+      )
+    | Async (s1, t11, t12), Async (s2, t21, t22) when s1 == s2 && eq t11 t21 ->
+      Async (s1, t11, combine rel lubs glbs t12 t22)
+    | Con _, _
+    | _, Con _ ->
+      if sub t1 t2 then
+        let t = if rel == glbs then t1 else t2 in
+        rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+        t
+      else if sub t2 t1 then
+        let t = if rel == lubs then t1 else t2 in
+        rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+        t
+      else
+        let op, expand =
+          if rel == lubs then "lub", promote else "glb", normalize in
+        let name = op ^ "<" ^ !str t1 ^ ", " ^ !str t2 ^ ">" in
+        let c = Cons.fresh name (Abs ([], Pre)) in
+        let t = Con (c, []) in
+        rel := M.add (t2, t1) t (M.add (t1, t2) t !rel);
+        let t' =
+          (* When taking the glb of an abstract con and an incompatible type,
+           * normalisation will no further simplify t1 nor t2, so that t itself
+           * is returned via the extended relation. In that case, bottom is
+           * the correct result.
+           *)
+          match combine rel lubs glbs (expand t1) (expand t2) with
+          | t' when t' == t -> assert (rel == glbs); Non
+          | t' -> t'
+        in
+        set_kind c (Def ([], t'));
+        t'
+    | _, _ ->
+      if rel == lubs then Any else Non
+
+and cons_if b x xs = if b then x::xs else xs
+
+and combine_fields rel lubs glbs fs1 fs2 =
+  match fs1, fs2 with
+  | _, [] -> if rel == lubs then [] else fs1
+  | [], _ -> if rel == lubs then [] else fs2
+  | f1::fs1', f2::fs2' ->
+    match compare_field f1 f2 with
+    | -1 -> cons_if (rel == glbs) f1 (combine_fields rel lubs glbs fs1' fs2)
+    | +1 -> cons_if (rel == glbs) f2 (combine_fields rel lubs glbs fs1 fs2')
+    | _ ->
+      match combine rel lubs glbs f1.typ f2.typ with
+      | typ ->
+       {lab = f1.lab; typ; src = empty_src} :: combine_fields rel lubs glbs fs1' fs2'
+      | exception Mismatch when rel == lubs ->
+        combine_fields rel lubs glbs fs1' fs2'
+
+and combine_tags rel lubs glbs fs1 fs2 =
+  match fs1, fs2 with
+  | _, [] -> if rel == lubs then fs1 else []
+  | [], _ -> if rel == lubs then fs2 else []
+  | f1::fs1', f2::fs2' ->
+    match compare_field f1 f2 with
+    | -1 -> cons_if (rel == lubs) f1 (combine_tags rel lubs glbs fs1' fs2)
+    | +1 -> cons_if (rel == lubs) f2 (combine_tags rel lubs glbs fs1 fs2')
+    | _ ->
+      let typ = combine rel lubs glbs f1.typ f2.typ in
+      {lab = f1.lab; typ; src = empty_src} :: combine_tags rel lubs glbs fs1' fs2'
+
+let lub t1 t2 = let lubs = ref M.empty in combine lubs lubs (ref M.empty) t1 t2
+let glb t1 t2 = let glbs = ref M.empty in combine glbs (ref M.empty) glbs t1 t2
+
+
+(* Environments *)
+
+module Env = Env.Make(String)
+
+(* Scopes *)
+
+let scope_var var = "$" ^ var
+let default_scope_var = scope_var ""
+let scope_bound = Any
+let scope_bind = { var = default_scope_var; sort = Scope; bound = scope_bound }
+
+(* Well-known fields *)
+
+let motoko_async_helper_fld =
+  { lab = "__motoko_async_helper";
+    typ = Func(Shared Write, Promises, [scope_bind], [Prim Nat32], []);
+    src = empty_src;
+  }
+
+let motoko_stable_var_info_fld =
+  { lab = "__motoko_stable_var_info";
+    typ =
+      Func(Shared Query, Promises, [scope_bind], [],
+        [ Obj(Object, [{lab = "size"; typ = nat64; src = empty_src}]) ]);
+    src = empty_src;
+  }
+
+let motoko_gc_trigger_fld =
+  { lab = "__motoko_gc_trigger";
+    typ = Func(Shared Write, Promises, [scope_bind], [], []);
+    src = empty_src;
+  }
+
+let well_known_actor_fields = [
+    motoko_async_helper_fld;
+    motoko_stable_var_info_fld;
+    motoko_gc_trigger_fld;
+  ]
+
+let decode_msg_typ tfs =
+  Variant
+    (List.sort compare_field (List.filter_map (fun tf ->
+       match normalize tf.typ with
+       | Func(Shared (Write | Query), _, tbs, ts1, ts2) ->
+         Some { tf with
+           typ =
+             Func(Local, Returns, [], [],
+               List.map (open_ (List.map (fun _ -> Non) tbs)) ts1);
+           src = empty_src }
+       | _ -> None)
+     tfs))
+
+let canister_settings_typ =
+  obj Object [
+    "settings",
+    Opt (
+      obj Object [
+      ("controllers", Opt (Array principal));
+      ("compute_allocation", Opt nat);
+      ("memory_allocation", Opt nat);
+      ("freezing_threshold", Opt nat)])]
+
+let install_arg_typ =
+  sum [
+    ("new", canister_settings_typ);
+    ("install", principal);
+    ("reinstall", obj Actor []);
+    ("upgrade", obj Actor [])
+  ]
+
+let install_typ ts actor_typ =
+  Func(Local, Returns, [],
+    [ install_arg_typ ],
+    [ Func(Local, Returns, [scope_bind], ts, [Async (Fut, Var (default_scope_var, 0), actor_typ)]) ])
+
+
+(* Pretty printing *)
+
+let string_of_async_sort = function
+  | Fut -> ""
+  | Cmp -> "*"
+
+let string_of_prim = function
+  | Null -> "Null"
+  | Bool -> "Bool"
+  | Nat -> "Nat"
+  | Nat8 -> "Nat8"
+  | Nat16 -> "Nat16"
+  | Nat32 -> "Nat32"
+  | Nat64 -> "Nat64"
+  | Int -> "Int"
+  | Int8 -> "Int8"
+  | Int16 -> "Int16"
+  | Int32 -> "Int32"
+  | Int64 -> "Int64"
+  | Float -> "Float"
+  | Char -> "Char"
+  | Text -> "Text"
+  | Blob -> "Blob"
+  | Error -> "Error"
+  | Principal -> "Principal"
+  | Region -> "Region"
+
+let string_of_obj_sort = function
+  | Object -> ""
+  | Module -> "module "
+  | Actor -> "actor "
+  | Memory -> "memory "
+
+let string_of_func_sort = function
+  | Local -> ""
+  | Shared Write -> "shared "
+  | Shared Query -> "shared query "
+  | Shared Composite -> "shared composite query " (* TBR *)
+
+(* PrettyPrinter configurations *)
+
+module type PrettyConfig = sig
+  val show_stamps : bool
+  val con_sep : string
+  val par_sep : string
+end
+
+module ShowStamps = struct
+  let show_stamps = true
+  let con_sep = "__" (* TODO: revert to "/" *)
+  let par_sep = "_"
+end
+
+module ElideStamps = struct
+  let show_stamps = false
+  let con_sep = ShowStamps.con_sep
+  let par_sep = ShowStamps.par_sep
+end
+
+module ParseableStamps = struct
+  let show_stamps = true
+  let con_sep = "__"
+  let par_sep = "_"
+end
+
+module MakePretty(Cfg : PrettyConfig) = struct
+
+open Format
+
+let pr = pp_print_string
+
+let comma ppf () = fprintf ppf ",@ "
+
+let semi ppf () = fprintf ppf ";@ "
+
+module StringSet = Set.Make(String)
+
+let vs_of_cs cs =
+  let names = ConSet.fold (fun c ns -> StringSet.add (Cons.name c) ns) cs StringSet.empty in
+  StringSet.fold (fun n vs -> (n, 0)::vs) names []
+
+let string_of_var (x, i) =
+  if i = 0 then sprintf "%s" x else sprintf "%s%s%d" x Cfg.par_sep i
+
+let string_of_con c = Cons.to_string Cfg.show_stamps Cfg.con_sep c
+
+let rec can_sugar = function
+  | Func(s, Promises, tbs, ts1, ts2)
+  | Func((Shared _ as s), Returns, tbs, ts1, ([] as ts2))
+  | Func(s, Returns, (_::_ as tbs), ts1, ([Async (_, Var(_, 0),_)] as ts2)) ->
+    List.for_all (fun tb -> can_omit 0 tb.bound) tbs &&
+    List.for_all (can_omit 0) ts1 &&
+    List.for_all (can_omit 0) ts2
+  | _ -> false
+
+and can_omit n t =
+  let rec go i = function
+    | Var (_, j) -> i <> j
+    | Pre -> assert false
+    | Prim _ | Any | Non -> true
+    | Con (c, ts) -> List.for_all (go i ) ts
+    | Array t | Opt t | Mut t -> go i t
+    | Async (s, Var (_, j), t2) when j = i && i <= n -> go i t2 (* t1 is a phantom type *)
+    | Async (s, t1, t2) -> go i t1 && go i t2
+    | Tup ts -> List.for_all (go i ) ts
+    | Obj (_, fs) | Variant fs -> List.for_all (fun f -> go i f.typ) fs
+    | Func (s, c, tbs, ts1, ts2) ->
+      let i' = i+List.length tbs in
+      List.for_all (fun tb -> go i' tb.bound) tbs &&
+      List.for_all (go i') ts1 &&
+      List.for_all (go i') ts2
+    | Typ c -> true (* assumes type defs are closed *)
+  in go n t
+
+let rec pp_typ_obj vs ppf o =
+  match o with
+  | (Object, fs) ->
+    fprintf ppf "@[<hv 2>{@;<0 0>%a@;<0 -2>}@]"
+      (pp_print_list ~pp_sep:semi (pp_field vs)) fs
+  | (s, fs) ->
+    fprintf ppf "@[<hv 2>%s{@;<0 0>%a@;<0 -2>}@]"
+      (string_of_obj_sort s)
+      (pp_print_list ~pp_sep:semi (pp_field vs)) fs
+
+and pp_typ_variant vs ppf fs =
+  match fs with
+  | [] -> pr ppf "{#}"
+  | fs ->
+    fprintf ppf "@[<hv 2>{@;<0 0>%a@;<0 -2>}@]"
+      (pp_print_list ~pp_sep:semi (pp_tag vs)) fs
+
+and pp_typ_nullary vs ppf t =
+  match t with
+  | Tup ts ->
+    fprintf ppf "@[<1>(%a%s)@]"
+      (pp_print_list ~pp_sep:comma (pp_typ' vs)) ts
+      (if List.length ts = 1 then "," else "")
+  | Pre -> pr ppf "???"
+  | Any -> pr ppf "Any"
+  | Non -> pr ppf "None"
+  | Prim p -> pr ppf (string_of_prim p)
+  | Var (s, i) ->
+    pr ppf (try string_of_var (List.nth vs i) with _ -> Printf.sprintf "??? %s %i" s i)
+  | Con (c, []) -> pr ppf (string_of_con c)
+  | Con (c, ts) ->
+    fprintf ppf "@[%s<@[<1>%a@]>@]" (string_of_con c)
+      (pp_print_list ~pp_sep:comma (pp_typ' vs)) ts
+  | Array (Mut t) ->
+    fprintf ppf "@[<1>[var %a]@]" (pp_typ' vs) t
+  | Array t ->
+    fprintf ppf "@[<1>[%a]@]" (pp_typ' vs) t
+  | Obj (Object, fs) ->
+    pp_typ_obj vs ppf (Object, fs)
+  | Variant fs ->
+    pp_typ_variant vs ppf fs
+  | t ->
+    (* In the parser, this case is subsumed by the grammar production for `LPAR .. RPAR` *)
+    fprintf ppf "@[<1>(%a)@]" (pp_typ' vs) t
+
+and pp_typ_un vs ppf t =
+  match t with
+  | Opt t ->
+    fprintf ppf "@[<1>?%a@]"  (pp_typ_un vs) t
+  | t ->
+    pp_typ_nullary vs ppf t
+
+and pp_typ_pre vs ppf t =
+  match t with
+  (* No case for grammar production `PRIM s` *)
+  | Async (s, t1, t2) ->
+    if Cfg.show_stamps then
+      match t1 with
+      | Var(_, n) when fst (List.nth vs n) = "" ->
+        fprintf ppf "@[<2>async%s@ %a@]" (string_of_async_sort s) (pp_typ_pre vs) t2
+      | _ ->
+        fprintf ppf "@[<2>async%s<%a>@ %a@]"
+          (string_of_async_sort s)
+          (pp_typ' vs) t1
+          (pp_typ_pre vs) t2
+    else fprintf ppf "@[<2>async%s@ %a@]" (string_of_async_sort s) (pp_typ_pre vs) t2
+  | Obj ((Module | Actor | Memory) as os, fs) ->
+    pp_typ_obj vs ppf (os, fs)
+  | t ->
+    pp_typ_un vs ppf t
+
+and sequence pp ppf ts =
+  match ts with
+  | [Tup _] ->
+    fprintf ppf "@[<1>(%a)@]" pp (seq ts)
+  | ts ->
+    pp ppf (seq ts)
+
+and pp_typ_nobin vs ppf t =
+  match t with
+  | Func (s, c, tbs, ts1, ts2) ->
+    let sugar = can_sugar t in
+    let vs' = vars_of_binds vs tbs in
+    let vs'', tbs' =
+      if sugar then
+        List.tl vs', List.tl tbs
+      else
+        match tbs with
+        | { sort = Scope; _ } :: _ -> ("system", List.hd vs' |> snd) :: List.tl vs', tbs
+        | _ -> vs', tbs
+    in
+    let vs'vs = vs' @ vs in
+    fprintf ppf "@[<2>%s%a%a ->@ %a@]"
+      (string_of_func_sort s)
+      (pp_binds vs'vs vs'') tbs'
+      (sequence (pp_typ_un vs'vs)) ts1
+      (pp_control_cod sugar c vs'vs) ts2
+  | t ->
+     pp_typ_pre vs ppf t
+
+and pp_control_cod sugar c vs ppf ts =
+  match c, ts with
+  (* sugar *)
+  | Returns, [Async (s, _, t)] when sugar ->
+    fprintf ppf "@[<2>async%s@ %a@]" (string_of_async_sort s) (pp_typ_pre vs) t
+  | Promises, ts ->
+    fprintf ppf "@[<2>async@ %a@]" (sequence (pp_typ_pre vs)) ts
+  | Returns, _ ->
+    sequence (pp_typ_nobin vs) ppf ts
+  | Replies, _ ->
+    fprintf ppf "@[<2>replies@ %a@]" (sequence (pp_typ_nobin vs)) ts
+
+and pp_typ' vs ppf t =
+  match t with
+  (* special, additional cases for printing second-class types *)
+  | Typ c ->
+    fprintf ppf "@[<1>=@ @[(type@ %a)@]@]" (pp_kind' vs) (Cons.kind c)
+  | Mut t ->
+    fprintf ppf "@[<1>var@ %a@]" (pp_typ_un vs) t
+  (* No cases for syntactic _ And _ & _ Or _ (already desugared) *)
+  | t -> pp_typ_nobin vs ppf t
+
+and pp_field vs ppf {lab; typ; src} =
+  match typ with
+  | Typ c ->
+    let op, sbs, st = pps_of_kind' vs (Cons.kind c) in
+    fprintf ppf "@[<2>type %s%a %s@ %a@]" lab sbs () op st ()
+  | Mut t' ->
+    fprintf ppf "@[<2>var %s :@ %a@]" lab (pp_typ' vs) t'
+  | _ ->
+    fprintf ppf "@[<2>%s :@ %a@]" lab (pp_typ' vs) typ
+
+and pp_stab_field vs ppf {lab; typ; src} =
+  match typ with
+  | Mut t' ->
+    fprintf ppf "@[<2>stable var %s :@ %a@]" lab (pp_typ' vs) t'
+  | _ ->
+    fprintf ppf "@[<2>stable %s :@ %a@]" lab (pp_typ' vs) typ
+
+and pp_tag vs ppf {lab; typ; src} =
+  match typ with
+  | Tup [] -> fprintf ppf "#%s" lab
+  | _ ->
+    fprintf ppf "@[<2>#%s :@ %a@]" lab
+      (pp_typ' vs) typ
+
+and vars_of_binds vs bs =
+  List.map (fun b -> name_of_var vs (b.var, 0)) bs
+
+and name_of_var vs v =
+  match vs with
+  | [] -> v
+  | v'::vs' -> name_of_var vs' (if fst v = fst v' then (fst v, snd v + 1) else v)
+
+and pp_bind vs ppf (v, {bound; _}) =
+  if bound = Any then
+    pr ppf (string_of_var v)
+  else
+    fprintf ppf "%s <: %a"
+      (string_of_var v)
+      (pp_typ' vs) bound
+
+and pp_binds vs vs' ppf = function
+  | [] -> ()
+  | tbs ->
+    fprintf ppf "@[<1><%a>@]"
+      (pp_print_list ~pp_sep:comma (pp_bind vs)) (List.combine vs' tbs)
+
+and pps_of_kind' vs k =
+  let op, tbs, t =
+    match k with
+    | Def (tbs, t) -> "=", tbs, t
+    | Abs (tbs, t) -> "<:", tbs, t
+  in
+  let vs' = vars_of_binds vs tbs in
+  let vs'vs = vs'@vs in
+  op,
+  (fun ppf () -> pp_binds vs'vs vs' ppf tbs),
+  (fun ppf () -> pp_typ' vs'vs ppf t)
+
+and pps_of_kind k =
+  let cs = cons_kind k in
+  let vs = vs_of_cs cs in
+  pps_of_kind' vs k
+
+and pp_kind' vs ppf k =
+  let op, sbs, st = pps_of_kind' vs k in
+  fprintf ppf "%s %a%a" op sbs () st ()
+
+and pp_kind ppf k =
+  let cs = cons_kind k in
+  let vs = vs_of_cs cs in
+  pp_kind' vs ppf k
+
+and pp_stab_sig ppf sig_ =
+  let cs = List.fold_right
+    (cons_field false)
+    (* false here ^ means ignore unreferenced Typ c components
+       that would produce unreferenced bindings when unfolded *)
+    sig_ ConSet.empty in
+  let vs = vs_of_cs cs in
+  let ds =
+    let cs' = ConSet.filter (fun c ->
+      match Cons.kind c with
+      | Def ([], Prim p) when string_of_con c = string_of_prim p -> false
+      | Def ([], Any) when string_of_con c = "Any" -> false
+      | Def ([], Non) when string_of_con c = "None" -> false
+      | Def _ -> true
+      | Abs _ -> false) cs in
+    ConSet.elements cs' in
+  let fs =
+    List.sort compare_field
+      (List.map (fun c ->
+        { lab = string_of_con c;
+          typ = Typ c;
+          src = empty_src }) ds)
+  in
+  let pp_stab_fields ppf sig_ =
+    fprintf ppf "@[<v 2>%s{@;<0 0>%a@;<0 -2>}@]"
+      (string_of_obj_sort Actor)
+      (pp_print_list ~pp_sep:semi (pp_stab_field vs)) sig_
+  in
+  fprintf ppf "@[<v 0>%a%a%a;@]"
+   (pp_print_list ~pp_sep:semi (pp_field vs)) fs
+   (if fs = [] then fun ppf () -> () else semi) ()
+   pp_stab_fields sig_
+
+let rec pp_typ_expand' vs ppf t =
+  match t with
+  | Con (c, ts) ->
+    (match Cons.kind c with
+    | Abs _ -> pp_typ' vs ppf t
+    | Def _ ->
+      match normalize t with
+      | Prim _ | Any | Non -> pp_typ' vs ppf t
+      | t' -> fprintf ppf "%a = %a"
+        (pp_typ' vs) t
+        (pp_typ_expand' vs) t'
+    )
+  | _ -> pp_typ' vs ppf t
+
+let pp_lab = pr
+
+let pp_typ ppf t =
+  let vs = vs_of_cs (cons t) in
+  pp_typ' vs ppf t
+
+let pp_typ_expand ppf t =
+  let vs = vs_of_cs (cons t) in
+  pp_typ_expand' vs ppf t
+
+let string_of_typ typ : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_typ ppf) typ
+
+let string_of_kind k : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_kind ppf) k
+
+let strings_of_kind k : string * string * string =
+  let op, sbs, st = pps_of_kind k in
+  op, Lib.Format.with_str_formatter sbs (), Lib.Format.with_str_formatter st ()
+
+let string_of_typ_expand typ : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_typ_expand ppf) typ
+
+end
+
+module type Pretty = sig
+  val pp_lab : Format.formatter -> lab -> unit
+  val pp_typ : Format.formatter -> typ -> unit
+  val pp_typ_expand : Format.formatter -> typ -> unit
+  val pps_of_kind : kind ->
+    string *
+    (Format.formatter -> unit -> unit) *
+      (Format.formatter -> unit -> unit)
+
+  val string_of_con : con -> string
+  val string_of_typ : typ -> string
+  val string_of_kind : kind -> string
+  val strings_of_kind : kind -> string * string * string
+  val string_of_typ_expand : typ -> string
+end
+
+include MakePretty(ShowStamps)
+
+let _ = str := string_of_typ
+
+(* Stable signatures *)
+
+let rec match_stab_sig tfs1 tfs2 =
+  (* Assume that tfs1 and tfs2 are sorted. *)
+  (* Should we insist on monotonic preservation of fields, or relax? *)
+  match tfs1, tfs2 with
+  | [], _ ->
+    true (* no or additional fields ok *)
+  | _, [] ->
+    false (* true, should we allow fields to be dropped *)
+  | tf1::tfs1', tf2::tfs2' ->
+    (match compare_field tf1 tf2 with
+     | 0 ->
+       is_mut tf1.typ = is_mut tf2.typ &&
+       sub (as_immut tf1.typ) (as_immut tf2.typ) &&
+         (* should we enforce equal mutability or not? Seems unncessary
+            since upgrade is read-once *)
+       match_stab_sig tfs1' tfs2'
+     | -1 ->
+       false (* match_sig tfs1' tfs2', should we allow fields to be dropped *)
+     | _ ->
+       (* new field ok *)
+       match_stab_sig tfs1 tfs2'
+    )
+
+let string_of_stab_sig fields : string =
+  let module Pretty = MakePretty(ParseableStamps) in
+  "// Version: 1.0.0\n" ^
+  Format.asprintf "@[<v 0>%a@]@\n" (fun ppf -> Pretty.pp_stab_sig ppf) fields
+
+
+
+ + + diff --git a/coverage/mo_values/arrange_ops.ml.html b/coverage/mo_values/arrange_ops.ml.html new file mode 100644 index 00000000000..6ba3f5b7585 --- /dev/null +++ b/coverage/mo_values/arrange_ops.ml.html @@ -0,0 +1,170 @@ + + + + + arrange_ops.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+
+
open Wasm.Sexpr
+open Operator
+
+let unop uo = match uo with
+  | PosOp -> Atom "PosOp"
+  | NegOp -> Atom "NegOp"
+  | NotOp -> Atom "NotOp"
+
+let binop bo = match bo with
+  | AddOp  -> Atom "AddOp"
+  | SubOp  -> Atom "SubOp"
+  | MulOp  -> Atom "MulOp"
+  | DivOp  -> Atom "DivOp"
+  | ModOp  -> Atom "ModOp"
+  | AndOp  -> Atom "AndOp"
+  | OrOp   -> Atom "OrOp"
+  | XorOp  -> Atom "XorOp"
+  | ShLOp  -> Atom "ShiftLOp"
+  | ShROp  -> Atom "ShiftROp"
+  | RotLOp -> Atom "RotLOp"
+  | RotROp -> Atom "RotROp"
+  | CatOp  -> Atom "CatOp"
+  | PowOp  -> Atom "PowOp"
+  | WAddOp  -> Atom "WAddOp"
+  | WSubOp  -> Atom "WSubOp"
+  | WMulOp  -> Atom "WMulOp"
+  | WPowOp  -> Atom "WPowOp"
+
+let relop ro = match ro with
+  | EqOp  -> Atom "EqOp"
+  | NeqOp -> Atom "NeqOp"
+  | LtOp  -> Atom "LtOp"
+  | GtOp  -> Atom "GtOp"
+  | LeOp  -> Atom "LeOp"
+  | GeOp  -> Atom "GeOp"
+
+
+
+ + + diff --git a/coverage/mo_values/call_conv.ml.html b/coverage/mo_values/call_conv.ml.html new file mode 100644 index 00000000000..a7f08e2420a --- /dev/null +++ b/coverage/mo_values/call_conv.ml.html @@ -0,0 +1,156 @@ + + + + + call_conv.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
+
open Mo_types
+open Type
+
+(*
+Functions of different arities (even if the look like they have the same type)
+are not compatible, but the interpreters just pass tuples to them. In order to
+still catch mismatching arities in the interpreter, we tag function values
+with their “calling convention”, and check them in calls.
+*)
+
+type call_conv = {
+  sort: func_sort;
+  control : control;
+  n_args : int;
+  n_res : int;
+}
+type t = call_conv
+
+let local_cc n m = { sort = Local; control = Returns; n_args = n; n_res = m}
+let message_cc s n = { sort = Shared s; control = Returns; n_args = n; n_res = 0}
+let async_cc s n m = { sort = Shared s; control = Promises; n_args = n; n_res = m}
+let replies_cc s n m = { sort = Shared s; control = Replies; n_args = n; n_res = m}
+
+let call_conv_of_typ typ =
+  match typ with
+  | Func (sort, control, tbds, dom, res) ->
+    { sort; control; n_args = List.length dom; n_res = List.length res }
+  | Non ->
+    { sort = Local; control = Returns; n_args = 1; n_res = 1 }
+  | _ -> raise (Invalid_argument ("call_conv_of_typ " ^ string_of_typ typ))
+
+let string_of_call_conv {sort;control;n_args;n_res} =
+  Printf.sprintf "(%s%i %s %i)"
+    (string_of_func_sort sort)
+    n_args
+    (match control with Returns -> "->" | Promises -> "@>" | Replies -> "#>")
+    n_res
+
+
+
+
+ + + diff --git a/coverage/mo_values/numerics.ml.html b/coverage/mo_values/numerics.ml.html new file mode 100644 index 00000000000..22bf994791c --- /dev/null +++ b/coverage/mo_values/numerics.ml.html @@ -0,0 +1,1253 @@ + + + + + numerics.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+
+
(*
+This module contains all the numeric stuff, culminating
+in the NatN and Int_N modules, to be used by value.ml
+*)
+
+let rec add_digits buf s i j k =
+  if i < j then begin
+    if k = 0 then Buffer.add_char buf '_';
+    Buffer.add_char buf s.[i];
+    add_digits buf s (i + 1) j ((k + 2) mod 3)
+  end
+
+let is_digit c = '0' <= c && c <= '9'
+let isnt_digit c = not (is_digit c)
+
+let group_num s =
+  let len = String.length s in
+  let mant = Lib.Option.get (Lib.String.find_from_opt is_digit s 0) len in
+  let point = Lib.Option.get (Lib.String.find_from_opt isnt_digit s mant) len in
+  let frac = Lib.Option.get (Lib.String.find_from_opt is_digit s point) len in
+  let exp = Lib.Option.get (Lib.String.find_from_opt isnt_digit s frac) len in
+  let buf = Buffer.create (len*4/3) in
+  Buffer.add_substring buf s 0 mant;
+  add_digits buf s mant point ((point - mant) mod 3 + 3);
+  Buffer.add_substring buf s point (frac - point);
+  add_digits buf s frac exp 3;
+  Buffer.add_substring buf s exp (len - exp);
+  Buffer.contents buf
+
+(* OCaml version of LibTomMath's mp_set_double
+   Converts a Wasm f64 (represented as IEEE 754 double, same as OCaml `float`)
+   to Big_int *)
+let bigint_of_double (f : Wasm.F64.t) : Big_int.big_int =
+  let bits = Wasm.F64.to_bits f in
+
+  (* A bit pattern with 11 least significant bits set *)
+  let bits_11 = Int64.of_int 0x7FF in
+
+  (* Exponent part of IEEE 754 double, 11 bits *)
+  let exp = Int64.(logand (shift_right_logical bits 52) bits_11) in
+
+  (* Fraction part of IEEE 754 double, 52 bits from the float, with an implicit
+     1 at the 53rd bit *)
+  let frac = Int64.(logor (shift_right_logical (shift_left bits 12) 12) (shift_left (of_int 1) 52)) in
+
+  if Int64.(equal exp bits_11) then
+    (* Exponent is fully set: NaN or inf *)
+    raise (Invalid_argument "bigint_of_double: argument is NaN or inf");
+
+  (* Actual exponent value: subtract bias (1023), and 52 for the missing
+     fraction dot in `frac`. Reminder: if fractional part is `xxx...` (binary)
+     then actual fraction is `1.xxx...`, which we represent as `1xxx...` in
+     `frac`. `- 52` here is to take that lost fraction point into account. *)
+  let exp = Int64.(sub exp (of_int (1023 + 52))) in
+
+  let a = Big_int.big_int_of_int64 frac in
+
+  let a = if Int64.(compare exp (of_int 0)) < 0 then
+    (* Exponent < 0, shift right *)
+    Big_int.(shift_right_big_int a (- (Int64.to_int exp)))
+  else
+    (* Exponent >= 0, shift left *)
+    Big_int.(shift_left_big_int a (Int64.to_int exp))
+  in
+
+  (* Negate the number if sign bit is set (double is negative) *)
+  if Int64.shift_right_logical bits 63 = Int64.of_int 1 && a <> Big_int.zero_big_int then
+    Big_int.minus_big_int a
+  else
+    a
+
+(* a mild extension over Was.Int.RepType *)
+module type WordRepType =
+sig
+  include Wasm.Int.RepType
+  val of_big_int : Big_int.big_int -> t (* wrapping *)
+  val to_big_int : t -> Big_int.big_int
+end
+
+module Int64Rep : WordRepType =
+struct
+  include Int64
+  let bitwidth = 64
+  let to_hex_string = Printf.sprintf "%Lx"
+
+  let of_big_int i =
+    let open Big_int in
+    let i = mod_big_int i (power_int_positive_int 2 64) in
+    if lt_big_int i (power_int_positive_int 2 63)
+    then int64_of_big_int i
+    else int64_of_big_int (sub_big_int i (power_int_positive_int 2 64))
+
+  let to_big_int i =
+    let open Big_int in
+    if i < 0L
+    then add_big_int (big_int_of_int64 i) (power_int_positive_int 2 64)
+    else big_int_of_int64 i
+end
+
+
+(* Represent n-bit words using k-bit words by shifting left/right by k-n bits *)
+module SubRep (Rep : WordRepType) (Width : sig val bitwidth : int end) : WordRepType =
+struct
+  let _ = assert (Width.bitwidth < Rep.bitwidth)
+
+  type t = Rep.t
+
+  let bitwidth = Width.bitwidth
+  let bitdiff = Rep.bitwidth - Width.bitwidth
+  let inj r  = Rep.shift_left r bitdiff
+  let proj i = Rep.shift_right_logical i bitdiff
+
+  let zero = inj Rep.zero
+  let one = inj Rep.one
+  let minus_one = inj Rep.minus_one
+  let max_int = inj (Rep.shift_right_logical Rep.max_int bitdiff)
+  let min_int = inj (Rep.shift_right_logical Rep.min_int bitdiff)
+  let neg i = inj (Rep.neg (proj i))
+  let add i j = inj (Rep.add (proj i) (proj j))
+  let sub i j = inj (Rep.sub (proj i) (proj j))
+  let mul i j = inj (Rep.mul (proj i) (proj j))
+  let div i j = inj (Rep.div (proj i) (proj j))
+  let rem i j = inj (Rep.rem (proj i) (proj j))
+  let logand = Rep.logand
+  let logor = Rep.logor
+  let lognot i = inj (Rep.lognot (proj i))
+  let logxor i j = inj (Rep.logxor (proj i) (proj j))
+  let shift_left i j = Rep.shift_left i j
+  let shift_right i j = let res = Rep.shift_right i j in inj (proj res)
+  let shift_right_logical i j = let res = Rep.shift_right_logical i j in inj (proj res)
+  let of_int i = inj (Rep.of_int i)
+  let to_int i = Rep.to_int (proj i)
+  let to_string i = group_num (Rep.to_string (proj i))
+  let to_hex_string i = group_num (Rep.to_hex_string (proj i))
+  let of_big_int i = inj (Rep.of_big_int i)
+  let to_big_int i = Rep.to_big_int (proj i)
+end
+
+module Int8Rep = SubRep (Int64Rep) (struct let bitwidth = 8 end)
+module Int16Rep = SubRep (Int64Rep) (struct let bitwidth = 16 end)
+module Int32Rep = SubRep (Int64Rep) (struct let bitwidth = 32 end)
+
+(*
+This WordType is used only internally in this module, to implement the bit-wise
+or wrapping operations on NatN and IntN (see module Ranged)
+*)
+
+module type WordType =
+sig
+  include Wasm.Int.S
+  val neg : t -> t
+  val not : t -> t
+  val pow : t -> t -> t
+
+  val bitwidth : int
+  val of_big_int : Big_int.big_int -> t (* wrapping *)
+  val to_big_int : t -> Big_int.big_int (* returns natural numbers *)
+end
+
+module MakeWord (Rep : WordRepType) : WordType =
+struct
+  module WasmInt = Wasm.Int.Make (Rep)
+  include WasmInt
+  let neg w = sub zero w
+  let not w = xor w (of_int_s (-1))
+  let one = of_int_u 1
+  let rec pow x y =
+    if y = zero then
+      one
+    else if and_ y one = zero then
+      pow (mul x x) (shr_u y one)
+    else
+      mul x (pow x (sub y one))
+
+  let bitwidth = Rep.bitwidth
+  let of_big_int = Rep.of_big_int
+  let to_big_int = Rep.to_big_int
+end
+
+module Word8Rep  = MakeWord (Int8Rep)
+module Word16Rep = MakeWord (Int16Rep)
+module Word32Rep = MakeWord (Int32Rep)
+module Word64Rep = MakeWord (Int64Rep)
+
+module type FloatType =
+sig
+  include Wasm.Float.S
+  val rem : t -> t -> t
+  val pow : t -> t -> t
+  val to_pretty_string : t -> string
+end
+
+module MakeFloat(WasmFloat : Wasm.Float.S) =
+struct
+  include WasmFloat
+  let rem x y = of_float (Float.rem (to_float x) (to_float y))
+  let pow x y = of_float (to_float x ** to_float y)
+  let to_pretty_string w = group_num (WasmFloat.to_string w)
+  let to_string = to_pretty_string
+end
+
+module Float = MakeFloat(Wasm.F64)
+
+
+module type NumType =
+sig
+  type t
+  val signed : bool
+  val zero : t
+  val abs : t -> t
+  val neg : t -> t
+  val add : t -> t -> t
+  val sub : t -> t -> t
+  val mul : t -> t -> t
+  val div : t -> t -> t
+  val rem : t -> t -> t
+  val pow : t -> t -> t
+  val eq : t -> t -> bool
+  val ne : t -> t -> bool
+  val lt : t -> t -> bool
+  val gt : t -> t -> bool
+  val le : t -> t -> bool
+  val ge : t -> t -> bool
+  val compare : t -> t -> int
+  val to_int : t -> int
+  val of_int : int -> t
+  val to_big_int : t -> Big_int.big_int
+  val of_big_int : Big_int.big_int -> t
+  val of_string : string -> t
+  val to_string : t -> string
+  val to_pretty_string : t -> string
+end
+
+module Int : NumType with type t = Big_int.big_int =
+struct
+  open Big_int
+  type t = big_int
+  let signed = true
+  let zero = zero_big_int
+  let sub = sub_big_int
+  let abs = abs_big_int
+  let neg = minus_big_int
+  let add = add_big_int
+  let mul = mult_big_int
+  let div a b =
+    let q, m = quomod_big_int a b in
+    if sign_big_int m * sign_big_int a >= 0 then q
+    else if sign_big_int q = 1 then pred_big_int q else succ_big_int q
+  let rem a b =
+    let q, m = quomod_big_int a b in
+    let sign_m = sign_big_int m in
+    if sign_m * sign_big_int a >= 0 then m
+    else
+    let abs_b = abs_big_int b in
+    if sign_m = 1 then sub_big_int m abs_b else add_big_int m abs_b
+  let eq = eq_big_int
+  let ne x y = not (eq x y)
+  let lt = lt_big_int
+  let gt = gt_big_int
+  let le = le_big_int
+  let ge = ge_big_int
+  let compare = compare_big_int
+  let to_int = int_of_big_int
+  let of_int = big_int_of_int
+  let of_big_int i = i
+  let to_big_int i = i
+  let to_pretty_string i = group_num (string_of_big_int i)
+  let to_string = to_pretty_string
+  let of_string s =
+    big_int_of_string (String.concat "" (String.split_on_char '_' s))
+
+  let max_int = big_int_of_int max_int
+
+  let pow x y =
+    if gt y max_int
+    then raise (Invalid_argument "Int.pow")
+    else power_big_int_positive_int x (int_of_big_int y)
+end
+
+module Nat : NumType with type t = Big_int.big_int =
+struct
+  include Int
+  let signed = false
+  let of_big_int i =
+    if ge i zero then i else raise (Invalid_argument "Nat.of_big_int")
+  let sub x y =
+    let z = Int.sub x y in
+    if ge z zero then z else raise (Invalid_argument "Nat.sub")
+end
+
+(* Extension of NumType with wrapping and bit-wise operations *)
+module type BitNumType =
+sig
+  include NumType
+
+  val not : t -> t
+  val popcnt : t -> t
+  val clz : t -> t
+  val ctz : t -> t
+
+  val and_ : t -> t -> t
+  val or_ : t -> t -> t
+  val xor : t -> t -> t
+  val shl : t -> t -> t
+  val shr : t -> t -> t
+  val rotl : t -> t -> t
+  val rotr : t -> t -> t
+
+  val wrapping_of_big_int : Big_int.big_int -> t
+
+  val wadd : t -> t -> t
+  val wsub : t -> t -> t
+  val wmul : t -> t -> t
+  val wpow : t -> t -> t
+end
+
+module Ranged
+  (Rep : NumType)
+  (WordRep : WordType)
+  : BitNumType =
+struct
+  let to_word i = WordRep.of_big_int (Rep.to_big_int i)
+  let from_word i =
+    let n = WordRep.to_big_int i in
+    let n' =
+      let open Big_int in
+      if Rep.signed && le_big_int (power_int_positive_int 2 (WordRep.bitwidth - 1)) n
+      then sub_big_int n (power_int_positive_int 2 (WordRep.bitwidth))
+      else n
+    in
+    Rep.of_big_int n'
+
+  let check i =
+    if Rep.eq (from_word (to_word i)) i
+    then i
+    else raise (Invalid_argument "value out of bounds")
+
+  include Rep
+  (* bounds-checking operations *)
+  let neg a = let res = Rep.neg a in check res
+  let abs a = let res = Rep.abs a in check res
+  let add a b = let res = Rep.add a b in check res
+  let sub a b = let res = Rep.sub a b in check res
+  let mul a b = let res = Rep.mul a b in check res
+  let div a b = let res = Rep.div a b in check res
+  let pow a b = let res = Rep.pow a b in check res
+  let of_int i = let res = Rep.of_int i in check res
+  let of_big_int i = let res = Rep.of_big_int i in check res
+  let of_string s = let res = Rep.of_string s in check res
+
+  let on_word op a = from_word (op (to_word a))
+  let on_words op a b = from_word (op (to_word a) (to_word b))
+
+  (* bit-wise operations *)
+  let not = on_word WordRep.not
+  let popcnt = on_word WordRep.popcnt
+  let clz = on_word WordRep.clz
+  let ctz = on_word WordRep.ctz
+
+  let and_ = on_words WordRep.and_
+  let or_ = on_words WordRep.or_
+  let xor = on_words WordRep.xor
+  let shl = on_words WordRep.shl
+  let shr = on_words (if Rep.signed then WordRep.shr_s else WordRep.shr_u)
+  let rotl = on_words WordRep.rotl
+  let rotr = on_words WordRep.rotr
+
+
+  (* wrapping operations *)
+  let wrapping_of_big_int i = from_word (WordRep.of_big_int i)
+
+  let wadd = on_words WordRep.add
+  let wsub = on_words WordRep.sub
+  let wmul = on_words WordRep.mul
+  let wpow a b =
+    if Rep.ge b Rep.zero
+    then on_words WordRep.pow a b
+    else raise (Invalid_argument "negative exponent")
+end
+
+module Nat8 = Ranged (Nat) (Word8Rep)
+module Nat16 = Ranged (Nat) (Word16Rep)
+module Nat32 = Ranged (Nat) (Word32Rep)
+module Nat64 = Ranged (Nat) (Word64Rep)
+
+module Int_8 = Ranged (Int) (Word8Rep)
+module Int_16 = Ranged (Int) (Word16Rep)
+module Int_32 = Ranged (Int) (Word32Rep)
+module Int_64 = Ranged (Int) (Word64Rep)
+
+
+
+ + + diff --git a/coverage/mo_values/operator.ml.html b/coverage/mo_values/operator.ml.html new file mode 100644 index 00000000000..88461362ec3 --- /dev/null +++ b/coverage/mo_values/operator.ml.html @@ -0,0 +1,926 @@ + + + + + operator.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+
+
open Value
+open Numerics
+
+module T = Mo_types.Type
+
+(* Operators *)
+
+type unop =
+  | PosOp                                       (* +x *)
+  | NegOp                                       (* -x *)
+  | NotOp                                       (* bitwise negation *)
+
+type binop =
+  | AddOp                                       (* x+y *)
+  | SubOp                                       (* x-y *)
+  | MulOp                                       (* x*y *)
+  | DivOp                                       (* x/y *)
+  | ModOp                                       (* x%y *)
+  | PowOp                                       (* x^y *)
+  | AndOp                                       (* bitwise operators... *)
+  | OrOp
+  | XorOp
+  | ShLOp
+  | ShROp
+  | RotLOp
+  | RotROp
+  | WAddOp                                      (* wrapping operators... *)
+  | WSubOp
+  | WMulOp
+  | WPowOp
+  | CatOp                                       (* concatenation *)
+
+type relop =
+  | EqOp                                        (* x=y *)
+  | NeqOp                                       (* x!=y *)
+  | LtOp                                        (* x<y *)
+  | GtOp                                        (* x>y *)
+  | LeOp                                        (* x<=y *)
+  | GeOp                                        (* x>=y *)
+
+let impossible _ = raise (Invalid_argument "operator called for None")
+
+
+(* Unary operators *)
+
+(* bit-wise unops *)
+let bit_unop (fnat8, fnat16, fnat32, fnat64, fint8, fint16, fint32, fint64) = function
+  | T.Nat8 -> fun v -> Nat8 (fnat8 (as_nat8 v))
+  | T.Nat16 -> fun v -> Nat16 (fnat16 (as_nat16 v))
+  | T.Nat32 -> fun v -> Nat32 (fnat32 (as_nat32 v))
+  | T.Nat64 -> fun v -> Nat64 (fnat64 (as_nat64 v))
+  | T.Int8 -> fun v -> Int8 (fint8 (as_int8 v))
+  | T.Int16 -> fun v -> Int16 (fint16 (as_int16 v))
+  | T.Int32 -> fun v -> Int32 (fint32 (as_int32 v))
+  | T.Int64 -> fun v -> Int64 (fint64 (as_int64 v))
+  | _ -> raise (Invalid_argument "unop")
+
+(* types that support sign operations (+, -)  *)
+let sign_unop fint (fint8, fint16, fint32, fint64) ffloat = function
+  | T.Int -> fun v -> Int (fint (as_int v))
+  | T.Int8 -> fun v -> Int8 (fint8 (as_int8 v))
+  | T.Int16 -> fun v -> Int16 (fint16 (as_int16 v))
+  | T.Int32 -> fun v -> Int32 (fint32 (as_int32 v))
+  | T.Int64 -> fun v -> Int64 (fint64 (as_int64 v))
+  | T.Float -> fun v -> Float (ffloat (as_float v))
+  | _ -> raise (Invalid_argument "unop")
+
+let unop op t =
+  match t with
+  | T.Prim p ->
+    (match op with
+    | PosOp -> Fun.(sign_unop id (id, id, id, id) id p)
+    | NegOp ->
+      sign_unop
+        Int.neg
+        (Int_8.neg, Int_16.neg, Int_32.neg, Int_64.neg)
+        Float.neg
+        p
+    | NotOp -> bit_unop
+      (Nat8.not, Nat16.not, Nat32.not, Nat64.not,
+       Int_8.not, Int_16.not, Int_32.not, Int_64.not)
+      p
+    )
+  | T.Non -> impossible
+  | _ -> raise (Invalid_argument "unop")
+
+
+(* Binary operators *)
+
+let text_binop ftext = function
+  | T.Text -> fun v1 v2 -> Text (ftext (as_text v1) (as_text v2))
+  | _ -> raise (Invalid_argument "binop")
+
+let fixed_binop (fnat8, fnat16, fnat32, fnat64, fint8, fint16, fint32, fint64) = function
+  | T.Nat8 -> fun v1 v2 -> Nat8 (fnat8 (as_nat8 v1) (as_nat8 v2))
+  | T.Nat16 -> fun v1 v2 -> Nat16 (fnat16 (as_nat16 v1) (as_nat16 v2))
+  | T.Nat32 -> fun v1 v2 -> Nat32 (fnat32 (as_nat32 v1) (as_nat32 v2))
+  | T.Nat64 -> fun v1 v2 -> Nat64 (fnat64 (as_nat64 v1) (as_nat64 v2))
+  | T.Int8 -> fun v1 v2 -> Int8 (fint8 (as_int8 v1) (as_int8 v2))
+  | T.Int16 -> fun v1 v2 -> Int16 (fint16 (as_int16 v1) (as_int16 v2))
+  | T.Int32 -> fun v1 v2 -> Int32 (fint32 (as_int32 v1) (as_int32 v2))
+  | T.Int64 -> fun v1 v2 -> Int64 (fint64 (as_int64 v1) (as_int64 v2))
+  | _ -> raise (Invalid_argument "binop")
+
+let num_binop fnat fint ffixed ffloat = function
+  | T.Nat -> fun v1 v2 -> Int (fnat (as_int v1) (as_int v2))
+  | T.Int -> fun v1 v2 -> Int (fint (as_int v1) (as_int v2))
+  | T.Float -> fun v1 v2 -> Float (ffloat (as_float v1) (as_float v2))
+  | t -> fixed_binop ffixed t
+
+let binop op t =
+  match t with
+  | T.Prim p ->
+    (match op with
+    | AddOp -> num_binop Nat.add Int.add (Nat8.add, Nat16.add, Nat32.add, Nat64.add, Int_8.add, Int_16.add, Int_32.add, Int_64.add) Float.add p
+    | SubOp -> num_binop Nat.sub Int.sub (Nat8.sub, Nat16.sub, Nat32.sub, Nat64.sub, Int_8.sub, Int_16.sub, Int_32.sub, Int_64.sub) Float.sub p
+    | MulOp -> num_binop Nat.mul Int.mul (Nat8.mul, Nat16.mul, Nat32.mul, Nat64.mul, Int_8.mul, Int_16.mul, Int_32.mul, Int_64.mul) Float.mul p
+    | DivOp -> num_binop Nat.div Int.div (Nat8.div, Nat16.div, Nat32.div, Nat64.div, Int_8.div, Int_16.div, Int_32.div, Int_64.div) Float.div p
+    | ModOp -> num_binop Nat.rem Int.rem (Nat8.rem, Nat16.rem, Nat32.rem, Nat64.rem, Int_8.rem, Int_16.rem, Int_32.rem, Int_64.rem) Float.rem p
+    | PowOp -> num_binop Nat.pow Int.pow (Nat8.pow, Nat16.pow, Nat32.pow, Nat64.pow, Int_8.pow, Int_16.pow, Int_32.pow, Int_64.pow) Float.pow p
+    | AndOp -> fixed_binop (Nat8.and_, Nat16.and_, Nat32.and_, Nat64.and_, Int_8.and_, Int_16.and_, Int_32.and_, Int_64.and_) p
+    | OrOp  -> fixed_binop (Nat8.or_, Nat16.or_, Nat32.or_, Nat64.or_, Int_8.or_, Int_16.or_, Int_32.or_, Int_64.or_) p
+    | XorOp -> fixed_binop (Nat8.xor, Nat16.xor, Nat32.xor, Nat64.xor, Int_8.xor, Int_16.xor, Int_32.xor, Int_64.xor) p
+    | ShLOp -> fixed_binop (Nat8.shl, Nat16.shl, Nat32.shl, Nat64.shl, Int_8.shl, Int_16.shl, Int_32.shl, Int_64.shl) p
+    | ShROp -> fixed_binop (Nat8.shr, Nat16.shr, Nat32.shr, Nat64.shr, Int_8.shr, Int_16.shr, Int_32.shr, Int_64.shr) p
+    | RotLOp -> fixed_binop (Nat8.rotl, Nat16.rotl, Nat32.rotl, Nat64.rotl, Int_8.rotl, Int_16.rotl, Int_32.rotl, Int_64.rotl) p
+    | RotROp -> fixed_binop (Nat8.rotr, Nat16.rotr, Nat32.rotr, Nat64.rotr, Int_8.rotr, Int_16.rotr, Int_32.rotr, Int_64.rotr) p
+    | WAddOp -> fixed_binop (Nat8.wadd, Nat16.wadd, Nat32.wadd, Nat64.wadd, Int_8.wadd, Int_16.wadd, Int_32.wadd, Int_64.wadd) p
+    | WSubOp -> fixed_binop (Nat8.wsub, Nat16.wsub, Nat32.wsub, Nat64.wsub, Int_8.wsub, Int_16.wsub, Int_32.wsub, Int_64.wsub) p
+    | WMulOp -> fixed_binop (Nat8.wmul, Nat16.wmul, Nat32.wmul, Nat64.wmul, Int_8.wmul, Int_16.wmul, Int_32.wmul, Int_64.wmul) p
+    | WPowOp -> fixed_binop (Nat8.wpow, Nat16.wpow, Nat32.wpow, Nat64.wpow, Int_8.wpow, Int_16.wpow, Int_32.wpow, Int_64.wpow) p
+    | CatOp -> text_binop (^) p
+    )
+  | T.Non -> impossible
+  | _ -> raise (Invalid_argument "binop")
+
+
+(* Relational operators *)
+
+let num_relop fnat fint (fnat8, fnat16, fnat32, fnat64, fint8, fint16, fint32, fint64) ffloat = function
+  | T.Nat -> fun v1 v2 -> Bool (fnat (as_int v1) (as_int v2))
+  | T.Nat8 -> fun v1 v2 -> Bool (fnat8 (as_nat8 v1) (as_nat8 v2))
+  | T.Nat16 -> fun v1 v2 -> Bool (fnat16 (as_nat16 v1) (as_nat16 v2))
+  | T.Nat32 -> fun v1 v2 -> Bool (fnat32 (as_nat32 v1) (as_nat32 v2))
+  | T.Nat64 -> fun v1 v2 -> Bool (fnat64 (as_nat64 v1) (as_nat64 v2))
+  | T.Int -> fun v1 v2 -> Bool (fint (as_int v1) (as_int v2))
+  | T.Int8 -> fun v1 v2 -> Bool (fint8 (as_int8 v1) (as_int8 v2))
+  | T.Int16 -> fun v1 v2 -> Bool (fint16 (as_int16 v1) (as_int16 v2))
+  | T.Int32 -> fun v1 v2 -> Bool (fint32 (as_int32 v1) (as_int32 v2))
+  | T.Int64 -> fun v1 v2 -> Bool (fint64 (as_int64 v1) (as_int64 v2))
+  | T.Float -> fun v1 v2 -> Bool (ffloat (as_float v1) (as_float v2))
+  | _ -> raise (Invalid_argument "relop")
+
+let ord_relop fnat fint fwords ffloat fchar ftext fblob = function
+  | T.Char -> fun v1 v2 -> Bool (fchar (as_char v1) (as_char v2))
+  | T.Text -> fun v1 v2 -> Bool (ftext (as_text v1) (as_text v2))
+  | T.Blob | T.Principal -> fun v1 v2 -> Bool (ftext (as_blob v1) (as_blob v2))
+  | t -> num_relop fnat fint fwords ffloat t
+
+let eq_relop fnat fint fwords ffloat fchar ftext fblob fnull fbool = function
+  | T.Null -> fun v1 v2 -> Bool (fnull (as_null v1) (as_null v2))
+  | T.Bool -> fun v1 v2 -> Bool (fbool (as_bool v1) (as_bool v2))
+  | t -> ord_relop fnat fint fwords ffloat fchar ftext fblob t
+
+let eq_prim =
+  eq_relop Nat.eq  Int.eq (Nat8.eq, Nat16.eq, Nat32.eq, Nat64.eq, Int_8.eq, Int_16.eq, Int_32.eq, Int_64.eq) Float.eq (=) (=) (=) (=) (=)
+
+(* Follows the structure of `shared` in mo_type/type.ml *)
+let structural_equality t =
+  let rec go t =
+    match t with
+    | T.Var _ | T.Pre | T.Non | T.Async _ | T.Mut _ -> assert false
+    | T.Any | T.Typ _ -> fun v1 v2 -> Bool true
+    | T.Prim T.Error
+    | T.Prim T.Region -> assert false
+    | T.Prim p -> eq_prim p
+    | T.Con (c, ts) -> (
+        match Mo_types.Cons.kind c with
+        | T.Abs _ -> assert false
+        | T.Def (_, t) -> go (T.open_ ts t) (* TBR this may fail to terminate *)
+        )
+    | T.Array t ->
+        fun v1 v2 ->
+          let eq_elem = go t in
+          let v1 = as_array v1 in
+          let v2 = as_array v2 in
+          Bool (
+            Array.length v1 == Array.length v2 &&
+            Lib.Array.for_all2 (fun x y -> as_bool (eq_elem x y)) v1 v2
+          )
+    | T.Opt t -> (
+        fun v1 v2 ->
+          match (v1, v2) with
+          | Null, Null -> Bool true
+          | Null, Opt _
+          | Opt _, Null -> Bool false
+          | Opt v1, Opt v2 -> go t v1 v2
+          | _, _ -> assert false )
+    | T.Tup ts ->
+        fun v1 v2 ->
+          let v1 = as_tup v1 in
+          let v2 = as_tup v2 in
+          let rec go_inner ts v1 v2 =
+            match (ts, v1, v2) with
+            | [], [], [] -> true
+            | t :: ts, v1 :: v1s, v2 :: v2s ->
+                as_bool (go t v1 v2) && go_inner ts v1s v2s
+            | _ -> assert false
+          in
+          Bool (go_inner ts v1 v2)
+    | T.Obj (s, fs) -> (
+        match s with
+        | T.Actor ->
+            fun v1 v2 ->
+              (match (v1, v2) with
+               | Blob s1, Blob s2 -> Bool (s1 = s2)
+               | _, _ -> Bool (v1 == v2) (* HACK *))
+        | T.Module | T.Memory -> assert false
+        | T.Object ->
+            fun v1 v2 ->
+              let v1 = as_obj v1 in
+              let v2 = as_obj v2 in
+              Bool
+                (List.for_all
+                   (fun f ->
+                     T.is_typ f.T.typ ||
+                     as_bool
+                       (go f.T.typ (Env.find f.T.lab v1) (Env.find f.T.lab v2)))
+                   fs) )
+    | T.Variant fs ->
+        fun v1 v2 ->
+          let l1, v1 = as_variant v1 in
+          let l2, v2 = as_variant v2 in
+          if l1 <> l2 then Bool false
+          else
+            go (List.find (fun f -> f.T.lab = l1) fs).T.typ v1 v2
+    | T.Func (s, c, tbs, ts1, ts2) ->
+        assert (T.is_shared_sort s);
+        fun v1 v2 -> Bool (v1 == v2)  (* HACK *)
+  in
+  go t
+
+let relop op t =
+  match t with
+  | T.Prim p ->
+    (match op with
+    | EqOp -> eq_prim p
+    | NeqOp -> eq_relop Nat.ne Int.ne (Nat8.ne, Nat16.ne, Nat32.ne, Nat64.ne, Int_8.ne, Int_16.ne, Int_32.ne, Int_64.ne) Float.ne (<>) (<>) (<>) (<>) (<>) p
+    | LtOp -> ord_relop Nat.lt Int.lt (Nat8.lt, Nat16.lt, Nat32.lt, Nat64.lt, Int_8.lt, Int_16.lt, Int_32.lt, Int_64.lt) Float.lt (<) (<) (<) p
+    | GtOp -> ord_relop Nat.gt Int.gt (Nat8.gt, Nat16.gt, Nat32.gt, Nat64.gt, Int_8.gt, Int_16.gt, Int_32.gt, Int_64.gt) Float.gt (>) (>) (>) p
+    | LeOp -> ord_relop Nat.le Int.le (Nat8.le, Nat16.le, Nat32.le, Nat64.le, Int_8.le, Int_16.le, Int_32.le, Int_64.le) Float.le (<=) (<=) (<=) p
+    | GeOp -> ord_relop Nat.ge Int.ge (Nat8.ge, Nat16.ge, Nat32.ge, Nat64.ge, Int_8.ge, Int_16.ge, Int_32.ge, Int_64.ge) Float.ge (>=) (>=) (>=) p
+    )
+  | T.Non -> impossible
+  | t when op = EqOp && T.shared t ->
+    structural_equality t
+  | t when op = NeqOp && T.shared t ->
+    fun v1 v2 -> Bool (not (as_bool (structural_equality t v1 v2)))
+  | _ -> raise (Invalid_argument "relop")
+
+
+let has f op t = try ignore (f op t); true with Invalid_argument _ -> false
+let has_unop op t = has unop op t
+let has_binop op t = has binop op t
+let has_relop op t = has relop op t
+
+let type_unop op t = if t = T.nat then T.int else t
+let type_binop op t = t
+let type_relop op t = t
+
+
+
+ + + diff --git a/coverage/mo_values/prim.ml.html b/coverage/mo_values/prim.ml.html new file mode 100644 index 00000000000..c17bd019c13 --- /dev/null +++ b/coverage/mo_values/prim.ml.html @@ -0,0 +1,1435 @@ + + + + + prim.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+
+
(* Primitives *)
+open Mo_types
+
+open Value
+open Numerics
+
+(* This function raises `Invalid_argument` exception, catch it in the call site
+   to convert to trap *)
+let as_big_int = function
+  | Type.Nat -> fun v -> Nat.to_big_int (as_int v)
+  | Type.Int -> fun v -> Int.to_big_int (as_int v)
+  | Type.Nat8 -> fun v -> Nat8.to_big_int (as_nat8 v)
+  | Type.Nat16 -> fun v -> Nat16.to_big_int (as_nat16 v)
+  | Type.Nat32 -> fun v -> Nat32.to_big_int (as_nat32 v)
+  | Type.Nat64 -> fun v -> Nat64.to_big_int (as_nat64 v)
+  | Type.Int8 -> fun v -> Int_8.to_big_int (as_int8 v)
+  | Type.Int16 -> fun v -> Int_16.to_big_int (as_int16 v)
+  | Type.Int32 -> fun v -> Int_32.to_big_int (as_int32 v)
+  | Type.Int64 -> fun v -> Int_64.to_big_int (as_int64 v)
+  | Type.Char -> fun v -> Big_int.big_int_of_int (as_char v)
+  | t -> raise (Invalid_argument ("Value.as_big_int: " ^ Type.string_of_typ (Type.Prim t)))
+
+(* This function raises `Invalid_argument` exception, catch it in the call site
+   to convert to trap *)
+let of_big_int_trap = function
+  | Type.Nat -> fun i -> Int (Nat.of_big_int i)
+  | Type.Int -> fun i -> Int (Int.of_big_int i)
+  | Type.Nat8 -> fun i -> Nat8 (Nat8.of_big_int i)
+  | Type.Nat16 -> fun i -> Nat16 (Nat16.of_big_int i)
+  | Type.Nat32 -> fun i -> Nat32 (Nat32.of_big_int i)
+  | Type.Nat64 -> fun i -> Nat64 (Nat64.of_big_int i)
+  | Type.Int8 -> fun i -> Int8 (Int_8.of_big_int i)
+  | Type.Int16 -> fun i -> Int16 (Int_16.of_big_int i)
+  | Type.Int32 -> fun i -> Int32 (Int_32.of_big_int i)
+  | Type.Int64 -> fun i -> Int64 (Int_64.of_big_int i)
+  | Type.Char -> fun i ->
+    let i = Big_int.int_of_big_int i in
+    if i < 0xD800 || i >= 0xE000 && i < 0x110000 then Char i else raise (Invalid_argument "character value out of bounds")
+  | t -> raise (Invalid_argument ("Value.of_big_int_trap: " ^ Type.string_of_typ (Type.Prim t)))
+
+(* This function raises `Invalid_argument` exception, catch it in the call site
+   to convert to trap *)
+let of_big_int_wrap = function
+  | Type.Nat8 -> fun i -> Nat8 (Nat8.wrapping_of_big_int i)
+  | Type.Nat16 -> fun i -> Nat16 (Nat16.wrapping_of_big_int i)
+  | Type.Nat32 -> fun i -> Nat32 (Nat32.wrapping_of_big_int i)
+  | Type.Nat64 -> fun i -> Nat64 (Nat64.wrapping_of_big_int i)
+  | Type.Int8 -> fun i -> Int8 (Int_8.wrapping_of_big_int i)
+  | Type.Int16 -> fun i -> Int16 (Int_16.wrapping_of_big_int i)
+  | Type.Int32 -> fun i -> Int32 (Int_32.wrapping_of_big_int i)
+  | Type.Int64 -> fun i -> Int64 (Int_64.wrapping_of_big_int i)
+  | t -> raise (Invalid_argument ("Value.of_big_int_wrap: " ^ Type.string_of_typ (Type.Prim t)))
+
+(*
+Wrapping numeric conversions are all specified uniformly by going through bigint
+*)
+
+type trap = { trap : 'a. string -> 'a  }
+
+(* Trapping conversions (the num_conv_t1_t2 prim used in prelude/prelude.ml) *)
+let num_conv_trap_prim trap t1 t2 =
+  let module T = Type in
+  match t1, t2 with
+  | T.Nat, T.(T.Nat8|Nat16|Nat32|Nat64)
+  | T.Int, T.(Int8|Int16|Int32|Int64)
+  | T.(Nat8|Nat16|Nat32|Nat64), T.Nat
+  | T.(Int8|Int16|Int32|Int64), T.Int
+  | T.Nat8, T.Nat16
+  | T.Nat16, T.Nat32
+  | T.Nat32, T.Nat64
+  | T.Nat64, T.Nat32
+  | T.Nat32, T.Nat16
+  | T.Nat16, T.Nat8
+  | T.Int8, T.Int16
+  | T.Int16, T.Int32
+  | T.Int32, T.Int64
+  | T.Int64, T.Int32
+  | T.Int32, T.Int16
+  | T.Int16, T.Int8
+  | T.Nat32, T.Char
+  -> fun v -> (try of_big_int_trap t2 (as_big_int t1 v)
+               with Invalid_argument msg -> trap.trap msg)
+  | T.Float, T.Int64 -> fun v -> Int64 (Int_64.of_big_int (bigint_of_double (as_float v)))
+  | T.Int64, T.Float -> fun v -> Float (Wasm.F64_convert.convert_i64_s (Big_int.int64_of_big_int (Int_64.to_big_int (as_int64 v))))
+
+  | T.Float, T.Int -> fun v -> Int (Int.of_big_int (bigint_of_double (as_float v)))
+  | T.Int, T.Float -> fun v -> Float (Wasm.F64.of_float (Big_int.float_of_big_int (Int.to_big_int (as_int v))))
+
+  | t1, t2 -> trap.trap T.("Value.num_conv_trap_prim: " ^ string_of_typ (Prim t1) ^ string_of_typ (Prim t2))
+
+(*
+It is the responsibility of prelude/prelude.ml to define num_wrap_t1_t2 only
+for suitable types t1 and t2
+*)
+let num_conv_wrap_prim trap t1 t2 =
+  fun v -> try of_big_int_wrap t2 (as_big_int t1 v)
+           with Invalid_argument msg -> trap.trap msg
+
+let prim trap =
+  let via_float f v = Float.(Float (of_float (f (to_float (as_float v))))) in
+  let via_float2 f v w = Float.(Float (of_float (f (to_float (as_float v)) (to_float (as_float w))))) in
+  let unpack_nat8 v = Nat8.to_int (as_nat8 v) in
+  let float_formatter prec : int -> float -> string =
+    let open Printf in
+    function
+    | 0 -> sprintf "%.*f" prec
+    | 1 -> sprintf "%.*e" prec
+    | 2 -> sprintf "%.*g" prec
+    | 3 -> sprintf "%.*h" prec
+    | _ -> fun _ -> trap.trap "float_formatter: unrecognised mode" in
+  function
+  | "abs" -> fun _ v k -> k (Int (Nat.abs (as_int v)))
+  | "fabs" -> fun _ v k -> k (Float (Float.abs (as_float v)))
+  | "fsqrt" -> fun _ v k -> k (Float (Float.sqrt (as_float v)))
+  | "fceil" -> fun _ v k -> k (Float (Float.ceil (as_float v)))
+  | "ffloor" -> fun _ v k -> k (Float (Float.floor (as_float v)))
+  | "ftrunc" -> fun _ v k -> k (Float (Float.trunc (as_float v)))
+  | "fnearest" -> fun _ v k -> k (Float (Float.nearest (as_float v)))
+  | "fmin" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Float (Float.min (as_float a) (as_float b)))
+     | _ -> assert false)
+  | "fmax" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Float (Float.max (as_float a) (as_float b)))
+     | _ -> assert false)
+  | "fcopysign" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Float (Float.copysign (as_float a) (as_float b)))
+     | _ -> assert false)
+  | "Float->Text" -> fun _ v k -> k (Text (Float.to_string (as_float v)))
+  | "fmtFloat->Text" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [f; prec; mode] ->
+       k (Text (float_formatter (unpack_nat8 prec) (unpack_nat8 mode) Float.(to_float (as_float f))))
+     | _ -> assert false)
+  | "fsin" -> fun _ v k -> k (via_float Stdlib.sin v)
+  | "fcos" -> fun _ v k -> k (via_float Stdlib.cos v)
+  | "ftan" -> fun _ v k -> k (via_float Stdlib.tan v)
+  | "fasin" -> fun _ v k -> k (via_float Stdlib.asin v)
+  | "facos" -> fun _ v k -> k (via_float Stdlib.acos v)
+  | "fatan" -> fun _ v k -> k (via_float Stdlib.atan v)
+  | "fatan2" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [y; x] -> k (via_float2 Stdlib.atan2 y x)
+     | _ -> assert false)
+  | "fexp" -> fun _ v k -> k (via_float Stdlib.exp v)
+  | "flog" -> fun _ v k -> k (via_float Stdlib.log v)
+  (* TODO: refine exotic cases below to catch more errors *)
+  | "popcntInt8" | "popcntInt16" | "popcntInt32" | "popcntInt64"
+  | "popcnt8" | "popcnt16" | "popcnt32" | "popcnt64" ->
+     fun _ v k ->
+     k (match v with
+        | Nat8  w -> Nat8  (Nat8. popcnt w)
+        | Nat16 w -> Nat16 (Nat16.popcnt w)
+        | Nat32 w -> Nat32 (Nat32.popcnt w)
+        | Nat64 w -> Nat64 (Nat64.popcnt w)
+        | Int8  w -> Int8  (Int_8. popcnt w)
+        | Int16 w -> Int16 (Int_16.popcnt w)
+        | Int32 w -> Int32 (Int_32.popcnt w)
+        | Int64 w -> Int64 (Int_64.popcnt w)
+        | _ -> failwith "popcnt")
+  | "clzInt8" | "clzInt16" | "clzInt32" | "clzInt64"
+  | "clz8" | "clz16" | "clz32" | "clz64" ->
+     fun _ v k ->
+     k (match v with
+        | Nat8  w -> Nat8  (Nat8. clz w)
+        | Nat16 w -> Nat16 (Nat16.clz w)
+        | Nat32 w -> Nat32 (Nat32.clz w)
+        | Nat64 w -> Nat64 (Nat64.clz w)
+        | Int8  w -> Int8  (Int_8. clz w)
+        | Int16 w -> Int16 (Int_16.clz w)
+        | Int32 w -> Int32 (Int_32.clz w)
+        | Int64 w -> Int64 (Int_64.clz w)
+        | _ -> failwith "clz")
+  | "ctzInt8" | "ctzInt16" | "ctzInt32" | "ctzInt64"
+  | "ctz8" | "ctz16" | "ctz32" | "ctz64" ->
+     fun _ v k ->
+     k (match v with
+        | Nat8  w -> Nat8  (Nat8. ctz w)
+        | Nat16 w -> Nat16 (Nat16.ctz w)
+        | Nat32 w -> Nat32 (Nat32.ctz w)
+        | Nat64 w -> Nat64 (Nat64.ctz w)
+        | Int8  w -> Int8  (Int_8. ctz w)
+        | Int16 w -> Int16 (Int_16.ctz w)
+        | Int32 w -> Int32 (Int_32.ctz w)
+        | Int64 w -> Int64 (Int_64.ctz w)
+        | _ -> failwith "ctz")
+  | "btstInt8" | "btstInt16" | "btstInt32" | "btstInt64"
+  | "btst8" | "btst16" | "btst32" | "btst64" ->
+     fun _ v k ->
+     let w, a = as_pair v
+     in k (match w with
+           | Nat8  y -> Nat8  Nat8. (and_ y (shl (of_int 1) (as_nat8  a)))
+           | Nat16 y -> Nat16 Nat16.(and_ y (shl (of_int 1) (as_nat16 a)))
+           | Nat32 y -> Nat32 Nat32.(and_ y (shl (of_int 1) (as_nat32 a)))
+           | Nat64 y -> Nat64 Nat64.(and_ y (shl (of_int 1) (as_nat64 a)))
+           | Int8  y -> Int8  Int_8. (and_ y (shl (of_int 1) (as_int8  a)))
+           | Int16 y -> Int16 Int_16.(and_ y (shl (of_int 1) (as_int16 a)))
+           | Int32 y -> Int32 Int_32.(and_ y (shl (of_int 1) (as_int32 a)))
+           | Int64 y -> Int64 Int_64.(and_ y (shl (of_int 1) (as_int64 a)))
+           | _ -> failwith "btst")
+
+  | "lsh_Nat" -> fun _ v k ->
+    (match as_tup v with
+     | [x; shift] -> k (Int Numerics.Int.(mul (as_int x) (pow (of_int 2) (of_big_int (Nat32.to_big_int (as_nat32 shift))))))
+     | _ -> failwith "lsh_Nat")
+  | "rsh_Nat" -> fun _ v k ->
+    (match as_tup v with
+     | [x; shift] -> k (Int Numerics.Int.(div (as_int x) (pow (of_int 2) (of_big_int (Nat32.to_big_int (as_nat32 shift))))))
+     | _ -> failwith "rsh_Nat")
+
+  | "conv_Char_Text" -> fun _ v k -> let str = match as_char v with
+                                          | c when c <= 0o177 -> String.make 1 (Char.chr c)
+                                          | code -> Lib.Utf8.encode [code]
+                               in k (Text str)
+  | "print" -> fun _ v k -> Printf.printf "%s\n%!" (as_text v); k unit
+  | "trap" -> fun _ v k -> trap.trap ("explicit trap: " ^ (as_text v))
+  | "rts_version" -> fun _ v k -> as_unit v; k (Text "0.1")
+  | (  "rts_memory_size"
+     | "rts_heap_size"
+     | "rts_total_allocation"
+     | "rts_reclaimed"
+     | "rts_max_live_size"
+     | "rts_callback_table_count"
+     | "rts_callback_table_size"
+     | "rts_mutator_instructions"
+     | "rts_collector_instructions") ->
+        fun _ v k -> as_unit v; k (Int (Int.of_int 0))
+  | "time" -> fun _ v k -> as_unit v; k (Value.Nat64 (Numerics.Nat64.of_int 42))
+  | "idlHash" -> fun _ v k ->
+    let s = as_text v in
+    k (Nat32 (Nat32.wrapping_of_big_int (Big_int.big_int_of_int32 (Lib.Uint32.to_int32 (Idllib.IdlHash.idl_hash s)))))
+  | "crc32Hash" -> fun _ v k -> let s = as_blob v in
+    let i = Optint.(to_int32 (Checkseum.Crc32.digest_string s 0 (String.length s) zero)) in
+    k (Nat32 (Nat32.wrapping_of_big_int (Big_int.big_int_of_int32 i)))
+  | "array_len" -> fun _ v k ->
+    k (Int (Int.of_int (Array.length (Value.as_array v))))
+  | "blob_size" -> fun _ v k ->
+    k (Int (Nat.of_int (String.length (Value.as_blob v))))
+  | "blob_vals_iter" -> fun _ v k ->
+    let s = String.to_seq (Value.as_blob v) in
+    let valuation b = Nat8 (Nat8.of_int (Char.code b)) in
+    k (Iter (ref (Seq.map valuation s)))
+  | "blob_iter_done" | "text_iter_done" -> fun _ v k ->
+    let i = Value.as_iter v in
+    k (Bool (!i () = Seq.Nil))
+  | "blob_iter_next" | "text_iter_next" -> fun _ v k ->
+    let i = Value.as_iter v in
+    begin match !i () with
+    | Seq.Nil -> assert false
+    | Seq.Cons (v, vs) -> i := vs; k v
+    end
+  | "text_len" -> fun _ v k ->
+    k (Int (Nat.of_int (List.length (Lib.Utf8.decode (Value.as_text v)))))
+  | "text_lowercase" ->
+     fun _ v k ->
+     k (Text (String.lowercase_ascii (Value.as_text v))) (* TODO -- use Unicode here. *)
+  | "text_uppercase" -> fun _ v k ->
+     k (Text (String.uppercase_ascii (Value.as_text v))) (* TODO -- use Unicode here. *)
+  | "text_compare" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Int8 (Int_8.of_int
+                            (let a, b = Value.as_text a, Value.as_text b in
+                             if a = b then 0 else if a < b then -1 else 1)))
+     | _ -> assert false)
+  | "blob_compare" -> fun _ v k ->
+    (match Value.as_tup v with
+     | [a; b] -> k (Int8 (Int_8.of_int
+                            (let a, b = Value.as_blob a, Value.as_blob b in
+                             if a = b then 0 else if a < b then -1 else 1)))
+     | _ -> assert false)
+  | "text_iter" -> fun _ v k ->
+    let s = Lib.Utf8.decode (Value.as_text v) in
+    let i = Seq.map (fun c -> Char c) (List.to_seq s) in
+    k (Iter (ref i))
+  | "Array.init" -> fun _ v k ->
+    (match Value.as_tup v with
+    | [len; x] ->
+      k (Array (Array.init (Int.to_int (as_int len)) (fun _ -> Mut (ref x))))
+    | _ -> assert false
+    )
+  | "Array.tabulate" -> fun c v k ->
+    (match Value.as_tup v with
+    | [len; g] ->
+      let len_nat = Int.to_int (as_int len) in
+      let (_, g') = Value.as_func g in
+      let rec go prefix k i =
+        if i == len_nat
+        then k (Array (Array.of_list (prefix [])))
+        else g' c (Int (Int.of_int i)) (fun x -> go (fun tl -> prefix (x::tl)) k (i + 1))
+      in go (fun xs -> xs) k 0
+    | _ -> assert false
+    )
+  | "blobToArray" -> fun _ v k ->
+    k (Array (Array.of_seq (Seq.map (fun c ->
+      Nat8 (Nat8.of_int (Char.code c))
+    ) (String.to_seq (Value.as_blob v)))))
+  | "blobToArrayMut" -> fun _ v k ->
+    k (Array (Array.of_seq (Seq.map (fun c ->
+      Mut (ref (Nat8 (Nat8.of_int (Char.code c))))
+    ) (String.to_seq (Value.as_blob v)))))
+  | "arrayToBlob" -> fun _ v k ->
+    k (Blob (String.of_seq (Seq.map (fun v ->
+      Char.chr (Nat8.to_int (Value.as_nat8 v))
+    ) (Array.to_seq (Value.as_array v)))))
+  | "arrayMutToBlob" -> fun _ v k ->
+    k (Blob (String.of_seq (Seq.map (fun v ->
+      Char.chr (Nat8.to_int (Value.as_nat8 !(Value.as_mut v)))
+    ) (Array.to_seq (Value.as_array v)))))
+
+  | "cast" -> fun _ v k -> k v
+
+  (* calls never fail in the interpreter *)
+  | "call_perform_status" -> fun _ v k -> k (Nat32 Nat32.zero)
+  | "call_perform_message" -> fun _ v k -> k (Value.Text "")
+
+  | p when Lib.String.chop_prefix "num_conv" p <> None ->
+    begin match String.split_on_char '_' p with
+    | [_;_;s1;s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      fun env v k -> k (num_conv_trap_prim trap p1 p2 v)
+    | _ -> assert false
+    end
+
+  | p when Lib.String.chop_prefix "num_wrap" p <> None ->
+    begin match String.split_on_char '_' p with
+    | [_;_;s1;s2] ->
+      let p1 = Type.prim s1 in
+      let p2 = Type.prim s2 in
+      fun env v k -> k (num_conv_wrap_prim trap p1 p2 v)
+    | _ -> assert false
+    end
+
+  | "char_to_upper" ->
+      fun _ v k ->
+        begin match Uucp.Case.Map.to_upper (Uchar.of_int (as_char v)) with
+        | `Uchars [c] -> k (Char (Uchar.to_int c))
+        | `Uchars _ ->
+            (* RTS implementation of to_upper returns the input for characters
+               that map to multiple characters in uppercase versions, so to be
+               in sync with that we do the same here *)
+            k v
+        | `Self -> k v
+        end
+
+  | "char_to_lower" ->
+      fun _ v k ->
+        begin match Uucp.Case.Map.to_lower (Uchar.of_int (as_char v)) with
+        | `Uchars [c] -> k (Char (Uchar.to_int c))
+        | `Uchars _ -> k v (* same as above, in char_to_upper *)
+        | `Self -> k v
+        end
+
+  | "char_is_whitespace" ->
+      fun _ v k -> k (Bool (Uucp.White.is_white_space (Uchar.of_int (as_char v))))
+
+  | "char_is_lowercase" ->
+      fun _ v k -> k (Bool (Uucp.Case.is_lower (Uchar.of_int (as_char v))))
+
+  | "char_is_uppercase" ->
+      fun _ v k -> k (Bool (Uucp.Case.is_upper (Uchar.of_int (as_char v))))
+
+  | "char_is_alphabetic" ->
+      fun _ v k -> k (Bool (Uucp.Alpha.is_alphabetic (Uchar.of_int (as_char v))))
+
+  | "decodeUtf8" ->
+      fun _ v k ->
+        let s = as_blob v in
+        begin match Lib.Utf8.decode s with
+          | _ -> k (Opt (Text s))
+          | exception Lib.Utf8.Utf8 -> k Null
+        end
+
+  | "encodeUtf8" ->
+      fun _ v k -> k (Blob (as_text v))
+
+  | "is_controller" ->
+      fun _ v k -> k (Bool false)
+
+  | "canister_version" ->
+      fun _ v k -> as_unit v; k (Nat64 (Numerics.Nat64.of_int 42))
+
+  | s -> trap.trap ("Value.prim: " ^ s)
+
+
+
+ + + diff --git a/coverage/mo_values/show.ml.html b/coverage/mo_values/show.ml.html new file mode 100644 index 00000000000..81969545e2d --- /dev/null +++ b/coverage/mo_values/show.ml.html @@ -0,0 +1,386 @@ + + + + + show.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+
+
module T = Mo_types.Type
+
+(* Entry point for type checking: *)
+
+let can_show t =
+  let open T in
+  let seen = ref T.S.empty in
+  let rec go t =
+    S.mem t !seen ||
+    begin
+      seen := S.add t !seen;
+      match normalize t with
+      | Prim (Bool|Nat|Int|Text|Blob|Char|Null|Principal) -> true
+      | Prim (Nat8|Int8)
+      | Prim (Nat16|Int16)
+      | Prim (Nat32|Int32)
+      | Prim (Nat64|Int64) -> true
+      | Prim Float -> true
+      | Tup ts' -> List.for_all go ts'
+      | Opt t' -> go t'
+      | Array t' -> go (as_immut t')
+      | Obj (Object, fs) ->
+        List.for_all (fun f -> go (as_immut f.typ)) fs
+      | Variant cts ->
+        List.for_all (fun f -> go f.typ) cts
+      | Non -> true
+      | Typ _ -> true
+      | _ -> false
+    end
+  in go t
+
+(* Entry point for the interpreter (reference implementation) *)
+
+let needs_parens s = s.[0] = '+' || s.[0] = '-' || s.[0] = '?' || s.[0] = '#'
+let parens s = if needs_parens s then "(" ^ s ^ ")" else s
+let sign b s = (if b then "+" else "") ^ s
+
+let rec show_val t v =
+  let t = T.normalize t in
+  match t, v with
+  | T.(Prim Bool), Value.Bool b -> if b then "true" else "false"
+  | T.(Prim Nat), Value.Int i -> Numerics.Int.to_string i
+  | T.(Prim Nat8), Value.Nat8 i -> Numerics.Nat8.to_string i
+  | T.(Prim Nat16), Value.Nat16 i -> Numerics.Nat16.to_string i
+  | T.(Prim Nat32), Value.Nat32 i -> Numerics.Nat32.to_string i
+  | T.(Prim Nat64), Value.Nat64 i -> Numerics.Nat64.to_string i
+  | T.(Prim Int), Value.Int i -> Numerics.Int.(sign (gt i zero) (to_string i))
+  | T.(Prim Int8), Value.Int8 i -> Numerics.Int_8.(sign (gt i zero) (to_string i))
+  | T.(Prim Int16), Value.Int16 i -> Numerics.Int_16.(sign (gt i zero) (to_string i))
+  | T.(Prim Int32), Value.Int32 i -> Numerics.Int_32.(sign (gt i zero) (to_string i))
+  | T.(Prim Int64), Value.Int64 i -> Numerics.Int_64.(sign (gt i zero) (to_string i))
+  | T.(Prim Float), Value.Float i -> Numerics.Float.to_string i
+  | T.(Prim Text), Value.Text s -> "\"" ^ s ^ "\""
+  | T.(Prim Blob), Value.Blob s -> "\"" ^ Value.Blob.escape s ^ "\""
+  | T.(Prim Char), Value.Char c -> "\'" ^ Lib.Utf8.encode [c] ^ "\'"
+  | T.(Prim Principal), Value.Blob s -> Ic.Url.encode_principal s
+  | T.(Prim Null), Value.Null -> "null"
+  | T.Opt _, Value.Null -> "null"
+  | T.Opt t', Value.Opt v -> "?" ^ parens (show_val t' v)
+  | T.Tup ts', Value.Tup vs ->
+    Printf.sprintf "(%s%s)"
+      (String.concat ", " (List.map2 show_val ts' vs))
+      (if List.length vs = 1 then "," else "")
+  | T.Array (T.Mut t'), Value.Array a ->
+    if a = [||] then "[var]" else
+    Printf.sprintf "[var %s]"
+      (String.concat ", " (List.map (fun v -> show_val t' !(Value.as_mut v)) (Array.to_list a)))
+  | T.Array t', Value.Array a ->
+    Printf.sprintf "[%s]"
+      (String.concat ", " (List.map (show_val t') (Array.to_list a)))
+  | T.Obj (_, fts), Value.Obj fs ->
+    Printf.sprintf "{%s}"
+      (String.concat "; "
+         (List.filter_map (fun ft ->
+            if T.is_typ ft.T.typ then None else
+            Some (show_field fs ft)) fts))
+  | T.Variant fs, Value.Variant (l, v) ->
+    begin match List.find_opt (fun {T.lab = l'; _} -> l = l') fs with
+    | Some {T.typ = T.Tup []; _} -> Printf.sprintf "#%s" l
+    | Some {T.typ = T.Tup _ as t'; _} -> Printf.sprintf "#%s%s" l (show_val t' v)
+    | Some {T.typ = t'; _} -> Printf.sprintf "#%s(%s)" l (show_val t' v)
+    | _ -> assert false
+    end
+  | _ ->
+    Format.eprintf "@[show_val: %a : %a@.@]"
+      (Value.pp_val 2) (t, v)
+      T.pp_typ t;
+    assert false
+
+and show_field fs ft =
+  let v = Value.Env.find ft.T.lab fs in
+  let m, t', v' =
+    match ft.T.typ with
+    | T.Mut t' -> "var ", t', !(Value.as_mut  v)
+    | t' -> "", t', v
+  in
+  (* With types:
+  Printf.sprintf "%s%s : %s = %s" m ft.T.name (T.string_of_typ t') (show_val t' v')
+  *)
+  Printf.sprintf "%s = %s" ft.T.lab (show_val t' v')
+
+
+
+ + + diff --git a/coverage/mo_values/value.ml.html b/coverage/mo_values/value.ml.html new file mode 100644 index 00000000000..82c69754253 --- /dev/null +++ b/coverage/mo_values/value.ml.html @@ -0,0 +1,997 @@ + + + + + value.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+
+
open Numerics
+module T = Mo_types.Type
+
+(* Environments *)
+
+module Env = Env.Make(String)
+
+(* Blobs *)
+
+module Blob = struct
+  let escape b =
+    String.concat "" (
+      List.of_seq (
+        Seq.map (fun c ->
+          "\\" ^ Lib.Hex.hex_of_char c
+        ) (String.to_seq b)
+      )
+    )
+  let rand32() = String.init 32 (fun _ -> Char.chr (Random.int 256))
+end
+
+(* Types *)
+
+type unicode = int
+
+type actor_id = string
+
+type context = value
+
+and func =
+  context -> value -> value cont -> unit
+
+and comp =
+  value cont -> value cont -> unit
+
+and value =
+  | Null
+  | Bool of bool
+  | Int of Int.t
+  | Int8 of Int_8.t
+  | Int16 of Int_16.t
+  | Int32 of Int_32.t
+  | Int64 of Int_64.t
+  | Nat8 of Nat8.t
+  | Nat16 of Nat16.t
+  | Nat32 of Nat32.t
+  | Nat64 of Nat64.t
+  | Float of Float.t
+  | Char of unicode
+  | Text of string
+  | Blob of string
+  | Tup of value list
+  | Opt of value
+  | Variant of string * value
+  | Array of value array
+  | Obj of value Env.t
+  | Func of Call_conv.t * func
+  | Async of async
+  | Comp of comp
+  | Mut of value ref
+  | Iter of value Seq.t ref (* internal to {b.vals(), t.chars()} iterator *)
+
+and res = Ok of value | Error of value
+and async = {result : res Lib.Promise.t ; mutable waiters : (value cont * value cont) list}
+
+and def = value Lib.Promise.t
+and 'a cont = 'a -> unit
+
+
+(* Shorthands *)
+
+let unit = Tup []
+
+let local_func n m f = Func (Call_conv.local_cc n m, f)
+let message_func s n f = Func (Call_conv.message_cc s n, f)
+let async_func s n m f = Func (Call_conv.async_cc s n m, f)
+let replies_func s n m f = Func (Call_conv.replies_cc s n m, f)
+
+
+(* Projections *)
+
+let invalid s = raise (Invalid_argument ("Value." ^ s))
+
+let as_null = function Null -> () | _ -> invalid "as_null"
+let as_bool = function Bool b -> b | _ -> invalid "as_bool"
+let as_int = function Int n -> n | _ -> invalid "as_int"
+let as_int8 = function Int8 w -> w | _ -> invalid "as_int8"
+let as_int16 = function Int16 w -> w | _ -> invalid "as_int16"
+let as_int32 = function Int32 w -> w | _ -> invalid "as_int32"
+let as_int64 = function Int64 w -> w | _ -> invalid "as_int64"
+let as_nat8 = function Nat8 w -> w | _ -> invalid "as_nat8"
+let as_nat16 = function Nat16 w -> w | _ -> invalid "as_nat16"
+let as_nat32 = function Nat32 w -> w | _ -> invalid "as_nat32"
+let as_nat64 = function Nat64 w -> w | _ -> invalid "as_nat64"
+let as_float = function Float f -> f | _ -> invalid "as_float"
+let as_char = function Char c -> c | _ -> invalid "as_char"
+let as_text = function Text s -> s | _ -> invalid "as_text"
+let as_blob = function Blob b -> b | _ -> invalid "as_blob"
+let as_iter = function Iter i -> i | _ -> invalid "as_iter"
+let as_array = function Array a -> a | _ -> invalid "as_array"
+let as_opt = function Opt v -> v | _ -> invalid "as_opt"
+let as_variant = function Variant (i, v) -> i, v | _ -> invalid "as_variant"
+let as_tup = function Tup vs -> vs | _ -> invalid "as_tup"
+let as_unit = function Tup [] -> () | _ -> invalid "as_unit"
+let as_pair = function Tup [v1; v2] -> v1, v2 | _ -> invalid "as_pair"
+let as_obj = function Obj ve -> ve | _ -> invalid "as_obj"
+let as_func = function Func (cc, f) -> cc, f | _ -> invalid "as_func"
+let as_async = function Async a -> a | _ -> invalid "as_async"
+let as_comp = function Comp c -> c | _ -> invalid "as_comp"
+let as_mut = function Mut r -> r | _ -> invalid "as_mut"
+
+
+(* Ordering *)
+
+let generic_compare = compare
+
+let rec compare x1 x2 =
+  if x1 == x2 then 0 else
+  match x1, x2 with
+  | Int n1, Int n2 -> Int.compare n1 n2
+  | Int8 n1, Int8 n2 -> Int_8.compare n1 n2
+  | Int16 n1, Int16 n2 -> Int_16.compare n1 n2
+  | Int32 n1, Int32 n2 -> Int_32.compare n1 n2
+  | Int64 n1, Int64 n2 -> Int_64.compare n1 n2
+  | Nat8 n1, Nat8 n2 -> Nat8.compare n1 n2
+  | Nat16 n1, Nat16 n2 -> Nat16.compare n1 n2
+  | Nat32 n1, Nat32 n2 -> Nat32.compare n1 n2
+  | Nat64 n1, Nat64 n2 -> Nat64.compare n1 n2
+  | Opt v1, Opt v2 -> compare v1 v2
+  | Tup vs1, Tup vs2 -> Lib.List.compare compare vs1 vs2
+  | Array a1, Array a2 -> Lib.Array.compare compare a1 a2
+  | Obj fs1, Obj fs2 -> Env.compare compare fs1 fs2
+  | Variant (l1, v1), Variant (l2, v2) ->
+    (match String.compare l1 l2 with
+    | 0 -> compare v1 v2
+    | i -> i
+    )
+  | Mut r1, Mut r2 -> compare !r1 !r2
+  | Async _, Async _ -> raise (Invalid_argument "Value.compare")
+  | Comp _, Comp _ -> raise (Invalid_argument "Value.compare")
+  | _ -> generic_compare x1 x2
+
+let equal x1 x2 = compare x1 x2 = 0
+
+(* (Pseudo)-Identities (for caller and self) *)
+
+let next_id = ref 0
+
+let fresh_id() =
+  let id = Printf.sprintf "ID:%i" (!next_id) in
+  next_id := !next_id + 1;
+  id
+
+let top_id = fresh_id ()
+
+(* Pretty Printing *)
+
+let add_unicode buf = function
+  | 0x09 -> Buffer.add_string buf "\\t"
+  | 0x0a -> Buffer.add_string buf "\\n"
+  | 0x22 -> Buffer.add_string buf "\\\""
+  | 0x27 -> Buffer.add_string buf "\\\'"
+  | 0x5c -> Buffer.add_string buf "\\\\"
+  | c when 0x20 <= c && c < 0x7f -> Buffer.add_char buf (Char.chr c)
+  | c -> Printf.bprintf buf "\\u{%02x}" c
+
+let string_of_string lsep s rsep =
+  let buf = Buffer.create 256 in
+  Buffer.add_char buf lsep;
+  List.iter (add_unicode buf) s;
+  Buffer.add_char buf rsep;
+  Buffer.contents buf
+
+let pos_sign b = if b then "+" else ""
+
+open Format
+
+let pr = pp_print_string
+
+let comma ppf () = fprintf ppf ",@ "
+
+let semi ppf () = fprintf ppf ";@ "
+
+let rec pp_val_nullary d ppf (t, v : T.typ * value) =
+  match T.normalize t with
+  | T.Any -> pr ppf "<any>"
+  | t ->
+    match v with
+    | Null -> pr ppf "null"
+    | Bool b -> pr ppf (if b then "true" else "false")
+    | Int n when Int.(ge n zero) -> pr ppf (Int.to_pretty_string n)
+    | Int8 n when Int_8.(n = zero) -> pr ppf (Int_8.to_pretty_string n)
+    | Int16 n when Int_16.(n = zero) -> pr ppf (Int_16.to_pretty_string n)
+    | Int32 n when Int_32.(n = zero) -> pr ppf (Int_32.to_pretty_string n)
+    | Int64 n when Int_64.(n = zero) -> pr ppf (Int_64.to_pretty_string n)
+    | Nat8 n -> pr ppf (Nat8.to_pretty_string n)
+    | Nat16 n -> pr ppf (Nat16.to_pretty_string n)
+    | Nat32 n -> pr ppf (Nat32.to_pretty_string n)
+    | Nat64 n -> pr ppf (Nat64.to_pretty_string n)
+    | Float f -> pr ppf (Float.to_pretty_string f)
+    | Char c ->  pr ppf (string_of_string '\'' [c] '\'')
+    | Text t -> pr ppf (string_of_string '\"' (Lib.Utf8.decode t) '\"')
+    | Blob b ->
+      (match t with
+         T.Obj (T.Actor, _) ->
+         pr ppf (string_of_string '`' (Lib.Utf8.decode (Ic.Url.encode_principal b)) '`')
+       | _ -> pr ppf ("\"" ^ Blob.escape b ^ "\""))
+    | Tup vs ->
+      let list = match t with
+      | T.Tup ts -> List.combine ts vs
+      | _ -> List.map (fun v -> (T.Non, v)) vs in
+      fprintf ppf "@[<1>(%a%s)@]"
+        (pp_print_list ~pp_sep:comma (pp_val d)) list
+        (if List.length vs = 1 then "," else "")
+    | Obj ve ->
+      if d = 0 then pr ppf "{...}" else
+      let sort, lookup = match t with
+        | T.Obj (s, fs) ->
+          T.string_of_obj_sort s,
+          fun lab -> T.lookup_val_field_opt lab fs
+        | _ ->
+          "", fun lab -> Some T.Non
+      in
+      fprintf ppf "@[<hv 2>%a{@;<0 0>%a@;<0 -2>}@]"
+        pr sort
+        (pp_print_list ~pp_sep:semi (pp_field d)) (List.filter_map (fun (lab, v) ->
+            match lookup lab with
+            | Some t -> Some (lab, t, v)
+            | None -> None)
+          (Env.bindings ve))
+    | Array vs ->
+      let t' = match t with T.Array t' -> t' | _ -> T.Non in
+      fprintf ppf "@[<1>[%a%a]@]"
+        pr (match t' with T.Mut t -> "var " | _ -> "")
+        (pp_print_list ~pp_sep:comma (pp_val d)) (List.map (fun v -> (t', v)) (Array.to_list vs))
+
+    | Func (_, _) -> pr ppf "<func>"
+    | Comp _ -> pr ppf "<async*>"
+    | v ->
+      fprintf ppf "@[<1>(%a)@]" (pp_val d) (t, v)
+
+and pp_field d ppf (lab, t, v) =
+  fprintf ppf "@[<2>%s =@ %a@]" lab (pp_val d) (t, v)
+
+and pp_val d ppf (t, v) =
+  match T.normalize t with
+  | T.Any -> pr ppf "<any>"
+  | t ->
+    match v with
+    | Int i -> pr ppf (Int.to_pretty_string i)
+    | Int8 i -> pr ppf (Int_8.(pos_sign (gt i zero) ^ to_pretty_string i))
+    | Int16 i -> pr ppf (Int_16.(pos_sign (gt i zero) ^ to_pretty_string i))
+    | Int32 i -> pr ppf (Int_32.(pos_sign (gt i zero) ^ to_pretty_string i))
+    | Int64 i -> pr ppf (Int_64.(pos_sign (gt i zero) ^ to_pretty_string i))
+    | Opt v ->
+      let t' = match t with T.Opt t' -> t' | _ -> T.Non in
+      fprintf ppf "@[<1>?%a@]" (pp_val_nullary d) (t', v)
+    | Variant (l, Tup []) -> fprintf ppf "#%s" l
+    | Variant (l, v) ->
+      let t' = match t with T.Variant fs -> T.lookup_val_field l fs | _ -> T.Non in
+      (match v with
+      | Tup vs -> fprintf ppf "@[#%s@;<0 1>%a@]" l (pp_val d) (t', Tup vs)
+      | _ -> fprintf ppf "@[#%s@;<0 1>(%a)@]" l (pp_val d) (t', v))
+    | Async {result; waiters = []} ->
+      let t' = match t with T.Async (_, _, t') -> t' | _ -> T.Non in
+      fprintf ppf "@[<2>async@ %a@]" (pp_res d) (t', result)
+    | Async {result; waiters} ->
+      let t' = match t with T.Async (_, _, t') -> t' | _ -> T.Non in
+      fprintf ppf "@[<2>async[%d]@ %a@]"
+        (List.length waiters) (pp_res d) (t', result)
+    | Mut r ->
+      let t' = match t with T.Mut t' -> t' | _ -> T.Non in
+      pp_val d ppf (t', !r)
+    | v -> pp_val_nullary d ppf (t, v)
+
+and pp_res d ppf (t, result) =
+  match Lib.Promise.value_opt result with
+  | Some (Error v) -> fprintf ppf "@[Error@ %a@]" (pp_val_nullary d) (t, v)
+  | Some (Ok v) -> pp_val_nullary d ppf (t, v)
+  | None -> pr ppf "_"
+
+and pp_def d ppf (t, def) =
+  match Lib.Promise.value_opt def with
+  | Some v -> pp_val d ppf (t, v)
+  | None -> pr ppf "_"
+
+and string_of_val d t v : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_val d ppf) (t, v)
+
+let string_of_def d t def : string =
+  Lib.Format.with_str_formatter (fun ppf ->
+    pp_def d ppf) (t, def)
+
+
+
+ + + diff --git a/coverage/nix-support/hydra-build-products b/coverage/nix-support/hydra-build-products new file mode 100644 index 00000000000..c26ca3b51ba --- /dev/null +++ b/coverage/nix-support/hydra-build-products @@ -0,0 +1 @@ +report coverage /nix/store/22j64v2n5qp3k6z279bmkm448yxm0b51-test-coverage index.html diff --git a/coverage/pipeline/pipeline.ml.html b/coverage/pipeline/pipeline.ml.html new file mode 100644 index 00000000000..502baa66bfb --- /dev/null +++ b/coverage/pipeline/pipeline.ml.html @@ -0,0 +1,2394 @@ + + + + + pipeline.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+
+
open Mo_def
+open Mo_frontend
+open Mo_types
+open Mo_values
+open Mo_interpreter
+open Ir_def
+open Ir_interpreter
+open Ir_passes
+open Mo_config
+
+open Printf
+
+module ResolveImport = Resolve_import
+
+type stat_env = Scope.t
+type dyn_env = Interpret.scope
+type env = stat_env * dyn_env
+
+
+(* Diagnostics *)
+
+let phase heading name =
+  if !Flags.verbose then printf "-- %s %s:\n%!" heading name
+
+let print_ce =
+  Type.ConSet.iter (fun c ->
+    let eq, params, typ = Type.pps_of_kind (Cons.kind c) in
+    Format.printf "@[<hv 2>type %s%a %s@ %a@]@."
+      (Type.string_of_con c)
+      params ()
+      eq
+      typ ()
+  )
+
+let print_stat_ve =
+  Type.Env.iter (fun x (t, _, _) ->
+    let t' = Type.as_immut t in
+    Format.printf "@[<hv 2>%s %s :@ %a@]@."
+      (if t == t' then "let" else "var") x
+      Type.pp_typ t'
+  )
+
+let print_dyn_ve scope =
+  Value.Env.iter (fun x d ->
+    let open Type in
+    let (t, _, _) = Env.find x scope.Scope.val_env in
+    let t' = as_immut t in
+    match normalize t' with
+    | Obj (Module, fs) ->
+      Format.printf "@[<hv 2>%s %s : module {...}@]@."
+        (if t == t' then "let" else "var") x
+    | _ ->
+      Format.printf "@[<hv 2>%s %s :@ %a =@ %a@]@."
+        (if t == t' then "let" else "var") x
+        Type.pp_typ t'
+        (Value.pp_def !Flags.print_depth) (t', d)
+  )
+
+let print_scope senv scope dve =
+  print_ce scope.Scope.con_env;
+  print_dyn_ve senv dve
+
+let print_val _senv t v =
+  Format.printf "@[<hv 2>%a :@ %a@]@."
+    (Value.pp_val !Flags.print_depth) (t, v)
+    Type.pp_typ t
+
+
+(* Dumping *)
+
+let dump_prog flag prog =
+    if !flag then
+      Wasm.Sexpr.print 80 (Arrange.prog prog)
+
+let dump_ir flag prog_ir =
+    if !flag then
+      Wasm.Sexpr.print 80 (Arrange_ir.prog prog_ir)
+
+
+(* Parsing *)
+
+type rel_path = string
+
+type parse_result = (Syntax.prog * rel_path) Diag.result
+
+type no_region_parse_fn = string -> parse_result
+type parse_fn = Source.region -> no_region_parse_fn
+
+let generic_parse_with mode lexer parser name : _ Diag.result =
+  phase "Parsing" name;
+  let open Diag.Syntax in
+  lexer.Lexing.lex_curr_p <-
+    {lexer.Lexing.lex_curr_p with Lexing.pos_fname = name};
+  (* a back door to enable the `prim` syntax, for our test suite *)
+  let tokenizer, triv_table = Lexer.tokenizer mode lexer in
+  let* mk_syntax =
+    try
+      Parser_lib.triv_table := triv_table;
+      Parsing.parse mode (!Flags.error_detail) (parser lexer.Lexing.lex_curr_p) tokenizer lexer
+    with Lexer.Error (at, msg) -> Diag.error at"M0002" "syntax" msg
+  in
+  let phrase = mk_syntax name in
+  Diag.return phrase
+
+let parse_with mode lexer parser name : Syntax.prog Diag.result =
+  let open Diag.Syntax in
+  let* prog = generic_parse_with mode lexer parser name in
+  dump_prog Flags.dump_parse prog;
+  Diag.return prog
+
+let parse_string' mode name s : parse_result =
+  let open Diag.Syntax in
+  let lexer = Lexing.from_string s in
+  let parse = Parser.Incremental.parse_prog in
+  let* prog = parse_with mode lexer parse name in
+  Diag.return (prog, name)
+
+let parse_string = parse_string' Lexer.mode
+
+let parse_file' mode at filename : (Syntax.prog * rel_path) Diag.result =
+  let ic, messages = Lib.FilePath.open_in filename in
+  Diag.finally (fun () -> close_in ic) (
+    let open Diag.Syntax in
+    let* _ =
+      Diag.traverse_
+        (Diag.warn at "M0005" "import")
+        messages in
+    let lexer = Lexing.from_channel ic in
+    let parse = Parser.Incremental.parse_prog in
+    let* prog = parse_with mode lexer parse filename in
+    Diag.return (prog, filename)
+  )
+
+let parse_file = parse_file' Lexer.mode
+let parse_verification_file = parse_file' Lexer.mode_verification
+
+(* Import file name resolution *)
+
+type resolve_result = (Syntax.prog * ResolveImport.resolved_imports) Diag.result
+
+let resolve_flags () =
+  ResolveImport.{
+    package_urls = !Flags.package_urls;
+    actor_aliases = !Flags.actor_aliases;
+    actor_idl_path = !Flags.actor_idl_path
+  }
+
+let resolve_prog (prog, base) : resolve_result =
+  Diag.map
+    (fun libs -> (prog, libs))
+    (ResolveImport.resolve (resolve_flags ()) prog base)
+
+let resolve_progs =
+  Diag.traverse resolve_prog
+
+
+(* Printing dependency information *)
+
+let print_deps (file : string) : unit =
+  let (prog, _) =  Diag.run (parse_file Source.no_region file) in
+  let imports = Diag.run (ResolveImport.collect_imports prog file) in
+  List.iter (fun (url, path) ->
+      match path with
+      | None -> Printf.printf "%s\n" url
+      | Some path -> Printf.printf "%s %s\n" url path
+    ) imports
+
+(* Checking *)
+
+let async_cap_of_prog prog =
+  let open Syntax in
+  let open Source in
+  match (CompUnit.comp_unit_of_prog false prog).it.body.it with
+  | ActorClassU _ -> Async_cap.NullCap
+  | ActorU _ -> Async_cap.initial_cap()
+  | ModuleU _ -> assert false
+  | ProgU _ ->
+     if !Flags.compiled then
+       Async_cap.NullCap
+     else
+       Async_cap.initial_cap()
+
+let infer_prog pkg_opt senv async_cap prog : (Type.typ * Scope.scope) Diag.result =
+  let filename = prog.Source.note.Syntax.filename in
+  phase "Checking" filename;
+  let r = Typing.infer_prog pkg_opt senv async_cap prog in
+  if !Flags.trace && !Flags.verbose then begin
+    match r with
+    | Ok ((_, scope), _) ->
+      print_ce scope.Scope.con_env;
+      print_stat_ve scope.Scope.val_env;
+      dump_prog Flags.dump_tc prog;
+    | Error _ -> ()
+  end;
+  phase "Definedness" filename;
+  let open Diag.Syntax in
+  let* t_sscope = r in
+  let* () = Definedness.check_prog prog in
+  Diag.return t_sscope
+
+let rec check_progs senv progs : Scope.scope Diag.result =
+  match progs with
+  | [] -> Diag.return senv
+  | prog::progs' ->
+    let open Diag.Syntax in
+    let async_cap = async_cap_of_prog prog in
+    let* _t, sscope = infer_prog senv None async_cap prog in
+    let senv' = Scope.adjoin senv sscope in
+    check_progs senv' progs'
+
+let check_lib senv pkg_opt lib : Scope.scope Diag.result =
+  let filename = lib.Source.note.Syntax.filename in
+  phase "Checking" (Filename.basename filename);
+  let open Diag.Syntax in
+  let* sscope = Typing.check_lib senv pkg_opt lib in
+  phase "Definedness" (Filename.basename filename);
+  let* () = Definedness.check_lib lib in
+  Diag.return sscope
+
+let lib_of_prog f prog : Syntax.lib  =
+  let lib = CompUnit.comp_unit_of_prog true prog in
+  { lib with Source.note = { lib.Source.note with Syntax.filename = f } }
+
+
+(* Prelude and internals *)
+
+let builtin_error phase what (msgs : Diag.messages) =
+  Printf.eprintf "%s %s failed\n" phase what;
+  Diag.print_messages msgs;
+  exit 1
+
+let check_builtin what src senv0 : Syntax.prog * stat_env =
+  let lexer = Lexing.from_string src in
+  let parse = Parser.Incremental.parse_prog in
+  match parse_with Lexer.mode_priv lexer parse what with
+  | Error es -> builtin_error "parsing" what es
+  | Ok (prog, _ws) ->
+    match infer_prog senv0 None Async_cap.NullCap prog with
+    | Error es -> builtin_error "checking" what es
+    | Ok ((_t, sscope), _ws) ->
+      let senv1 = Scope.adjoin senv0 sscope in
+      prog, senv1
+
+let prelude, initial_stat_env0 =
+  check_builtin "prelude" Prelude.prelude Typing.initial_scope
+let internals, initial_stat_env =
+  check_builtin "internals" Prelude.internals initial_stat_env0
+
+(* Stable compatibility *)
+
+
+let parse_stab_sig s name  =
+  let open Diag.Syntax in
+  let mode = Lexer.{privileged = false; verification = false} in
+  let lexer = Lexing.from_string s in
+  let parse = Parser.Incremental.parse_stab_sig in
+  let* sig_ = generic_parse_with mode lexer parse name in
+  Diag.return sig_
+
+let parse_stab_sig_from_file filename : Syntax.stab_sig Diag.result =
+  let ic = Stdlib.open_in filename in
+  Diag.finally (fun () -> close_in ic) (
+    let open Diag.Syntax in
+    let mode = Lexer.{privileged = false; verification = false} in
+    let lexer = Lexing.from_channel ic in
+    let parse = Parser.Incremental.parse_stab_sig in
+    let* sig_ = generic_parse_with mode lexer parse filename in
+    Diag.return sig_
+  )
+
+let stable_compatible pre post : unit Diag.result =
+  let open Diag.Syntax in
+  let* p1 = parse_stab_sig_from_file pre in
+  let* p2 = parse_stab_sig_from_file post in
+  let* s1 = Typing.check_stab_sig initial_stat_env0 p1 in
+  let* s2 = Typing.check_stab_sig initial_stat_env0 p2 in
+  Stability.match_stab_sig s1 s2
+
+let validate_stab_sig s : unit Diag.result =
+  let open Diag.Syntax in
+  let name = "stable-types" in
+  let* p1 = parse_stab_sig s name in
+  let* p2 = parse_stab_sig s name in
+  let* s1 = Typing.check_stab_sig initial_stat_env0 p1 in
+  let* s2 = Typing.check_stab_sig initial_stat_env0 p2 in
+  Stability.match_stab_sig s1 s2
+
+(* The prim module *)
+
+let prim_name = "prim"
+
+let prim_error phase (msgs : Diag.messages) =
+  Printf.eprintf "%s prim failed\n" phase;
+  Diag.print_messages msgs;
+  exit 1
+
+let check_prim () : Syntax.lib * stat_env =
+  let lexer = Lexing.from_string (Prelude.prim_module ~timers:!Flags.global_timer) in
+  let parse = Parser.Incremental.parse_prog in
+
+  match parse_with Lexer.mode_priv lexer parse prim_name with
+  | Error es -> prim_error "parsing" es
+  | Ok (prog, _ws) ->
+    let open Syntax in
+    let open Source in
+    let senv0 = initial_stat_env in
+    let fs = List.map (fun d -> {vis = Public None @@ no_region; dec = d; stab = None} @@ d.at) prog.it in
+    let body = {it = ModuleU (None, fs); at = no_region; note = empty_typ_note} in
+    let lib = {
+      it = { imports = []; body };
+      at = no_region;
+      note = { filename = "@prim"; trivia = Trivia.empty_triv_table }
+    } in
+    match check_lib senv0 None lib with
+    | Error es -> prim_error "checking" es
+    | Ok (sscope, _ws) ->
+      let senv1 = Scope.adjoin senv0 sscope in
+      lib, senv1
+
+
+(* Imported file loading *)
+
+(*
+Loading a file (or string) implies lexing, parsing, resolving imports to
+libraries, and typechecking.
+The resulting prog is typechecked.
+The Typing.scope field in load_result is the accumulated scope.
+When we load a declaration (i.e from the REPL), we also care about the type
+and the newly added scopes, so these are returned separately.
+*)
+
+
+type load_result =
+  (Syntax.lib list * Syntax.prog list * Scope.scope) Diag.result
+
+type load_decl_result =
+  (Syntax.lib list * Syntax.prog * Scope.scope * Type.typ * Scope.scope) Diag.result
+
+let chase_imports parsefn senv0 imports : (Syntax.lib list * Scope.scope) Diag.result =
+  (*
+  This function loads and type-checkes the files given in `imports`,
+  including any further dependencies.
+
+  The resulting `Syntax.libraries` list is in dependency order. To achieve this,
+  the function go below does an depth-first traversal of the import DAG.
+  * To detected illegal cycles, pending is a set of filenames that we started
+    processing, but did not add yet.
+  * To avoid duplicates, i.e. load each file at most once, we check the
+    senv.
+  * We accumulate the resulting libraries in reverse order, for O(1) appending.
+  *)
+
+  let open ResolveImport.S in
+  let pending = ref empty in
+  let senv = ref senv0 in
+  let libs = ref [] in
+
+  let rec go pkg_opt ri = match ri.Source.it with
+    | Syntax.PrimPath ->
+      (* a bit of a hack, lib_env should key on resolved_import *)
+      if Type.Env.mem "@prim" !senv.Scope.lib_env then
+        Diag.return ()
+      else
+        let lib, sscope = check_prim () in
+        libs := lib :: !libs; (* NB: Conceptually an append *)
+        senv := Scope.adjoin !senv sscope;
+        Diag.return ()
+    | Syntax.Unresolved -> assert false
+    | Syntax.(LibPath {path = f; package = lib_pkg_opt}) ->
+      if Type.Env.mem f !senv.Scope.lib_env then
+        Diag.return ()
+      else if mem ri.Source.it !pending then
+        Diag.error
+          ri.Source.at
+          "M0003"
+          "import"
+          (Printf.sprintf "file %s must not depend on itself" f)
+      else begin
+        pending := add ri.Source.it !pending;
+        let open Diag.Syntax in
+        let* prog, base = parsefn ri.Source.at f in
+        let* () = Static.prog prog in
+        let* more_imports = ResolveImport.resolve (resolve_flags ()) prog base in
+        let cur_pkg_opt = if lib_pkg_opt <> None then lib_pkg_opt else pkg_opt in
+        let* () = go_set cur_pkg_opt more_imports in
+        let lib = lib_of_prog f prog in
+        let* sscope = check_lib !senv cur_pkg_opt lib in
+        libs := lib :: !libs; (* NB: Conceptually an append *)
+        senv := Scope.adjoin !senv sscope;
+        pending := remove ri.Source.it !pending;
+        Diag.return ()
+      end
+    | Syntax.IDLPath (f, _) ->
+      let open Diag.Syntax in
+      let* prog, idl_scope, actor_opt = Idllib.Pipeline.check_file f in
+      if actor_opt = None then
+        Diag.error
+          ri.Source.at
+          "M0004"
+          "import"
+          (Printf.sprintf "file %s does not define a service" f)
+      else
+        match Mo_idl.Idl_to_mo.check_prog idl_scope actor_opt with
+        | exception Idllib.Exception.UnsupportedCandidFeature error_message ->
+          Stdlib.Error [
+            Diag.error_message
+              ri.Source.at
+              "M0153"
+              "import"
+              (Printf.sprintf "file %s uses Candid types without corresponding Motoko type" f);
+            error_message ]
+        | actor ->
+          let sscope = Scope.lib f actor in
+          senv := Scope.adjoin !senv sscope;
+          Diag.return ()
+  and go_set pkg_opt todo = Diag.traverse_ (go pkg_opt) todo
+  in
+  Diag.map (fun () -> (List.rev !libs, !senv)) (go_set None imports)
+
+let load_progs parsefn files senv : load_result =
+  let open Diag.Syntax in
+  let* parsed = Diag.traverse (parsefn Source.no_region) files in
+  let* rs = resolve_progs parsed in
+  let progs' = List.map fst rs in
+  let libs = List.concat_map snd rs in
+  let* libs, senv' = chase_imports parsefn senv libs in
+  let* senv'' = check_progs senv' progs' in
+  Diag.return (libs, progs', senv'')
+
+let load_decl parse_one senv : load_decl_result =
+  let open Diag.Syntax in
+  let* parsed = parse_one in
+  let* prog, libs = resolve_prog parsed in
+  let* libs, senv' = chase_imports parse_file senv libs in
+  let* t, sscope = infer_prog senv' (Some "<toplevel>") (Async_cap.(AwaitCap top_cap)) prog in
+  let senv'' = Scope.adjoin senv' sscope in
+  Diag.return (libs, prog, senv'', t, sscope)
+
+
+(* Interpretation (Source) *)
+
+let interpret_prog denv prog : (Value.value * Interpret.scope) option =
+  let open Interpret in
+  phase "Interpreting" prog.Source.note.Syntax.filename;
+  let flags = { trace = !Flags.trace; print_depth = !Flags.print_depth } in
+  let result = Interpret.interpret_prog flags denv prog in
+  Profiler.process_prog_result result ;
+  result
+
+let rec interpret_libs denv libs : Interpret.scope =
+  let open Interpret in
+  match libs with
+  | [] -> denv
+  | lib::libs' ->
+     phase "Interpreting" (Filename.basename lib.Source.note.Syntax.filename);
+    let flags = { trace = !Flags.trace; print_depth = !Flags.print_depth } in
+    let dscope = interpret_lib flags denv lib in
+    let denv' = adjoin_scope denv dscope in
+    interpret_libs denv' libs'
+
+let rec interpret_progs denv progs : Interpret.scope option =
+  match progs with
+  | [] -> Some denv
+  | p::ps ->
+    match interpret_prog denv p with
+    | Some (_v, dscope) ->
+      let denv' = Interpret.adjoin_scope denv dscope in
+      interpret_progs denv' ps
+    | None -> None
+
+let interpret_files (senv0, denv0) files : (Scope.scope * Interpret.scope) option =
+  Option.bind
+    (Diag.flush_messages (load_progs parse_file files senv0))
+    (fun (libs, progs, senv1) ->
+      let denv1 = interpret_libs denv0 libs in
+      match interpret_progs denv1 progs with
+      | None -> None
+      | Some denv2 -> Some (senv1, denv2)
+    )
+
+let run_builtin prog denv : dyn_env =
+  match interpret_prog denv prog with
+  | None -> builtin_error "initializing" prog.Source.note.Syntax.filename []
+  | Some (_v, dscope) ->
+    Interpret.adjoin_scope denv dscope
+
+let initial_dyn_env = run_builtin internals (run_builtin prelude Interpret.empty_scope)
+
+let initial_env = (initial_stat_env, initial_dyn_env)
+
+
+(* Only checking *)
+
+type check_result = unit Diag.result
+
+let check_files' parsefn files : check_result =
+  Diag.map ignore (load_progs parsefn files initial_stat_env)
+
+let check_files files : check_result =
+  check_files' parse_file files
+
+(* Generate Viper *)
+
+type viper_result = (string * (Source.region -> Source.region option)) Diag.result
+
+let viper_files' parsefn files : viper_result =
+  let open Diag.Syntax in
+  let* libs, progs, senv = load_progs parsefn files initial_stat_env in
+  let* () = Typing.check_actors senv progs in
+  let prog = CompUnit.combine_progs progs in
+  let u = CompUnit.comp_unit_of_prog false prog in
+  let* v = Viper.Trans.unit u in
+  let s = Viper.Pretty.prog_mapped "" v in
+  Diag.return s
+
+let viper_files files : viper_result =
+  viper_files' parse_verification_file files
+
+(* Generate IDL *)
+
+let generate_idl files : Idllib.Syntax.prog Diag.result =
+  let open Diag.Syntax in
+  let* libs, progs, senv = load_progs parse_file files initial_stat_env in
+  let* () = Typing.check_actors senv progs in
+  Diag.return (Mo_idl.Mo_to_idl.prog (progs, senv))
+
+(* Running *)
+
+let run_files files : unit option =
+  Option.map ignore (interpret_files initial_env files)
+
+(* Interactively *)
+
+let continuing = ref false
+
+let lexer_stdin buf len =
+  let prompt = if !continuing then "  " else "> " in
+  printf "%s" prompt; flush_all ();
+  continuing := true;
+  let rec loop i =
+    if i = len then i else
+    let ch = input_char stdin in
+    Bytes.set buf i ch;
+    if ch = '\n' then i + 1 else loop (i + 1)
+  in loop 0
+
+let parse_lexer lexer : parse_result =
+  let open Lexing in
+  if lexer.lex_curr_pos >= lexer.lex_buffer_len - 1 then continuing := false;
+  match parse_with Lexer.mode lexer Parser.Incremental.parse_prog_interactive "stdin" with
+  | Error es ->
+    Lexing.flush_input lexer;
+    (* Reset beginning-of-line, too, to sync consecutive positions. *)
+    lexer.lex_curr_p <- {lexer.lex_curr_p with pos_bol = 0};
+    Error es
+  | Ok (prog, ws) -> Ok ((prog, Filename.current_dir_name), ws)
+
+let is_exp dec = match dec.Source.it with Syntax.ExpD _ -> true | _ -> false
+
+let output_scope (senv, _) t v sscope dscope =
+  print_scope senv sscope dscope.Interpret.val_env;
+  if v <> Value.unit then print_val senv t v
+
+let run_stdin lexer (senv, denv) : env option =
+  match Diag.flush_messages (load_decl (parse_lexer lexer) senv) with
+  | None ->
+    if !Flags.verbose then printf "\n";
+    None
+  | Some (libs, prog, senv', t, sscope) ->
+    let denv' = interpret_libs denv libs in
+    match interpret_prog denv' prog with
+    | None ->
+      if !Flags.verbose then printf "\n";
+      None
+    | Some (v, dscope) ->
+      phase "Finished" "stdin";
+      let denv' = Interpret.adjoin_scope denv dscope in
+      let env' = (senv', denv') in
+      (* TBR: hack *)
+      let t', v' =
+        if Option.fold ~none:false ~some:is_exp (Lib.List.last_opt prog.Source.it)
+        then t, v
+        else Type.unit, Value.unit
+      in
+      output_scope env' t' v' sscope dscope;
+      if !Flags.verbose then printf "\n";
+      Some env'
+
+let run_stdin_from_file files file : Value.value option =
+  let open Lib.Option.Syntax in
+  let* (senv, denv) = interpret_files initial_env files in
+  let* (libs, prog, senv', t, sscope) =
+    Diag.flush_messages (load_decl (parse_file Source.no_region file) senv) in
+  let denv' = interpret_libs denv libs in
+  let* (v, dscope) = interpret_prog denv' prog in
+  print_val senv t v;
+  Some v
+
+let run_files_and_stdin files =
+  let open Lib.Option.Syntax in
+  let lexer = Lexing.from_function lexer_stdin in
+  let* env = interpret_files initial_env files in
+  let rec loop env = loop (Lib.Option.get (run_stdin lexer env) env) in
+  try loop env with End_of_file ->
+    printf "\n%!";
+    Some ()
+
+(* Desugaring *)
+
+let desugar_unit imports u name : Ir.prog =
+  phase "Desugaring" name;
+  let open Lowering.Desugar in
+  let prog_ir' : Ir.prog = link_declarations
+    (import_prelude prelude @ import_prelude internals @ imports)
+    (transform_unit u) in
+  dump_ir Flags.dump_lowering prog_ir';
+  if !Flags.check_ir
+  then Check_ir.check_prog !Flags.verbose "Desugaring" prog_ir';
+  prog_ir'
+
+(* IR transforms *)
+
+let transform transform_name trans prog name =
+  phase transform_name name;
+  let prog_ir' : Ir.prog = trans prog in
+  dump_ir Flags.dump_lowering prog_ir';
+  if !Flags.check_ir
+  then Check_ir.check_prog !Flags.verbose transform_name prog_ir';
+  prog_ir'
+
+let transform_if transform_name trans flag prog name =
+  if flag then transform transform_name trans prog name
+  else prog
+
+let await_lowering =
+  transform_if "Await Lowering" Await.transform
+
+let async_lowering mode =
+  transform_if "Async Lowering" Async.transform
+
+let tailcall_optimization =
+  transform_if "Tailcall optimization" Tailcall.transform
+
+let typ_field_translation =
+  transform_if "Erase type components" Erase_typ_field.transform
+
+let show_translation =
+  transform_if "Translate show" Show.transform
+
+let eq_translation =
+  transform_if "Translate polymorphic equality" Eq.transform
+
+let analyze analysis_name analysis prog name =
+  phase analysis_name name;
+  analysis prog;
+  if !Flags.check_ir
+  then Check_ir.check_prog !Flags.verbose analysis_name prog
+
+let ir_passes mode prog_ir name =
+  (* erase typ components from objects *)
+  let prog_ir = typ_field_translation true prog_ir name in
+  (* translations that extend the progam and must be done before await/cps conversion *)
+  let prog_ir = show_translation true prog_ir name in
+  let prog_ir = eq_translation true prog_ir name in
+  (* cps conversion and local transformations *)
+  let prog_ir = await_lowering !Flags.await_lowering prog_ir name in
+  let prog_ir = async_lowering mode !Flags.async_lowering prog_ir name in
+  let prog_ir = tailcall_optimization true prog_ir name in
+  analyze "constness analysis" Const.analyze prog_ir name;
+  prog_ir
+
+
+(* Compilation *)
+
+let load_as_rts () =
+  let rts = match (!Flags.gc_strategy, !Flags.sanity) with
+    | (Flags.Incremental, false) -> Rts.wasm_incremental_release
+    | (Flags.Incremental, true) -> Rts.wasm_incremental_debug
+    | (_, false) -> Rts.wasm_non_incremental_release
+    | (_, true) -> Rts.wasm_non_incremental_debug
+  in
+  Wasm_exts.CustomModuleDecode.decode "rts.wasm" (Lazy.force rts)
+
+type compile_result = (Idllib.Syntax.prog * Wasm_exts.CustomModule.extended_module) Diag.result
+
+(* This transforms the flat list of libs (some of which are classes)
+   into a list of imported libs and (compiled) classes *)
+let rec compile_libs mode libs : Lowering.Desugar.import_declaration =
+  let open Source in
+  let rec go imports = function
+    | [] -> imports
+    | l :: libs ->
+      let { Syntax.body = cub; _ } = l.it in
+      match cub.it with
+      | Syntax.ActorClassU _ ->
+        let wasm = compile_unit_to_wasm mode imports l in
+        go (imports @ Lowering.Desugar.import_compiled_class l wasm) libs
+      | _ ->
+        go (imports @ Lowering.Desugar.import_unit l) libs
+  in go [] libs
+
+and compile_unit mode do_link imports u : Wasm_exts.CustomModule.extended_module =
+  let name = u.Source.note.Syntax.filename in
+  let prog_ir = desugar_unit imports u name in
+  let prog_ir = ir_passes mode prog_ir name in
+  phase "Compiling" name;
+  let rts = if do_link then Some (load_as_rts ()) else None in
+  Codegen.Compile.compile mode rts prog_ir
+
+and compile_unit_to_wasm mode imports (u : Syntax.comp_unit) : string =
+  let wasm_mod = compile_unit mode true imports u in
+  let (_source_map, wasm) = Wasm_exts.CustomModuleEncode.encode wasm_mod in
+  wasm
+
+and compile_progs mode do_link libs progs : Wasm_exts.CustomModule.extended_module =
+  let imports = compile_libs mode libs in
+  let prog = CompUnit.combine_progs progs in
+  let u = CompUnit.comp_unit_of_prog false prog in
+  compile_unit mode do_link imports u
+
+let compile_files mode do_link files : compile_result =
+  let open Diag.Syntax in
+  let* libs, progs, senv = load_progs parse_file files initial_stat_env in
+  let* () = Typing.check_actors senv progs in
+  let idl = Mo_idl.Mo_to_idl.prog (progs, senv) in
+  let ext_module = compile_progs mode do_link libs progs in
+  (* validate any stable type signature *)
+  let* () =
+    match Wasm_exts.CustomModule.(ext_module.motoko.stable_types) with
+    | Some (_, ss) -> validate_stab_sig ss
+    | _ -> Diag.return ()
+  in
+  let* () =
+    if Wasm_exts.CustomModule.(ext_module.wasm_features) <> []
+    then Diag.warn Source.no_region "M0191" "compile" (Printf.sprintf "code requires Wasm features %s to execute" (String.concat "," Wasm_exts.CustomModule.(ext_module.wasm_features)))
+    else Diag.return ()
+  in
+  Diag.return (idl, ext_module)
+
+
+(* Interpretation (IR) *)
+
+(*
+   This transforms the flat list of libs into a list of imported units,
+   Unlike, `compile_libs`, classes are imported as IR for interpretation,
+   not compiled to wasm
+*)
+let import_libs libs : Lowering.Desugar.import_declaration =
+  List.concat_map Lowering.Desugar.import_unit libs
+
+let interpret_ir_progs libs progs =
+  let prog = CompUnit.combine_progs progs in
+  let name = prog.Source.note.Syntax.filename in
+  let imports = import_libs libs in
+  let u = CompUnit.comp_unit_of_prog false prog in
+  let prog_ir = desugar_unit imports u name in
+  let prog_ir = ir_passes (!Flags.compile_mode) prog_ir name in
+  phase "Interpreting" name;
+  let open Interpret_ir in
+  let flags = { trace = !Flags.trace; print_depth = !Flags.print_depth } in
+  interpret_prog flags prog_ir
+
+let interpret_ir_files files =
+  Option.map
+    (fun (libs, progs, senv) -> interpret_ir_progs libs progs)
+    (Diag.flush_messages (load_progs parse_file files initial_stat_env))
+
+
+
+ + + diff --git a/coverage/pipeline/resolve_import.ml.html b/coverage/pipeline/resolve_import.ml.html new file mode 100644 index 00000000000..22e6e1add35 --- /dev/null +++ b/coverage/pipeline/resolve_import.ml.html @@ -0,0 +1,912 @@ + + + + + resolve_import.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+
+
open Mo_def
+open Ic
+module Traversals = Mo_frontend.Traversals
+
+(*
+This module traverses the syntax tree. For each `import` statement, it looks
+at the given relative path and tries to resolve it to a full path (where
+full means relative to the current working directory, so that source
+directories do not creep into the build output). If no file can be found
+there, this prints an error message, otherwise it stores the real path
+in the second, mutable field of the ImportE statement.
+
+It returns a list of all imported file names.
+
+*)
+
+type filepath = string
+type url = string
+type blob = string
+
+type resolved_imports = Syntax.resolved_import Source.phrase list
+
+(* This returns a map from Syntax.resolved_import
+   to the location of the first import of that library
+*)
+module RIM = Map.Make
+  (struct
+    type t = Syntax.resolved_import
+    let compare = compare
+  end)
+
+(* The Set variant is used in the pipeline module *)
+module S = Set.Make
+  (struct
+    type t = Syntax.resolved_import
+    let compare = compare
+  end)
+
+
+(* a map of type package_map will map each package name to local, non-relative
+   filepath e.g.,
+   packages("std") = "/Users/home/username/.dfinity-sdk/src/mo-stdlib/0.1.0/"
+   packages("foo") = "/Users/home/username/fooPackage/1.2.3/src"
+*)
+module M = Map.Make(String)
+type package_map = filepath M.t
+
+open Syntax
+open Source
+
+let err_unrecognized_url msgs at url msg =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0006"
+       "import"
+       (Printf.sprintf "cannot parse import URL \"%s\": %s" url msg))
+
+let err_unrecognized_alias msgs alias principal msg =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       no_region
+       "M0007"
+       "actor-alias"
+       (Printf.sprintf "cannot parse principal \"%s\" for actor alias \"%s\": %s" principal alias msg))
+
+let err_actor_import_without_idl_path msgs at =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0008"
+       "import"
+      (Printf.sprintf "cannot import canister urls without --actor-idl param"))
+
+let err_file_does_not_exist' at full_path =
+  Diag.error_message
+    at
+    "M0009"
+    "import"
+    (Printf.sprintf "file \"%s\" does not exist" full_path)
+
+let err_file_does_not_exist msgs at full_path =
+  Diag.add_msg msgs (err_file_does_not_exist' at full_path)
+
+let err_package_not_defined msgs at pkg =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0010"
+       "import"
+       (Printf.sprintf "package \"%s\" not defined" pkg))
+
+let err_alias_not_defined msgs at alias =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       at
+       "M0011"
+       "import"
+       (Printf.sprintf "canister alias \"%s\" not defined" alias))
+
+let err_package_file_does_not_exist msgs f pname =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       no_region
+       "M0012"
+       "package"
+       (Printf.sprintf "file \"%s\" (for package `%s`) does not exist" f pname))
+
+let err_prim_pkg msgs =
+  let open Diag in
+  add_msg msgs
+    (error_message
+       no_region
+       "M0013"
+       "package" "the \"prim\" package is built-in, and cannot be mapped to a directory")
+
+let append_extension : (string -> bool) -> string -> string =
+  fun file_exists f ->
+  let file_path = f ^ ".mo" in
+  let lib_path = Filename.concat f "lib.mo" in
+  if Option.is_some (Lib.String.chop_suffix "/" f) then
+    lib_path
+  else if file_exists file_path then
+    file_path
+  else
+    lib_path
+
+let resolve_lib_import at full_path : (string, Diag.message) result =
+  let full_path = append_extension Sys.file_exists full_path in
+  let full_path = Lib.FilePath.normalise full_path in
+  if Sys.file_exists full_path
+  then Ok full_path
+  else Error (err_file_does_not_exist' at full_path)
+
+let add_lib_import msgs imported ri_ref at lib_path =
+  match resolve_lib_import at lib_path.path with
+  | Ok full_path -> begin
+      let ri = LibPath {lib_path with path = full_path} in
+      ri_ref := ri;
+      imported := RIM.add ri at !imported
+    end
+  | Error err ->
+     Diag.add_msg msgs err
+
+let add_idl_import msgs imported ri_ref at full_path bytes =
+  if Sys.file_exists full_path
+  then begin
+    ri_ref := IDLPath (full_path, bytes);
+    imported := RIM.add (IDLPath (full_path, bytes)) at !imported
+  end else
+    err_file_does_not_exist msgs at full_path
+
+let add_prim_import imported ri_ref at =
+  ri_ref := PrimPath;
+  imported := RIM.add PrimPath at !imported
+
+let in_base base f =
+  if base = "."
+  then f
+  else Filename.concat base f
+
+let resolve_import_string msgs base actor_idl_path aliases packages imported (f, ri_ref, at)  =
+  let resolve_ic bytes = match actor_idl_path with
+    | None -> err_actor_import_without_idl_path msgs at
+    | Some actor_base ->
+      let full_path = in_base actor_base (Url.idl_basename_of_blob bytes) in
+      add_idl_import msgs imported ri_ref at full_path bytes
+  in
+  match Url.parse f with
+  | Ok (Url.Relative path) ->
+    (* TODO support importing local .did file *)
+    add_lib_import msgs imported ri_ref at
+      { path = in_base base path; package = None }
+  | Ok (Url.Package (pkg,path)) ->
+    begin match M.find_opt pkg packages with
+    | Some pkg_path ->
+      add_lib_import msgs imported ri_ref at
+        { path = in_base pkg_path path; package = Some pkg }
+    | None -> err_package_not_defined msgs at pkg
+    end
+  | Ok (Url.Ic bytes) ->
+     if String.length bytes > 29 then
+       err_unrecognized_url msgs at f "Principal too long"
+     else
+     resolve_ic bytes
+  | Ok (Url.IcAlias alias) ->
+    begin match M.find_opt alias aliases with
+    | Some bytes -> resolve_ic bytes
+    | None -> err_alias_not_defined msgs at alias
+    end
+  | Ok Url.Prim ->
+    add_prim_import imported ri_ref at
+  | Error msg ->
+    err_unrecognized_url msgs at f msg
+
+(* Resolve the argument to --package. *)
+let resolve_package_url (msgs:Diag.msg_store) (pname:string) (f:url) : filepath =
+  if pname = "prim" then (err_prim_pkg msgs ;"") else
+  let f = Lib.FilePath.normalise f in
+  if Sys.file_exists f
+  then f
+  else (err_package_file_does_not_exist msgs f pname;"")
+
+(* Resolve the argument to --actor-alias. Check eagerly for well-formedness *)
+let resolve_alias_principal (msgs:Diag.msg_store) (alias:string) (f:string) : blob =
+  match Url.decode_principal f with
+  | Ok bytes ->
+     if String.length bytes > 29 then
+       (err_unrecognized_alias msgs alias f "Principal too long"; "")
+     else bytes
+  | Error msg -> err_unrecognized_alias msgs alias f msg; ""
+
+
+let prog_imports (p : prog): (url * resolved_import ref * region) list =
+  let res = ref [] in
+  let f e = match e.it with
+    | ImportE (f, fp) -> res := (f, fp, e.at) ::!res; e
+    | _ -> e in
+  let _ = ignore (Traversals.over_prog f p) in
+  List.rev !res
+
+type actor_idl_path = filepath option
+type package_urls = url M.t
+type actor_aliases = url M.t
+type aliases = blob M.t
+
+
+let resolve_packages : package_urls -> package_map Diag.result = fun purls ->
+  Diag.with_message_store (fun msgs -> Some (M.mapi (resolve_package_url msgs) purls))
+
+let resolve_aliases : actor_aliases -> aliases Diag.result = fun alias_principals ->
+  Diag.with_message_store (fun msgs -> Some (M.mapi (resolve_alias_principal msgs) alias_principals))
+
+type flags = {
+  package_urls : package_urls;
+  actor_aliases : actor_aliases;
+  actor_idl_path : actor_idl_path;
+  }
+
+type resolved_flags = {
+  packages : package_map;
+  aliases : aliases;
+  actor_idl_path : actor_idl_path;
+  }
+
+let resolve_flags : flags -> resolved_flags Diag.result
+  = fun { actor_idl_path; package_urls; actor_aliases } ->
+  let open Diag.Syntax in
+  let* packages = resolve_packages package_urls in
+  let* aliases = resolve_aliases actor_aliases in
+  Diag.return { packages; aliases; actor_idl_path }
+
+let resolve
+  : flags -> Syntax.prog -> filepath -> resolved_imports Diag.result
+  = fun flags p base ->
+  let open Diag.Syntax in
+  let* { packages; aliases; actor_idl_path } = resolve_flags flags in
+  Diag.with_message_store (fun msgs ->
+    let base = if Sys.is_directory base then base else Filename.dirname base in
+    let imported = ref RIM.empty in
+    List.iter (resolve_import_string msgs base actor_idl_path aliases packages imported) (prog_imports p);
+    Some (List.map (fun (rim,at) -> rim @@ at) (RIM.bindings !imported))
+  )
+
+
+let collect_imports (p:prog) base : ((url * url option) list) Diag.result =
+  (* TODO unify the code path for resolve and collect_imports *)
+  let base = if Sys.is_directory base then base else Filename.dirname base in
+  Diag.with_message_store (fun msgs ->
+      let imports =
+        List.map (fun (f, _, at) ->
+            match Url.parse f with
+            | Ok (Url.Relative path) -> begin
+               match resolve_lib_import at (in_base base path) with
+               | Ok full_path ->
+                  (f, Some full_path)
+               | Error err ->
+                  Diag.add_msg msgs err;
+                  (f, None)
+              end
+            | _ -> (f, None)
+          ) (prog_imports p) in
+       Some imports
+    )
+
+
+
+ + + diff --git a/coverage/prelude/prelude.ml.html b/coverage/prelude/prelude.ml.html new file mode 100644 index 00000000000..391158f8e6e --- /dev/null +++ b/coverage/prelude/prelude.ml.html @@ -0,0 +1,59 @@ + + + + + prelude.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+6
+7
+8
+
+
let prelude = [%blob "prelude/prelude.mo"]
+let internals = [%blob "prelude/internals.mo"]
+let timers_api = [%blob "prelude/timers-api.mo"]
+let prim_module' = [%blob "prelude/prim.mo"]
+let prim_module ~timers:required =
+  if required
+  then prim_module' ^ timers_api
+  else prim_module'
+
+
+
+ + + diff --git a/coverage/profiler/counters.ml.html b/coverage/profiler/counters.ml.html new file mode 100644 index 00000000000..33db27e93d0 --- /dev/null +++ b/coverage/profiler/counters.ml.html @@ -0,0 +1,529 @@ + + + + + counters.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+
+
(**
+
+Counters for regions, for super-simple profiling support.
+
+Useful for debugging combinatoric algorithms
+or other algorithms with known complexity,
+such as search, sorting, etc.
+
+*)
+
+open Source
+module Value = Mo_values.Value
+module T = Mo_types.Type
+
+type t = {
+    label  : ((region * string), int) Hashtbl.t ;
+    region : (region, int) Hashtbl.t ;
+  }
+
+let dump_count = ref 0
+
+let zeros () = {
+    label  = Hashtbl.create 100 ;
+    region = Hashtbl.create 100 ;
+  }
+
+let bump_region c reg =
+  if !ProfilerFlags.profile then
+    match Hashtbl.find_opt c.region reg with
+      Some n -> Hashtbl.replace c.region reg (n + 1)
+    | None   -> Hashtbl.replace c.region reg 1
+
+let bump_label c reg lab =
+  if !ProfilerFlags.profile then
+    match Hashtbl.find_opt c.label (reg, lab) with
+      Some n -> Hashtbl.replace c.label (reg, lab) (n + 1)
+    | None   -> Hashtbl.replace c.label (reg, lab) 1
+
+(* lexicographic on (left.file, left.line, left.column, right.line, right.column) *)
+let region_order rega regb =
+  if rega.left.file = regb.left.file then
+    if rega.left.line = regb.left.line then
+      if rega.left.column = regb.left.column then
+        if rega.right.line = regb.right.line then
+          compare rega.right.column regb.right.column
+        else
+          compare rega.right.line regb.right.line
+      else
+        compare rega.left.column regb.left.column
+    else
+      compare rega.left.line regb.left.line
+  else
+    compare rega.left.file regb.left.file
+
+let label_order laba labb =
+  compare laba labb
+
+let dump (c:t) (ve: Value.value Value.Env.t) =
+  if !ProfilerFlags.profile then
+    if !ProfilerFlags.profile_verbose then (
+      Printf.printf "{\n" ;
+      Value.Env.iter (fun fn fv ->
+          Printf.printf " %s = %s;\n"
+            fn (Value.string_of_val 0 T.Non fv)
+        )
+        ve ;
+      Printf.printf "}\n"
+    ) ;
+    let dump_count = begin
+        let d = !dump_count in
+        dump_count := d + 1;
+        d
+      end
+    in
+    (* Include all labeled regions in the final table: *)
+    let labeled_counts =
+      Hashtbl.fold (
+          fun (reg, label) count counts ->
+          ((reg, Some label), count) :: counts)
+        c.label []
+    in
+    (* Include all other regions in the final table: *)
+    let all_region_counts =
+      Hashtbl.fold (
+          fun reg count counts ->
+          ((reg, None), count) :: counts)
+        c.region labeled_counts
+    in
+    let sorted_counts =
+      List.sort (
+          (* Final ordering:
+             - counts; bigger first; this is the main ordering constraint.
+             - labels; labeled expressions before unlabeled
+             - regions; earlier/outer regions before later/enclosed ones
+           *)
+          fun
+            ((rega, laba), x)
+            ((regb, labb), y)
+          ->
+          let diff = x - y in
+          if diff <> 0 then -diff else
+            match (laba, labb) with
+              (Some _, None) -> -1
+            | (None, Some _) ->  1
+            | (Some _, Some _) -> label_order laba labb
+            | (None, None) -> region_order rega regb
+        ) all_region_counts
+    in
+    let file = open_out (!ProfilerFlags.profile_file) in
+    let (suffix, flds) =
+      (* the suffix of the line consists of field values for each field in `profile_field_names`: *)
+      List.fold_right
+        (fun var (line, flds) ->
+          match Value.Env.find_opt var ve with
+            None   -> (Printf.sprintf "%s, #err" line, (var :: flds))
+          | Some v -> (Printf.sprintf "%s, %s" line (Value.string_of_val 0 T.Non v), var :: flds)
+        ) !ProfilerFlags.profile_field_names ("", [])
+    in
+    Printf.fprintf file "# column: source region\n" ;
+    Printf.fprintf file "# column: source region count\n" ;
+    List.iter (fun fld -> Printf.fprintf file "# column: --profile-field: %s\n" fld)
+      (List.rev flds) ;
+    let lab_total = ref 0 in
+    let unlab_total = ref 0 in
+    List.iter (fun ((region, labop), region_count) ->
+        assert (dump_count = 0);
+        (match labop with
+           None   -> unlab_total := !unlab_total + region_count
+         | Some x -> lab_total := !lab_total + region_count
+        );
+      ) sorted_counts;
+    Printf.fprintf file "# count total (unlabeled): %d\n" !unlab_total ;
+    Printf.fprintf file "# ...             labeled: %d\n" !lab_total ;
+    List.iter (fun ((region, labop), region_count) ->
+        assert (dump_count = 0);
+        Printf.fprintf file "%s\"%s\", %s, %d%s\n"
+          (!ProfilerFlags.profile_line_prefix)
+          (string_of_region region)
+          (match labop with
+             None   -> "null"
+           | Some x -> Printf.sprintf "?\"%s\"" x
+          )
+          region_count
+          suffix
+      ) sorted_counts;
+    close_out file
+
+
+
+ + + diff --git a/coverage/profiler/profiler.ml.html b/coverage/profiler/profiler.ml.html new file mode 100644 index 00000000000..8c6901756b3 --- /dev/null +++ b/coverage/profiler/profiler.ml.html @@ -0,0 +1,112 @@ + + + + + profiler.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+
+
open Mo_values
+
+let counters : Counters.t = Counters.zeros ()
+
+let bump_region reg =
+  Counters.bump_region counters reg
+
+let bump_label lab reg =
+  Counters.bump_label counters lab reg
+
+let process_prog_result result =
+  if !ProfilerFlags.profile then
+    try
+      match result with
+        Some(Value.Async a,_) -> begin
+          match Lib.Promise.value_opt a.Value.result with
+          | Some (Value.Ok v) -> Counters.dump counters (Value.as_obj v)
+          | Some _
+          | None   -> ()
+        end
+      | _  -> ()
+    with
+    | Invalid_argument _ -> () ;
+
+
+
+ + + diff --git a/coverage/profiler/profilerFlags.ml.html b/coverage/profiler/profilerFlags.ml.html new file mode 100644 index 00000000000..b180ac3934a --- /dev/null +++ b/coverage/profiler/profilerFlags.ml.html @@ -0,0 +1,50 @@ + + + + + profilerFlags.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+
+
let profile = ref false
+let profile_verbose = ref false
+let profile_file = ref "profiling-counters.csv"
+let profile_line_prefix = ref ""
+let profile_field_names : string list ref = ref []
+
+
+
+ + + diff --git a/coverage/rts/rts.ml.html b/coverage/rts/rts.ml.html new file mode 100644 index 00000000000..f6f457d874d --- /dev/null +++ b/coverage/rts/rts.ml.html @@ -0,0 +1,113 @@ + + + + + rts.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+
+
(*
+This source file loads the RTS (`mo-rts.wasm` etc.) via the environment
+variables. This is for local development (e.g. inside `nix-shell`). The nix
+build of `moc` will statically replace this file with one that just embeds
+`mo-rts.wasm` etc. as a static string, to produce a fully self-contained `moc`
+binary for distribution.
+*)
+
+let load_file env =
+  match Sys.getenv_opt env with
+  | Some filename ->
+    let ic = open_in_bin filename in
+    let n = in_channel_length ic in
+    let s = Bytes.create n in
+    really_input ic s 0 n;
+    close_in ic;
+    Bytes.to_string s
+  | None ->
+    Printf.eprintf "Environment variable %s not set. Please run moc via the bin/moc wrapper (which should be in your PATH in the nix-shell)." env;
+    exit 1
+
+let wasm_non_incremental_release : string Lazy.t = lazy (load_file "MOC_NON_INCREMENTAL_RELEASE_RTS")
+let wasm_non_incremental_debug : string Lazy.t = lazy (load_file "MOC_NON_INCREMENTAL_DEBUG_RTS")
+
+let wasm_incremental_release : string Lazy.t = lazy (load_file "MOC_INCREMENTAL_RELEASE_RTS")
+let wasm_incremental_debug : string Lazy.t = lazy (load_file "MOC_INCREMENTAL_DEBUG_RTS")
+
+
+
+ + + diff --git a/coverage/source_id/generated.ml.html b/coverage/source_id/generated.ml.html new file mode 100644 index 00000000000..99f0c950435 --- /dev/null +++ b/coverage/source_id/generated.ml.html @@ -0,0 +1,41 @@ + + + + + generated.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+
+
+
+
+1
+2
+
+
let release = Some "0.11.1+"
+let id = "31chdvvn-f81kgglf-im1fzkrj-hvl1aavc"
+
+
+
+ + + diff --git a/coverage/source_id/source_id.ml.html b/coverage/source_id/source_id.ml.html new file mode 100644 index 00000000000..88ebd0291f8 --- /dev/null +++ b/coverage/source_id/source_id.ml.html @@ -0,0 +1,51 @@ + + + + + source_id.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+1
+2
+3
+4
+5
+
+
let release = Generated.release
+let id = Generated.id
+let banner = match Generated.release with
+  | None -> "(source " ^ Generated.id ^ ")"
+  | Some r -> r ^ " (source " ^ Generated.id ^ ")"
+
+
+
+ + + diff --git a/coverage/viper/pretty.ml.html b/coverage/viper/pretty.ml.html new file mode 100644 index 00000000000..4fbd8967ecb --- /dev/null +++ b/coverage/viper/pretty.ml.html @@ -0,0 +1,859 @@ + + + + + pretty.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+
+
open Source
+open Syntax
+
+open Format
+
+let marks = ref []
+
+let pr = pp_print_string
+
+let comma ppf () = fprintf ppf ",@ "
+
+let semi ppf () = fprintf ppf ";@ "
+
+let pp_info ppf info =
+  match info with
+  | NoInfo -> ()
+  | ActorInit -> fprintf ppf "@[// translation of actor initializers @]"
+  | PublicFunction x -> fprintf ppf "@[// translation of PUBLIC function %s@]" x
+  | PrivateFunction x -> fprintf ppf "@[// translation of _private_ function %s@]" x
+
+let rec pp_prog ppf p =
+  match p.it with
+  | is ->
+   fprintf ppf "@[<v 0>%a@]"
+   (pp_print_list pp_item) is
+
+and pp_item ppf i =
+  match i.it with
+  | FieldI (id, typ) ->
+    fprintf ppf "@[<2>field %s:@ %a@]"
+      id.it
+      pp_typ typ
+  | MethodI (id, locals, rets, pres, posts, bo) ->
+    marks := i.at :: !marks;
+    fprintf ppf "\017@[<v 2>method %s%a@; %a@; %a@; %a@; %a@]\019"
+      id.it
+      pp_locals locals
+      pp_returns rets
+      pp_pres pres
+      pp_posts posts
+      pp_block_opt bo
+  | InvariantI (inv_name, e) -> (* TODO: srcloc mapping *)
+    fprintf ppf "@[<2>define %s($Self) (%a)@]" inv_name pp_exp e
+
+and pp_block_opt ppf = function
+  | None -> ()
+  | Some seqn ->
+    pp_seqn ppf seqn
+
+and pp_seqn ppf seqn =
+    let (ds, ss) = seqn.it in
+    fprintf ppf "@[<v 2>{ %a@ %a @;<0 -2>}@]"
+     (pp_print_list pp_decl) ds
+     (pp_print_list pp_stmt) ss
+
+and pp_decl ppf decl =
+    let (id, typ) = decl.it in
+    fprintf ppf "@[<v 0>var %s: %a@]"
+    id.it
+    pp_typ typ
+
+and pp_pres ppf exps =
+   fprintf ppf "@[<v 0>%a@]" (pp_print_list pp_pre) exps
+
+and pp_pre ppf exp =
+   fprintf ppf "@[<v 2>requires %a@]" pp_exp exp
+
+and pp_posts ppf exps =
+   fprintf ppf "@[<v 0>%a@]" (pp_print_list pp_post) exps
+
+and pp_post ppf exp =
+   fprintf ppf "@[<v 2>ensures %a@]" pp_exp exp
+
+and pp_local ppf (id, typ) =
+  fprintf ppf "@[<2>%s: %a@]"
+    id.it
+    pp_typ typ
+
+and pp_locals ppf pars =
+  fprintf ppf "@[<1>(%a)@]"
+    (pp_print_list ~pp_sep:comma (pp_local)) pars
+
+and pp_returns ppf pars =
+  match pars with
+  | [] -> ()
+  | _ ->
+    fprintf ppf "@[<1> returns (%a)@]"
+      (pp_print_list ~pp_sep:comma (pp_local)) pars
+
+and pp_typ ppf t =
+  match t.it with
+  | IntT -> pr ppf "Int"
+  | BoolT -> pr ppf "Bool"
+  | RefT -> pr ppf "Ref"
+
+and pp_exp ppf exp =
+  match exp.it with
+  | LocalVar (id, _) ->
+     fprintf ppf "%s" id.it
+  | FldAcc fldacc ->
+     pp_fldacc ppf fldacc
+  | MacroCall (m, e) ->
+     fprintf ppf "@[%s(%a)@]" m pp_exp e
+  | NotE e ->
+     fprintf ppf "@[(!%a)@]" pp_exp e
+  | MinusE e ->
+     fprintf ppf "@[(-%a)@]" pp_exp e
+  | NullLitE ->
+     fprintf ppf "null"
+  | BoolLitE b ->
+     fprintf ppf "%s" (if b then "true" else "false")
+  | IntLitE i ->
+     fprintf ppf "%s" String.(of_seq (Seq.filter (fun c -> c <> '_') (to_seq (Mo_values.Numerics.Int.to_string i))))
+  | AddE (e1, e2) | SubE (e1, e2) | MulE (e1, e2) | DivE (e1, e2) | ModE (e1, e2)
+  | EqCmpE (e1, e2) | NeCmpE (e1, e2) | GtCmpE (e1, e2) | GeCmpE (e1, e2) | LtCmpE (e1, e2) | LeCmpE (e1, e2)
+  | Implies (e1, e2) | OrE (e1, e2) | AndE (e1, e2) ->
+     let op = match exp.it with
+       | AddE _ -> "+" | SubE _ -> "-"
+       | MulE _ -> "*" | DivE _ -> "/" | ModE _ -> "%"
+       | EqCmpE _ -> "==" | NeCmpE _ -> "!="
+       | GtCmpE _ -> ">" | GeCmpE _ -> ">="
+       | LtCmpE _ -> "<" | LeCmpE _ -> "<="
+       | Implies _ -> "==>" | OrE _ -> "||" | AndE _ -> "&&"
+       | _ -> failwith "not a binary operator" in
+     fprintf ppf "(%a %s %a)" pp_exp e1 op pp_exp e2
+  | Old e ->
+    fprintf ppf "@[old(%a)@]" pp_exp e
+  | PermE p -> pp_perm ppf p
+  | AccE (fldacc, perm) -> fprintf ppf "@[acc(%a,%a)@]" pp_fldacc fldacc pp_exp perm
+  | _ -> fprintf ppf "@[// pretty printer not implemented for node at %s@]" (string_of_region exp.at)
+
+and pp_perm ppf perm =
+  match perm.it with
+  | NoP -> fprintf ppf "none"
+  | FullP -> fprintf ppf "write"
+  | WildcardP -> fprintf ppf "wildcard"
+  | FractionalP (a, b) -> fprintf ppf "@[(%a/%a)@]" pp_exp a pp_exp b
+
+and pp_stmt ppf stmt =
+  marks := stmt.at :: !marks;
+  fprintf ppf "\017%a\019"
+    pp_stmt' stmt.it
+
+and pp_stmt' ppf = function
+  | SeqnS seqn -> pp_seqn ppf seqn
+  | IfS (exp1, s1, { it = ([],[]); _ }) ->
+    fprintf ppf "@[<v 2>if (%a)@ %a@]"
+      pp_exp exp1
+      pp_seqn s1
+  | IfS (exp1, s1, s2) ->
+    fprintf ppf "@[<v 2>if (%a)@ %aelse@ %a@]"
+      pp_exp exp1
+      pp_seqn s1
+      pp_seqn s2
+  | WhileS (exp, _, s) -> (* TODO: Invariant *)
+    fprintf ppf "@[<v 2>while (%a) {@ %a}@]"
+      pp_exp exp
+      pp_seqn s
+  | VarAssignS (id, exp) ->
+    fprintf ppf "@[<v 2>%s := %a@]"
+      id.it
+      pp_exp exp
+  | FieldAssignS (fldacc, exp) ->
+    fprintf ppf "@[<v 2>%a := %a@]"
+      pp_fldacc fldacc
+      pp_exp exp
+  | InhaleS exp ->
+    fprintf ppf "@[<v 2>inhale %a@]"
+      pp_exp exp
+  | ExhaleS exp ->
+    fprintf ppf "@[<v 2>exhale %a@]"
+      pp_exp exp
+  | AssumeS exp ->
+    fprintf ppf "@[<v 2>assume %a@]"
+      pp_exp exp
+  | AssertS exp ->
+    fprintf ppf "@[<v 2>assert %a@]"
+      pp_exp exp
+  | PreconditionS exp ->
+    fprintf ppf "@[<v 2>/*requires %a*/@]"
+      pp_exp exp
+  | PostconditionS exp ->
+    fprintf ppf "@[<v 2>/*ensures %a*/@]"
+      pp_exp exp
+  | ConcurrencyS (max, exp, _) ->
+    fprintf ppf "@[<v 2>/*concurrency max %s, cond: s %a*/@]"
+      max
+      pp_exp exp
+  | MethodCallS (rs, m, args) ->
+    let () = match rs with
+    | [] -> ()
+    | r :: rs ->
+      let () = fprintf ppf "@[%s@]" r.it in
+      List.iter (fun r ->
+        fprintf ppf ", @[%s@]" r.it
+      ) rs
+    in
+    let () = if rs != [] then
+      fprintf ppf " := "
+    in
+    let () = fprintf ppf "@[%s(@]" m.it in
+    let () = match args with
+    | [] -> ()
+    | arg :: args ->
+      let () = fprintf ppf "@[%a@]" pp_exp arg in
+      fprintf ppf "@[%a@]" (pp_print_list ~pp_sep:comma pp_exp) args
+    in
+    fprintf ppf ")"
+  | LabelS (_, _) -> failwith "LabelS?"
+
+and pp_fldacc ppf fldacc =
+  match fldacc with
+  | (exp1, id) ->
+    fprintf ppf "@[(%a).%s@]" pp_exp exp1 id.it
+
+let prog_mapped file p =
+    marks := [];
+    let b = Buffer.create 16 in
+    let ppf = Format.formatter_of_buffer b in
+    Format.fprintf ppf "@[%a@]" pp_prog p;
+    Format.pp_print_flush ppf ();
+    let in_file { left; right } =
+      let left, right = { left with file }, { right with file } in
+      { left ; right } in
+    let marks = ref (List.rev_map (fun loc -> loc, in_file loc) !marks, [], []) in
+    let pos = ref 0 in
+    let push line column = match !marks with
+        | (mot, vip) :: clos, ope, don -> marks := clos, (mot, { vip with left = { vip.left with line; column } }) :: ope, don
+        | _ -> assert false in
+    let pop line column = match !marks with
+        | clos, (mot, vip) :: ope, don -> marks := clos, ope, (mot, { vip with right = { vip.right with line; column } }) :: don
+        | _ -> assert false in
+    let line = ref 1 in
+    let examine = function
+    | '\n' -> line := !line + 1; pos := 0; '\n';
+    | '\017' -> push !line !pos; '\017'
+    | '\019' -> pop !line !pos; '\017'
+    | a -> pos := !pos + 1; a in
+    let clean = function
+    | '\017' -> false
+    | _ -> true in
+    let b = Buffer.(of_seq Seq.(filter clean (map examine (to_seq b)))) in
+    let _, _, mapping = !marks in
+    let inside { left; right } other =
+        left.file = other.left.file &&
+        right.file = other.right.file &&
+        (other.left.line, other.left.column) <= (left.line, left.column) &&
+        (right.line, right.column) <= (other.right.line, other.right.column) in
+    let lookup (r : Source.region) =
+        let tighten prev (mot, vip) =
+            if inside r vip
+            then Some mot
+            else prev in
+        List.fold_left tighten None mapping in
+    Buffer.contents b, lookup
+
+let prog p = fst (prog_mapped "" p)
+
+
+
+ + + diff --git a/coverage/viper/trans.ml.html b/coverage/viper/trans.ml.html new file mode 100644 index 00000000000..f34cdb66ce6 --- /dev/null +++ b/coverage/viper/trans.ml.html @@ -0,0 +1,1629 @@ + + + + + trans.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+
+
open Source
+
+open Syntax
+
+module T = Mo_types.Type
+module M = Mo_def.Syntax
+module Arrange = Mo_def.Arrange
+
+module Stamps = Env.Make(String)
+
+(* symbol generation *)
+
+let stamps : int Stamps.t ref = ref Stamps.empty
+
+let reset_stamps () = stamps := Stamps.empty
+
+let fresh_stamp name =
+  let n = Lib.Option.get (Stamps.find_opt name !stamps) 0 in
+  stamps := Stamps.add name (n + 1) !stamps;
+  n
+
+let fresh_id name =
+  let n = fresh_stamp name in
+  if n = 0 then
+    name
+  else Printf.sprintf "%s_%i" name (fresh_stamp name)
+
+(* helpers for constructing annotated syntax *)
+
+let (^^^) at it note = { it; at; note}
+
+let (!!!) at it = (^^^) at it NoInfo
+
+
+let intLitE at i =
+  !!! at (IntLitE (Mo_values.Numerics.Int.of_int i))
+
+let accE at fldacc =
+  !!! at
+    (AccE(
+         fldacc,
+         !!! at (PermE (!!! at FullP))))
+
+let conjoin es at =
+  match es with
+  | [] -> !!! at (BoolLitE true)
+  | e0::es0 ->
+    List.fold_left
+      (fun e1 -> fun e2 ->
+        !!! at (AndE(e1, e2)))
+        e0
+        es0
+
+let rec adjoin ctxt e = function
+  | [] -> e
+  | f :: fs -> f ctxt (adjoin ctxt e fs)
+
+
+(* exception for reporting unsupported Motoko syntax *)
+exception Unsupported of Source.region * string
+
+let unsupported at sexp =
+  raise (Unsupported (at, (Wasm.Sexpr.to_string 80 sexp)))
+
+type sort = Field | Local | Method
+
+module Env = T.Env
+
+type ctxt =
+  { self : string option;
+    ids : sort T.Env.t;
+    ghost_items : (ctxt -> item) list ref;
+    ghost_inits : (ctxt -> stmt) list ref;
+    ghost_perms : (ctxt -> Source.region -> exp) list ref;
+    ghost_conc : (ctxt -> exp -> exp) list ref;
+  }
+
+let self ctxt at =
+  match ctxt.self with
+  | Some id -> !!! at (LocalVar (!!! at id,!!! at RefT))
+  | _ -> failwith "no self"
+
+let rec extract_invariants : item list -> (par -> invariants -> invariants) = function
+  | [] -> fun _ x -> x
+  | { it = InvariantI (s, e); at; _ } :: p ->
+      fun self es ->
+        !!! at (MacroCall(s, !!! at (LocalVar (fst self, snd self))))
+        :: extract_invariants p self es
+  | _ :: p -> extract_invariants p
+
+let rec extract_concurrency (seq : seqn) : stmt' list * seqn =
+  let open List in
+  let extr (concs, stmts) s : stmt' list * stmt list =
+    match s.it with
+    | ConcurrencyS _ -> s.it :: concs, stmts
+    | SeqnS seq ->
+      let concs', seq = extract_concurrency seq in
+      rev_append concs' concs, { s with it = SeqnS seq } :: stmts
+    | WhileS (e, inv, seq) ->
+      let concs', seq = extract_concurrency seq in
+      rev_append concs' concs, { s with it = WhileS (e, inv, seq) } :: stmts
+    | IfS (e, the, els) ->
+      let the_concs, the = extract_concurrency the in
+      let els_concs, els = extract_concurrency els in
+      rev_append els_concs (rev_append the_concs concs), { s with it = IfS (e, the, els) } :: stmts
+    | _ -> concs, s :: stmts in
+
+  let stmts = snd seq.it in
+  let conc, stmts = List.fold_left extr ([], []) stmts in
+  rev conc, { seq with it = fst seq.it, rev stmts }
+
+let rec unit (u : M.comp_unit) : prog Diag.result =
+  Diag.(
+    reset_stamps();
+    try return (unit' u) with
+    | Unsupported (at, desc) -> error at "0" "viper" ("translation to viper failed:\n"^desc)
+    | _ -> error u.it.M.body.at "1" "viper" "translation to viper failed"
+  )
+
+and unit' (u : M.comp_unit) : prog =
+  let { M.imports; M.body } = u.it in
+  match body.it with
+  | M.ActorU(id_opt, decs) ->
+    let ctxt = { self = None; ids = Env.empty; ghost_items = ref []; ghost_inits = ref []; ghost_perms = ref []; ghost_conc = ref [] } in
+    let ctxt', inits, mk_is = dec_fields ctxt decs in
+    let is' = List.map (fun mk_i -> mk_i ctxt') mk_is in
+    (* given is', compute ghost_is *)
+    let ghost_is = List.map (fun mk_i -> mk_i ctxt') !(ctxt.ghost_items) in
+    let init_id = !!! (Source.no_region) "__init__" in
+    let self_id = !!! (Source.no_region) "$Self" in
+    let self_typ = !!! (self_id.at) RefT in
+    let ctxt'' = { ctxt' with self = Some self_id.it } in
+    let perms = List.map (fun (id, _) -> fun (at : region) ->
+       (accE at (self ctxt'' at, id))) inits in
+    let ghost_perms = List.map (fun mk_p -> mk_p ctxt'') !(ctxt.ghost_perms) in
+    let perm =
+      fun (at : region) ->
+       List.fold_left
+         (fun pexp -> fun p_fn ->
+           !!! at (AndE(pexp, p_fn at)))
+         (!!! at (BoolLitE true))
+         (perms @ ghost_perms)
+    in
+    (* Add initializer *)
+    let init_list = List.map (fun (id, init) ->
+        !!! { left = id.at.left; right = init.at.right }
+          (FieldAssignS((self ctxt'' init.at, id), exp ctxt'' init)))
+        inits in
+    let init_list = init_list @ List.map (fun mk_s -> mk_s ctxt'') !(ctxt.ghost_inits) in
+    let init_body =
+      !!! (body.at) ([], init_list)(* ATG: Is this the correct position? *)
+    in
+    let init_m =
+      (^^^) (body.at) (MethodI(init_id, [self_id, self_typ], [], [], [], Some init_body)) ActorInit
+    in
+    let is'' = init_m :: is' in
+    (* Add permissions *)
+    let is''' = List.map (function
+    | {it = MethodI (id, ins, outs, pres, posts, body); at; note: info} ->
+      (^^^)
+        at
+        (MethodI (id, ins, outs,
+          !!! at (MacroCall("$Perm", self ctxt'' at))::pres,
+          !!! at (MacroCall("$Perm", self ctxt'' at))::posts,
+          body))
+        note
+      | x -> x) is'' in
+    (* Add functional invariants to public functions *)
+    let invs = extract_invariants is''' (self_id, self_typ) [] in
+    let is4 = List.map (function
+      | {
+        it = MethodI (id, ins, outs, pres, posts, body);
+        at;
+        note = ActorInit
+      } -> ((^^^)
+        at
+        (MethodI(id, ins, outs,
+          pres,
+          posts @ [!!! at (MacroCall("$Inv", self ctxt'' at))],
+          body))
+        ActorInit
+      )
+      | {
+        it = MethodI (id, ins, outs, pres, posts, body);
+        at;
+        note = PublicFunction x
+      } -> ((^^^)
+        at
+        (MethodI(id, ins, outs,
+          pres @ [!!! at (MacroCall("$Inv", self ctxt'' at))],
+          posts @ [!!! at (MacroCall("$Inv", self ctxt'' at))],
+          body))
+        (PublicFunction x)
+      )
+      | x -> x
+    ) is''' in
+    let perm_def = !!! (body.at) (InvariantI("$Perm", perm body.at)) in
+    let inv_def = !!! (body.at) (InvariantI("$Inv", adjoin ctxt'' (conjoin invs body.at) !(ctxt.ghost_conc))) in
+    let is = ghost_is @ (perm_def :: inv_def :: is4) in
+    !!! (body.at) is
+  | _ -> assert false
+
+and dec_fields (ctxt : ctxt) (ds : M.dec_field list) =
+  match ds with
+  | [] ->
+    (ctxt, [], [])
+  | d :: ds ->
+    let ctxt, init, mk_i = dec_field ctxt d in
+    let ctxt, inits, mk_is = dec_fields ctxt ds in
+    (ctxt, (match init with Some i -> i::inits | _ -> inits), mk_i::mk_is)
+
+and dec_field ctxt d =
+  let ctxt, init, mk_i = dec_field' ctxt d.it in
+   (ctxt,
+    init,
+    fun ctxt' ->
+      let (i, info) = mk_i ctxt' in
+      (^^^) (d.at) i info)
+
+and dec_field' ctxt d =
+  match d.M.dec.it with
+  | M.VarD (x, e) ->
+      { ctxt with ids = Env.add x.it Field ctxt.ids },
+      Some (id x, e),
+      fun ctxt' ->
+        (FieldI(id x, tr_typ e.note.M.note_typ),
+        NoInfo)
+  (* async functions *)
+  | M.(LetD ({it=VarP f;_},
+             {it=FuncE(x, sp, tp, p, t_opt, sugar,
+             {it = AsyncE (T.Fut, _, e); _} );_}, None)) -> (* ignore async *)
+      { ctxt with ids = Env.add f.it Method ctxt.ids },
+      None,
+      fun ctxt' ->
+        let open Either in
+        let self_id = !!! (Source.no_region) "$Self" in
+        let ctxt'' = { ctxt' with self = Some self_id.it }
+        in (* TODO: add args (and rets?) *)
+        let stmts = stmt ctxt'' e in
+        let _, stmts = extract_concurrency stmts in
+        let pres, stmts' = List.partition_map (function { it = PreconditionS exp; _ } -> Left exp | s -> Right s) (snd stmts.it) in
+        let posts, stmts' = List.partition_map (function { it = PostconditionS exp; _ } -> Left exp | s -> Right s) stmts' in
+        (MethodI(id f, (self_id, !!! Source.no_region RefT)::args p, rets t_opt, pres, posts, Some { stmts with it = fst stmts.it, stmts' } ),
+        PublicFunction f.it)
+  (* private sync functions *)
+  | M.(LetD ({it=VarP f;_},
+             {it=FuncE(x, sp, tp, p, t_opt, sugar, e );_},
+             None)) ->
+      { ctxt with ids = Env.add f.it Method ctxt.ids },
+      None,
+      fun ctxt' ->
+        let open Either in
+        let self_id = !!! (Source.no_region) "$Self" in
+        let ctxt'' = { ctxt' with self = Some self_id.it }
+        in (* TODO: add args (and rets?) *)
+        let stmts = stmt ctxt'' e in
+        let _, stmts = extract_concurrency stmts in
+        let pres, stmts' = List.partition_map (function { it = PreconditionS exp; _ } -> Left exp | s -> Right s) (snd stmts.it) in
+        let posts, stmts' = List.partition_map (function { it = PostconditionS exp; _ } -> Left exp | s -> Right s) stmts' in
+        (MethodI(id f, (self_id, !!! Source.no_region RefT)::args p, rets t_opt, pres, posts, Some { stmts with it = fst stmts.it, stmts' } ),
+        PrivateFunction f.it)
+  | M.(ExpD { it = AssertE (Invariant, e); at; _ }) ->
+      ctxt,
+      None,
+      fun ctxt' ->
+        (InvariantI (Printf.sprintf "invariant_%d" at.left.line, exp { ctxt' with self = Some "$Self" }  e), NoInfo)
+  | _ ->
+     unsupported d.M.dec.at (Arrange.dec d.M.dec)
+
+and args p = match p.it with
+  | M.TupP ps ->
+    List.map
+      (fun p ->
+        match p.it with
+        | M.VarP x ->
+          (id x, tr_typ p.note)
+        | _ -> unsupported p.at (Arrange.pat p))
+      ps
+  |  _ -> unsupported p.at (Arrange.pat p)
+
+and block ctxt at ds =
+  let ctxt, mk_ss = decs ctxt ds in
+  !!! at (mk_ss ctxt)
+
+and decs ctxt ds =
+  match ds with
+  | [] -> (ctxt, fun ctxt' -> ([],[]))
+  | d::ds' ->
+    let (ctxt1, mk_s) = dec ctxt d in
+    let (ctxt2, mk_ss) = decs ctxt1 ds' in
+    (ctxt2,
+     fun ctxt' ->
+       let (l, s) = mk_s ctxt' in
+       let (ls, ss) = mk_ss ctxt' in
+       (l @ ls, s @ ss))
+
+and dec ctxt d =
+  let (!!) p = !!! (d.at) p in
+  match d.it with
+  | M.VarD (x, e) ->
+     (* TODO: translate e? *)
+    { ctxt with ids = Env.add x.it Local ctxt.ids },
+    fun ctxt' ->
+      ([ !!(id x, tr_typ e.note.M.note_typ) ],
+       [ !!(VarAssignS (id x, exp ctxt' e)) ])
+  | M.(LetD ({it=VarP x;_}, e, None)) ->
+     { ctxt with ids = Env.add x.it Local ctxt.ids },
+     fun ctxt' ->
+       ([ !!(id x, tr_typ e.note.M.note_typ) ],
+        [ !!(VarAssignS (id x, exp ctxt' e)) ])
+  | M.(ExpD e) -> (* TODO: restrict to e of unit type? *)
+     (ctxt,
+      fun ctxt' ->
+        let s = stmt ctxt' e in
+        s.it)
+  | _ ->
+     unsupported d.at (Arrange.dec d)
+
+and stmt ctxt (s : M.exp) : seqn =
+  let (!!) p = !!! (s.at) p in
+  match s.it with
+  | M.TupE [] ->
+     block ctxt s.at []
+  | M.BlockE ds ->
+     block ctxt s.at ds
+  | M.IfE(e, s1, s2) ->
+    !!([],
+       [ !!(IfS(exp ctxt e, stmt ctxt s1, stmt ctxt s2))])
+  | M.(AwaitE(T.Fut, { it = AsyncE (T.Fut, _, e); at; _ })) -> (* gross hack *)
+     let id = fresh_id "$message_async" in
+     let (!!) p = !!! (s.at) p in
+     let (!@) p = !!! at p in
+     ctxt.ghost_items :=
+       (fun ctxt ->
+         !!(FieldI (!!id, !!IntT))) ::
+       !(ctxt.ghost_items);
+     let mk_s = fun ctxt ->
+       !!! at
+         (FieldAssignS (
+            (self  ctxt s.at, !!id),
+            intLitE (s.at) 0))
+     in
+     ctxt.ghost_inits := mk_s :: !(ctxt.ghost_inits);
+     let mk_p = fun ctxt at ->
+       accE at (self ctxt at, !!! at id)
+     in
+     ctxt.ghost_perms := mk_p :: !(ctxt.ghost_perms);
+     let stmts = stmt ctxt e in
+     (* assume that each `async {...}` has an assertion *)
+     let conc, _ = extract_concurrency stmts in
+     let mk_c = match conc with
+       | [] ->
+         fun _ x -> x
+       | ConcurrencyS ("1", _, cond) :: _ ->
+         let (!?) p = !!! (cond.at) p in
+         let zero, one = intLitE Source.no_region 0, intLitE Source.no_region 1 in
+         fun ctxt x ->
+           let ghost_fld () = !?(FldAcc (self ctxt cond.at, !?id)) in
+           let between = !?(AndE (!?(LeCmpE (zero, ghost_fld ())), !?(LeCmpE (ghost_fld (), one)))) in
+           let is_one = !?(EqCmpE (ghost_fld (), one)) in
+           !?(AndE (x, !?(AndE (between, !?(Implies (is_one, cond.it (exp ctxt)))))))
+       | _ -> unsupported e.at (Arrange.exp e) in
+     ctxt.ghost_conc := mk_c :: !(ctxt.ghost_conc);
+     !!([],
+        [ !!(FieldAssignS(
+            (self ctxt Source.no_region, !!id),
+            (!!(AddE(!!(FldAcc (self ctxt (s.at), !!id)),
+                     intLitE Source.no_region 1)))));
+          !@(ExhaleS (!@(AndE(!@(MacroCall("$Perm", self ctxt at)),
+                              !@(MacroCall("$Inv", self ctxt at))))));
+          !@(SeqnS (
+              !@([],
+                 [
+                   !@(InhaleS (!@(AndE(!@(MacroCall("$Perm", self ctxt at)),
+                                  !@(AndE(!@(MacroCall("$Inv", self ctxt at)),
+                                          !@(GtCmpE(!@(FldAcc (self ctxt at, !@id)),
+                                               intLitE Source.no_region 0))))))));
+                   !@(FieldAssignS(
+                          (self ctxt at, !@id),
+                          (!@(SubE(!@(FldAcc (self ctxt at, !@id)),
+                                   intLitE at 1)))));
+                   !!! (e.at) (SeqnS stmts);
+                   !@(ExhaleS (!@(AndE(!@(MacroCall("$Perm", self ctxt at)),
+                                       !@(MacroCall("$Inv", self ctxt at)))))) ])));
+          !!(InhaleS (!!(AndE(!!(MacroCall("$Perm", self ctxt at)),
+                              !!(MacroCall("$Inv", self ctxt at))))));
+        ])
+  | M.WhileE(e, s1) ->
+     !!([],
+        [ !!(WhileS(exp ctxt e, [], stmt ctxt s1)) ]) (* TODO: Invariant *)
+  | M.(AssignE({it = VarE x; _}, e2)) ->
+     begin match Env.find x.it ctxt.ids with
+     | Local ->
+       let loc = !!! (x.at) (x.it) in
+       !!([],
+          [ !!(VarAssignS(loc, exp ctxt e2)) ])
+     | Field ->
+       let fld = (self ctxt x.at, id x) in
+       !!([],
+          [ !!(FieldAssignS(fld, exp ctxt e2)) ])
+     | _ ->
+        unsupported s.at (Arrange.exp s)
+     end
+  | M.AssertE (M.Precondition, e) ->
+    !!( [],
+        [ !!(PreconditionS (exp ctxt e)) ])
+  | M.AssertE (M.Postcondition, e) ->
+    !!([],
+       [ !!(PostconditionS (exp ctxt e)) ])
+  | M.AssertE (M.Concurrency n, e) ->
+    !!([],
+       [ !!(ConcurrencyS (n, exp ctxt e, !! ((|>) e))) ])
+  | M.AssertE (M.Static, e) ->
+    !!([],
+       [ !!(AssertS (exp ctxt e)) ])
+  | M.AssertE (M.Runtime, e) ->
+    !!([],
+       [ !!(AssumeS (exp ctxt e)) ])
+  | M.(CallE({it = VarE m; _}, inst, {it = TupE args; _})) ->
+    !!([],
+       [ !!(MethodCallS ([], id m,
+       let self_var = self ctxt m.at in
+       self_var :: List.map (fun arg -> exp ctxt arg) args))])
+  | _ ->
+     unsupported s.at (Arrange.exp s)
+
+and exp ctxt e =
+  let open Mo_values.Operator in
+  let (!!) p = !!! (e.at) p in
+  match e.it with
+  | M.VarE x ->
+    begin
+     match Env.find x.it ctxt.ids with
+     | Local ->
+        !!(LocalVar (id x, tr_typ e.note.M.note_typ))
+     | Field ->
+        !!(FldAcc (self ctxt x.at, id x))
+     | _ ->
+        unsupported e.at (Arrange.exp e)
+    end
+  | M.AnnotE(a, b) ->
+    exp ctxt a
+  | M.LitE r ->
+    begin match !r with
+    | M.BoolLit b ->
+       !!(BoolLitE b)
+    | M.IntLit i ->
+       !!(IntLitE i)
+    | _ ->
+       unsupported e.at (Arrange.exp e)
+    end
+  | M.NotE e ->
+     !!(NotE (exp ctxt e))
+  | M.RelE (ot, e1, op, e2) ->
+     let e1, e2 = exp ctxt e1, exp ctxt e2 in
+     !!(match op with
+      | EqOp -> EqCmpE (e1, e2)
+      | NeqOp -> NeCmpE (e1, e2)
+      | GtOp -> GtCmpE (e1, e2)
+      | GeOp -> GeCmpE (e1, e2)
+      | LtOp -> LtCmpE (e1, e2)
+      | LeOp -> LeCmpE (e1, e2))
+  | M.BinE (ot, e1, op, e2) ->
+     let e1, e2 = exp ctxt e1, exp ctxt e2 in
+     !!(match op with
+      | AddOp -> AddE (e1, e2)
+      | SubOp -> SubE (e1, e2)
+      | MulOp -> MulE (e1, e2)
+      | DivOp -> DivE (e1, e2)
+      | ModOp -> ModE (e1, e2)
+      | _ -> unsupported e.at (Arrange.exp e))
+  | M.OrE (e1, e2) ->
+     !!(OrE (exp ctxt e1, exp ctxt e2))
+  | M.AndE (e1, e2) ->
+     !!(AndE (exp ctxt e1, exp ctxt e2))
+  | M.ImpliesE (e1, e2) ->
+     !!(Implies (exp ctxt e1, exp ctxt e2))
+  | M.OldE e ->
+    !!(Old (exp ctxt e))
+  | _ ->
+     unsupported e.at (Arrange.exp e)
+
+and rets t_opt =
+  match t_opt with
+  | None -> []
+  | Some t ->
+    (match T.normalize t.note with
+     | T.Tup [] -> []
+     | T.Async (T.Fut, _, _) -> []
+     | _ -> unsupported t.at (Arrange.typ t)
+    )
+
+and id id = { it = id.it; at = id.at; note = NoInfo }
+
+and tr_typ typ =
+  { it = tr_typ' typ;
+    at = Source.no_region;
+    note = NoInfo }
+and tr_typ' typ =
+  match T.normalize typ with
+  | T.Prim T.Int -> IntT
+  | T.Prim T.Bool -> BoolT
+  | _ -> unsupported Source.no_region (Mo_types.Arrange_type.typ (T.normalize typ))
+
+
+
+ + + diff --git a/coverage/wasm-exts/abbreviation.ml.html b/coverage/wasm-exts/abbreviation.ml.html new file mode 100644 index 00000000000..d0520b19e54 --- /dev/null +++ b/coverage/wasm-exts/abbreviation.ml.html @@ -0,0 +1,560 @@ + + + + + abbreviation.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+
+

+(* pseudo-tags
+
+There can be several abbreviated DW_TAGs in the
+abbreviation table, each with a different attribute set.
+
+To refer to the duplicated tags, we use the bits above
+the 16 bits that are possible for DW_TAGs.
+
+A regular tag is just a pseudo-tag with an ordinal of 0.
+
+ *)
+
+let pseudo_tag base ordinal =
+  assert (base > 0 && base <= Dwarf5.dw_TAG_hi_user);
+  base lor (ordinal lsl 16)
+
+let dw_TAG_member_Pointer_mark = pseudo_tag Dwarf5.dw_TAG_member 1
+let dw_TAG_member_Word_sized_typed = pseudo_tag Dwarf5.dw_TAG_member 2
+let dw_TAG_member_Tag_mark = pseudo_tag Dwarf5.dw_TAG_member 3
+let dw_TAG_member_Variant_mark = pseudo_tag Dwarf5.dw_TAG_member 4
+let dw_TAG_member_In_variant = pseudo_tag Dwarf5.dw_TAG_member 5
+
+let dw_TAG_base_type_Anon = pseudo_tag Dwarf5.dw_TAG_base_type 1
+let dw_TAG_base_type_Unsigned_Anon = pseudo_tag Dwarf5.dw_TAG_base_type 2
+let dw_TAG_base_type_Unsigned_Bytes_Anon = pseudo_tag Dwarf5.dw_TAG_base_type 3
+
+let dw_TAG_variant_Named = pseudo_tag Dwarf5.dw_TAG_variant 1
+
+let dw_TAG_subprogram_Ret = pseudo_tag Dwarf5.dw_TAG_subprogram 1
+
+type dw_tag_id = int
+type dw_bool = int
+type dw_attr_id = int
+type dw_form = int
+
+type tag_to_contents_assoc = (dw_tag_id * dw_bool * (dw_attr_id * dw_form) list) list
+
+(* The following data associates the expected attribute sequence
+   (each with encoding form) and whether it is hierarchic with
+   each used tag identifier. It corresponds to the `.debug_abbrev`
+   section. *)
+let abbreviations : tag_to_contents_assoc =
+  let open Dwarf5 in
+  [ ( dw_TAG_compile_unit, dw_CHILDREN_yes,
+      [ dw_AT_producer, dw_FORM_strp;
+        dw_AT_language, dw_FORM_data2;
+        dw_AT_name, dw_FORM_strp;
+        dw_AT_stmt_list, dw_FORM_sec_offset;
+        dw_AT_comp_dir, dw_FORM_strp;
+        dw_AT_use_UTF8, dw_FORM_flag_present;
+        dw_AT_low_pc, dw_FORM_addr; (* TODO: dw_FORM_addrx? *)
+        dw_AT_addr_base, dw_FORM_sec_offset;
+        dw_AT_ranges, dw_FORM_sec_offset
+      ] );
+    ( dw_TAG_subprogram, dw_CHILDREN_yes,
+      [ dw_AT_low_pc, dw_FORM_addrx;
+        dw_AT_high_pc, dw_FORM_data4(*FIXME*);
+         (* dw_AT_GNU_all_call_sites, dw_FORM_flag_present; *)
+        dw_AT_name, dw_FORM_strp;
+        dw_AT_decl_file, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_line, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_column, dw_FORM_data1(*FIXME*);
+        dw_AT_prototyped, dw_FORM_flag_present;
+        dw_AT_external, dw_FORM_flag(*_present*)
+      ] );
+    ( dw_TAG_subprogram_Ret, dw_CHILDREN_yes,
+      [ dw_AT_low_pc, dw_FORM_addrx;
+        dw_AT_high_pc, dw_FORM_data4(*FIXME*);
+         (* dw_AT_GNU_all_call_sites, dw_FORM_flag_present; *)
+        dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_decl_file, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_line, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_column, dw_FORM_data1(*FIXME*);
+        dw_AT_prototyped, dw_FORM_flag_present;
+        dw_AT_external, dw_FORM_flag(*_present*)
+      ] );
+    ( dw_TAG_formal_parameter, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_decl_line, dw_FORM_data1;
+        dw_AT_decl_column, dw_FORM_data1;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_location, dw_FORM_exprloc
+      ] );
+    ( dw_TAG_lexical_block, dw_CHILDREN_yes,
+      [ dw_AT_low_pc, dw_FORM_addr; (* filled-in by tag open *)
+        dw_AT_decl_line, dw_FORM_data1(*FIXME*);
+        dw_AT_decl_column, dw_FORM_data1(*FIXME*);
+        dw_AT_high_pc, dw_FORM_addr (* filled-in by tag close *)
+      ] );
+    ( dw_TAG_variable, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_decl_line, dw_FORM_data1;
+        dw_AT_decl_column, dw_FORM_data1;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_location, dw_FORM_exprloc
+      ] );
+    ( dw_TAG_typedef, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref4
+      ] );
+    ( dw_TAG_base_type, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1;
+        dw_AT_encoding, dw_FORM_data1
+      ] );
+    ( dw_TAG_base_type_Anon, dw_CHILDREN_no,
+      [ dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1
+      ] );
+    ( dw_TAG_base_type_Unsigned_Anon, dw_CHILDREN_no,
+      [ dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1;
+        dw_AT_encoding, dw_FORM_data1
+      ] );
+    ( dw_TAG_base_type_Unsigned_Bytes_Anon, dw_CHILDREN_no,
+      [ dw_AT_byte_size, dw_FORM_data1;
+        dw_AT_encoding, dw_FORM_data1
+      ] );
+    ( dw_TAG_pointer_type, dw_CHILDREN_no, (* TODO: use dw_TAG_reference_type *)
+      [ dw_AT_type, dw_FORM_ref_udata
+      ] );
+    ( dw_TAG_reference_type, dw_CHILDREN_no, (* TODO: BETTER: DW_TAG_rvalue_reference_type *)
+      [ dw_AT_type, dw_FORM_ref_udata
+      ] );
+    ( dw_TAG_structure_type, dw_CHILDREN_yes,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_byte_size, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Pointer_mark, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_artificial, dw_FORM_flag_present;
+        dw_AT_bit_size, dw_FORM_data1;
+        dw_AT_data_bit_offset, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Tag_mark, dw_CHILDREN_no,
+      [ dw_AT_artificial, dw_FORM_flag_present;
+        dw_AT_byte_size, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Variant_mark, dw_CHILDREN_no,
+      [ dw_AT_artificial, dw_FORM_flag_present;
+        dw_AT_byte_size, dw_FORM_data1;
+        dw_AT_data_member_location, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_Word_sized_typed, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_byte_size, dw_FORM_data1
+      ] );
+    ( dw_TAG_member_In_variant, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_type, dw_FORM_ref_udata;
+        dw_AT_data_member_location, dw_FORM_data1
+      ] );
+    ( dw_TAG_variant_part, dw_CHILDREN_yes,
+      [ dw_AT_discr, dw_FORM_ref_udata
+      ] );
+    ( dw_TAG_variant, dw_CHILDREN_yes,
+      [ dw_AT_discr_value, dw_FORM_data1
+      ] );
+    ( dw_TAG_variant_Named, dw_CHILDREN_yes,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_discr_value, dw_FORM_data4
+      ] );
+    ( dw_TAG_enumeration_type, dw_CHILDREN_yes,
+      [ dw_AT_artificial, dw_FORM_flag_present (* to avoid elimination *)
+      ] );
+    ( dw_TAG_enumerator, dw_CHILDREN_no,
+      [ dw_AT_name, dw_FORM_strp;
+        dw_AT_const_value, dw_FORM_data4
+      ] )
+  ]
+
+
+
+ + + diff --git a/coverage/wasm-exts/ast.ml.html b/coverage/wasm-exts/ast.ml.html new file mode 100644 index 00000000000..ac8169e7a41 --- /dev/null +++ b/coverage/wasm-exts/ast.ml.html @@ -0,0 +1,972 @@ + + + + + ast.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+
+
(*
+This module originated as a copy of interpreter/syntax/ast.ml in the
+reference implementation.
+
+Base revision: WebAssembly/spec@a7a1856.
+
+The changes are:
+ * Pseudo-instruction Meta for debug information
+ * StableMemory, StableGrow, StableRead, StableWrite instructions.
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+*)
+
+(*
+ * Throughout the implementation we use consistent naming conventions for
+ * syntactic elements, associated with the types defined here and in a few
+ * other places:
+ *
+ *   x : var
+ *   v : value
+ *   e : instr
+ *   f : func
+ *   m : module_
+ *
+ *   t : value_type
+ *   s : func_type
+ *   c : context / config
+ *
+ * These conventions mostly follow standard practice in language semantics.
+ *)
+
+open Wasm.Types
+module Values = Wasm.Values
+module Memory = Wasm.Memory
+open Wasm.Source
+
+
+(* Operators *)
+
+module IntOp =
+struct
+  type unop = Clz | Ctz | Popcnt | ExtendS of pack_size
+  type binop = Add | Sub | Mul | DivS | DivU | RemS | RemU
+             | And | Or | Xor | Shl | ShrS | ShrU | Rotl | Rotr
+  type testop = Eqz
+  type relop = Eq | Ne | LtS | LtU | GtS | GtU | LeS | LeU | GeS | GeU
+  type cvtop = ExtendSI32 | ExtendUI32 | WrapI64
+             | TruncSF32 | TruncUF32 | TruncSF64 | TruncUF64
+             | TruncSatSF32 | TruncSatUF32 | TruncSatSF64 | TruncSatUF64
+             | ReinterpretFloat
+end
+
+module FloatOp =
+struct
+  type unop = Neg | Abs | Ceil | Floor | Trunc | Nearest | Sqrt
+  type binop = Add | Sub | Mul | Div | Min | Max | CopySign
+  type testop
+  type relop = Eq | Ne | Lt | Gt | Le | Ge
+  type cvtop = ConvertSI32 | ConvertUI32 | ConvertSI64 | ConvertUI64
+             | PromoteF32 | DemoteF64
+             | ReinterpretInt
+end
+
+module I32Op = IntOp
+module I64Op = IntOp
+module F32Op = FloatOp
+module F64Op = FloatOp
+
+type unop = (I32Op.unop, I64Op.unop, F32Op.unop, F64Op.unop) Values.op
+type binop = (I32Op.binop, I64Op.binop, F32Op.binop, F64Op.binop) Values.op
+type testop = (I32Op.testop, I64Op.testop, F32Op.testop, F64Op.testop) Values.op
+type relop = (I32Op.relop, I64Op.relop, F32Op.relop, F64Op.relop) Values.op
+type cvtop = (I32Op.cvtop, I64Op.cvtop, F32Op.cvtop, F64Op.cvtop) Values.op
+
+type 'a memop =
+  {ty : value_type; align : int; offset : Memory.offset; sz : 'a option}
+type loadop = (pack_size * extension) memop
+type storeop = pack_size memop
+
+
+(* Expressions *)
+
+type var = int32 phrase
+type literal = Values.value phrase
+type name = int list
+
+type block_type = VarBlockType of var | ValBlockType of value_type option
+
+type instr = instr' phrase
+and instr' =
+  | Unreachable                       (* trap unconditionally *)
+  | Nop                               (* do nothing *)
+  | Drop                              (* forget a value *)
+  | Select                            (* branchless conditional *)
+  | Block of block_type * instr list  (* execute in sequence *)
+  | Loop of block_type * instr list   (* loop header *)
+  | If of block_type * instr list * instr list  (* conditional *)
+  | Br of var                         (* break to n-th surrounding label *)
+  | BrIf of var                       (* conditional break *)
+  | BrTable of var list * var         (* indexed break *)
+  | Return                            (* break from function body *)
+  | Call of var                       (* call function *)
+  | CallIndirect of var               (* call function through table *)
+  | LocalGet of var                   (* read local variable *)
+  | LocalSet of var                   (* write local variable *)
+  | LocalTee of var                   (* write local variable and keep value *)
+  | GlobalGet of var                  (* read global variable *)
+  | GlobalSet of var                  (* write global variable *)
+  | Load of loadop                    (* read memory at address *)
+  | Store of storeop                  (* write memory at address *)
+  | MemorySize                        (* size of linear memory *)
+  | MemoryGrow                        (* grow linear memory *)
+  | Const of literal                  (* constant *)
+  | Test of testop                    (* numeric test *)
+  | Compare of relop                  (* numeric comparison *)
+  | Unary of unop                     (* unary numeric operator *)
+  | Binary of binop                   (* binary numeric operator *)
+  | Convert of cvtop                  (* conversion *)
+
+  (* Custom addition for debugging *)
+  | Meta of Dwarf5.Meta.die           (* debugging metadata *)
+
+  (* Custom additions for emulating stable-memory, special cases
+     of MemorySize, MemoryGrow and MemoryCopy
+     requiring wasm features bulk-memory and multi-memory
+  *)
+  | StableSize                        (* size of stable memory *)
+  | StableGrow                        (* grow stable memory *)
+  | StableRead                        (* read from stable memory *)
+  | StableWrite                       (* write to stable memory *)
+
+(* Globals & Functions *)
+
+type const = instr list phrase
+
+type global = global' phrase
+and global' =
+{
+  gtype : global_type;
+  value : const;
+}
+
+type func = func' phrase
+and func' =
+{
+  ftype : var;
+  locals : value_type list;
+  body : instr list;
+}
+
+
+(* Tables & Memories *)
+
+type table = table' phrase
+and table' =
+{
+  ttype : table_type;
+}
+
+type memory = memory' phrase
+and memory' =
+{
+  mtype : memory_type;
+}
+
+type 'data segment = 'data segment' phrase
+and 'data segment' =
+{
+  index : var;
+  offset : const;
+  init : 'data;
+}
+
+type table_segment = var list segment
+type memory_segment = string segment
+
+
+(* Modules *)
+
+type type_ = func_type phrase
+
+type export_desc = export_desc' phrase
+and export_desc' =
+  | FuncExport of var
+  | TableExport of var
+  | MemoryExport of var
+  | GlobalExport of var
+
+type export = export' phrase
+and export' =
+{
+  name : name;
+  edesc : export_desc;
+}
+
+type import_desc = import_desc' phrase
+and import_desc' =
+  | FuncImport of var
+  | TableImport of table_type
+  | MemoryImport of memory_type
+  | GlobalImport of global_type
+
+type import = import' phrase
+and import' =
+{
+  module_name : name;
+  item_name : name;
+  idesc : import_desc;
+}
+
+type module_ = module_' phrase
+and module_' =
+{
+  types : type_ list;
+  globals : global list;
+  tables : table list;
+  memories : memory list;
+  funcs : func list;
+  start : var option;
+  elems : var list segment list;
+  data : string segment list;
+  imports : import list;
+  exports : export list;
+}
+
+
+(* Auxiliary functions *)
+
+let empty_module =
+{
+  types = [];
+  globals = [];
+  tables = [];
+  memories = [];
+  funcs = [];
+  start = None;
+  elems  = [];
+  data = [];
+  imports = [];
+  exports = [];
+}
+
+
+let func_type_for (m : module_) (x : var) : func_type =
+  (Lib.List32.nth m.it.types x.it).it
+
+let import_type (m : module_) (im : import) : extern_type =
+  let {idesc; _} = im.it in
+  match idesc.it with
+  | FuncImport x -> ExternFuncType (func_type_for m x)
+  | TableImport t -> ExternTableType t
+  | MemoryImport t -> ExternMemoryType t
+  | GlobalImport t -> ExternGlobalType t
+
+let export_type (m : module_) (ex : export) : extern_type =
+  let {edesc; _} = ex.it in
+  let its = List.map (import_type m) m.it.imports in
+  let open Lib.List32 in
+  match edesc.it with
+  | FuncExport x ->
+    let fts =
+      funcs its @ List.map (fun f -> func_type_for m f.it.ftype) m.it.funcs
+    in ExternFuncType (nth fts x.it)
+  | TableExport x ->
+    let tts = tables its @ List.map (fun t -> t.it.ttype) m.it.tables in
+    ExternTableType (nth tts x.it)
+  | MemoryExport x ->
+    let mts = memories its @ List.map (fun m -> m.it.mtype) m.it.memories in
+    ExternMemoryType (nth mts x.it)
+  | GlobalExport x ->
+    let gts = globals its @ List.map (fun g -> g.it.gtype) m.it.globals in
+    ExternGlobalType (nth gts x.it)
+
+let string_of_name n =
+  let b = Buffer.create 16 in
+  let escape uc =
+    if uc < 0x20 || uc >= 0x7f then
+      Buffer.add_string b (Printf.sprintf "\\u{%02x}" uc)
+    else begin
+      let c = Char.chr uc in
+      if c = '\"' || c = '\\' then Buffer.add_char b '\\';
+      Buffer.add_char b c
+    end
+  in
+  List.iter escape n;
+  Buffer.contents b
+
+(* is_dwarf_like indicates whether an AST meta instruction
+   prevents dead-code elimination. Elimination is forbidden,
+   if the instruction contributes to a DIE, i.e. establishes, augments
+   or closes a DWARF Tag.
+ *)
+let rec is_dwarf_like' =
+  let open Dwarf5.Meta in
+  function
+  | Tag _ | TagClose | IntAttribute _ | StringAttribute _ | OffsetAttribute _ -> true
+  | Grouped parts -> List.exists is_dwarf_like' parts
+  | StatementDelimiter _ | FutureAttribute _ -> false
+let is_dwarf_like = function
+  | Meta m -> is_dwarf_like' m
+  | _ -> false
+
+
+
+
+ + + diff --git a/coverage/wasm-exts/customModule.ml.html b/coverage/wasm-exts/customModule.ml.html new file mode 100644 index 00000000000..dfb53ff5496 --- /dev/null +++ b/coverage/wasm-exts/customModule.ml.html @@ -0,0 +1,266 @@ + + + + + customModule.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+
+
(* Extend the idea of a module as defined in Wasm.Syntax
+   with custom sections that we are interested in
+*)
+
+open Ast
+
+type name_section = {
+  module_ : string option;
+  function_names : (int32 * string) list;
+  locals_names : (int32 * (int32 * string) list) list;
+  label_names : (int32 * (int32 * string) list) list;
+  type_names : (int32 * string) list;
+  table_names : (int32 * string) list;
+  memory_names : (int32 * string) list;
+  global_names : (int32 * string) list;
+  elem_segment_names : (int32 * string) list;
+  data_segment_names : (int32 * string) list;
+}
+
+let empty_name_section : name_section = {
+  module_ = None;
+  function_names = [];
+  locals_names = [];
+  label_names = [];
+  type_names = [];
+  table_names = [];
+  memory_names = [];
+  global_names = [];
+  elem_segment_names = [];
+  data_segment_names = [];
+}
+
+type dylink_section = {
+  memory_size : int32;
+  memory_alignment : int32;
+  table_size : int32;
+  table_alignment : int32;
+  needed_dynlibs : string list;
+}
+
+type motoko_sections = {
+  labels : string list;
+  stable_types : (bool * string) option;
+  compiler : (bool * string) option;
+}
+
+type candid_sections = {
+  args : (bool * string) option;
+  service : (bool * string) option;
+}
+
+let empty_motoko_sections = {
+  labels = [];
+  stable_types = None;
+  compiler = None;
+}
+
+let empty_candid_sections = {
+  args = None;
+  service = None;
+}
+
+type extended_module = {
+  (* The non-custom sections *)
+  module_ : module_';
+  (* name section *)
+  name : name_section;
+  (* dylib section *)
+  dylink : dylink_section option;
+  (* candid sections *)
+  candid : candid_sections;
+  (* motoko sections *)
+  motoko : motoko_sections;
+  (* source map section *)
+  source_mapping_url : string option;
+  wasm_features : string list;
+}
+
+
+
+ + + diff --git a/coverage/wasm-exts/customModuleDecode.ml.html b/coverage/wasm-exts/customModuleDecode.ml.html new file mode 100644 index 00000000000..96102f4dcef --- /dev/null +++ b/coverage/wasm-exts/customModuleDecode.ml.html @@ -0,0 +1,2987 @@ + + + + + customModuleDecode.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+
+
(*
+This module originated as a copy of interpreter/binary/encode.ml in the
+reference implementation.
+
+The changes are:
+ * Support for additional custom sections
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+
+TODO:
+ The treatment of known custom sections is suboptimal and assumes
+ they appear once, in a fixed relative order.
+ It would be better to just rescan the whole binary for each such section,
+ re-using the original custom section decoder from the reference implementation.
+*)
+
+module Error = Wasm.Error
+module Source = Wasm.Source
+module I32 = Wasm.I32
+module I64 = Wasm.I64
+module F32 = Wasm.F32
+module F64 = Wasm.F64
+module I32_convert = Wasm.I32_convert
+module I64_convert = Wasm.I64_convert
+module Utf8 = Lib.Utf8
+open CustomModule
+
+(* Decoding stream *)
+
+type stream =
+{
+  name : string;
+  bytes : string;
+  pos : int ref;
+}
+
+exception EOS
+
+let stream name bs = {name; bytes = bs; pos = ref 0}
+
+let len s = String.length s.bytes
+let pos s = !(s.pos)
+let eos s = (pos s = len s)
+
+let check n s = if pos s + n > len s then raise EOS
+let skip n s = if n < 0 then raise EOS else check n s; s.pos := !(s.pos) + n
+
+let read s = Char.code (s.bytes.[!(s.pos)])
+let peek s = if eos s then None else Some (read s)
+let get s = check 1 s; let b = read s in skip 1 s; b
+let get_string n s = let i = pos s in skip n s; String.sub s.bytes i n
+
+let checkpoint s = let p = !(s.pos) in fun () -> s.pos := p
+
+
+(* Errors *)
+
+module Code = Error.Make ()
+exception Code = Code.Error
+
+let string_of_byte b = Printf.sprintf "%02x" b
+
+let position (s : stream) pos = Source.({file = s.name; line = -1; column = pos})
+let region s left right =
+  Source.({left = position s left; right = position s right})
+
+let error s pos msg = raise (Code (region s pos pos, msg))
+let require b s pos msg = if not b then error s pos msg
+
+let guard f s =
+  try f s with EOS -> error s (len s) "unexpected end of section or function"
+
+let get = guard get
+let get_string n = guard (get_string n)
+let skip n = guard (skip n)
+
+let expect b s msg = require (guard get s = b) s (pos s - 1) msg
+let illegal s pos b = error s pos ("illegal opcode " ^ string_of_byte b)
+
+let at f s =
+  let left = pos s in
+  let x = f s in
+  let right = pos s in
+  Source.(x @@ region s left right)
+
+
+
+(* Generic values *)
+
+let u8 s =
+  get s
+
+let u16 s =
+  let lo = u8 s in
+  let hi = u8 s in
+  hi lsl 8 + lo
+
+let u32 s =
+  let lo = Int32.of_int (u16 s) in
+  let hi = Int32.of_int (u16 s) in
+  Int32.(add lo (shift_left hi 16))
+
+let u64 s =
+  let lo = I64_convert.extend_i32_u (u32 s) in
+  let hi = I64_convert.extend_i32_u (u32 s) in
+  Int64.(add lo (shift_left hi 32))
+
+let rec vuN n s =
+  require (n > 0) s (pos s) "integer representation too long";
+  let b = u8 s in
+  require (n >= 7 || b land 0x7f < 1 lsl n) s (pos s - 1) "integer too large";
+  let x = Int64.of_int (b land 0x7f) in
+  if b land 0x80 = 0 then x else Int64.(logor x (shift_left (vuN (n - 7) s) 7))
+
+let rec vsN n s =
+  require (n > 0) s (pos s) "integer representation too long";
+  let b = u8 s in
+  let mask = (-1 lsl (n - 1)) land 0x7f in
+  require (n >= 7 || b land mask = 0 || b land mask = mask) s (pos s - 1)
+    "integer too large";
+  let x = Int64.of_int (b land 0x7f) in
+  if b land 0x80 = 0
+  then (if b land 0x40 = 0 then x else Int64.(logor x (logxor (-1L) 0x7fL)))
+  else Int64.(logor x (shift_left (vsN (n - 7) s) 7))
+
+let vu1 s = Int64.to_int (vuN 1 s)
+let vu32 s = Int64.to_int32 (vuN 32 s)
+let vs7 s = Int64.to_int (vsN 7 s)
+let vs32 s = Int64.to_int32 (vsN 32 s)
+let vs33 s = I32_convert.wrap_i64 (vsN 33 s)
+let vs64 s = vsN 64 s
+let f32 s = F32.of_bits (u32 s)
+let f64 s = F64.of_bits (u64 s)
+
+let len32 s =
+  let pos = pos s in
+  let n = vu32 s in
+  if I32.le_u n (Int32.of_int (len s)) then Int32.to_int n else
+    error s pos "length out of bounds"
+
+let bool s = (vu1 s = 1)
+let string s = let n = len32 s in get_string n s
+let rec list f n s = if n = 0 then [] else let x = f s in x :: list f (n - 1) s
+let opt f b s = if b then Some (f s) else None
+let vec f s = let n = len32 s in list f n s
+
+let name s =
+  let pos = pos s in
+  try Utf8.decode (string s) with Utf8.Utf8 ->
+    error s pos "malformed UTF-8 encoding"
+
+let sized (f : int -> stream -> 'a) (s : stream) =
+  let size = len32 s in
+  let start = pos s in
+  let x = f size s in
+  require (pos s = start + size) s start "section size mismatch";
+  x
+
+
+(* Types *)
+
+open Wasm.Types
+
+let value_type s =
+  match vs7 s with
+  | -0x01 -> I32Type
+  | -0x02 -> I64Type
+  | -0x03 -> F32Type
+  | -0x04 -> F64Type
+  | _ -> error s (pos s - 1) "malformed value type"
+
+let elem_type s =
+  match vs7 s with
+  | -0x10 -> FuncRefType
+  | _ -> error s (pos s - 1) "malformed element type"
+
+let stack_type s = vec value_type s
+let func_type s =
+  match vs7 s with
+  | -0x20 ->
+    let ins = stack_type s in
+    let out = stack_type s in
+    FuncType (ins, out)
+  | _ -> error s (pos s - 1) "malformed function type"
+
+let limits vu s =
+  let has_max = bool s in
+  let min = vu s in
+  let max = opt vu has_max s in
+  {min; max}
+
+let table_type s =
+  let t = elem_type s in
+  let lim = limits vu32 s in
+  TableType (lim, t)
+
+let memory_type s =
+  let lim = limits vu32 s in
+  MemoryType lim
+
+let mutability s =
+  match u8 s with
+  | 0 -> Immutable
+  | 1 -> Mutable
+  | _ -> error s (pos s - 1) "malformed mutability"
+
+let global_type s =
+  let t = value_type s in
+  let mut = mutability s in
+  GlobalType (t, mut)
+
+
+(* Decode instructions *)
+
+open Ast
+open Operators
+
+let var s = vu32 s
+
+let op s = u8 s
+let end_ s = expect 0x0b s "END opcode expected"
+
+let memop s =
+  let align = vu32 s in
+  require (I32.le_u align 32l) s (pos s - 1) "malformed memop flags";
+  let offset = vu32 s in
+  Int32.to_int align, offset
+
+let block_type s =
+  match peek s with
+  | Some 0x40 -> skip 1 s; ValBlockType None
+  | Some b when b land 0xc0 = 0x40 -> ValBlockType (Some (value_type s))
+  | _ -> VarBlockType (at vs33 s)
+
+let math_prefix s =
+  let pos = pos s in
+  match op s with
+  | 0x00 -> i32_trunc_sat_f32_s
+  | 0x01 -> i32_trunc_sat_f32_u
+  | 0x02 -> i32_trunc_sat_f64_s
+  | 0x03 -> i32_trunc_sat_f64_u
+  | 0x04 -> i64_trunc_sat_f32_s
+  | 0x05 -> i64_trunc_sat_f32_u
+  | 0x06 -> i64_trunc_sat_f64_s
+  | 0x07 -> i64_trunc_sat_f64_u
+  | b -> illegal s pos b
+
+let rec instr s =
+  let pos = pos s in
+  match op s with
+  | 0x00 -> unreachable
+  | 0x01 -> nop
+
+  | 0x02 ->
+    let bt = block_type s in
+    let es' = instr_block s in
+    end_ s;
+    block bt es'
+  | 0x03 ->
+    let bt = block_type s in
+    let es' = instr_block s in
+    end_ s;
+    loop bt es'
+  | 0x04 ->
+    let bt = block_type s in
+    let es1 = instr_block s in
+    if peek s = Some 0x05 then begin
+      expect 0x05 s "ELSE or END opcode expected";
+      let es2 = instr_block s in
+      end_ s;
+      if_ bt es1 es2
+    end else begin
+      end_ s;
+      if_ bt es1 []
+    end
+
+  | 0x05 -> error s pos "misplaced ELSE opcode"
+  | 0x06| 0x07 | 0x08 | 0x09 | 0x0a as b -> illegal s pos b
+  | 0x0b -> error s pos "misplaced END opcode"
+
+  | 0x0c -> br (at var s)
+  | 0x0d -> br_if (at var s)
+  | 0x0e ->
+    let xs = vec (at var) s in
+    let x = at var s in
+    br_table xs x
+  | 0x0f -> return
+
+  | 0x10 -> call (at var s)
+  | 0x11 ->
+    let x = at var s in
+    expect 0x00 s "zero flag expected";
+    call_indirect x
+
+  | 0x12 | 0x13 | 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 as b -> illegal s pos b
+
+  | 0x1a -> drop
+  | 0x1b -> select
+
+  | 0x1c | 0x1d | 0x1e | 0x1f as b -> illegal s pos b
+
+  | 0x20 -> local_get (at var s)
+  | 0x21 -> local_set (at var s)
+  | 0x22 -> local_tee (at var s)
+  | 0x23 -> global_get (at var s)
+  | 0x24 -> global_set (at var s)
+
+  | 0x25 | 0x26 | 0x27 as b -> illegal s pos b
+
+  | 0x28 -> let a, o = memop s in i32_load a o
+  | 0x29 -> let a, o = memop s in i64_load a o
+  | 0x2a -> let a, o = memop s in f32_load a o
+  | 0x2b -> let a, o = memop s in f64_load a o
+  | 0x2c -> let a, o = memop s in i32_load8_s a o
+  | 0x2d -> let a, o = memop s in i32_load8_u a o
+  | 0x2e -> let a, o = memop s in i32_load16_s a o
+  | 0x2f -> let a, o = memop s in i32_load16_u a o
+  | 0x30 -> let a, o = memop s in i64_load8_s a o
+  | 0x31 -> let a, o = memop s in i64_load8_u a o
+  | 0x32 -> let a, o = memop s in i64_load16_s a o
+  | 0x33 -> let a, o = memop s in i64_load16_u a o
+  | 0x34 -> let a, o = memop s in i64_load32_s a o
+  | 0x35 -> let a, o = memop s in i64_load32_u a o
+
+  | 0x36 -> let a, o = memop s in i32_store a o
+  | 0x37 -> let a, o = memop s in i64_store a o
+  | 0x38 -> let a, o = memop s in f32_store a o
+  | 0x39 -> let a, o = memop s in f64_store a o
+  | 0x3a -> let a, o = memop s in i32_store8 a o
+  | 0x3b -> let a, o = memop s in i32_store16 a o
+  | 0x3c -> let a, o = memop s in i64_store8 a o
+  | 0x3d -> let a, o = memop s in i64_store16 a o
+  | 0x3e -> let a, o = memop s in i64_store32 a o
+
+  | 0x3f ->
+    expect 0x00 s "zero flag expected";
+    memory_size
+  | 0x40 ->
+    expect 0x00 s "zero flag expected";
+    memory_grow
+
+  | 0x41 -> i32_const (at vs32 s)
+  | 0x42 -> i64_const (at vs64 s)
+  | 0x43 -> f32_const (at f32 s)
+  | 0x44 -> f64_const (at f64 s)
+
+  | 0x45 -> i32_eqz
+  | 0x46 -> i32_eq
+  | 0x47 -> i32_ne
+  | 0x48 -> i32_lt_s
+  | 0x49 -> i32_lt_u
+  | 0x4a -> i32_gt_s
+  | 0x4b -> i32_gt_u
+  | 0x4c -> i32_le_s
+  | 0x4d -> i32_le_u
+  | 0x4e -> i32_ge_s
+  | 0x4f -> i32_ge_u
+
+  | 0x50 -> i64_eqz
+  | 0x51 -> i64_eq
+  | 0x52 -> i64_ne
+  | 0x53 -> i64_lt_s
+  | 0x54 -> i64_lt_u
+  | 0x55 -> i64_gt_s
+  | 0x56 -> i64_gt_u
+  | 0x57 -> i64_le_s
+  | 0x58 -> i64_le_u
+  | 0x59 -> i64_ge_s
+  | 0x5a -> i64_ge_u
+
+  | 0x5b -> f32_eq
+  | 0x5c -> f32_ne
+  | 0x5d -> f32_lt
+  | 0x5e -> f32_gt
+  | 0x5f -> f32_le
+  | 0x60 -> f32_ge
+
+  | 0x61 -> f64_eq
+  | 0x62 -> f64_ne
+  | 0x63 -> f64_lt
+  | 0x64 -> f64_gt
+  | 0x65 -> f64_le
+  | 0x66 -> f64_ge
+
+  | 0x67 -> i32_clz
+  | 0x68 -> i32_ctz
+  | 0x69 -> i32_popcnt
+  | 0x6a -> i32_add
+  | 0x6b -> i32_sub
+  | 0x6c -> i32_mul
+  | 0x6d -> i32_div_s
+  | 0x6e -> i32_div_u
+  | 0x6f -> i32_rem_s
+  | 0x70 -> i32_rem_u
+  | 0x71 -> i32_and
+  | 0x72 -> i32_or
+  | 0x73 -> i32_xor
+  | 0x74 -> i32_shl
+  | 0x75 -> i32_shr_s
+  | 0x76 -> i32_shr_u
+  | 0x77 -> i32_rotl
+  | 0x78 -> i32_rotr
+
+  | 0x79 -> i64_clz
+  | 0x7a -> i64_ctz
+  | 0x7b -> i64_popcnt
+  | 0x7c -> i64_add
+  | 0x7d -> i64_sub
+  | 0x7e -> i64_mul
+  | 0x7f -> i64_div_s
+  | 0x80 -> i64_div_u
+  | 0x81 -> i64_rem_s
+  | 0x82 -> i64_rem_u
+  | 0x83 -> i64_and
+  | 0x84 -> i64_or
+  | 0x85 -> i64_xor
+  | 0x86 -> i64_shl
+  | 0x87 -> i64_shr_s
+  | 0x88 -> i64_shr_u
+  | 0x89 -> i64_rotl
+  | 0x8a -> i64_rotr
+
+  | 0x8b -> f32_abs
+  | 0x8c -> f32_neg
+  | 0x8d -> f32_ceil
+  | 0x8e -> f32_floor
+  | 0x8f -> f32_trunc
+  | 0x90 -> f32_nearest
+  | 0x91 -> f32_sqrt
+  | 0x92 -> f32_add
+  | 0x93 -> f32_sub
+  | 0x94 -> f32_mul
+  | 0x95 -> f32_div
+  | 0x96 -> f32_min
+  | 0x97 -> f32_max
+  | 0x98 -> f32_copysign
+
+  | 0x99 -> f64_abs
+  | 0x9a -> f64_neg
+  | 0x9b -> f64_ceil
+  | 0x9c -> f64_floor
+  | 0x9d -> f64_trunc
+  | 0x9e -> f64_nearest
+  | 0x9f -> f64_sqrt
+  | 0xa0 -> f64_add
+  | 0xa1 -> f64_sub
+  | 0xa2 -> f64_mul
+  | 0xa3 -> f64_div
+  | 0xa4 -> f64_min
+  | 0xa5 -> f64_max
+  | 0xa6 -> f64_copysign
+
+  | 0xa7 -> i32_wrap_i64
+  | 0xa8 -> i32_trunc_f32_s
+  | 0xa9 -> i32_trunc_f32_u
+  | 0xaa -> i32_trunc_f64_s
+  | 0xab -> i32_trunc_f64_u
+  | 0xac -> i64_extend_i32_s
+  | 0xad -> i64_extend_i32_u
+  | 0xae -> i64_trunc_f32_s
+  | 0xaf -> i64_trunc_f32_u
+  | 0xb0 -> i64_trunc_f64_s
+  | 0xb1 -> i64_trunc_f64_u
+  | 0xb2 -> f32_convert_i32_s
+  | 0xb3 -> f32_convert_i32_u
+  | 0xb4 -> f32_convert_i64_s
+  | 0xb5 -> f32_convert_i64_u
+  | 0xb6 -> f32_demote_f64
+  | 0xb7 -> f64_convert_i32_s
+  | 0xb8 -> f64_convert_i32_u
+  | 0xb9 -> f64_convert_i64_s
+  | 0xba -> f64_convert_i64_u
+  | 0xbb -> f64_promote_f32
+
+  | 0xbc -> i32_reinterpret_f32
+  | 0xbd -> i64_reinterpret_f64
+  | 0xbe -> f32_reinterpret_i32
+  | 0xbf -> f64_reinterpret_i64
+
+  | 0xc0 -> i32_extend8_s
+  | 0xc1 -> i32_extend16_s
+  | 0xc2 -> i64_extend8_s
+  | 0xc3 -> i64_extend16_s
+  | 0xc4 -> i64_extend32_s
+
+  | 0xfc -> math_prefix s
+
+  | b -> illegal s pos b
+
+and instr_block s = List.rev (instr_block' s [])
+and instr_block' s es =
+  match peek s with
+  | None | Some (0x05 | 0x0b) -> es
+  | _ ->
+    let pos = pos s in
+    let e' = instr s in
+    instr_block' s (Source.(e' @@ region s pos pos) :: es)
+
+let const s =
+  let c = at instr_block s in
+  end_ s;
+  c
+
+
+(* Sections *)
+
+let id s =
+  let bo = peek s in
+  Option.map
+    (function
+    | 0 -> `CustomSection
+    | 1 -> `TypeSection
+    | 2 -> `ImportSection
+    | 3 -> `FuncSection
+    | 4 -> `TableSection
+    | 5 -> `MemorySection
+    | 6 -> `GlobalSection
+    | 7 -> `ExportSection
+    | 8 -> `StartSection
+    | 9 -> `ElemSection
+    | 10 -> `CodeSection
+    | 11 -> `DataSection
+    | _ -> error s (pos s) "malformed section id"
+    ) bo
+
+let section_with_size tag f default s =
+  match id s with
+  | Some tag' when tag' = tag -> ignore (u8 s); sized f s
+  | _ -> default
+
+let section tag f default s =
+  section_with_size tag (fun _ -> f) default s
+
+
+(* Type section *)
+
+let type_ s = at func_type s
+
+let type_section s =
+  section `TypeSection (vec type_) [] s
+
+
+(* Import section *)
+
+let import_desc s =
+  match u8 s with
+  | 0x00 -> FuncImport (at var s)
+  | 0x01 -> TableImport (table_type s)
+  | 0x02 -> MemoryImport (memory_type s)
+  | 0x03 -> GlobalImport (global_type s)
+  | _ -> error s (pos s - 1) "malformed import kind"
+
+let import s =
+  let module_name = name s in
+  let item_name = name s in
+  let idesc = at import_desc s in
+  {module_name; item_name; idesc}
+
+let import_section s =
+  section `ImportSection (vec (at import)) [] s
+
+
+(* Function section *)
+
+let func_section s =
+  section `FuncSection (vec (at var)) [] s
+
+
+(* Table section *)
+
+let table s =
+  let ttype = table_type s in
+  {ttype}
+
+let table_section s =
+  section `TableSection (vec (at table)) [] s
+
+
+(* Memory section *)
+
+let memory s =
+  let mtype = memory_type s in
+  {mtype}
+
+let memory_section s =
+  section `MemorySection (vec (at memory)) [] s
+
+
+(* Global section *)
+
+let global s =
+  let gtype = global_type s in
+  let value = const s in
+  {gtype; value}
+
+let global_section s =
+  section `GlobalSection (vec (at global)) [] s
+
+
+(* Export section *)
+
+let export_desc s =
+  match u8 s with
+  | 0x00 -> FuncExport (at var s)
+  | 0x01 -> TableExport (at var s)
+  | 0x02 -> MemoryExport (at var s)
+  | 0x03 -> GlobalExport (at var s)
+  | _ -> error s (pos s - 1) "malformed export kind"
+
+let export s =
+  let name = name s in
+  let edesc = at export_desc s in
+  {name; edesc}
+
+let export_section s =
+  section `ExportSection (vec (at export)) [] s
+
+
+(* Start section *)
+
+let start_section s =
+  section `StartSection (opt (at var) true) None s
+
+
+(* Code section *)
+
+let local s =
+  let n = vu32 s in
+  let t = value_type s in
+  n, t
+
+let code _ s =
+  let pos = pos s in
+  let nts = vec local s in
+  let ns = List.map (fun (n, _) -> I64_convert.extend_i32_u n) nts in
+  require (I64.lt_u (List.fold_left I64.add 0L ns) 0x1_0000_0000L)
+    s pos "too many locals";
+  let locals = List.flatten (List.map (Lib.Fun.uncurry Lib.List32.make) nts) in
+  let body = instr_block s in
+  end_ s;
+  {locals; body; ftype = Source.((-1l) @@ Source.no_region)}
+
+let code_section s =
+  section `CodeSection (vec (at (sized code))) [] s
+
+
+(* Element section *)
+
+let segment dat s =
+  let index = at var s in
+  let offset = const s in
+  let init = dat s in
+  {index; offset; init}
+
+let table_segment s =
+  segment (vec (at var)) s
+
+let elem_section s =
+  section `ElemSection (vec (at table_segment)) [] s
+
+
+(* Data section *)
+
+let memory_segment s =
+  segment string s
+
+let data_section s =
+  section `DataSection (vec (at memory_segment)) [] s
+
+
+(* Custom sections *)
+
+let custom_section (name_pred : int list -> bool) (f : int -> stream -> 'a) (default : 'a) (s : stream) =
+  let rewind = checkpoint s in
+  match id s with
+  | Some `CustomSection ->
+    ignore (u8 s);
+    let sec_size = len32 s in
+    let sec_start = pos s in
+    let sec_end = sec_start + sec_size in
+    if name_pred (name s)
+    then (* this is the right custom section *)
+      let x = f sec_end s in
+      require (pos s = sec_end) s sec_start "custom section size mismatch";
+      x
+    else begin (* wrong custom section, rewind *)
+      rewind ();
+      default
+    end
+  | Some _ -> default
+  | _ -> default
+
+
+let icp_name suffix =
+  let public_name = Utf8.decode ("icp:public " ^ suffix) in
+  let private_name = Utf8.decode ("icp:private " ^ suffix) in
+  fun name ->
+    if public_name = name then
+      Some true
+    else if private_name = name then
+      Some false
+    else None
+
+let icp_custom_section n (f : int -> stream -> 'a) (default : (bool * 'a) option) (s : stream) =
+  let rewind = checkpoint s in
+  match id s with
+  | Some `CustomSection ->
+    ignore (u8 s);
+    let sec_size = len32 s in
+    let sec_start = pos s in
+    let sec_end = sec_start + sec_size in
+    let name = name s in
+    let opt = icp_name n name in
+    begin
+    match opt with
+    | Some b ->
+      (* this is the right custom section *)
+      let x = f sec_end s in
+      require (pos s = sec_end) s sec_start "custom section size mismatch";
+      Some (b, x)
+    | None -> begin (* wrong custom section, rewind *)
+      rewind ();
+      default
+      end
+    end
+  | Some _ -> default
+  | _ -> default
+
+(* Dylink section *)
+
+let dylink _ s =
+  let memory_size = vu32 s in
+  let memory_alignment = vu32 s in
+  let table_size = vu32 s in
+  let table_alignment = vu32 s in
+  let needed_dynlibs = vec string s in
+  Some { memory_size; memory_alignment; table_size; table_alignment; needed_dynlibs }
+
+let is_dylink n = (n = Utf8.decode "dylink")
+
+let dylink_section s =
+  custom_section is_dylink dylink None s
+
+(* Name custom section *)
+
+let repeat_until p_end s x0 f =
+  let rec go x =
+    require (pos s <= p_end) s (pos s) "repeat_until overshot";
+    if pos s = p_end then x else go (f x s)
+  in go x0
+
+let assoc_list f = vec (fun s ->
+    let i = var s in
+    let x = f s in
+    (i, x)
+  )
+let name_map = assoc_list string
+let indirect_name_map = assoc_list name_map
+
+let name_section_subsection (ns : name_section) (s : stream) : name_section =
+  match u8 s with
+  | 0 -> (* module name *)
+    let mod_name = sized (fun _ -> string) s in
+    { ns with module_ = Some mod_name }
+  | 1 -> (* function names *)
+    let func_names = sized (fun _ -> name_map) s in
+    { ns with function_names = ns.function_names @ func_names }
+  | 2 -> (* local names *)
+    let loc_names = sized (fun _ -> indirect_name_map) s in
+    { ns with locals_names = ns.locals_names @ loc_names }
+  (* The following subsections are not in the standard yet, but from the extended-name-section proposal
+     https://github.com/WebAssembly/extended-name-section/blob/master/proposals/extended-name-section/Overview.md
+  *)
+  | 3 -> (* label names *)
+    let label_names = sized (fun _ -> indirect_name_map) s in
+    { ns with label_names = ns.label_names @ label_names }
+  | 4 -> (* type names *)
+    let type_names = sized (fun _ -> name_map) s in
+    { ns with type_names = ns.type_names @ type_names }
+  | 5 -> (* table names *)
+    let table_names = sized (fun _ -> name_map) s in
+    { ns with table_names = ns.table_names @ table_names }
+  | 6 -> (* memory names *)
+    let memory_names = sized (fun _ -> name_map) s in
+    { ns with memory_names = ns.memory_names @ memory_names }
+  | 7 -> (* global names *)
+    let global_names = sized (fun _ -> name_map) s in
+    { ns with global_names = ns.global_names @ global_names }
+  | 8 -> (* elem segment names *)
+    let elem_segment_names = sized (fun _ -> name_map) s in
+    { ns with elem_segment_names = ns.elem_segment_names @ elem_segment_names }
+  | 9 -> (* data segment names *)
+    let data_segment_names = sized (fun _ -> name_map) s in
+    { ns with data_segment_names = ns.data_segment_names @ data_segment_names }
+  | i -> error s (pos s) (Printf.sprintf "unknown name section subsection id %d" i)
+
+let name_section_content p_end s =
+  repeat_until p_end s empty_name_section name_section_subsection
+
+let is_name n = (n = Utf8.decode "name")
+
+let name_section s =
+  custom_section is_name name_section_content empty_name_section s
+
+(* Motoko sections *)
+
+let motoko_section_subsection (ms : motoko_sections) s =
+  match u8 s with
+  | 0 ->
+    let labels = sized (fun _ -> vec string) s in
+    { ms with labels = ms.labels @ labels }
+  | i -> error s (pos s) (Printf.sprintf "unknown motoko section subsection id %d" i)
+
+let motoko_section_content p_end s =
+  repeat_until p_end s empty_motoko_sections motoko_section_subsection
+
+let is_motoko n = (n = Utf8.decode "motoko")
+
+let utf8 sec_end s =
+  let pos = pos s in
+  let bytes = get_string (sec_end - pos) s in
+  try
+    let _ = Utf8.decode (string s) in
+    bytes
+  with Utf8.Utf8 ->
+    error s pos "malformed UTF-8 encoding"
+
+let motoko_sections s =
+  let stable_types = icp_custom_section "motoko:stable-types" utf8 None s in
+  let compiler = icp_custom_section "motoko:compiler" utf8 None s in
+  custom_section is_motoko motoko_section_content { empty_motoko_sections with stable_types; compiler} s
+
+(* Candid sections *)
+
+let candid_sections s =
+  let service = icp_custom_section "candid:service" utf8 None s in
+  let args = icp_custom_section "candid:args" utf8 None s in
+  { service; args }
+
+(* Other custom sections *)
+
+let candid_service_name = icp_name "candid:service"
+let candid_args_name = icp_name "candid:args"
+let motoko_stable_types_name = icp_name "motoko:stable-types"
+
+let is_icp icp_name n = icp_name n <> None
+
+let is_wasm_features n = (n = Utf8.decode "wasm_features")
+let wasm_features_section s =
+  custom_section is_wasm_features
+    (fun sec_end s -> let t = utf8 sec_end s in String.split_on_char ',' t) [] s
+
+let is_unknown n = not (
+  is_dylink n ||
+  is_name n ||
+  is_motoko n ||
+  is_icp candid_service_name n ||
+  is_icp candid_args_name n ||
+  is_icp motoko_stable_types_name n ||
+  is_wasm_features n)
+
+let skip_custom sec_end s =
+  skip (sec_end - pos s) s;
+  true
+
+let skip_custom_section s =
+  custom_section is_unknown skip_custom false s
+
+(* Modules *)
+
+let rec iterate f s = if f s then iterate f s
+
+let module_ s =
+  let magic = u32 s in
+  require (magic = 0x6d736100l) s 0 "magic header not detected";
+  let version = u32 s in
+  require (version = Wasm.Encode.version) s 4 "unknown binary version";
+  let dylink = dylink_section s in
+  iterate skip_custom_section s;
+  let types = type_section s in
+  iterate skip_custom_section s;
+  let imports = import_section s in
+  iterate skip_custom_section s;
+  let func_types = func_section s in
+  iterate skip_custom_section s;
+  let tables = table_section s in
+  iterate skip_custom_section s;
+  let memories = memory_section s in
+  iterate skip_custom_section s;
+  let globals = global_section s in
+  iterate skip_custom_section s;
+  let exports = export_section s in
+  iterate skip_custom_section s;
+  let start = start_section s in
+  iterate skip_custom_section s;
+  let elems = elem_section s in
+  iterate skip_custom_section s;
+  let func_bodies = code_section s in
+  iterate skip_custom_section s;
+  let data = data_section s in
+  iterate skip_custom_section s;
+  let name = name_section s in
+  iterate skip_custom_section s;
+  (* TODO: allow candid/motoko sections anywhere, not just here, in this order *)
+  let candid = candid_sections s in
+  iterate skip_custom_section s;
+  let motoko = motoko_sections s in
+  iterate skip_custom_section s;
+  let wasm_features = wasm_features_section s in
+  iterate skip_custom_section s;
+  require (pos s = len s) s (len s) "junk after last section";
+  require (List.length func_types = List.length func_bodies)
+    s (len s) "function and code section have inconsistent lengths";
+  let funcs =
+    List.map2 Source.(fun t f -> {f.it with ftype = t} @@ f.at)
+      func_types func_bodies
+  in
+  { module_ =
+     {types; tables; memories; globals; funcs; imports; exports; elems; data; start};
+    dylink;
+    name;
+    motoko;
+    candid;
+    source_mapping_url = None;
+    wasm_features = wasm_features;
+  }
+
+
+let decode name bs = module_ (stream name bs)
+
+
+
+ + + diff --git a/coverage/wasm-exts/customModuleEncode.ml.html b/coverage/wasm-exts/customModuleEncode.ml.html new file mode 100644 index 00000000000..86f1192af98 --- /dev/null +++ b/coverage/wasm-exts/customModuleEncode.ml.html @@ -0,0 +1,4062 @@ + + + + + customModuleEncode.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+   1
+   2
+   3
+   4
+   5
+   6
+   7
+   8
+   9
+  10
+  11
+  12
+  13
+  14
+  15
+  16
+  17
+  18
+  19
+  20
+  21
+  22
+  23
+  24
+  25
+  26
+  27
+  28
+  29
+  30
+  31
+  32
+  33
+  34
+  35
+  36
+  37
+  38
+  39
+  40
+  41
+  42
+  43
+  44
+  45
+  46
+  47
+  48
+  49
+  50
+  51
+  52
+  53
+  54
+  55
+  56
+  57
+  58
+  59
+  60
+  61
+  62
+  63
+  64
+  65
+  66
+  67
+  68
+  69
+  70
+  71
+  72
+  73
+  74
+  75
+  76
+  77
+  78
+  79
+  80
+  81
+  82
+  83
+  84
+  85
+  86
+  87
+  88
+  89
+  90
+  91
+  92
+  93
+  94
+  95
+  96
+  97
+  98
+  99
+ 100
+ 101
+ 102
+ 103
+ 104
+ 105
+ 106
+ 107
+ 108
+ 109
+ 110
+ 111
+ 112
+ 113
+ 114
+ 115
+ 116
+ 117
+ 118
+ 119
+ 120
+ 121
+ 122
+ 123
+ 124
+ 125
+ 126
+ 127
+ 128
+ 129
+ 130
+ 131
+ 132
+ 133
+ 134
+ 135
+ 136
+ 137
+ 138
+ 139
+ 140
+ 141
+ 142
+ 143
+ 144
+ 145
+ 146
+ 147
+ 148
+ 149
+ 150
+ 151
+ 152
+ 153
+ 154
+ 155
+ 156
+ 157
+ 158
+ 159
+ 160
+ 161
+ 162
+ 163
+ 164
+ 165
+ 166
+ 167
+ 168
+ 169
+ 170
+ 171
+ 172
+ 173
+ 174
+ 175
+ 176
+ 177
+ 178
+ 179
+ 180
+ 181
+ 182
+ 183
+ 184
+ 185
+ 186
+ 187
+ 188
+ 189
+ 190
+ 191
+ 192
+ 193
+ 194
+ 195
+ 196
+ 197
+ 198
+ 199
+ 200
+ 201
+ 202
+ 203
+ 204
+ 205
+ 206
+ 207
+ 208
+ 209
+ 210
+ 211
+ 212
+ 213
+ 214
+ 215
+ 216
+ 217
+ 218
+ 219
+ 220
+ 221
+ 222
+ 223
+ 224
+ 225
+ 226
+ 227
+ 228
+ 229
+ 230
+ 231
+ 232
+ 233
+ 234
+ 235
+ 236
+ 237
+ 238
+ 239
+ 240
+ 241
+ 242
+ 243
+ 244
+ 245
+ 246
+ 247
+ 248
+ 249
+ 250
+ 251
+ 252
+ 253
+ 254
+ 255
+ 256
+ 257
+ 258
+ 259
+ 260
+ 261
+ 262
+ 263
+ 264
+ 265
+ 266
+ 267
+ 268
+ 269
+ 270
+ 271
+ 272
+ 273
+ 274
+ 275
+ 276
+ 277
+ 278
+ 279
+ 280
+ 281
+ 282
+ 283
+ 284
+ 285
+ 286
+ 287
+ 288
+ 289
+ 290
+ 291
+ 292
+ 293
+ 294
+ 295
+ 296
+ 297
+ 298
+ 299
+ 300
+ 301
+ 302
+ 303
+ 304
+ 305
+ 306
+ 307
+ 308
+ 309
+ 310
+ 311
+ 312
+ 313
+ 314
+ 315
+ 316
+ 317
+ 318
+ 319
+ 320
+ 321
+ 322
+ 323
+ 324
+ 325
+ 326
+ 327
+ 328
+ 329
+ 330
+ 331
+ 332
+ 333
+ 334
+ 335
+ 336
+ 337
+ 338
+ 339
+ 340
+ 341
+ 342
+ 343
+ 344
+ 345
+ 346
+ 347
+ 348
+ 349
+ 350
+ 351
+ 352
+ 353
+ 354
+ 355
+ 356
+ 357
+ 358
+ 359
+ 360
+ 361
+ 362
+ 363
+ 364
+ 365
+ 366
+ 367
+ 368
+ 369
+ 370
+ 371
+ 372
+ 373
+ 374
+ 375
+ 376
+ 377
+ 378
+ 379
+ 380
+ 381
+ 382
+ 383
+ 384
+ 385
+ 386
+ 387
+ 388
+ 389
+ 390
+ 391
+ 392
+ 393
+ 394
+ 395
+ 396
+ 397
+ 398
+ 399
+ 400
+ 401
+ 402
+ 403
+ 404
+ 405
+ 406
+ 407
+ 408
+ 409
+ 410
+ 411
+ 412
+ 413
+ 414
+ 415
+ 416
+ 417
+ 418
+ 419
+ 420
+ 421
+ 422
+ 423
+ 424
+ 425
+ 426
+ 427
+ 428
+ 429
+ 430
+ 431
+ 432
+ 433
+ 434
+ 435
+ 436
+ 437
+ 438
+ 439
+ 440
+ 441
+ 442
+ 443
+ 444
+ 445
+ 446
+ 447
+ 448
+ 449
+ 450
+ 451
+ 452
+ 453
+ 454
+ 455
+ 456
+ 457
+ 458
+ 459
+ 460
+ 461
+ 462
+ 463
+ 464
+ 465
+ 466
+ 467
+ 468
+ 469
+ 470
+ 471
+ 472
+ 473
+ 474
+ 475
+ 476
+ 477
+ 478
+ 479
+ 480
+ 481
+ 482
+ 483
+ 484
+ 485
+ 486
+ 487
+ 488
+ 489
+ 490
+ 491
+ 492
+ 493
+ 494
+ 495
+ 496
+ 497
+ 498
+ 499
+ 500
+ 501
+ 502
+ 503
+ 504
+ 505
+ 506
+ 507
+ 508
+ 509
+ 510
+ 511
+ 512
+ 513
+ 514
+ 515
+ 516
+ 517
+ 518
+ 519
+ 520
+ 521
+ 522
+ 523
+ 524
+ 525
+ 526
+ 527
+ 528
+ 529
+ 530
+ 531
+ 532
+ 533
+ 534
+ 535
+ 536
+ 537
+ 538
+ 539
+ 540
+ 541
+ 542
+ 543
+ 544
+ 545
+ 546
+ 547
+ 548
+ 549
+ 550
+ 551
+ 552
+ 553
+ 554
+ 555
+ 556
+ 557
+ 558
+ 559
+ 560
+ 561
+ 562
+ 563
+ 564
+ 565
+ 566
+ 567
+ 568
+ 569
+ 570
+ 571
+ 572
+ 573
+ 574
+ 575
+ 576
+ 577
+ 578
+ 579
+ 580
+ 581
+ 582
+ 583
+ 584
+ 585
+ 586
+ 587
+ 588
+ 589
+ 590
+ 591
+ 592
+ 593
+ 594
+ 595
+ 596
+ 597
+ 598
+ 599
+ 600
+ 601
+ 602
+ 603
+ 604
+ 605
+ 606
+ 607
+ 608
+ 609
+ 610
+ 611
+ 612
+ 613
+ 614
+ 615
+ 616
+ 617
+ 618
+ 619
+ 620
+ 621
+ 622
+ 623
+ 624
+ 625
+ 626
+ 627
+ 628
+ 629
+ 630
+ 631
+ 632
+ 633
+ 634
+ 635
+ 636
+ 637
+ 638
+ 639
+ 640
+ 641
+ 642
+ 643
+ 644
+ 645
+ 646
+ 647
+ 648
+ 649
+ 650
+ 651
+ 652
+ 653
+ 654
+ 655
+ 656
+ 657
+ 658
+ 659
+ 660
+ 661
+ 662
+ 663
+ 664
+ 665
+ 666
+ 667
+ 668
+ 669
+ 670
+ 671
+ 672
+ 673
+ 674
+ 675
+ 676
+ 677
+ 678
+ 679
+ 680
+ 681
+ 682
+ 683
+ 684
+ 685
+ 686
+ 687
+ 688
+ 689
+ 690
+ 691
+ 692
+ 693
+ 694
+ 695
+ 696
+ 697
+ 698
+ 699
+ 700
+ 701
+ 702
+ 703
+ 704
+ 705
+ 706
+ 707
+ 708
+ 709
+ 710
+ 711
+ 712
+ 713
+ 714
+ 715
+ 716
+ 717
+ 718
+ 719
+ 720
+ 721
+ 722
+ 723
+ 724
+ 725
+ 726
+ 727
+ 728
+ 729
+ 730
+ 731
+ 732
+ 733
+ 734
+ 735
+ 736
+ 737
+ 738
+ 739
+ 740
+ 741
+ 742
+ 743
+ 744
+ 745
+ 746
+ 747
+ 748
+ 749
+ 750
+ 751
+ 752
+ 753
+ 754
+ 755
+ 756
+ 757
+ 758
+ 759
+ 760
+ 761
+ 762
+ 763
+ 764
+ 765
+ 766
+ 767
+ 768
+ 769
+ 770
+ 771
+ 772
+ 773
+ 774
+ 775
+ 776
+ 777
+ 778
+ 779
+ 780
+ 781
+ 782
+ 783
+ 784
+ 785
+ 786
+ 787
+ 788
+ 789
+ 790
+ 791
+ 792
+ 793
+ 794
+ 795
+ 796
+ 797
+ 798
+ 799
+ 800
+ 801
+ 802
+ 803
+ 804
+ 805
+ 806
+ 807
+ 808
+ 809
+ 810
+ 811
+ 812
+ 813
+ 814
+ 815
+ 816
+ 817
+ 818
+ 819
+ 820
+ 821
+ 822
+ 823
+ 824
+ 825
+ 826
+ 827
+ 828
+ 829
+ 830
+ 831
+ 832
+ 833
+ 834
+ 835
+ 836
+ 837
+ 838
+ 839
+ 840
+ 841
+ 842
+ 843
+ 844
+ 845
+ 846
+ 847
+ 848
+ 849
+ 850
+ 851
+ 852
+ 853
+ 854
+ 855
+ 856
+ 857
+ 858
+ 859
+ 860
+ 861
+ 862
+ 863
+ 864
+ 865
+ 866
+ 867
+ 868
+ 869
+ 870
+ 871
+ 872
+ 873
+ 874
+ 875
+ 876
+ 877
+ 878
+ 879
+ 880
+ 881
+ 882
+ 883
+ 884
+ 885
+ 886
+ 887
+ 888
+ 889
+ 890
+ 891
+ 892
+ 893
+ 894
+ 895
+ 896
+ 897
+ 898
+ 899
+ 900
+ 901
+ 902
+ 903
+ 904
+ 905
+ 906
+ 907
+ 908
+ 909
+ 910
+ 911
+ 912
+ 913
+ 914
+ 915
+ 916
+ 917
+ 918
+ 919
+ 920
+ 921
+ 922
+ 923
+ 924
+ 925
+ 926
+ 927
+ 928
+ 929
+ 930
+ 931
+ 932
+ 933
+ 934
+ 935
+ 936
+ 937
+ 938
+ 939
+ 940
+ 941
+ 942
+ 943
+ 944
+ 945
+ 946
+ 947
+ 948
+ 949
+ 950
+ 951
+ 952
+ 953
+ 954
+ 955
+ 956
+ 957
+ 958
+ 959
+ 960
+ 961
+ 962
+ 963
+ 964
+ 965
+ 966
+ 967
+ 968
+ 969
+ 970
+ 971
+ 972
+ 973
+ 974
+ 975
+ 976
+ 977
+ 978
+ 979
+ 980
+ 981
+ 982
+ 983
+ 984
+ 985
+ 986
+ 987
+ 988
+ 989
+ 990
+ 991
+ 992
+ 993
+ 994
+ 995
+ 996
+ 997
+ 998
+ 999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+
+
(*
+This module originated as a copy of interpreter/binary/encode.ml in the
+reference implementation.
+
+The changes are:
+ * Support for writing out a source map for the Code parts
+ * Support for additional custom sections
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+ *)
+
+(* Note [funneling DIEs through Wasm.Ast]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The DWARF debugging information entry (DIE) is a simple data carrier meant
+to be transmitted in a sequential fashion. Here, DIEs are attached to
+specially crafted instructions (Meta) in the instruction stream
+that is derived from the Wasm.Ast. Since these instructions are inserted artificially
+and are not intended for execution, they will not be emitted as instructions, but
+aggregated, correlated and finally output into DWARF sections of the binary.
+DIEs are defined in Dwarf5.Meta and can be recognised via the `is_dwarf_like` predicate.
+When extracted from the instruction stream using the predicate, we can check whether
+they are a tag (pre-filled) with attributes/subtags or free-standing attributes that will
+end up in the last tag. Similarly later tags nest into open tags. The larger-scale hierarchical
+structure is finally restored when all instructions are emitted. The mechanism is described in
+the blog post http://eli.thegreenplace.net/2011/09/29/an-interesting-tree-serialization-algorithm-from-dwarf
+
+ *)
+
+
+(* Note [bubbling up types in the tag hierarchy]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Certain DIEs (precisely `DW_TAG_*`s) can be referenced from attributes
+by means of position in the `.debug_info` section. E.g. types are referenced
+from a variety of DIEs. But since we generate DIEs for types on the fly,
+they end up at the same hierarchy level as the referencing DIE. Such references
+are allocated serially by extending a mapping to promises. The promise gets
+fulfilled when the prerequisite DIE is externalised into the section.
+To have every referencable tag a fulfilled section position, on the tag closing
+trigger we move every referencable DIE out of it and into the parent, effectively
+bubbling all up to toplevel. Then, immediately before externalising the DIE tree,
+we perform a stable sort by serial number, with non-referencable DIEs trailing.
+
+ *)
+
+(* Note [placeholder promises for typedefs]
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+When forming the DIE for a Motoko type synonym (`type List = ...`)
+we need to do something special. Since such typedefs are cycle-breakers
+in the type system, we will need to adopt the same property in the
+`.debug_info` section too. So, we'll output `DW_TAG_typedef` before
+even knowing which type it refers to. Instead we use a DW_FORM_ref4
+for its `DW_AT_type` attribute, which is backpatchable. The value of this
+attribute is an integer, pointing to a fulfilled promise created when the
+DIE was formed. It got fulfilled when the typedef's type became known,
+another DIE, formed shortly after the typedef's. Resolving this fulfilled
+promise in turn gives us the index (actual type ref) of an unfulfilled
+promise (the forward reference). This forward reference will be fulfilled
+to be a byte offset in the section as soon as the corresponding DIE is emitted.
+
+We keep a function that performs the patching of the section (before it is
+written to disk) by overwriting the preliminary bytes in `DW_TAG_typedef`'s
+`DW_AT_type` with the now fulfilled offset obtained from the forward reference.
+
+ *)
+
+module Promise = Lib.Promise
+
+open Dwarf5.Meta
+
+open CustomModule
+
+(* Version *)
+
+let version = 1l
+
+
+(* Errors *)
+
+module Code = Wasm.Error.Make ()
+
+(* Encoding stream *)
+
+type stream =
+{
+  buf : Buffer.t;
+  patches : (int * char) list ref
+}
+
+let stream () = {buf = Buffer.create 8192; patches = ref []}
+let pos s = Buffer.length s.buf
+let put s b = Buffer.add_char s.buf b
+let put_string s bs = Buffer.add_string s.buf bs
+let patch s pos b = s.patches := (pos, b) :: !(s.patches)
+
+let to_string s =
+  let bs = Buffer.to_bytes s.buf in
+  List.iter (fun (pos, b) -> Bytes.set bs pos b) !(s.patches);
+  Bytes.to_string bs
+
+module References = Map.Make (struct type t = int let compare = compare end)
+
+let dw_references = ref References.empty
+let num_dw_references = ref 1 (* 0 would mean: "this tag doesn't fulfill a reference" *)
+let promise_reference_slot p =
+  let have = !num_dw_references in
+  dw_references := References.add have p !dw_references;
+  num_dw_references := 1 + have;
+  have
+let allocate_reference_slot () =
+  promise_reference_slot (Promise.make ())
+
+(* Encoding *)
+
+let encode (em : extended_module) =
+  let s = stream () in
+
+  (* source map *)
+  let map = Buffer.create 0 in
+  let sources = ref [] in
+  let sourcesContent = ref [] in
+  let segs = ref 0 in
+  let prev_if = ref 0 in
+  let prev_ol = ref 0 in
+  let prev_oc = ref 0 in
+  let prev_il = ref 0 in
+  let prev_ic = ref 0 in
+
+  (* modify reference *)
+  let modif r f = r := f !r in
+
+  let rec add_source filename = function (* FIXME: use add_string *)
+    | [] ->
+      sources := !sources @ [ filename ];
+      let source_code =
+        try
+          if filename = "prelude" then Prelude.prelude else
+          if filename = "prim" then Prelude.prim_module ~timers:!Mo_config.Flags.global_timer else
+          (*
+          Here we opportunistically see if we can find the source file
+          mentioned in the source location, and if we can, include its source
+          verbatim in the source map
+          *)
+          let ic = Stdlib.open_in filename in
+          let n = in_channel_length ic in
+          let s = Bytes.create n in
+          really_input ic s 0 n;
+          close_in ic;
+          Bytes.to_string s
+        with _ -> "" in
+      sourcesContent := !sourcesContent @ [ source_code ];
+      0
+    | h :: t -> if filename = h then 0 else 1 + add_source filename t
+  in
+
+  let add_string gen strings str = (* FIXME: perform suffix compression? *)
+    let strs = !strings in
+    match List.assoc_opt str strs with
+    | Some v -> v
+    | _ ->
+      let v = gen strs in
+      let strs' = (str, v) :: strs in strings := strs'; v
+  in
+
+  let dwarf_strings = ref [] in
+
+  let add_dwarf_string =
+    add_string (function | [] -> 0 | (h, p) :: _ -> String.length h + 1 + p) dwarf_strings in
+
+  let module Instrs = Set.Make (struct type t = int * Wasm.Source.pos let compare = compare end) in
+  let statement_positions = ref Instrs.empty in
+
+  let module DW_Sequence = Set.Make (struct type t = int * Instrs.t * int let compare = compare end) in
+  let sequence_bounds = ref DW_Sequence.empty in
+
+  let dwarf_tags = ref [Tag (None, 0, [])] in
+
+  let is_closed tag =
+    let tag_of (t', _, _) = tag = t' in
+    let (_, has_children, _) = List.find tag_of Abbreviation.abbreviations in
+    not (has_children <> 0)
+  in
+
+  let code_section_start = ref 0 in
+
+  let add_dwarf_tag refi tag =
+    let position_attr =
+      if tag = Dwarf5.dw_TAG_lexical_block then
+        [IntAttribute (Dwarf5.dw_AT_low_pc, pos s - !code_section_start)]
+      else [] in
+
+    (* invariant: at most one closed tag waiting for attributes *)
+
+    dwarf_tags :=
+      match !dwarf_tags with
+      | [Tag (refi, t, viscera)] when tag = Dwarf5.dw_TAG_compile_unit && t = 0 ->
+        [Tag (refi, tag, viscera)]
+      | Tag (_, t', _) as closed :: Tag (r, t, arts) :: tail when is_closed t' ->
+        Tag (refi, tag, position_attr) :: Tag (r, t, closed :: arts) :: tail
+      | tail ->
+        Tag (refi, tag, position_attr) :: tail in
+
+  let no_tags = List.for_all (function Tag _ -> false | _ -> true) in
+  let hoistables = List.partition (function Tag (Some r, _, _) -> true | _ -> false) in
+
+  let rec close_dwarf genuine =
+    (* hoist out referencable tags,
+       see Note [bubbling up types in the tag hierarchy] *)
+    begin match !dwarf_tags with
+    | Tag (refi, t, viscera) :: Tag (refi', t', viscera') :: tail
+        when genuine && Dwarf5.(dw_TAG_subprogram = t land 0xFF || dw_TAG_lexical_block = t land 0xFF) ->
+      let hoist, stay = hoistables viscera in
+      dwarf_tags := Tag (refi, t, stay) :: Tag (refi', t', hoist @ viscera') :: tail
+    | _ -> ()
+    end;
+
+    match !dwarf_tags with
+    | Tag (_, t, viscera) :: tail when Dwarf5.dw_TAG_lexical_block = t && no_tags viscera ->
+      dwarf_tags := tail
+    | Tag (refi, t, viscera) :: tail when genuine && Dwarf5.dw_TAG_lexical_block = t ->
+      dwarf_tags := Tag (refi, t, IntAttribute (Dwarf5.dw_AT_high_pc, pos s - !code_section_start) :: viscera) :: tail;
+      close_dwarf false
+    | [] -> failwith "no open DW_TAG"
+    | [Tag (None, t, viscera)] when Dwarf5.dw_TAG_compile_unit = t ->
+      dwarf_tags := Tag (None, t, viscera) :: []
+    | [Tag _] -> failwith "TOPLEVEL: NOT NESTING"
+    | Tag (_, t', _) as closed :: Tag (r, t, arts) :: tail when is_closed t' ->
+      dwarf_tags := Tag (r, t, closed :: arts) :: tail; close_dwarf genuine
+    | Tag (_, t', _) as nested :: Tag (r, tag, arts) :: t ->
+      dwarf_tags := Tag (r, tag, nested :: arts) :: t
+    | _ -> failwith "cannot close DW_AT" in
+  let add_dwarf_attribute attr =
+    dwarf_tags := match !dwarf_tags with
+                  | Tag (r, tag, arts) :: t -> Tag (r, tag, attr :: arts) :: t
+                  | _ -> assert false
+  in
+
+  (* keeping count of the DWARF code sequence we are in *)
+  let sequence_number = ref 0 in
+  (* array of the sizes of the emitted subprograms *)
+  let subprogram_sizes = Promise.make () in
+  (* offset of the range lists section *)
+  let rangelists = Promise.make () in
+
+  let extract_dwarf refi tag =
+    let open Dwarf5 in
+    let extract = function
+      | OffsetAttribute at when at = dw_AT_low_pc && tag = dw_TAG_compile_unit ->
+        add_dwarf_attribute (IntAttribute (at, 0))
+      | OffsetAttribute at when at = dw_AT_low_pc && tag land 0xFF = dw_TAG_subprogram ->
+        add_dwarf_attribute (IntAttribute (at, !sequence_number))
+      | OffsetAttribute at when at = dw_AT_high_pc && tag land 0xFF = dw_TAG_subprogram ->
+        let s = !sequence_number in
+        let resolve () = IntAttribute (at, Array.get (Promise.value subprogram_sizes) s) in
+        add_dwarf_attribute (FutureAttribute resolve)
+      | OffsetAttribute at when at = dw_AT_ranges ->
+        let resolve () = IntAttribute (at, Promise.value rangelists) in
+        add_dwarf_attribute (FutureAttribute resolve) (* see Note [Low_pc, High_pc, Ranges are special] *)
+      | (IntAttribute _ | StringAttribute _) as attr ->
+        add_dwarf_attribute attr
+      | _ -> assert false
+    in
+    add_dwarf_tag refi tag;
+    List.iter extract
+  in
+
+  let add_to_map file il ic ol oc =
+    let il = il - 1 in
+    let if_ = add_source file !sources in
+    if ol <> !prev_ol then Buffer.add_char map ';';
+    Vlq.Base64.encode map (oc - !prev_oc);             (* output column *)
+    Vlq.Base64.encode map (if_ - !prev_if);            (* sources index *)
+    Vlq.Base64.encode map (il - !prev_il);             (* input row *)
+    Vlq.Base64.encode map (ic - !prev_ic);             (* input column *)
+    Buffer.add_char map ',';
+
+    prev_if := if_; prev_ol := ol; prev_oc := oc; prev_il := il; prev_ic := ic; incr segs
+  in
+
+  let module E = struct
+    (* Generic values *)
+
+    let u8 i = put s (Char.chr (i land 0xff))
+    let u16 i = u8 (i land 0xff); u8 (i lsr 8)
+    let u32 i =
+      Int32.(u16 (to_int (logand i 0xffffl));
+             u16 (to_int (shift_right i 16)))
+    let u64 i =
+      Int64.(u32 (to_int32 (logand i 0xffffffffL));
+             u32 (to_int32 (shift_right i 32)))
+
+    let rec vu64 i =
+      let b = Int64.(to_int (logand i 0x7fL)) in
+      if 0L <= i && i < 128L then u8 b
+      else (u8 (b lor 0x80); vu64 (Int64.shift_right_logical i 7))
+
+    let rec vs64 i =
+      let b = Int64.(to_int (logand i 0x7fL)) in
+      if -64L <= i && i < 64L then u8 b
+      else (u8 (b lor 0x80); vs64 (Int64.shift_right i 7))
+
+    let vu1 i = vu64 Int64.(logand (of_int i) 1L)
+    let vu32 i = vu64 Int64.(logand (of_int32 i) 0xffffffffL)
+    let vs7 i = vs64 (Int64.of_int i)
+    let vs32 i = vs64 (Int64.of_int32 i)
+    let vs33 i = vs64 (Wasm.I64_convert.extend_i32_s i)
+    let f32 x = u32 (Wasm.F32.to_bits x)
+    let f64 x = u64 (Wasm.F64.to_bits x)
+
+    let len i =
+      if Int32.to_int (Int32.of_int i) <> i then
+        Code.error Wasm.Source.no_region
+          "cannot encode length with more than 32 bit";
+      vu32 (Int32.of_int i)
+
+    let bool b = vu1 (if b then 1 else 0)
+    let string bs = len (String.length bs); put_string s bs
+    let name n = string (Lib.Utf8.encode n)
+    let list f xs = List.iter f xs
+    let opt f xo = Option.iter f xo
+    let vec_by l f xs = l (List.length xs); list f xs
+    let vec f xs = vec_by len f xs
+
+    let gap32 () = let p = pos s in u32 0l; u8 0; p
+    let patch_gap32 p n =
+      assert (n <= 0x0fff_ffff); (* Strings cannot excess 2G anyway *)
+      let lsb i = Char.chr (i land 0xff) in
+      patch s p (lsb (n lor 0x80));
+      patch s (p + 1) (lsb ((n lsr 7) lor 0x80));
+      patch s (p + 2) (lsb ((n lsr 14) lor 0x80));
+      patch s (p + 3) (lsb ((n lsr 21) lor 0x80));
+      patch s (p + 4) (lsb (n lsr 28))
+
+    (* Types *)
+
+    open Wasm.Types
+
+    let value_type = function
+      | I32Type -> vs7 (-0x01)
+      | I64Type -> vs7 (-0x02)
+      | F32Type -> vs7 (-0x03)
+      | F64Type -> vs7 (-0x04)
+
+    let elem_type = function
+      | FuncRefType -> vs7 (-0x10)
+
+    let stack_type = vec value_type
+    let func_type = function
+      | FuncType (ins, out) -> vs7 (-0x20); stack_type ins; stack_type out
+
+    let limits vu {min; max} =
+      bool (max <> None); vu min; opt vu max
+
+    let table_type = function
+      | TableType (lim, t) -> elem_type t; limits vu32 lim
+
+    let memory_type = function
+      | MemoryType lim -> limits vu32 lim
+
+    let mutability = function
+      | Immutable -> u8 0
+      | Mutable -> u8 1
+
+    let global_type = function
+      | GlobalType (t, mut) -> value_type t; mutability mut
+
+    (* Expressions *)
+
+    open Wasm.Source
+    open Ast
+    open Wasm.Values
+
+    let op n = u8 n
+    let end_ () = op 0x0b
+
+    let memop {align; offset; _} = vu32 (Int32.of_int align); vu32 offset
+
+    let var x = vu32 x.it
+
+    let block_type = function
+      | VarBlockType x -> vs33 x.it
+      | ValBlockType None -> vs7 (-0x40)
+      | ValBlockType (Some t) -> value_type t
+
+    let rec instr noting e =
+      if e.at <> no_region then add_to_map e.at.left.file e.at.left.line e.at.left.column 0 (pos s);
+      noting e;
+      let instr = instr noting in
+
+      match e.it with
+      | Meta TagClose -> close_dwarf true
+      | Meta (StatementDelimiter left) ->
+        modif statement_positions (Instrs.add (pos s, left))
+      | Meta (Tag (r, t, attrs_tags)) ->
+        let tags, attrs = List.partition (function Tag _ | Grouped _ -> true | _ -> false) attrs_tags in
+        extract_dwarf r t attrs;
+        List.iter (fun t -> instr { e with it = (Meta t) }) tags
+      | Meta (Grouped []) -> ()
+      | Meta (Grouped (late :: former)) ->
+        instr { e with it = Meta (Grouped former) };
+        instr { e with it = Meta late }
+      | Meta _ -> assert false
+
+      | Unreachable -> op 0x00
+      | Nop -> op 0x01
+
+      | Block (bt, es) -> op 0x02; block_type bt; list instr es; end_ ()
+      | Loop (bt, es) -> op 0x03; block_type bt; list instr es; end_ ()
+      | If (bt, es1, es2) ->
+        op 0x04; block_type bt; list instr es1;
+        if es2 <> [] then op 0x05;
+        list instr es2; end_ ()
+
+      | Br x -> op 0x0c; var x
+      | BrIf x -> op 0x0d; var x
+      | BrTable (xs, x) -> op 0x0e; vec var xs; var x
+      | Return -> op 0x0f
+      | Call x -> op 0x10; var x
+      | CallIndirect x -> op 0x11; var x; u8 0x00
+
+      | Drop -> op 0x1a
+      | Select -> op 0x1b
+
+      | LocalGet x -> op 0x20; var x
+      | LocalSet x -> op 0x21; var x
+      | LocalTee x -> op 0x22; var x
+      | GlobalGet x -> op 0x23; var x
+      | GlobalSet x -> op 0x24; var x
+
+      | Load ({ty = I32Type; sz = None; _} as mo) -> op 0x28; memop mo
+      | Load ({ty = I64Type; sz = None; _} as mo) -> op 0x29; memop mo
+      | Load ({ty = F32Type; sz = None; _} as mo) -> op 0x2a; memop mo
+      | Load ({ty = F64Type; sz = None; _} as mo) -> op 0x2b; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack8, SX); _} as mo) ->
+        op 0x2c; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack8, ZX); _} as mo) ->
+        op 0x2d; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack16, SX); _} as mo) ->
+        op 0x2e; memop mo
+      | Load ({ty = I32Type; sz = Some (Pack16, ZX); _} as mo) ->
+        op 0x2f; memop mo
+      | Load {ty = I32Type; sz = Some (Pack32, _); _} ->
+        assert false
+      | Load ({ty = I64Type; sz = Some (Pack8, SX); _} as mo) ->
+        op 0x30; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack8, ZX); _} as mo) ->
+        op 0x31; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack16, SX); _} as mo) ->
+        op 0x32; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack16, ZX); _} as mo) ->
+        op 0x33; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack32, SX); _} as mo) ->
+        op 0x34; memop mo
+      | Load ({ty = I64Type; sz = Some (Pack32, ZX); _} as mo) ->
+        op 0x35; memop mo
+      | Load {ty = F32Type | F64Type; sz = Some _; _} ->
+        assert false
+
+      | Store ({ty = I32Type; sz = None; _} as mo) -> op 0x36; memop mo
+      | Store ({ty = I64Type; sz = None; _} as mo) -> op 0x37; memop mo
+      | Store ({ty = F32Type; sz = None; _} as mo) -> op 0x38; memop mo
+      | Store ({ty = F64Type; sz = None; _} as mo) -> op 0x39; memop mo
+      | Store ({ty = I32Type; sz = Some Pack8; _} as mo) -> op 0x3a; memop mo
+      | Store ({ty = I32Type; sz = Some Pack16; _} as mo) -> op 0x3b; memop mo
+      | Store {ty = I32Type; sz = Some Pack32; _} -> assert false
+      | Store ({ty = I64Type; sz = Some Pack8; _} as mo) -> op 0x3c; memop mo
+      | Store ({ty = I64Type; sz = Some Pack16; _} as mo) -> op 0x3d; memop mo
+      | Store ({ty = I64Type; sz = Some Pack32; _} as mo) -> op 0x3e; memop mo
+      | Store {ty = F32Type | F64Type; sz = Some _; _} -> assert false
+
+      | MemorySize -> op 0x3f; u8 0x00
+      | MemoryGrow -> op 0x40; u8 0x00
+
+      | Const {it = I32 c; _} -> op 0x41; vs32 c
+      | Const {it = I64 c; _} -> op 0x42; vs64 c
+      | Const {it = F32 c; _} -> op 0x43; f32 c
+      | Const {it = F64 c; _} -> op 0x44; f64 c
+
+      | Test (I32 I32Op.Eqz) -> op 0x45
+      | Test (I64 I64Op.Eqz) -> op 0x50
+      | Test (F32 _) -> assert false
+      | Test (F64 _) -> assert false
+
+      | Compare (I32 I32Op.Eq) -> op 0x46
+      | Compare (I32 I32Op.Ne) -> op 0x47
+      | Compare (I32 I32Op.LtS) -> op 0x48
+      | Compare (I32 I32Op.LtU) -> op 0x49
+      | Compare (I32 I32Op.GtS) -> op 0x4a
+      | Compare (I32 I32Op.GtU) -> op 0x4b
+      | Compare (I32 I32Op.LeS) -> op 0x4c
+      | Compare (I32 I32Op.LeU) -> op 0x4d
+      | Compare (I32 I32Op.GeS) -> op 0x4e
+      | Compare (I32 I32Op.GeU) -> op 0x4f
+
+      | Compare (I64 I64Op.Eq) -> op 0x51
+      | Compare (I64 I64Op.Ne) -> op 0x52
+      | Compare (I64 I64Op.LtS) -> op 0x53
+      | Compare (I64 I64Op.LtU) -> op 0x54
+      | Compare (I64 I64Op.GtS) -> op 0x55
+      | Compare (I64 I64Op.GtU) -> op 0x56
+      | Compare (I64 I64Op.LeS) -> op 0x57
+      | Compare (I64 I64Op.LeU) -> op 0x58
+      | Compare (I64 I64Op.GeS) -> op 0x59
+      | Compare (I64 I64Op.GeU) -> op 0x5a
+
+      | Compare (F32 F32Op.Eq) -> op 0x5b
+      | Compare (F32 F32Op.Ne) -> op 0x5c
+      | Compare (F32 F32Op.Lt) -> op 0x5d
+      | Compare (F32 F32Op.Gt) -> op 0x5e
+      | Compare (F32 F32Op.Le) -> op 0x5f
+      | Compare (F32 F32Op.Ge) -> op 0x60
+
+      | Compare (F64 F64Op.Eq) -> op 0x61
+      | Compare (F64 F64Op.Ne) -> op 0x62
+      | Compare (F64 F64Op.Lt) -> op 0x63
+      | Compare (F64 F64Op.Gt) -> op 0x64
+      | Compare (F64 F64Op.Le) -> op 0x65
+      | Compare (F64 F64Op.Ge) -> op 0x66
+
+      | Unary (I32 I32Op.Clz) -> op 0x67
+      | Unary (I32 I32Op.Ctz) -> op 0x68
+      | Unary (I32 I32Op.Popcnt) -> op 0x69
+      | Unary (I32 (I32Op.ExtendS Pack8)) -> op 0xc0
+      | Unary (I32 (I32Op.ExtendS Pack16)) -> op 0xc1
+      | Unary (I32 (I32Op.ExtendS Pack32)) -> assert false
+
+      | Unary (I64 I64Op.Clz) -> op 0x79
+      | Unary (I64 I64Op.Ctz) -> op 0x7a
+      | Unary (I64 I64Op.Popcnt) -> op 0x7b
+      | Unary (I64 (I64Op.ExtendS Pack8)) -> op 0xc2
+      | Unary (I64 (I64Op.ExtendS Pack16)) -> op 0xc3
+      | Unary (I64 (I64Op.ExtendS Pack32)) -> op 0xc4
+
+      | Unary (F32 F32Op.Abs) -> op 0x8b
+      | Unary (F32 F32Op.Neg) -> op 0x8c
+      | Unary (F32 F32Op.Ceil) -> op 0x8d
+      | Unary (F32 F32Op.Floor) -> op 0x8e
+      | Unary (F32 F32Op.Trunc) -> op 0x8f
+      | Unary (F32 F32Op.Nearest) -> op 0x90
+      | Unary (F32 F32Op.Sqrt) -> op 0x91
+
+      | Unary (F64 F64Op.Abs) -> op 0x99
+      | Unary (F64 F64Op.Neg) -> op 0x9a
+      | Unary (F64 F64Op.Ceil) -> op 0x9b
+      | Unary (F64 F64Op.Floor) -> op 0x9c
+      | Unary (F64 F64Op.Trunc) -> op 0x9d
+      | Unary (F64 F64Op.Nearest) -> op 0x9e
+      | Unary (F64 F64Op.Sqrt) -> op 0x9f
+
+      | Binary (I32 I32Op.Add) -> op 0x6a
+      | Binary (I32 I32Op.Sub) -> op 0x6b
+      | Binary (I32 I32Op.Mul) -> op 0x6c
+      | Binary (I32 I32Op.DivS) -> op 0x6d
+      | Binary (I32 I32Op.DivU) -> op 0x6e
+      | Binary (I32 I32Op.RemS) -> op 0x6f
+      | Binary (I32 I32Op.RemU) -> op 0x70
+      | Binary (I32 I32Op.And) -> op 0x71
+      | Binary (I32 I32Op.Or) -> op 0x72
+      | Binary (I32 I32Op.Xor) -> op 0x73
+      | Binary (I32 I32Op.Shl) -> op 0x74
+      | Binary (I32 I32Op.ShrS) -> op 0x75
+      | Binary (I32 I32Op.ShrU) -> op 0x76
+      | Binary (I32 I32Op.Rotl) -> op 0x77
+      | Binary (I32 I32Op.Rotr) -> op 0x78
+
+      | Binary (I64 I64Op.Add) -> op 0x7c
+      | Binary (I64 I64Op.Sub) -> op 0x7d
+      | Binary (I64 I64Op.Mul) -> op 0x7e
+      | Binary (I64 I64Op.DivS) -> op 0x7f
+      | Binary (I64 I64Op.DivU) -> op 0x80
+      | Binary (I64 I64Op.RemS) -> op 0x81
+      | Binary (I64 I64Op.RemU) -> op 0x82
+      | Binary (I64 I64Op.And) -> op 0x83
+      | Binary (I64 I64Op.Or) -> op 0x84
+      | Binary (I64 I64Op.Xor) -> op 0x85
+      | Binary (I64 I64Op.Shl) -> op 0x86
+      | Binary (I64 I64Op.ShrS) -> op 0x87
+      | Binary (I64 I64Op.ShrU) -> op 0x88
+      | Binary (I64 I64Op.Rotl) -> op 0x89
+      | Binary (I64 I64Op.Rotr) -> op 0x8a
+
+      | Binary (F32 F32Op.Add) -> op 0x92
+      | Binary (F32 F32Op.Sub) -> op 0x93
+      | Binary (F32 F32Op.Mul) -> op 0x94
+      | Binary (F32 F32Op.Div) -> op 0x95
+      | Binary (F32 F32Op.Min) -> op 0x96
+      | Binary (F32 F32Op.Max) -> op 0x97
+      | Binary (F32 F32Op.CopySign) -> op 0x98
+
+      | Binary (F64 F64Op.Add) -> op 0xa0
+      | Binary (F64 F64Op.Sub) -> op 0xa1
+      | Binary (F64 F64Op.Mul) -> op 0xa2
+      | Binary (F64 F64Op.Div) -> op 0xa3
+      | Binary (F64 F64Op.Min) -> op 0xa4
+      | Binary (F64 F64Op.Max) -> op 0xa5
+      | Binary (F64 F64Op.CopySign) -> op 0xa6
+
+      | Convert (I32 I32Op.ExtendSI32) -> assert false
+      | Convert (I32 I32Op.ExtendUI32) -> assert false
+      | Convert (I32 I32Op.WrapI64) -> op 0xa7
+      | Convert (I32 I32Op.TruncSF32) -> op 0xa8
+      | Convert (I32 I32Op.TruncUF32) -> op 0xa9
+      | Convert (I32 I32Op.TruncSF64) -> op 0xaa
+      | Convert (I32 I32Op.TruncUF64) -> op 0xab
+      | Convert (I32 I32Op.TruncSatSF32) -> op 0xfc; op 0x00
+      | Convert (I32 I32Op.TruncSatUF32) -> op 0xfc; op 0x01
+      | Convert (I32 I32Op.TruncSatSF64) -> op 0xfc; op 0x02
+      | Convert (I32 I32Op.TruncSatUF64) -> op 0xfc; op 0x03
+      | Convert (I32 I32Op.ReinterpretFloat) -> op 0xbc
+
+      | Convert (I64 I64Op.ExtendSI32) -> op 0xac
+      | Convert (I64 I64Op.ExtendUI32) -> op 0xad
+      | Convert (I64 I64Op.WrapI64) -> assert false
+      | Convert (I64 I64Op.TruncSF32) -> op 0xae
+      | Convert (I64 I64Op.TruncUF32) -> op 0xaf
+      | Convert (I64 I64Op.TruncSF64) -> op 0xb0
+      | Convert (I64 I64Op.TruncUF64) -> op 0xb1
+      | Convert (I64 I64Op.TruncSatSF32) -> op 0xfc; op 0x04
+      | Convert (I64 I64Op.TruncSatUF32) -> op 0xfc; op 0x05
+      | Convert (I64 I64Op.TruncSatSF64) -> op 0xfc; op 0x06
+      | Convert (I64 I64Op.TruncSatUF64) -> op 0xfc; op 0x07
+      | Convert (I64 I64Op.ReinterpretFloat) -> op 0xbd
+
+      | Convert (F32 F32Op.ConvertSI32) -> op 0xb2
+      | Convert (F32 F32Op.ConvertUI32) -> op 0xb3
+      | Convert (F32 F32Op.ConvertSI64) -> op 0xb4
+      | Convert (F32 F32Op.ConvertUI64) -> op 0xb5
+      | Convert (F32 F32Op.PromoteF32) -> assert false
+      | Convert (F32 F32Op.DemoteF64) -> op 0xb6
+      | Convert (F32 F32Op.ReinterpretInt) -> op 0xbe
+
+      | Convert (F64 F64Op.ConvertSI32) -> op 0xb7
+      | Convert (F64 F64Op.ConvertUI32) -> op 0xb8
+      | Convert (F64 F64Op.ConvertSI64) -> op 0xb9
+      | Convert (F64 F64Op.ConvertUI64) -> op 0xba
+      | Convert (F64 F64Op.PromoteF32) -> op 0xbb
+      | Convert (F64 F64Op.DemoteF64) -> assert false
+      | Convert (F64 F64Op.ReinterpretInt) -> op 0xbf
+
+      (* Custom encodings for emulating stable-memory, special cases
+         of MemorySize, MemoryGrow and MemoryCopy
+         requiring wasm features bulk-memory and multi-memory
+      *)
+      | StableSize -> op 0x3f; u8 0x01
+      | StableGrow -> op 0x40; u8 0x01
+      | StableRead -> op 0xfc; vu32 0x0al; u8 0x00; u8 0x01
+      | StableWrite -> op 0xfc; vu32 0x0al; u8 0x01; u8 0x00
+
+    let const c =
+      list (instr ignore) c.it; end_ ()
+
+    (* Sections *)
+
+    let section id f x needed =
+      if needed then begin
+        u8 id;
+        let g = gap32 () in
+        let p = pos s in
+        f x;
+        patch_gap32 g (pos s - p)
+      end
+
+    let custom_section name f x needed =
+      section 0 (fun x ->
+        string name;
+        f x
+      ) x needed
+
+    (* Type section *)
+    let type_ t = func_type t.it
+
+    let type_section ts =
+      section 1 (vec type_) ts (ts <> [])
+
+    (* Import section *)
+    let import_desc d =
+      match d.it with
+      | FuncImport x -> u8 0x00; var x
+      | TableImport t -> u8 0x01; table_type t
+      | MemoryImport t -> u8 0x02; memory_type t
+      | GlobalImport t -> u8 0x03; global_type t
+
+    let import im =
+      let {module_name; item_name; idesc} = im.it in
+      name module_name; name item_name; import_desc idesc
+
+    let import_section ims =
+      section 2 (vec import) ims (ims <> [])
+
+    (* Function section *)
+    let func f = var f.it.ftype
+
+    let func_section fs =
+      section 3 (vec func) fs (fs <> [])
+
+    (* Table section *)
+    let table tab =
+      let {ttype} = tab.it in
+      table_type ttype
+
+    let table_section tabs =
+      section 4 (vec table) tabs (tabs <> [])
+
+    (* Memory section *)
+    let memory mem =
+      let {mtype} = mem.it in
+      memory_type mtype
+
+    let memory_section mems =
+      section 5 (vec memory) mems (mems <> [])
+
+    (* Global section *)
+    let global g =
+      let {gtype; value} = g.it in
+      global_type gtype; const value
+
+    let global_section gs =
+      section 6 (vec global) gs (gs <> [])
+
+    (* Export section *)
+    let export_desc d =
+      match d.it with
+      | FuncExport x -> u8 0; var x
+      | TableExport x -> u8 1; var x
+      | MemoryExport x -> u8 2; var x
+      | GlobalExport x -> u8 3; var x
+
+    let export ex =
+      let {name = n; edesc} = ex.it in
+      name n; export_desc edesc
+
+    let export_section exs =
+      section 7 (vec export) exs (exs <> [])
+
+    (* Start section *)
+    let start_section xo =
+      section 8 (opt var) xo (xo <> None)
+
+    (* Code section *)
+    let compress ts =
+      let combine t = function
+        | (t', n) :: ts when t = t' -> (t, n + 1) :: ts
+        | ts -> (t, 1) :: ts
+      in List.fold_right combine ts []
+
+    let local (t, n) = len n; value_type t
+
+    let (here_dir, asset_dir) = (0, 1) (* reversed indices in dir_names, below *)
+    let source_names =
+      ref [ "prelude", (Promise.make (), asset_dir)
+          ; "prim", (Promise.make (), asset_dir)
+          ; "rts.wasm", (Promise.make (), asset_dir) ] (* make these appear last in .debug_line file_name_entries *)
+    let dir_names = (* ditto, but reversed: 6.2.4.1 Standard Content Descriptions *)
+      ref [ "<moc-asset>", (Promise.make (), asset_dir)
+          ; Filename.dirname "", (Promise.make (), here_dir) ]
+    let source_path_indices = ref (List.map (fun (p, (_, i)) -> p, i) !source_names)
+    let add_source_name =
+      let source_adder dir_index _ = Promise.make (), dir_index in
+      let add_source_path_index (_, _) = function
+        | "" -> assert false
+        | str ->
+          ignore (add_string (function [] -> assert false | (_, i) :: _ -> i + 1) source_path_indices str) in
+      function
+      | "" -> ()
+      | ("prelude" | "prim" | "rts.wasm") as asset ->
+        add_source_path_index (add_string (source_adder asset_dir) source_names asset) asset
+      | path ->
+        let dir, basename = Filename.(dirname path, basename path) in
+        let _, dir_index = add_string (function [] -> assert false | (_, (_, i)) :: _ -> Promise.make (), i + 1) dir_names dir in
+        let promise = add_string (source_adder dir_index) source_names basename in
+        add_source_path_index promise path
+
+    let code f =
+      let {locals; body; _} = f.it in
+      let g = gap32 () in
+      let p = pos s in
+      vec local (compress locals);
+      let instr_notes = ref Instrs.empty in
+      let note i =
+        if not (is_dwarf_like i.it) then
+          (modif instr_notes (Instrs.add (pos s, i.at.left));
+           ignore (add_source_name i.at.left.file)
+          ) in
+      list (instr note) body;
+      modif instr_notes (Instrs.add (pos s, f.at.right));
+      ignore (add_source_name f.at.right.file);
+      end_ ();
+      incr sequence_number;
+      let sequence_end = pos s in
+      patch_gap32 g (sequence_end - p);
+      modif sequence_bounds (DW_Sequence.add (p, !instr_notes, sequence_end))
+
+    let code_section fs =
+      section 10 (fun fs -> code_section_start := pos s; vec code fs) fs (fs <> [])
+
+    (* Element section *)
+    let segment dat seg =
+      let {index; offset; init} = seg.it in
+      var index; const offset; dat init
+
+    let table_segment seg =
+      segment (vec var) seg
+
+    let elem_section elems =
+      section 9 (vec table_segment) elems (elems <> [])
+
+    (* Data section *)
+    let memory_segment seg =
+      segment string seg
+
+    let data_section data =
+      section 11 (vec memory_segment) data (data <> [])
+
+    (* sourceMappingURL section *)
+
+    let source_mapping_url_section smu =
+      match smu with
+      | Some smu -> custom_section "sourceMappingURL" string smu true
+      | None -> ()
+
+    (* Name section *)
+
+    let assoc_list : 'a. ('a -> unit) -> (int32 * 'a) list -> unit = fun f xs ->
+      vec (fun (li, x) -> vu32 li; f x)
+          (List.sort (fun (i1,_) (i2,_) -> compare i1 i2) xs)
+
+    let name_section ns =
+      let name_section_body (ns : name_section) =
+        (* module name section *)
+        section 0 (opt string) ns.module_ (ns.module_ <> None);
+        (* function names section *)
+        section 1 (assoc_list string) ns.function_names  (ns.function_names <> []);
+        (* locals names section *)
+        section 2 (assoc_list (assoc_list string)) ns.locals_names  (ns.locals_names <> []) in
+
+      custom_section "name" name_section_body ns
+        (ns.module_ <> None || ns.function_names <> [] || ns.locals_names <> [])
+
+    let icp_custom_section name f opt =
+      match opt with
+      | None -> ()
+      | Some (is_public, x) ->
+        section 0 (fun x ->
+          string ("icp:"^ (if is_public then "public " else "private ") ^ name);
+          f x
+        ) x true
+
+    (* Motoko custom section *)
+
+    let motoko_section_body labels =
+      section 0 (vec string) labels (labels <> [])
+
+    let utf8 bs =
+      ignore (Lib.Utf8.decode bs);  (* assert well-formedness *)
+      put_string s bs
+
+    let motoko_sections motoko =
+      icp_custom_section "motoko:stable-types" utf8 motoko.stable_types;
+      icp_custom_section "motoko:compiler" utf8 motoko.compiler;
+      custom_section "motoko" motoko_section_body motoko.labels (motoko.labels <> []) (* TODO: make an icp_section *)
+
+    let candid_sections candid =
+      icp_custom_section "candid:service" utf8 candid.service;
+      icp_custom_section "candid:args" utf8 candid.args
+
+    let wasm_features_section wasm_features =
+      let text = String.concat "," wasm_features in
+      custom_section "wasm_features" utf8 text (text <> "")
+
+    let uleb128 n = vu64 (Int64.of_int n)
+    let sleb128 n = vs64 (Int64.of_int n)
+    let close_section () = u8 0x00
+    let write16 = Buffer.add_int16_le s.buf
+    let write32 i = Buffer.add_int32_le s.buf (Int32.of_int i)
+    let zero_terminated str = put_string s str; u8 0
+    let vec_uleb128 el = vec_by uleb128 el
+    let writeBlock1 str = let len = String.length str in assert (len < 256); u8 len; put_string s str
+    let writeBlockLEB str = uleb128 (String.length str); put_string s str
+    let dw_gap32 () = let p = pos s in write32 0x0; p
+    let dw_patch_gap32 p n =
+      let lsb i = Char.chr (i land 0xff) in
+      patch s p (lsb n);
+      patch s (p + 1) (lsb (n lsr 8));
+      patch s (p + 2) (lsb (n lsr 16));
+      patch s (p + 3) (lsb (n lsr 24))
+    let dw_patches = ref (fun i -> i)
+
+    let debug_abbrev_section () =
+      let tag (t, ch, kvs) =
+        uleb128 (t land 0xFFFF); u8 ch;
+        assert (kvs <> []); (* these run risk of dead-code elimination *)
+        List.iter (fun (k, v) -> uleb128 k; uleb128 v) kvs in
+      let abbrev i abs = uleb128 (i + 1); tag abs; close_section (); close_section () in
+      let section_body abs = List.iteri abbrev abs; close_section () in
+      custom_section ".debug_abbrev" section_body Abbreviation.abbreviations true
+
+    (* dw_FORM writers *)
+    let writeForm : int -> die -> unit =
+      let open Dwarf5 in
+      function
+      | f when dw_FORM_strp = f ->
+        begin function
+          | StringAttribute (attr, str) -> write32 (add_dwarf_string str)
+          | _ -> failwith "dw_FORM_strp"
+        end
+      | f when dw_FORM_data1 = f ->
+        begin function
+          | IntAttribute (attr, i) -> u8 i
+          | _ -> failwith "dw_FORM_data1"
+        end
+      | f when dw_FORM_data2 = f ->
+        begin function
+          | IntAttribute (attr, i) -> write16 i
+          | _ -> failwith "dw_FORM_data2"
+        end
+      | f when dw_FORM_data4 = f ->
+        begin function
+          | IntAttribute (attr, i) -> write32 i
+          | _ -> failwith "dw_FORM_data4"
+        end
+      | f when dw_FORM_addr = f ->
+        begin function
+          | IntAttribute (attr, i) -> write32 i
+          | _ -> failwith "dw_FORM_addr"
+        end
+      | f when dw_FORM_addrx = f ->
+        begin function
+          | IntAttribute (attr, i) -> uleb128 i
+          | _ -> failwith "dw_FORM_addrx"
+        end
+      | f when dw_FORM_ref4 = f ->
+        begin function
+          | IntAttribute (attr, i) ->
+            (* See Note [placeholder promises for typedefs] *)
+            let placeholder_promise = References.find i !dw_references in
+            assert (Promise.is_fulfilled placeholder_promise);
+            let forward_ref = Promise.value placeholder_promise in
+            let offset_promise = References.find forward_ref !dw_references in
+            if Promise.is_fulfilled offset_promise
+            then write32 (Promise.value offset_promise)
+            else dw_patches :=
+                   (fun gap ps () ->
+                     ps ();
+                     dw_patch_gap32 gap (Promise.value offset_promise)
+                   ) (dw_gap32 ()) !dw_patches
+          | _ -> failwith "dw_FORM_ref_ref4"
+        end
+      | f when dw_FORM_ref_udata = f ->
+        begin function
+          | IntAttribute (attr, i) ->
+            uleb128 (Promise.value (References.find i !dw_references))
+          | _ -> failwith "dw_FORM_ref_udata"
+        end
+      | f when dw_FORM_sec_offset = f ->
+        begin function
+          | IntAttribute (attr, i) -> write32 i
+          | _ -> failwith "dw_FORM_sec_offset"
+        end
+      | f when dw_FORM_block1 = f ->
+        begin function
+          | StringAttribute (attr, str) -> writeBlock1 str
+          | _ -> failwith "dw_FORM_block1"
+        end
+      | f when dw_FORM_exprloc = f ->
+        begin function
+          | StringAttribute (attr, str) -> writeBlockLEB str
+          | _ -> failwith "dw_FORM_exprloc"
+        end
+      | f when dw_FORM_flag = f ->
+        begin function
+          | IntAttribute (attr, b) -> u8 b
+          | _ -> failwith "dw_FORM_flag"
+        end
+      | f when dw_FORM_flag_present = f ->
+        begin function
+          | IntAttribute (attr, 0) -> failwith "dw_FORM_flag_present with false"
+          | IntAttribute (attr, _) -> ()
+          | _ -> failwith "dw_FORM_flag_present"
+        end
+      | _ -> failwith "cannot write form"
+
+    let info_section_start = ref 0
+
+    let rec writeTag at_toplevel = function
+      | Tag (r, t, contentsRevd) ->
+        begin match r with
+        | Some refi ->
+          Promise.fulfill (References.find refi !dw_references) (pos s - !info_section_start)
+        | None -> assert (t <> Dwarf5.dw_TAG_base_type)
+        end;
+
+        (* we have to be careful to only reference tags already written,
+           so maintain creation order *)
+        let ref_priority a b = match a, b with
+          | Tag (Some m, _, _), Tag (Some n, _, _) -> compare n m
+          | _, Tag (Some _, _, _) -> -1
+          | Tag (Some _, _, _), _ -> 1
+          | _ -> 0 in
+
+        let contents = List.rev (if at_toplevel then List.stable_sort ref_priority contentsRevd else contentsRevd) in
+        let wanted_tag (t', _, _) = t = t' in
+        let (_, has_children, forms) = List.find wanted_tag Abbreviation.abbreviations in
+        let rec pairing (attr, form) = function
+          | Tag _ | TagClose | StatementDelimiter _ | Grouped _ -> failwith "Attribute expected"
+          | FutureAttribute f ->
+            pairing (attr, form) (f ())
+          | StringAttribute (a, path0) when a = Dwarf5.dw_AT_decl_file ->
+            let path = if path0 = "" then "prim" else path0 in
+            if attr <> a then Printf.printf "DATA1 attr: 0x%x = a: 0x%x (in TAG 0x%x) PATH: %s  ULT: (%s, %d)\n" attr a t path    (fst (List.hd !source_path_indices)) (snd (List.hd !source_path_indices));
+            assert (attr = a);
+            writeForm form (IntAttribute (a, List.(snd (hd !source_path_indices) - assoc path !source_path_indices)))
+          | IntAttribute (a, _) as art ->
+            if attr <> a then Printf.printf "attr: 0x%x = a: 0x%x (in TAG 0x%x)\n" attr a t;
+            assert (attr = a);
+            writeForm form art
+          | StringAttribute (a, _) as art -> assert (attr = a); writeForm form art
+          | OffsetAttribute _ -> failwith "too late to resolve OffsetAttribute" in
+        let rec indexOf cnt = function
+          | h :: t when wanted_tag h -> cnt
+          | _ :: t -> indexOf (cnt + 1) t
+          | _ -> failwith "not encountered" in
+        uleb128 (indexOf 1 Abbreviation.abbreviations);
+        let nested_tags, attrs = List.partition (function Tag _ -> true | _ -> false) contents in
+
+        List.iter2 pairing forms attrs;
+        List.iter (writeTag false) nested_tags;
+        if has_children <> 0 then close_section ()
+      | _ -> failwith "Tag expected"
+
+    let unit f =
+      let g = dw_gap32 () in (* unit_length *)
+      let p = pos s in
+      f g; dw_patch_gap32 g (pos s - p)
+
+    let debug_info_section () =
+      let section_body abs =
+        unit(fun info_start ->
+            write16 0x0005; (* version *)
+            u8 Dwarf5.dw_UT_compile; (* unit_type *)
+            u8 4; (* address_size *)
+            write32 0x0000; (* debug_abbrev_offset *)
+            info_section_start := info_start;
+
+            match !dwarf_tags with
+            | [toplevel] -> writeTag true toplevel
+            | _ -> failwith "expected one toplevel tag"
+        );
+        !dw_patches () in
+      let relevant ts = ts <> [Tag (None, 0, [])] in
+      custom_section ".debug_info" section_body dwarf_tags (relevant !dwarf_tags)
+
+    let debug_strings_section dss =
+      let rec debug_strings_section_body = function
+        | [] -> ()
+        | (h, _) :: t -> debug_strings_section_body t; zero_terminated h
+      in
+      custom_section ".debug_str" debug_strings_section_body dss (dss <> [])
+
+
+    let debug_addr_section seqs =
+      let debug_addr_section_body seqs =
+        unit(fun start ->
+            write16 0x0005; (* version *)
+            u8 4; (* addr_size *)
+            u8 0; (* segment_selector_size *)
+            let write_addr (st, _, _) =
+              let rel addr = addr - !code_section_start in
+              write32 (rel st)
+            in
+            DW_Sequence.iter write_addr seqs;
+        )
+      in
+      custom_section ".debug_addr" debug_addr_section_body seqs (not (DW_Sequence.is_empty seqs))
+
+
+    (* 7.28 Range List Table *)
+    let debug_rnglists_section sequence_bounds =
+      let index = ref 0 in
+      let debug_rnglists_section_body () =
+        unit(fun start ->
+            write16 0x0005; (* version *)
+            u8 4; (* address_size *)
+            u8 0; (* segment_selector_size *)
+            write32 0; (* offset_entry_count *)
+
+            Promise.fulfill rangelists (pos s - start);
+            DW_Sequence.iter (fun (st, _, en) ->
+                u8 Dwarf5.dw_RLE_startx_length;
+                uleb128 !index;
+                incr index;
+                uleb128 (en - st))
+              sequence_bounds;
+            u8 Dwarf5.dw_RLE_end_of_list;
+
+            (* extract the subprogram sizes to an array *)
+            Promise.fulfill subprogram_sizes (Array.of_seq (Seq.map (fun (st, _, en) -> en - st) (DW_Sequence.to_seq sequence_bounds)))
+        );
+
+        in
+      custom_section ".debug_rnglists" debug_rnglists_section_body () true
+
+    (* Debug strings for line machine section, used by DWARF5: "6.2.4 The Line Number Program Header" *)
+
+    let debug_line_str_section () =
+      let debug_line_strings_section_body (dirs, sources) =
+        let start = pos s in
+        let rec strings = function
+          | [] -> ()
+          | (h, (p, _)) :: t ->
+            Promise.fulfill p (pos s - start);
+            zero_terminated h;
+            strings t in
+        strings dirs;
+        strings sources in
+      custom_section ".debug_line_str" debug_line_strings_section_body (!dir_names, !source_names) true
+
+    (* Debug line machine section, see DWARF5: "6.2 Line Number Information" *)
+
+    let debug_line_section fs =
+      let debug_line_section_body () =
+
+        unit(fun start ->
+            (* see "6.2.4 The Line Number Program Header" *)
+            write16 0x0005;
+            u8 4;
+            u8 0; (* segment_selector_size *)
+            unit(fun _ ->
+                u8 1; (* min_inst_length *)
+                u8 1; (* max_ops_per_inst *)
+                u8 (if Dwarf5.Machine.default_is_stmt then 1 else 0); (* default_is_stmt *)
+                u8 0; (* line_base *)
+                u8 12; (* line_range *)
+                u8 13; (* opcode_base *)
+                let open List in
+                (* DW_LNS_copy .. DW_LNS_set_isa usage *)
+                iter u8 [0; 1; 1; 1; 1; 0; 0; 0; 1; 0; 0; 1];
+
+                let format (l, f) = uleb128 l; uleb128 f in
+                let vec_format = vec_by u8 format in
+
+                (* directory_entry_format_count, directory_entry_formats *)
+                vec_format Dwarf5.[dw_LNCT_path, dw_FORM_line_strp];
+
+                (* directories_count, directories *)
+                vec_uleb128 write32 (rev_map (fun (_, (p, _)) -> Promise.value p) !dir_names);
+
+                (* file_name_entry_format_count, file_name_entry_formats *)
+                vec_format Dwarf5.[dw_LNCT_path, dw_FORM_line_strp; dw_LNCT_directory_index, dw_FORM_udata];
+
+                (* The first entry in the sequence is the primary source file whose file name exactly
+                   matches that given in the DW_AT_name attribute in the compilation unit debugging
+                   information entry. This is ensured by the heuristics, that the last noted source file
+                   will be placed at position 0 in the table *)
+                vec_uleb128
+                  (fun (pos, indx) -> write32 pos; uleb128 indx)
+                  (map (fun (_, (p, dir_indx)) -> Promise.value p, dir_indx) !source_names);
+            );
+
+            (* build the statement loc -> addr map *)
+            let statement_positions = !statement_positions in
+            let module StmtsAt = Map.Make (struct type t = Wasm.Source.pos let compare = compare end) in
+            let statements_at = StmtsAt.of_seq (Seq.map (fun (k, v) -> v, k) (Instrs.to_seq statement_positions)) in
+            let is_statement_at (addr, loc) =
+              match StmtsAt.find_opt loc statements_at with
+              | Some addr' when addr = addr' -> true
+              | _ -> false in
+
+            (* generate the line section *)
+            let code_start = !code_section_start in
+            let rel addr = addr - code_start in
+            let source_indices = !source_path_indices in
+
+            let mapping epi (addr, {file; line; column} as loc) : Dwarf5.Machine.state =
+              let file' = List.(snd (hd source_indices) - assoc (if file = "" then "prim" else file) source_indices) in
+              let stmt = Instrs.mem loc statement_positions || is_statement_at loc (* FIXME TODO: why ||? *) in
+              let addr' = rel addr in
+              Dwarf5.Machine.{ ip = addr'; loc = { file = file'; line; col = column + 1 }; disc = 0; stmt; bb = false; mode = if addr' = epi then Epilogue else Regular }
+            in
+
+            let joining (prg, state) state' : int list list * Dwarf5.Machine.state =
+              (* to avoid quadratic runtime, just collect (cons up) the partial lists here;
+                 later we'll bring it in the right order and flatten *)
+              Dwarf5.Machine.infer state state' :: prg, state'
+            in
+
+            let sequence (sta, notes, en) =
+              let start, ending = rel sta, rel en in
+              let notes_seq = Instrs.to_seq notes in
+              let open Dwarf5.Machine in
+              (* Decorate first instr, and prepend start address, non-statement (FIXME: clang says it *is* a statement) *)
+              let seq_start_state = { start_state with ip = start; stmt = false } in
+              let states_seq () =
+                let open Seq in
+                match map (mapping (ending - 1)) notes_seq () with
+                | Nil -> failwith "there should be an 'end' instruction!"
+                | Cons ({ip; _}, _) when ip = start -> failwith "at start already an instruction?"
+                | Cons (state, _) as front ->
+                  (* override default location from `start_state` *)
+                  let start_state' = { seq_start_state with loc = state.loc } in
+                  (* FIXME (4.11) use `cons` *)
+                  Cons (start_state', fun () -> front)
+              in
+
+              let prg0, _ = Seq.fold_left joining ([], start_state) states_seq in
+              let prg = List.fold_left (Fun.flip (@)) Dwarf5.[dw_LNS_advance_pc; 1; dw_LNE_end_sequence] prg0 in
+              write_opcodes u8 uleb128 sleb128 write32 prg
+            in
+            DW_Sequence.iter sequence !sequence_bounds
+        )
+      in
+      custom_section ".debug_line" debug_line_section_body () (fs <> [])
+
+
+    (* Module *)
+
+    let module_ (em : extended_module) =
+      let m = em.module_ in
+
+      u32 0x6d736100l;
+      u32 version;
+      (* no use-case for encoding dylink section yet, but here would be the place *)
+      assert (em.dylink = None);
+      type_section m.types;
+      import_section m.imports;
+      func_section m.funcs;
+      table_section m.tables;
+      memory_section m.memories;
+      global_section m.globals;
+      export_section m.exports;
+      start_section m.start;
+      elem_section m.elems;
+      code_section m.funcs;
+      data_section m.data;
+      (* other optional sections *)
+      name_section em.name;
+      candid_sections em.candid;
+      motoko_sections em.motoko;
+      wasm_features_section em.wasm_features;
+      source_mapping_url_section em.source_mapping_url;
+      if !Mo_config.Flags.debug_info then
+        begin
+          debug_abbrev_section ();
+          debug_addr_section !sequence_bounds;
+          debug_rnglists_section !sequence_bounds;
+          debug_line_str_section ();
+          debug_line_section m.funcs;
+          debug_info_section ();
+          debug_strings_section !dwarf_strings
+        end
+  end
+  in E.module_ em;
+
+  let mappings = Buffer.contents map in
+  let n = max 0 ((String.length mappings) - 1) in
+  let json : Yojson.Basic.t = `Assoc [
+    ("version", `Int 3);
+    ("sources", `List ( List.map (fun x -> `String x) !sources ) );
+    ("sourcesContent", `List ( List.map (fun x -> if x = "" then `Null else `String x) !sourcesContent ) );
+    ("mappings", `String (String.sub mappings 0 n) )
+  ] in
+
+  (Yojson.Basic.to_string json, to_string s)
+
+
+
+ + + diff --git a/coverage/wasm-exts/dwarf5.ml.html b/coverage/wasm-exts/dwarf5.ml.html new file mode 100644 index 00000000000..20894216400 --- /dev/null +++ b/coverage/wasm-exts/dwarf5.ml.html @@ -0,0 +1,2104 @@ + + + + + dwarf5.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+
+
(* DWARF 5 constants *)
+
+let dw_CHILDREN_no = 0x00
+let dw_CHILDREN_yes = 0x01
+
+let dw_TAG_array_type = 0x01
+let dw_TAG_class_type = 0x02
+let dw_TAG_entry_point = 0x03
+let dw_TAG_enumeration_type = 0x04
+let dw_TAG_formal_parameter = 0x05
+(* let Reserved = 0x06 *)
+(* let Reserved = 0x07 *)
+let dw_TAG_imported_declaration = 0x08
+(* let Reserved = 0x09 *)
+let dw_TAG_label = 0x0a
+let dw_TAG_lexical_block = 0x0b
+(* let Reserved = 0x0c *)
+let dw_TAG_member = 0x0d
+(* let Reserved = 0x0e *)
+let dw_TAG_pointer_type = 0x0f
+let dw_TAG_reference_type = 0x10
+let dw_TAG_compile_unit = 0x11
+let dw_TAG_string_type = 0x12
+let dw_TAG_structure_type = 0x13
+(* let Reserved = 0x14 *)
+let dw_TAG_subroutine_type = 0x15
+let dw_TAG_typedef = 0x16
+let dw_TAG_union_type = 0x17
+let dw_TAG_unspecified_parameters = 0x18
+let dw_TAG_variant = 0x19
+let dw_TAG_common_block = 0x1a
+let dw_TAG_common_inclusion = 0x1b
+let dw_TAG_inheritance = 0x1c
+let dw_TAG_inlined_subroutine = 0x1d
+let dw_TAG_module = 0x1e
+let dw_TAG_ptr_to_member_type = 0x1f
+let dw_TAG_set_type = 0x20
+let dw_TAG_subrange_type = 0x21
+let dw_TAG_with_stmt = 0x22
+let dw_TAG_access_declaration = 0x23
+let dw_TAG_base_type = 0x24
+let dw_TAG_catch_block = 0x25
+let dw_TAG_const_type = 0x26
+let dw_TAG_constant = 0x27
+let dw_TAG_enumerator = 0x28
+let dw_TAG_file_type = 0x29
+let dw_TAG_friend = 0x2a
+let dw_TAG_namelist = 0x2b
+let dw_TAG_namelist_item = 0x2c
+let dw_TAG_packed_type = 0x2d
+let dw_TAG_subprogram = 0x2e
+let dw_TAG_template_type_parameter = 0x2f
+let dw_TAG_template_value_parameter = 0x30
+let dw_TAG_thrown_type = 0x31
+let dw_TAG_try_block = 0x32
+let dw_TAG_variant_part = 0x33
+let dw_TAG_variable = 0x34
+let dw_TAG_volatile_type = 0x35
+let dw_TAG_dwarf_procedure = 0x36
+let dw_TAG_restrict_type = 0x37
+let dw_TAG_interface_type = 0x38
+let dw_TAG_namespace = 0x39
+let dw_TAG_imported_module = 0x3a
+let dw_TAG_unspecified_type = 0x3b
+let dw_TAG_partial_unit = 0x3c
+let dw_TAG_imported_unit = 0x3d
+(* let Reserved = 0x3e *)
+let dw_TAG_condition = 0x3f
+let dw_TAG_shared_type = 0x40
+let dw_TAG_type_unit = 0x41
+let dw_TAG_rvalue_reference_type = 0x42
+let dw_TAG_template_alias = 0x43
+let dw_TAG_coarray_type = 0x44
+let dw_TAG_generic_subrange = 0x45
+let dw_TAG_dynamic_type = 0x46
+let dw_TAG_atomic_type = 0x47
+let dw_TAG_call_site = 0x48
+let dw_TAG_call_site_parameter = 0x49
+let dw_TAG_skeleton_unit = 0x4a
+let dw_TAG_immutable_type = 0x4b
+let dw_TAG_lo_user = 0x4080
+let dw_TAG_hi_user = 0xffff
+
+
+let dw_AT_sibling = 0x01
+let dw_AT_location = 0x02
+let dw_AT_name = 0x03
+(* let Reserved = 0x04 *)
+(* let Reserved = 0x05 *)
+(* let Reserved = 0x06 *)
+(* let Reserved = 0x07 *)
+(* let Reserved = 0x08 *)
+let dw_AT_ordering = 0x09
+(* let Reserved = 0x0a *)
+let dw_AT_byte_size = 0x0b
+(* let Reserved = 0x0c *)
+let dw_AT_bit_size = 0x0d
+(* let Reserved = 0x0e *)
+(* let Reserved = 0x0f *)
+let dw_AT_stmt_list = 0x10
+let dw_AT_low_pc = 0x11
+let dw_AT_high_pc = 0x12
+let dw_AT_language = 0x13
+(* let Reserved = 0x14 *)
+let dw_AT_discr = 0x15
+let dw_AT_discr_value = 0x16
+let dw_AT_visibility = 0x17
+let dw_AT_import = 0x18
+let dw_AT_string_length = 0x19
+let dw_AT_common_reference = 0x1a
+let dw_AT_comp_dir = 0x1b
+let dw_AT_const_value = 0x1c
+let dw_AT_containing_type = 0x1d
+let dw_AT_default_value = 0x1e
+(* let Reserved = 0x1f *)
+let dw_AT_inline = 0x20
+let dw_AT_is_optional = 0x21
+let dw_AT_lower_bound = 0x22
+(* let Reserved = 0x23 *)
+(* let Reserved = 0x24 *)
+let dw_AT_producer = 0x25
+(* let Reserved = 0x26 *)
+let dw_AT_prototyped = 0x27
+(* let Reserved = 0x28 *)
+(* let Reserved = 0x29 *)
+let dw_AT_return_addr = 0x2a
+(* let Reserved = 0x2b *)
+let dw_AT_start_scope = 0x2c
+(* let Reserved = 0x2d *)
+let dw_AT_bit_stride = 0x2e
+let dw_AT_upper_bound = 0x2f
+(* let Reserved = 0x30 *)
+let dw_AT_abstract_origin = 0x31
+let dw_AT_accessibility = 0x32
+let dw_AT_address_class = 0x33
+let dw_AT_artificial = 0x34
+let dw_AT_base_types = 0x35
+let dw_AT_calling_convention = 0x36
+let dw_AT_count = 0x37
+let dw_AT_data_member_location = 0x38
+let dw_AT_decl_column = 0x39
+let dw_AT_decl_file = 0x3a
+let dw_AT_decl_line = 0x3b
+let dw_AT_declaration = 0x3c
+let dw_AT_discr_list = 0x3d
+let dw_AT_encoding = 0x3e
+let dw_AT_external = 0x3f
+let dw_AT_frame_base = 0x40
+let dw_AT_friend = 0x41
+let dw_AT_identifier_case = 0x42
+(* let Reserved = 0x43 *)
+let dw_AT_namelist_item = 0x44
+let dw_AT_priority = 0x45
+let dw_AT_segment = 0x46
+let dw_AT_specification = 0x47
+let dw_AT_static_link = 0x48
+let dw_AT_type = 0x49
+let dw_AT_use_location = 0x4a
+let dw_AT_variable_parameter = 0x4b
+let dw_AT_virtuality = 0x4c
+let dw_AT_vtable_elem_location = 0x4d
+let dw_AT_allocated = 0x4e
+let dw_AT_associated = 0x4f
+let dw_AT_data_location = 0x50
+let dw_AT_byte_stride = 0x51
+let dw_AT_entry_pc = 0x52
+let dw_AT_use_UTF8 = 0x53
+let dw_AT_extension = 0x54
+let dw_AT_ranges = 0x55
+let dw_AT_trampoline = 0x56
+let dw_AT_call_column = 0x57
+let dw_AT_call_file = 0x58
+let dw_AT_call_line = 0x59
+let dw_AT_description = 0x5a
+let dw_AT_binary_scale = 0x5b
+let dw_AT_decimal_scale = 0x5c
+let dw_AT_small = 0x5d
+let dw_AT_decimal_sign = 0x5e
+let dw_AT_digit_count = 0x5f
+let dw_AT_picture_string = 0x60
+let dw_AT_mutable = 0x61
+let dw_AT_threads_scaled = 0x62
+let dw_AT_explicit = 0x63
+let dw_AT_object_pointer = 0x64
+let dw_AT_endianity = 0x65
+let dw_AT_elemental = 0x66
+let dw_AT_pure = 0x67
+let dw_AT_recursive = 0x68
+let dw_AT_signature = 0x69
+let dw_AT_main_subprogram = 0x6a
+let dw_AT_data_bit_offset = 0x6b
+let dw_AT_const_expr = 0x6c
+let dw_AT_enum_class = 0x6d
+let dw_AT_linkage_name = 0x6e
+let dw_AT_string_length_bit_size = 0x6f
+let dw_AT_string_length_byte_size = 0x70
+let dw_AT_rank = 0x71
+let dw_AT_str_offsets_base = 0x72
+let dw_AT_addr_base = 0x73
+let dw_AT_rnglists_base = 0x74
+(* let Reserved = 0x75 *)
+let dw_AT_dwo_name = 0x76
+let dw_AT_reference = 0x77
+let dw_AT_rvalue_reference = 0x78
+let dw_AT_macros = 0x79
+let dw_AT_call_all_calls = 0x7a
+let dw_AT_call_all_source_calls = 0x7b
+let dw_AT_call_all_tail_calls = 0x7c
+let dw_AT_call_return_pc = 0x7d
+let dw_AT_call_value = 0x7e
+let dw_AT_call_origin = 0x7f
+let dw_AT_call_parameter = 0x80
+let dw_AT_call_pc = 0x81
+let dw_AT_call_tail_call = 0x82
+let dw_AT_call_target = 0x83
+let dw_AT_call_target_clobbered = 0x84
+let dw_AT_call_data_location = 0x85
+let dw_AT_call_data_value = 0x86
+let dw_AT_noreturn = 0x87
+let dw_AT_alignment = 0x88
+let dw_AT_export_symbols = 0x89
+let dw_AT_deleted = 0x8a
+let dw_AT_defaulted = 0x8b
+let dw_AT_loclists_base = 0x8c
+let dw_AT_lo_user = 0x2000
+let dw_AT_hi_user = 0x3fff
+
+let dw_ATE_address = 0x01
+let dw_ATE_boolean = 0x02
+let dw_ATE_complex_float = 0x03
+let dw_ATE_float = 0x04
+let dw_ATE_signed = 0x05
+let dw_ATE_signed_char = 0x06
+let dw_ATE_unsigned = 0x07
+let dw_ATE_unsigned_char = 0x08
+let dw_ATE_imaginary_float = 0x09
+let dw_ATE_packed_decimal = 0x0a
+let dw_ATE_numeric_string = 0x0b
+let dw_ATE_edited = 0x0c
+let dw_ATE_signed_fixed = 0x0d
+let dw_ATE_unsigned_fixed = 0x0e
+let dw_ATE_decimal_float = 0x0f
+let dw_ATE_UTF = 0x10
+let dw_ATE_UCS = 0x11
+let dw_ATE_ASCII = 0x12
+let dw_ATE_lo_user = 0x80
+let dw_ATE_hi_user = 0xff
+
+let dw_DS_unsigned = 0x01
+let dw_DS_leading_overpunch = 0x02
+let dw_DS_trailing_overpunch = 0x03
+let dw_DS_leading_separate = 0x04
+let dw_DS_trailing_separate = 0x05
+
+let dw_END_default = 0x00
+let dw_END_big = 0x01
+let dw_END_little = 0x02
+let dw_END_lo_user = 0x40
+let dw_END_hi_user = 0xff
+  
+let dw_FORM_addr = 0x01
+(* Reserved = 0x02 *)
+let dw_FORM_block2 = 0x03
+let dw_FORM_block4 = 0x04
+let dw_FORM_data2 = 0x05
+let dw_FORM_data4 = 0x06
+let dw_FORM_data8 = 0x07
+let dw_FORM_string = 0x08
+let dw_FORM_block = 0x09
+let dw_FORM_block1 = 0x0a
+let dw_FORM_data1 = 0x0b
+let dw_FORM_flag = 0x0c
+let dw_FORM_sdata = 0x0d
+let dw_FORM_strp = 0x0e
+let dw_FORM_udata = 0x0f
+let dw_FORM_ref_addr = 0x10
+let dw_FORM_ref1 = 0x11
+let dw_FORM_ref2 = 0x12
+let dw_FORM_ref4 = 0x13
+let dw_FORM_ref8 = 0x14
+let dw_FORM_ref_udata = 0x15
+let dw_FORM_indirect = 0x16
+let dw_FORM_sec_offset = 0x17
+let dw_FORM_exprloc = 0x18
+let dw_FORM_flag_present = 0x19
+let dw_FORM_strx = 0x1a
+let dw_FORM_addrx = 0x1b
+let dw_FORM_ref_sup4 = 0x1c
+let dw_FORM_strp_sup = 0x1d
+let dw_FORM_data16 = 0x1e
+let dw_FORM_line_strp = 0x1f
+let dw_FORM_ref_sig8 = 0x20
+let dw_FORM_implicit_const = 0x21
+let dw_FORM_loclistx = 0x22
+let dw_FORM_rnglistx = 0x23
+let dw_FORM_ref_sup8 = 0x24
+let dw_FORM_strx1 = 0x25
+let dw_FORM_strx2 = 0x26
+let dw_FORM_strx3 = 0x27
+let dw_FORM_strx4 = 0x28
+let dw_FORM_addrx1 = 0x29
+let dw_FORM_addrx2 = 0x2a
+let dw_FORM_addrx3 = 0x2b
+let dw_FORM_addrx4 = 0x2c
+
+(* FIXME: we cheat for now *)
+let dw_LANG_C99 = 0x000c
+let dw_LANG_Swift = 0x001e
+let dw_LANG_Motoko = 0x0027
+
+
+let dw_UT_compile = 0x01
+let dw_UT_type = 0x02
+let dw_UT_partial = 0x03
+let dw_UT_skeleton = 0x04
+let dw_UT_split_compile = 0x05
+let dw_UT_split_type = 0x06
+let dw_UT_lo_user = 0x80
+let dw_UT_hi_user = 0xff
+
+let dw_RLE_end_of_list = 0x00
+let dw_RLE_base_addressx = 0x01
+let dw_RLE_startx_endx = 0x02
+let dw_RLE_startx_length = 0x03
+let dw_RLE_offset_pair = 0x04
+let dw_RLE_base_address = 0x05
+let dw_RLE_start_end = 0x06
+let dw_RLE_start_length = 0x07
+
+(* Line number header entry format name *)
+let dw_LNCT_path = 0x1
+let dw_LNCT_directory_index = 0x2
+let dw_LNCT_timestamp = 0x3
+let dw_LNCT_size = 0x4
+let dw_LNCT_MD5 = 0x5
+let dw_LNCT_lo_user = 0x2000
+let dw_LNCT_hi_user = 0x3fff
+
+(* Line number standard opcode encodings *)
+let dw_LNS_copy = 0x01
+let dw_LNS_advance_pc = 0x02
+let dw_LNS_advance_line = 0x03
+let dw_LNS_set_file = 0x04
+let dw_LNS_set_column = 0x05
+let dw_LNS_negate_stmt = 0x06
+let dw_LNS_set_basic_block = 0x07
+let dw_LNS_const_add_pc = 0x08
+let dw_LNS_fixed_advance_pc = 0x09
+let dw_LNS_set_prologue_end = 0x0a
+let dw_LNS_set_epilogue_begin = 0x0b
+let dw_LNS_set_isa = 0x0c
+
+(* Line number extended opcode encodings
+   Note: these are negative, so they don't overlap
+         with the `dw_LNS_*` above
+ *)
+let dw_LNE_end_sequence = -0x01
+let dw_LNE_set_address = -0x02
+(* let Reserved 0x03 *)
+let dw_LNE_set_discriminator = -0x04
+let dw_LNE_lo_user = 0x80
+let dw_LNE_hi_user = 0xff
+
+(* DWARF expression opcode encodings *)
+let dw_OP_addr = 0x03
+let dw_OP_deref = 0x06
+let dw_OP_const1u = 0x08
+let dw_OP_const1s = 0x09
+let dw_OP_const2u = 0x0a
+let dw_OP_const2s = 0x0b
+let dw_OP_const4u = 0x0c
+let dw_OP_const4s = 0x0d
+let dw_OP_const8u = 0x0e
+let dw_OP_const8s = 0x0f
+let dw_OP_constu = 0x10
+let dw_OP_consts = 0x11
+let dw_OP_dup = 0x12
+let dw_OP_drop = 0x13
+let dw_OP_over = 0x14
+let dw_OP_pick = 0x15
+let dw_OP_swap = 0x16
+let dw_OP_rot = 0x17
+let dw_OP_xderef = 0x18
+let dw_OP_abs = 0x19
+let dw_OP_and = 0x1a
+let dw_OP_div = 0x1b
+let dw_OP_minus = 0x1c
+let dw_OP_mod = 0x1d
+let dw_OP_mul = 0x1e
+let dw_OP_neg = 0x1f
+let dw_OP_not = 0x20
+let dw_OP_or = 0x21
+let dw_OP_plus = 0x22
+let dw_OP_plus_uconst = 0x23
+let dw_OP_shl = 0x24
+let dw_OP_shr = 0x25
+let dw_OP_shra = 0x26
+let dw_OP_xor = 0x27
+let dw_OP_skip = 0x2f
+let dw_OP_bra = 0x28
+let dw_OP_eq = 0x29
+let dw_OP_ge = 0x2a
+let dw_OP_gt = 0x2b
+let dw_OP_le = 0x2c
+let dw_OP_lt = 0x2d
+let dw_OP_ne = 0x2e
+let dw_OP_lit0 = 0x30
+let dw_OP_lit1 = 0x31
+let dw_OP_lit2 = 0x32
+let dw_OP_lit3 = 0x33
+let dw_OP_lit4 = 0x34
+let dw_OP_lit5 = 0x35
+let dw_OP_lit6 = 0x36
+let dw_OP_lit7 = 0x37
+let dw_OP_lit8 = 0x38
+let dw_OP_lit9 = 0x39
+let dw_OP_lit10 = 0x3a
+let dw_OP_lit11 = 0x3b
+let dw_OP_lit12 = 0x3c
+let dw_OP_lit13 = 0x3d
+let dw_OP_lit14 = 0x3e
+let dw_OP_lit15 = 0x3f
+let dw_OP_lit16 = 0x40
+let dw_OP_lit17 = 0x41
+let dw_OP_lit18 = 0x42
+let dw_OP_lit19 = 0x43
+let dw_OP_lit20 = 0x44
+let dw_OP_lit21 = 0x45
+let dw_OP_lit22 = 0x46
+let dw_OP_lit23 = 0x47
+let dw_OP_lit24 = 0x48
+let dw_OP_lit25 = 0x49
+let dw_OP_lit26 = 0x4a
+let dw_OP_lit27 = 0x4b
+let dw_OP_lit28 = 0x4c
+let dw_OP_lit29 = 0x4d
+let dw_OP_lit30 = 0x4e
+let dw_OP_lit31 = 0x4f
+let dw_OP_reg0 = 0x50
+let dw_OP_reg1 = 0x51
+let dw_OP_reg2 = 0x52
+let dw_OP_reg3 = 0x53
+let dw_OP_reg4 = 0x54
+let dw_OP_reg5 = 0x55
+let dw_OP_reg6 = 0x56
+let dw_OP_reg7 = 0x57
+let dw_OP_reg8 = 0x58
+let dw_OP_reg9 = 0x59
+let dw_OP_reg10 = 0x5a
+let dw_OP_reg11 = 0x5b
+let dw_OP_reg12 = 0x5c
+let dw_OP_reg13 = 0x5d
+let dw_OP_reg14 = 0x5e
+let dw_OP_reg15 = 0x5f
+let dw_OP_reg16 = 0x60
+let dw_OP_reg17 = 0x61
+let dw_OP_reg18 = 0x62
+let dw_OP_reg19 = 0x63
+let dw_OP_reg20 = 0x64
+let dw_OP_reg21 = 0x65
+let dw_OP_reg22 = 0x66
+let dw_OP_reg23 = 0x67
+let dw_OP_reg24 = 0x68
+let dw_OP_reg25 = 0x69
+let dw_OP_reg26 = 0x6a
+let dw_OP_reg27 = 0x6b
+let dw_OP_reg28 = 0x6c
+let dw_OP_reg29 = 0x6d
+let dw_OP_reg30 = 0x6e
+let dw_OP_reg31 = 0x6f
+let dw_OP_breg0 = 0x70
+let dw_OP_breg1 = 0x71
+let dw_OP_breg2 = 0x72
+let dw_OP_breg3 = 0x73
+let dw_OP_breg4 = 0x74
+let dw_OP_breg5 = 0x75
+let dw_OP_breg6 = 0x76
+let dw_OP_breg7 = 0x77
+let dw_OP_breg8 = 0x78
+let dw_OP_breg9 = 0x79
+let dw_OP_breg10 = 0x7a
+let dw_OP_breg11 = 0x7b
+let dw_OP_breg12 = 0x7c
+let dw_OP_breg13 = 0x7d
+let dw_OP_breg14 = 0x7e
+let dw_OP_breg15 = 0x7f
+let dw_OP_breg16 = 0x80
+let dw_OP_breg17 = 0x81
+let dw_OP_breg18 = 0x82
+let dw_OP_breg19 = 0x83
+let dw_OP_breg20 = 0x84
+let dw_OP_breg21 = 0x85
+let dw_OP_breg22 = 0x86
+let dw_OP_breg23 = 0x87
+let dw_OP_breg24 = 0x88
+let dw_OP_breg25 = 0x89
+let dw_OP_breg26 = 0x8a
+let dw_OP_breg27 = 0x8b
+let dw_OP_breg28 = 0x8c
+let dw_OP_breg29 = 0x8d
+let dw_OP_breg30 = 0x8e
+let dw_OP_breg31 = 0x8f
+let dw_OP_regx = 0x90
+let dw_OP_fbreg = 0x91
+let dw_OP_bregx = 0x92
+let dw_OP_piece = 0x93
+let dw_OP_deref_size = 0x94
+let dw_OP_xderef_size = 0x95
+let dw_OP_nop = 0x96
+let dw_OP_push_object_address = 0x97
+let dw_OP_call2 = 0x98
+let dw_OP_call4 = 0x99
+let dw_OP_call_ref = 0x9a
+let dw_OP_form_tls_address = 0x9b
+let dw_OP_call_frame_cfa = 0x9c
+let dw_OP_bit_piece = 0x9d
+let dw_OP_implicit_value = 0x9e
+let dw_OP_stack_value = 0x9f
+let dw_OP_implicit_pointer = 0xa0
+let dw_OP_addrx = 0xa1
+let dw_OP_constx = 0xa2
+let dw_OP_entry_value = 0xa3
+let dw_OP_const_type = 0xa4
+let dw_OP_regval_type = 0xa5
+let dw_OP_deref_type = 0xa6
+let dw_OP_xderef_type = 0xa7
+let dw_OP_convert = 0xa8
+let dw_OP_reinterpret = 0xa9
+
+let dw_OP_lo_user = 0xe0
+let dw_OP_hi_user = 0xff
+
+let dw_OP_WASM_location = 0xed (* see module Location, below *)
+
+module Machine =
+struct
+
+(* Assumptions:
+- op_index = 0 (const)
+- maximum_operations_per_instruction = 1 (non-VLIW)
+- minimum_instruction_length = 1 (bytecode)
+ *)
+
+let default_is_stmt = true
+let line_base = 0
+let line_range = 7
+let opcode_base = dw_LNS_set_isa
+
+type instr_mode = Regular | Prologue | Epilogue
+type loc = { file : int; line : int; col : int }
+
+type state = { ip : int
+             ; loc : loc
+             ; disc : int
+             ; stmt : bool
+             ; bb : bool
+             ; mode : instr_mode }
+
+(*
+Legend:
+-------
+ip: instruction pointer (Wasm bytecode offset in CODE section)
+loc: source location, file encoded as an index
+disc(riminator): instance of inlined code fragment (not relevant yet)
+--flags actionable (by debugger) bits of information (regarding stopping)
+stmt: statement
+bb: basic block
+mode: how the instruction should be treated
+
+See "6.2 Line Number Information" for details.
+*)
+let default_loc = { file = 1; line = 1; col = 0 }
+let default_flags = default_is_stmt, false, Prologue
+(* Table 6.4: Line number program initial state *)
+let start_state = { ip = 0; loc = default_loc; disc = 0; stmt = default_is_stmt; bb = false; mode = Prologue }
+
+
+(* Infers a list of opcodes for the line number program
+   ("6.2.5 The Line Number Program") that, when run, would
+   transition the machine from a certain intermediate state
+   to a following state. This is intended to be used in a loop
+   (fold) to obtain all the opcodes for a list of states.
+*)
+let rec infer from toward = match from, toward with
+  | f, {ip; _} when ip < f.ip -> failwith "can't go backwards"
+  | {ip=0; _}, t when t.ip > 0 ->
+    dw_LNE_set_address :: t.ip :: infer {from with ip = t.ip} t
+  | {ip; _}, t when t.ip > ip ->
+    dw_LNS_advance_pc :: t.ip - ip :: infer {from with ip = t.ip} t
+  | {loc; _}, {loc = {file; _}; _} when file <> loc.file ->
+    dw_LNS_set_file :: file :: infer {from with loc = {loc with file}} toward
+  | {loc; _}, {loc = {line; _}; _} when line <> loc.line ->
+    dw_LNS_advance_line :: line - loc.line :: infer {from with loc = {loc with line}} toward
+  | {loc; _}, {loc = {col; _}; _} when col <> loc.col ->
+    dw_LNS_set_column :: col :: infer {from with loc = {loc with col}} toward
+  | {disc; _}, _ when disc <> toward.disc -> failwith "cannot do disc yet"
+  | {stmt; _}, _ when stmt <> toward.stmt ->
+    dw_LNS_negate_stmt :: infer {from with stmt = toward.stmt} toward
+  | {bb; _}, _ when bb <> toward.bb -> failwith "cannot do bb yet"
+  | {mode = Prologue; _}, {mode = Regular; _} ->
+    dw_LNS_set_prologue_end :: infer toward toward
+  | {mode = Regular; _}, {mode = Epilogue; _} ->
+    dw_LNS_set_epilogue_begin :: infer toward toward
+  | {mode = Prologue; _}, {mode = Epilogue; _} ->
+    dw_LNS_set_prologue_end :: dw_LNS_set_epilogue_begin :: infer toward toward
+  | state, state' when state = state' -> [dw_LNS_copy]
+  | _ -> failwith "not covered"
+
+(* Given a few formatted outputter functions, dump the contents
+   of a line program (essentially a list of `DW_LNS/E_*` opcodes with
+   arguments). The bottleneck functions are expected to close over
+   the output buffer/stream.
+*)
+let write_opcodes u8 uleb sleb u32 : int list -> unit =
+  let standard lns = u8 lns in
+  let extended1 lne = u8 0; u8 1; u8 (- lne) in
+  let extended5 lne = u8 0; u8 5; u8 (- lne) in
+  let rec chase = function
+  | [] -> ()
+  | op :: tail when dw_LNS_copy = op -> standard op; chase tail
+  | op :: offs :: tail when dw_LNS_advance_pc = op -> standard op; uleb offs; chase tail
+  | op :: delta :: tail when dw_LNS_advance_line = op -> standard op; sleb delta; chase tail
+  | op :: file :: tail when dw_LNS_set_file = op -> standard op; uleb file; chase tail
+  | op :: col :: tail when dw_LNS_set_column = op -> standard op; uleb col; chase tail
+  | op :: tail when dw_LNS_negate_stmt = op -> standard op; chase tail
+  | op :: tail when dw_LNS_set_prologue_end = op -> standard op; chase tail
+  | op :: tail when dw_LNS_set_epilogue_begin = op -> standard op; chase tail
+  | op :: tail when dw_LNE_end_sequence = op -> extended1 op; chase tail
+  | op :: addr :: tail when dw_LNE_set_address = op -> extended5 op; u32 addr; chase tail
+  | op :: _ -> failwith (Printf.sprintf "opcode not covered: %d" op)
+  in chase
+
+end
+
+module Location =
+struct
+(* Wasm extensions for DWARF expressions are currently defined
+
+in https://yurydelendik.github.io/webassembly-dwarf/#DWARF-expressions-and-location-descriptions
+
+DW_OP_WASM_location := 0xED ;; available DWARF extension code
+
+wasm-op := wasm-local | wasm-global | wasm-operand-stack
+
+wasm-local := 0x00 i:uleb128
+wasm-global := 0x01 i:uleb128
+wasm-operand-stack := 0x02
+*)
+
+(* Difference-lists-based builder for location programs
+   ("2.5 DWARF Expressions") consisting from `DW_OP_*` opcodes
+   and their arguments. Since the final output is bytecode
+   (i.e. list of 0..255), we use the convention that negative
+   integers (`-i`) in the list externalise as ULEB128-encoded
+   bytes  of `i`.
+*)
+
+let local slot (rest : int list) : int list =
+  dw_OP_WASM_location :: 0x00 :: -slot :: rest
+
+(* below two expressions are not supported yet *)
+
+let global slot rest =
+  dw_OP_WASM_location :: 0x01 :: -slot :: rest
+
+let operand_stack slot rest =
+  dw_OP_WASM_location :: 0x02 :: -slot :: rest
+
+end
+
+
+module Meta =
+struct
+
+type die
+  = StatementDelimiter of Wasm.Source.pos
+  | Tag of int option * int * die list
+  | TagClose
+  | OffsetAttribute of int
+  | IntAttribute of int * int
+  | StringAttribute of int * string
+  (* below is after peephole optimisation only, snoc-like *)
+  | Grouped of die list
+  (* below is encoding-time only *)
+  | FutureAttribute of (unit -> die)
+
+end
+
+
+
+ + + diff --git a/coverage/wasm-exts/operators.ml.html b/coverage/wasm-exts/operators.ml.html new file mode 100644 index 00000000000..1c570a45278 --- /dev/null +++ b/coverage/wasm-exts/operators.ml.html @@ -0,0 +1,737 @@ + + + + + operators.ml — Coverage report + + + + + + + + +
+
+
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+
+
+
+
+  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+
+
(*
+This module originated as a copy of interpreter/syntax/operators.ml in the
+reference implementation. It is pulled in by the strong cohesion between
+the operators and the AST. Not having this source file locally would mean
+that it got basically replicated into the customModuleDecode.ml file.
+
+Base revision: WebAssembly/spec@a7a1856.
+
+The changes are:
+ * None for now
+
+The code is otherwise as untouched as possible, so that we can relatively
+easily apply diffs from the original code (possibly manually).
+*)
+
+open Wasm.Source
+open Wasm.Types
+open Wasm.Values
+open Ast
+
+
+let i32_const n = Const (I32 n.it @@ n.at)
+let i64_const n = Const (I64 n.it @@ n.at)
+let f32_const n = Const (F32 n.it @@ n.at)
+let f64_const n = Const (F64 n.it @@ n.at)
+
+let unreachable = Unreachable
+let nop = Nop
+let drop = Drop
+let select = Select
+let block bt es = Block (bt, es)
+let loop bt es = Loop (bt, es)
+let if_ bt es1 es2 = If (bt, es1, es2)
+let br x = Br x
+let br_if x = BrIf x
+let br_table xs x = BrTable (xs, x)
+
+let return = Return
+let call x = Call x
+let call_indirect x = CallIndirect x
+
+let local_get x = LocalGet x
+let local_set x = LocalSet x
+let local_tee x = LocalTee x
+let global_get x = GlobalGet x
+let global_set x = GlobalSet x
+
+let i32_load align offset = Load {ty = I32Type; align; offset; sz = None}
+let i64_load align offset = Load {ty = I64Type; align; offset; sz = None}
+let f32_load align offset = Load {ty = F32Type; align; offset; sz = None}
+let f64_load align offset = Load {ty = F64Type; align; offset; sz = None}
+let i32_load8_s align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack8, SX)}
+let i32_load8_u align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack8, ZX)}
+let i32_load16_s align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack16, SX)}
+let i32_load16_u align offset =
+  Load {ty = I32Type; align; offset; sz = Some (Pack16, ZX)}
+let i64_load8_s align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack8, SX)}
+let i64_load8_u align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack8, ZX)}
+let i64_load16_s align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack16, SX)}
+let i64_load16_u align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack16, ZX)}
+let i64_load32_s align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack32, SX)}
+let i64_load32_u align offset =
+  Load {ty = I64Type; align; offset; sz = Some (Pack32, ZX)}
+
+let i32_store align offset = Store {ty = I32Type; align; offset; sz = None}
+let i64_store align offset = Store {ty = I64Type; align; offset; sz = None}
+let f32_store align offset = Store {ty = F32Type; align; offset; sz = None}
+let f64_store align offset = Store {ty = F64Type; align; offset; sz = None}
+let i32_store8 align offset =
+  Store {ty = I32Type; align; offset; sz = Some Pack8}
+let i32_store16 align offset =
+  Store {ty = I32Type; align; offset; sz = Some Pack16}
+let i64_store8 align offset =
+  Store {ty = I64Type; align; offset; sz = Some Pack8}
+let i64_store16 align offset =
+  Store {ty = I64Type; align; offset; sz = Some Pack16}
+let i64_store32 align offset =
+  Store {ty = I64Type; align; offset; sz = Some Pack32}
+
+let i32_clz = Unary (I32 I32Op.Clz)
+let i32_ctz = Unary (I32 I32Op.Ctz)
+let i32_popcnt = Unary (I32 I32Op.Popcnt)
+let i64_clz = Unary (I64 I64Op.Clz)
+let i64_ctz = Unary (I64 I64Op.Ctz)
+let i64_popcnt = Unary (I64 I64Op.Popcnt)
+let f32_neg = Unary (F32 F32Op.Neg)
+let f32_abs = Unary (F32 F32Op.Abs)
+let f32_sqrt = Unary (F32 F32Op.Sqrt)
+let f32_ceil = Unary (F32 F32Op.Ceil)
+let f32_floor = Unary (F32 F32Op.Floor)
+let f32_trunc = Unary (F32 F32Op.Trunc)
+let f32_nearest = Unary (F32 F32Op.Nearest)
+let f64_neg = Unary (F64 F64Op.Neg)
+let f64_abs = Unary (F64 F64Op.Abs)
+let f64_sqrt = Unary (F64 F64Op.Sqrt)
+let f64_ceil = Unary (F64 F64Op.Ceil)
+let f64_floor = Unary (F64 F64Op.Floor)
+let f64_trunc = Unary (F64 F64Op.Trunc)
+let f64_nearest = Unary (F64 F64Op.Nearest)
+
+let i32_add = Binary (I32 I32Op.Add)
+let i32_sub = Binary (I32 I32Op.Sub)
+let i32_mul = Binary (I32 I32Op.Mul)
+let i32_div_s = Binary (I32 I32Op.DivS)
+let i32_div_u = Binary (I32 I32Op.DivU)
+let i32_rem_s = Binary (I32 I32Op.RemS)
+let i32_rem_u = Binary (I32 I32Op.RemU)
+let i32_and = Binary (I32 I32Op.And)
+let i32_or = Binary (I32 I32Op.Or)
+let i32_xor = Binary (I32 I32Op.Xor)
+let i32_shl = Binary (I32 I32Op.Shl)
+let i32_shr_s = Binary (I32 I32Op.ShrS)
+let i32_shr_u = Binary (I32 I32Op.ShrU)
+let i32_rotl = Binary (I32 I32Op.Rotl)
+let i32_rotr = Binary (I32 I32Op.Rotr)
+let i64_add = Binary (I64 I64Op.Add)
+let i64_sub = Binary (I64 I64Op.Sub)
+let i64_mul = Binary (I64 I64Op.Mul)
+let i64_div_s = Binary (I64 I64Op.DivS)
+let i64_div_u = Binary (I64 I64Op.DivU)
+let i64_rem_s = Binary (I64 I64Op.RemS)
+let i64_rem_u = Binary (I64 I64Op.RemU)
+let i64_and = Binary (I64 I64Op.And)
+let i64_or = Binary (I64 I64Op.Or)
+let i64_xor = Binary (I64 I64Op.Xor)
+let i64_shl = Binary (I64 I64Op.Shl)
+let i64_shr_s = Binary (I64 I64Op.ShrS)
+let i64_shr_u = Binary (I64 I64Op.ShrU)
+let i64_rotl = Binary (I64 I64Op.Rotl)
+let i64_rotr = Binary (I64 I64Op.Rotr)
+let f32_add = Binary (F32 F32Op.Add)
+let f32_sub = Binary (F32 F32Op.Sub)
+let f32_mul = Binary (F32 F32Op.Mul)
+let f32_div = Binary (F32 F32Op.Div)
+let f32_min = Binary (F32 F32Op.Min)
+let f32_max = Binary (F32 F32Op.Max)
+let f32_copysign = Binary (F32 F32Op.CopySign)
+let f64_add = Binary (F64 F64Op.Add)
+let f64_sub = Binary (F64 F64Op.Sub)
+let f64_mul = Binary (F64 F64Op.Mul)
+let f64_div = Binary (F64 F64Op.Div)
+let f64_min = Binary (F64 F64Op.Min)
+let f64_max = Binary (F64 F64Op.Max)
+let f64_copysign = Binary (F64 F64Op.CopySign)
+
+let i32_eqz = Test (I32 I32Op.Eqz)
+let i64_eqz = Test (I64 I64Op.Eqz)
+
+let i32_eq = Compare (I32 I32Op.Eq)
+let i32_ne = Compare (I32 I32Op.Ne)
+let i32_lt_s = Compare (I32 I32Op.LtS)
+let i32_lt_u = Compare (I32 I32Op.LtU)
+let i32_le_s = Compare (I32 I32Op.LeS)
+let i32_le_u = Compare (I32 I32Op.LeU)
+let i32_gt_s = Compare (I32 I32Op.GtS)
+let i32_gt_u = Compare (I32 I32Op.GtU)
+let i32_ge_s = Compare (I32 I32Op.GeS)
+let i32_ge_u = Compare (I32 I32Op.GeU)
+let i64_eq = Compare (I64 I64Op.Eq)
+let i64_ne = Compare (I64 I64Op.Ne)
+let i64_lt_s = Compare (I64 I64Op.LtS)
+let i64_lt_u = Compare (I64 I64Op.LtU)
+let i64_le_s = Compare (I64 I64Op.LeS)
+let i64_le_u = Compare (I64 I64Op.LeU)
+let i64_gt_s = Compare (I64 I64Op.GtS)
+let i64_gt_u = Compare (I64 I64Op.GtU)
+let i64_ge_s = Compare (I64 I64Op.GeS)
+let i64_ge_u = Compare (I64 I64Op.GeU)
+let f32_eq = Compare (F32 F32Op.Eq)
+let f32_ne = Compare (F32 F32Op.Ne)
+let f32_lt = Compare (F32 F32Op.Lt)
+let f32_le = Compare (F32 F32Op.Le)
+let f32_gt = Compare (F32 F32Op.Gt)
+let f32_ge = Compare (F32 F32Op.Ge)
+let f64_eq = Compare (F64 F64Op.Eq)
+let f64_ne = Compare (F64 F64Op.Ne)
+let f64_lt = Compare (F64 F64Op.Lt)
+let f64_le = Compare (F64 F64Op.Le)
+let f64_gt = Compare (F64 F64Op.Gt)
+let f64_ge = Compare (F64 F64Op.Ge)
+
+let i32_extend8_s = Unary (I32 (I32Op.ExtendS Pack8))
+let i32_extend16_s = Unary (I32 (I32Op.ExtendS Pack16))
+let i64_extend8_s = Unary (I64 (I64Op.ExtendS Pack8))
+let i64_extend16_s = Unary (I64 (I64Op.ExtendS Pack16))
+let i64_extend32_s = Unary (I64 (I64Op.ExtendS Pack32))
+
+let i32_wrap_i64 = Convert (I32 I32Op.WrapI64)
+let i32_trunc_f32_s = Convert (I32 I32Op.TruncSF32)
+let i32_trunc_f32_u = Convert (I32 I32Op.TruncUF32)
+let i32_trunc_f64_s = Convert (I32 I32Op.TruncSF64)
+let i32_trunc_f64_u = Convert (I32 I32Op.TruncUF64)
+let i32_trunc_sat_f32_s = Convert (I32 I32Op.TruncSatSF32)
+let i32_trunc_sat_f32_u = Convert (I32 I32Op.TruncSatUF32)
+let i32_trunc_sat_f64_s = Convert (I32 I32Op.TruncSatSF64)
+let i32_trunc_sat_f64_u = Convert (I32 I32Op.TruncSatUF64)
+let i64_extend_i32_s = Convert (I64 I64Op.ExtendSI32)
+let i64_extend_i32_u = Convert (I64 I64Op.ExtendUI32)
+let i64_trunc_f32_s = Convert (I64 I64Op.TruncSF32)
+let i64_trunc_f32_u = Convert (I64 I64Op.TruncUF32)
+let i64_trunc_f64_s = Convert (I64 I64Op.TruncSF64)
+let i64_trunc_f64_u = Convert (I64 I64Op.TruncUF64)
+let f32_convert_i32_s = Convert (F32 F32Op.ConvertSI32)
+let f32_convert_i32_u = Convert (F32 F32Op.ConvertUI32)
+let f32_convert_i64_s = Convert (F32 F32Op.ConvertSI64)
+let f32_convert_i64_u = Convert (F32 F32Op.ConvertUI64)
+let i64_trunc_sat_f32_s = Convert (I64 I64Op.TruncSatSF32)
+let i64_trunc_sat_f32_u = Convert (I64 I64Op.TruncSatUF32)
+let i64_trunc_sat_f64_s = Convert (I64 I64Op.TruncSatSF64)
+let i64_trunc_sat_f64_u = Convert (I64 I64Op.TruncSatUF64)
+let f32_demote_f64 = Convert (F32 F32Op.DemoteF64)
+let f64_convert_i32_s = Convert (F64 F64Op.ConvertSI32)
+let f64_convert_i32_u = Convert (F64 F64Op.ConvertUI32)
+let f64_convert_i64_s = Convert (F64 F64Op.ConvertSI64)
+let f64_convert_i64_u = Convert (F64 F64Op.ConvertUI64)
+let f64_promote_f32 = Convert (F64 F64Op.PromoteF32)
+let i32_reinterpret_f32 = Convert (I32 I32Op.ReinterpretFloat)
+let i64_reinterpret_f64 = Convert (I64 I64Op.ReinterpretFloat)
+let f32_reinterpret_i32 = Convert (F32 F32Op.ReinterpretInt)
+let f64_reinterpret_i64 = Convert (F64 F64Op.ReinterpretInt)
+
+let memory_size = MemorySize
+let memory_grow = MemoryGrow
+
+
+
+
+ + + diff --git a/docs/html/0.11.0-migration-guide.html b/docs/html/0.11.0-migration-guide.html new file mode 100644 index 00000000000..2d9f965199a --- /dev/null +++ b/docs/html/0.11.0-migration-guide.html @@ -0,0 +1,286 @@ + + + + + + + md/migration-guides/0.11.0-migration-guide.md + + + + +
+

md/migration-guides/0.11.0-migration-guide.md

+
+ +

Motoko v0.11.0: +Safety feature migration guide

+

Overview

+

Motoko v0.11.0 and newer introduces a new safety feature that could +cause breaking changes to existing code.

+

In previous Motoko versions, third-party library functions could make +calls to sensitive functions such as +ExperimentalCycles.add(...) and +Timer.setTimer(...) without providing any indication to the +caller that sensitive system functionality was being used.

+

In Motoko 0.11.0 and newer, the type system is used to detect and +prevent this scenario while still allowing developers to grant access to +sensitive functions.

+

Motoko v0.11.0 changes

+

Motoko uses a simple capability-based type system which selectively +enables language constructs depending on their context. One example is +only async expressions can contain await +expressions, or only some asynchronous contexts can call shared +functions.

+

In Motoko v0.11.0 and newer, this capability system is expanded to +restrict calls to functions including Timer.setTimer and +ExperimentalCycles.add. To accomplish this, Motoko +introduces and uses the pseudo-type parameter system and +corresponding pseudo-type argument (also system) for both +functions and classes.

+

Another change in v0.11.0 and newer is a revision of +ExperimentalCycles.add, whose type has been changed from +Nat -> () to <system>Nat -> (). +This change reflects the additional system capability +requirement using the type parameter <system>.

+

:::info The system type parameter must be the first +parameter of any function, class constructor or function type, e.g. +<system, T, U> is valid but +<T, system, U> is not. :::

+

Migrations for existing +workflows

+

User-defined functions must now declare an explicit system +pseudo-type parameter if they require system capabilities. If a caller +wants to grant system capabilities to a callee, the caller must already +have system capabilities either (implicitly) by virtue of the callsite's +program context or (explicitly) because the callsite resides within a +function or class that itself declares the new system type +parameter.

+

For example, in previous Motoko versions the following could be +used:

+
  func splitCycles() {
+    let amount = ExperimentalCycles.balance() / 2;
+    ExperimentalCycles.add(amount); // new error
+  };
+

This code will now throw a compiler error such as:

+
`system` capability required, but not available
+(need an enclosing async expression or function body or explicit `system` type parameter)(M0197)
+

For Motoko v0.11.0 and newer, the previous code should be rewritten +to include the system type parameter:

+
 func splitCycles<system>() {
+    let amount = ExperimentalCycles.balance() / 2;
+    ExperimentalCycles.add(amount); // warning
+  };
+

This code will include a warning to reflect that +ExperimentalCycles.add is implicitly using system +capability:

+
this function call implicitly requires `system` capability and may perform undesired actions (please review the call and provide a type instantiation `<system>` to suppress this warning)(M0195)
+

This warning can be silenced by adding the pseudo-type argument +system at the call-site:

+
  func splitCycles<system>() {
+    let amount = ExperimentalCycles.balance() / 2;
+    ExperimentalCycles.add<system>(amount); // no warning or error
+  }
+

Developers whose code has proper capability related errors that +prevent compilation will need to refactor their code to explicitly pass +down the system capabilities using additional type parameters and +arguments.

+

System capability syntax +limitations

+

System capability is available within the following contexts:

+
    +
  • Within the body of an actor expression or +actor class.
  • +
  • Within the body of a (non- query) shared +function, asynchronous function, async expression or +async* expression.
  • +
  • Within the body of a local (i.e. not shared) function +or class that is declared with system pseudo-type +parameter.
  • +
  • Within the system functions preupgrade and +postupgrade.
  • +
+

No other context provides system capabilities, including the bodies +of query and composite query methods.

+ + diff --git a/docs/html/Array.html b/docs/html/Array.html new file mode 100644 index 00000000000..83a1e2ef552 --- /dev/null +++ b/docs/html/Array.html @@ -0,0 +1,629 @@ + + + + + + + md/base/Array.md + + + + +
+

md/base/Array.md

+
+ +

Array

+

Provides extended utility functions on Arrays.

+

Note the difference between mutable and non-mutable arrays below.

+

WARNING: If you are looking for a list that can grow and shrink in +size, it is recommended you use either the Buffer class or the List +class for those purposes. Arrays must be created with a fixed size.

+

Import from the base library to use this module.

+
import Array "mo:base/Array";
+

Function init

+
func init<X>(size : Nat, initValue : X) : [var X]
+

Create a mutable array with size copies of the initial +value.

+
let array = Array.init<Nat>(4, 2);
+

Runtime: O(size) Space: O(size)

+

Function tabulate

+
func tabulate<X>(size : Nat, generator : Nat -> X) : [X]
+

Create an immutable array of size size. Each element at +index i is created by applying generator to i.

+
let array : [Nat] = Array.tabulate<Nat>(4, func i = i * 2);
+

Runtime: O(size) Space: O(size)

+

*Runtime and space assumes that generator runs in O(1) +time and space.

+

Function tabulateVar

+
func tabulateVar<X>(size : Nat, generator : Nat -> X) : [var X]
+

Create a mutable array of size size. Each element at +index i is created by applying generator to i.

+
let array : [var Nat] = Array.tabulateVar<Nat>(4, func i = i * 2);
+array[2] := 0;
+array
+

Runtime: O(size) Space: O(size)

+

*Runtime and space assumes that generator runs in O(1) +time and space.

+

Function freeze

+
func freeze<X>(varArray : [var X]) : [X]
+

Transforms a mutable array into an immutable array.

+

+let varArray = [var 0, 1, 2];
+varArray[2] := 3;
+let array = Array.freeze<Nat>(varArray);
+

Runtime: O(size)

+

Space: O(1)

+

Function thaw

+
func thaw<A>(array : [A]) : [var A]
+

Transforms an immutable array into a mutable array.

+

+let array = [0, 1, 2];
+let varArray = Array.thaw<Nat>(array);
+varArray[2] := 3;
+varArray
+

Runtime: O(size)

+

Space: O(1)

+

Function equal

+
func equal<X>(array1 : [X], array2 : [X], equal : (X, X) -> Bool) : Bool
+

Tests if two arrays contain equal values (i.e. they represent the +same list of elements). Uses equal to compare elements in +the arrays.

+
// Use the equal function from the Nat module to compare Nats
+import {equal} "mo:base/Nat";
+
+let array1 = [0, 1, 2, 3];
+let array2 = [0, 1, 2, 3];
+Array.equal(array1, array2, equal)
+

Runtime: O(size1 + size2)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function find

+
func find<X>(array : [X], predicate : X -> Bool) : ?X
+

Returns the first value in array for which +predicate returns true. If no element satisfies the +predicate, returns null.

+
let array = [1, 9, 4, 8];
+Array.find<Nat>(array, func x = x > 8)
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+

Function append

+
func append<X>(array1 : [X], array2 : [X]) : [X]
+

Create a new array by appending the values of array1 and +array2. @deprecated Array.append copies its +arguments and has linear complexity; when used in a loop, consider using +a Buffer, and Buffer.append, instead.

+
let array1 = [1, 2, 3];
+let array2 = [4, 5, 6];
+Array.append<Nat>(array1, array2)
+

Runtime: O(size1 + size2)

+

Space: O(size1 + size2)

+

Function sort

+
func sort<X>(array : [X], compare : (X, X) -> Order.Order) : [X]
+

Sorts the elements in the array according to compare. +Sort is deterministic and stable.

+
import Nat "mo:base/Nat";
+
+let array = [4, 2, 6];
+Array.sort(array, Nat.compare)
+

Runtime: O(size * log(size))

+

Space: O(size) *Runtime and space assumes that compare +runs in O(1) time and space.

+

Function sortInPlace

+
func sortInPlace<X>(array : [var X], compare : (X, X) -> Order.Order)
+

Sorts the elements in the array, in place, according +to compare. Sort is deterministic, stable, and +in-place.

+

+import {compare} "mo:base/Nat";
+
+let array = [var 4, 2, 6];
+Array.sortInPlace(array, compare);
+array
+

Runtime: O(size * log(size))

+

Space: O(size) *Runtime and space assumes that compare +runs in O(1) time and space.

+

Function reverse

+
func reverse<X>(array : [X]) : [X]
+

Creates a new array by reversing the order of elements in +array.

+

+let array = [10, 11, 12];
+
+Array.reverse(array)
+

Runtime: O(size)

+

Space: O(1)

+

Function map

+
func map<X, Y>(array : [X], f : X -> Y) : [Y]
+

Creates a new array by applying f to each element in +array. f "maps" each element it is applied to +of type X to an element of type Y. Retains +original ordering of elements.

+

+let array = [0, 1, 2, 3];
+Array.map<Nat, Nat>(array, func x = x * 3)
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function filter

+
func filter<X>(array : [X], predicate : X -> Bool) : [X]
+

Creates a new array by applying predicate to every +element in array, retaining the elements for which +predicate returns true.

+
let array = [4, 2, 6, 1, 5];
+let evenElements = Array.filter<Nat>(array, func x = x % 2 == 0);
+

Runtime: O(size)

+

Space: O(size) *Runtime and space assumes that predicate +runs in O(1) time and space.

+

Function mapEntries

+
func mapEntries<X, Y>(array : [X], f : (X, Nat) -> Y) : [Y]
+

Creates a new array by applying f to each element in +array and its index. Retains original ordering of +elements.

+

+let array = [10, 10, 10, 10];
+Array.mapEntries<Nat, Nat>(array, func (x, i) = i * x)
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapFilter

+
func mapFilter<X, Y>(array : [X], f : X -> ?Y) : [Y]
+

Creates a new array by applying f to each element in +array, and keeping all non-null elements. The ordering is +retained.

+
import {toText} "mo:base/Nat";
+
+let array = [4, 2, 0, 1];
+let newArray =
+  Array.mapFilter<Nat, Text>( // mapping from Nat to Text values
+    array,
+    func x = if (x == 0) { null } else { ?toText(100 / x) } // can't divide by 0, so return null
+  );
+

Runtime: O(size)

+

Space: O(size) *Runtime and space assumes that f runs in +O(1) time and space.

+

Function mapResult

+
func mapResult<X, Y, E>(array : [X], f : X -> Result.Result<Y, E>) : Result.Result<[Y], E>
+

Creates a new array by applying f to each element in +array. If any invocation of f produces an +#err, returns an #err. Otherwise returns an +#ok containing the new array.

+
let array = [4, 3, 2, 1, 0];
+// divide 100 by every element in the array
+Array.mapResult<Nat, Nat, Text>(array, func x {
+  if (x > 0) {
+    #ok(100 / x)
+  } else {
+    #err "Cannot divide by zero"
+  }
+})
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function chain

+
func chain<X, Y>(array : [X], k : X -> [Y]) : [Y]
+

Creates a new array by applying k to each element in +array, and concatenating the resulting arrays in order. +This operation is similar to what in other functional languages is known +as monadic bind.

+
import Nat "mo:base/Nat";
+
+let array = [1, 2, 3, 4];
+Array.chain<Nat, Int>(array, func x = [x, -x])
+
+

Runtime: O(size)

+

Space: O(size) *Runtime and space assumes that k runs in +O(1) time and space.

+

Function foldLeft

+
func foldLeft<X, A>(array : [X], base : A, combine : (A, X) -> A) : A
+

Collapses the elements in array into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs left to +right.

+
import {add} "mo:base/Nat";
+
+let array = [4, 2, 0, 1];
+let sum =
+  Array.foldLeft<Nat, Nat>(
+    array,
+    0, // start the sum at 0
+    func(sumSoFar, x) = sumSoFar + x // this entire function can be replaced with `add`!
+  );
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+

Function foldRight

+
func foldRight<X, A>(array : [X], base : A, combine : (X, A) -> A) : A
+

Collapses the elements in array into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs right to +left.

+
import {toText} "mo:base/Nat";
+
+let array = [1, 9, 4, 8];
+let bookTitle = Array.foldRight<Nat, Text>(array, "", func(x, acc) = toText(x) # acc);
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+

Function flatten

+
func flatten<X>(arrays : [[X]]) : [X]
+

Flattens the array of arrays into a single array. Retains the +original ordering of the elements.

+

+let arrays = [[0, 1, 2], [2, 3], [], [4]];
+Array.flatten<Nat>(arrays)
+

Runtime: O(number of elements in array)

+

Space: O(number of elements in array)

+

Function make

+
func make<X>(element : X) : [X]
+

Create an array containing a single value.

+
Array.make(2)
+

Runtime: O(1)

+

Space: O(1)

+

Function vals

+
func vals<X>(array : [X]) : I.Iter<X>
+

Returns an Iterator (Iter) over the elements of +array. Iterator provides a single method +next(), which returns elements in order, or +null when out of elements to iterate over.

+

NOTE: You can also use array.vals() instead of this +function. See example below.

+

+let array = [10, 11, 12];
+
+var sum = 0;
+for (element in array.vals()) {
+  sum += element;
+};
+sum
+

Runtime: O(1)

+

Space: O(1)

+

Function keys

+
func keys<X>(array : [X]) : I.Iter<Nat>
+

Returns an Iterator (Iter) over the indices of +array. Iterator provides a single method +next(), which returns indices in order, or +null when out of index to iterate over.

+

NOTE: You can also use array.keys() instead of this +function. See example below.

+

+let array = [10, 11, 12];
+
+var sum = 0;
+for (element in array.keys()) {
+  sum += element;
+};
+sum
+

Runtime: O(1)

+

Space: O(1)

+

Function size

+
func size<X>(array : [X]) : Nat
+

Returns the size of array.

+

NOTE: You can also use array.size() instead of this +function. See example below.

+

+let array = [10, 11, 12];
+let size = Array.size(array);
+

Runtime: O(1)

+

Space: O(1)

+

Function subArray

+
func subArray<X>(array : [X], start : Nat, length : Nat) : [X]
+

Returns a new subarray from the given array provided the start index +and length of elements in the subarray

+

Limitations: Traps if the start index + length is greater than the +size of the array

+

+let array = [1,2,3,4,5];
+let subArray = Array.subArray<Nat>(array, 2, 3);
+

Runtime: O(length); Space: O(length);

+

Function indexOf

+
func indexOf<X>(element : X, array : [X], equal : (X, X) -> Bool) : ?Nat
+

Returns the index of the first element in the +array.

+
import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.indexOf<Char>('c', array, Char.equal) == ?0;
+assert Array.indexOf<Char>('f', array, Char.equal) == ?2;
+assert Array.indexOf<Char>('g', array, Char.equal) == null;
+

Runtime: O(array.size()); Space: O(1);

+

Function nextIndexOf

+
func nextIndexOf<X>(element : X, array : [X], fromInclusive : Nat, equal : (X, X) -> Bool) : ?Nat
+

Returns the index of the next occurence of element in +the array starting from the from index +(inclusive).

+
import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.nextIndexOf<Char>('c', array, 0, Char.equal) == ?0;
+assert Array.nextIndexOf<Char>('f', array, 0, Char.equal) == ?2;
+assert Array.nextIndexOf<Char>('f', array, 2, Char.equal) == ?2;
+assert Array.nextIndexOf<Char>('f', array, 3, Char.equal) == ?3;
+assert Array.nextIndexOf<Char>('f', array, 4, Char.equal) == null;
+

Runtime: O(array.size()); Space: O(1);

+

Function lastIndexOf

+
func lastIndexOf<X>(element : X, array : [X], equal : (X, X) -> Bool) : ?Nat
+

Returns the index of the last element in the +array.

+
import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.lastIndexOf<Char>('c', array, Char.equal) == ?0;
+assert Array.lastIndexOf<Char>('f', array, Char.equal) == ?3;
+assert Array.lastIndexOf<Char>('e', array, Char.equal) == ?5;
+assert Array.lastIndexOf<Char>('g', array, Char.equal) == null;
+

Runtime: O(array.size()); Space: O(1);

+

Function prevIndexOf

+
func prevIndexOf<T>(element : T, array : [T], fromExclusive : Nat, equal : (T, T) -> Bool) : ?Nat
+

Returns the index of the previous occurance of element +in the array starting from the from index +(exclusive).

+
import Char "mo:base/Char";
+let array = ['c', 'o', 'f', 'f', 'e', 'e'];
+assert Array.prevIndexOf<Char>('c', array, array.size(), Char.equal) == ?0;
+assert Array.prevIndexOf<Char>('e', array, array.size(), Char.equal) == ?5;
+assert Array.prevIndexOf<Char>('e', array, 5, Char.equal) == ?4;
+assert Array.prevIndexOf<Char>('e', array, 4, Char.equal) == null;
+

Runtime: O(array.size()); Space: O(1);

+

Function slice

+
func slice<X>(array : [X], fromInclusive : Nat, toExclusive : Nat) : I.Iter<X>
+

Returns an iterator over a slice of the given array.

+
let array = [1, 2, 3, 4, 5];
+let s = Array.slice<Nat>(array, 3, array.size());
+assert s.next() == ?4;
+assert s.next() == ?5;
+assert s.next() == null;
+
+let s = Array.slice<Nat>(array, 0, 0);
+assert s.next() == null;
+

Runtime: O(1) Space: O(1)

+

Function take

+
func take<T>(array : [T], length : Int) : [T]
+

Returns a new subarray of given length from the beginning or end of +the given array

+

Returns the entire array if the length is greater than the size of +the array

+
let array = [1, 2, 3, 4, 5];
+assert Array.take(array, 2) == [1, 2];
+assert Array.take(array, -2) == [4, 5];
+assert Array.take(array, 10) == [1, 2, 3, 4, 5];
+assert Array.take(array, -99) == [1, 2, 3, 4, 5];
+

Runtime: O(length); Space: O(length);

+ + diff --git a/docs/html/AssocList.html b/docs/html/AssocList.html new file mode 100644 index 00000000000..d853674f874 --- /dev/null +++ b/docs/html/AssocList.html @@ -0,0 +1,430 @@ + + + + + + + md/base/AssocList.md + + + + +
+

md/base/AssocList.md

+
+ +

AssocList

+

Map implemented as a linked-list of key-value pairs +("Associations").

+

NOTE: This map implementation is mainly used as underlying buckets +for other map structures. Thus, other map implementations are easier to +use in most cases.

+

Type AssocList

+
type AssocList<K, V> = List.List<(K, V)>
+

Import from the base library to use this module.

+
import AssocList "mo:base/AssocList";
+import List "mo:base/List";
+import Nat "mo:base/Nat";
+
+type AssocList<K, V> = AssocList.AssocList<K, V>;
+

Initialize an empty map using an empty list.

+
var map : AssocList<Nat, Nat> = List.nil(); // Empty list as an empty map
+map := null; // Alternative: null as empty list.
+map
+

Function find

+
func find<K, V>(map : AssocList<K, V>, key : K, equal : (K, K) -> Bool) : ?V
+

Find the value associated with key key, or +null if no such key exists. Compares keys using the +provided function equal.

+

Example:

+
// Create map = [(0, 10), (1, 11), (2, 12)]
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+
+// Find value associated with key 1
+AssocList.find(map, 1, Nat.equal)
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function replace

+
func replace<K, V>(map : AssocList<K, V>, key : K, equal : (K, K) -> Bool, value : ?V) : (AssocList<K, V>, ?V)
+

Maps key to value in map, and +overwrites the old entry if the key was already present. Returns the old +value in an option if it existed and null otherwise, as +well as the new map. Compares keys using the provided function +equal.

+

Example:

+
// Add three entries to the map
+// map = [(0, 10), (1, 11), (2, 12)]
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+// Override second entry
+map := AssocList.replace(map, 1, Nat.equal, ?21).0;
+
+List.toArray(map)
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function diff

+
func diff<K, V, W>(map1 : AssocList<K, V>, map2 : AssocList<K, W>, equal : (K, K) -> Bool) : AssocList<K, V>
+

Produces a new map containing all entries from map1 +whose keys are not contained in map2. The "extra" entries +in map2 are ignored. Compares keys using the provided +function equal.

+

Example:

+
// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Take the difference
+let newMap = AssocList.diff(map1, map2, Nat.equal);
+List.toArray(newMap)
+

Runtime: O(size1 * size2)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function mapAppend

+
func mapAppend<K, V, W, X>(map1 : AssocList<K, V>, map2 : AssocList<K, W>, f : (?V, ?W) -> X) : AssocList<K, X>
+

@deprecated

+

Function disjDisjoint

+
func disjDisjoint<K, V, W, X>(map1 : AssocList<K, V>, map2 : AssocList<K, W>, f : (?V, ?W) -> X) : AssocList<K, X>
+

Produces a new map by mapping entries in map1 and +map2 using f and concatenating the results. +Assumes that there are no collisions between keys in map1 +and map2.

+

Example:

+
import { trap } "mo:base/Debug";
+
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(4, "14"), (3, "13")]
+var map2 : AssocList<Nat, Text> = null;
+map2 := AssocList.replace(map2, 4, Nat.equal, ?"14").0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?"13").0;
+
+// Map and append the two AssocLists
+let newMap =
+  AssocList.disjDisjoint<Nat, Nat, Text, Text>(
+    map1,
+    map2,
+    func((v1, v2) : (?Nat, ?Text)) {
+      switch(v1, v2) {
+        case(?v1, null) {
+          debug_show(v1) // convert values from map1 to Text
+        };
+        case(null, ?v2) {
+          v2 // keep values from map2 as Text
+        };
+        case _ {
+          trap "These cases will never happen in mapAppend"
+        }
+      }
+    }
+  );
+
+List.toArray(newMap)
+

Runtime: O(size1 + size2)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function disj

+
func disj<K, V, W, X>(map1 : AssocList<K, V>, map2 : AssocList<K, W>, equal : (K, K) -> Bool, combine : (?V, ?W) -> X) : AssocList<K, X>
+

Creates a new map by merging entries from map1 and +map2, and mapping them using combine. +combine is also used to combine the values of colliding +keys. Keys are compared using the given equal function.

+

NOTE: combine will never be applied to +(null, null).

+

Example:

+
import { trap } "mo:base/Debug";
+
+// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Merge the two maps using `combine`
+let newMap =
+  AssocList.disj<Nat, Nat, Nat, Nat>(
+    map1,
+    map2,
+    Nat.equal,
+    func((v1, v2) : (?Nat, ?Nat)) : Nat {
+      switch(v1, v2) {
+        case(?v1, ?v2) {
+          v1 + v2 // combine values of colliding keys by adding them
+        };
+        case(?v1, null) {
+          v1 // when a key doesn't collide, keep the original value
+        };
+        case(null, ?v2) {
+          v2
+        };
+        case _ {
+          trap "This case will never happen in disj"
+        }
+      }
+    }
+  );
+
+List.toArray(newMap)
+

Runtime: O(size1 * size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that equal and +combine runs in O(1) time and space.

+

Function join

+
func join<K, V, W, X>(map1 : AssocList<K, V>, map2 : AssocList<K, W>, equal : (K, K) -> Bool, combine : (V, W) -> X) : AssocList<K, X>
+

Takes the intersection of map1 and map2, +only keeping colliding keys and combining values using the +combine function. Keys are compared using the +equal function.

+

Example:

+
// Create map1 = [(0, 10), (1, 11), (2, 12)]
+var map1 : AssocList<Nat, Nat> = null;
+map1 := AssocList.replace(map1, 0, Nat.equal, ?10).0;
+map1 := AssocList.replace(map1, 1, Nat.equal, ?11).0;
+map1 := AssocList.replace(map1, 2, Nat.equal, ?12).0;
+
+// Create map2 = [(2, 12), (3, 13)]
+var map2 : AssocList<Nat, Nat> = null;
+map2 := AssocList.replace(map2, 2, Nat.equal, ?12).0;
+map2 := AssocList.replace(map2, 3, Nat.equal, ?13).0;
+
+// Take the intersection of the two maps, combining values by adding them
+let newMap = AssocList.join<Nat, Nat, Nat, Nat>(map1, map2, Nat.equal, Nat.add);
+
+List.toArray(newMap)
+

Runtime: O(size1 * size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that equal and +combine runs in O(1) time and space.

+

Function fold

+
func fold<K, V, X>(map : AssocList<K, V>, base : X, combine : (K, V, X) -> X) : X
+

Collapses the elements in map into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs left to +right.

+

Example:

+
// Create map = [(0, 10), (1, 11), (2, 12)]
+var map : AssocList<Nat, Nat> = null;
+map := AssocList.replace(map, 0, Nat.equal, ?10).0;
+map := AssocList.replace(map, 1, Nat.equal, ?11).0;
+map := AssocList.replace(map, 2, Nat.equal, ?12).0;
+
+// (0 * 10) + (1 * 11) + (2 * 12)
+AssocList.fold<Nat, Nat, Nat>(map, 0, func(k, v, sumSoFar) = (k * v) + sumSoFar)
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+ + diff --git a/docs/html/Blob.html b/docs/html/Blob.html new file mode 100644 index 00000000000..d4cf2d6627d --- /dev/null +++ b/docs/html/Blob.html @@ -0,0 +1,380 @@ + + + + + + + md/base/Blob.md + + + + +
+

md/base/Blob.md

+
+ +

Blob

+

Module for working with Blobs: immutable sequence of bytes.

+

Blobs represent sequences of bytes. They are immutable, iterable, but +not indexable and can be empty.

+

Byte sequences are also often represented as [Nat8], +i.e. an array of bytes, but this representation is currently much less +compact than Blob, taking 4 physical bytes to represent +each logical byte in the sequence. If you would like to manipulate +Blobs, it is recommended that you convert Blobs to +[var Nat8] or Buffer<Nat8>, do the +manipulation, then convert back.

+

Import from the base library to use this module.

+
import Blob "mo:base/Blob";
+

Some built in features not listed in this module:

+
    +
  • You can create a Blob literal from a Text +literal, provided the context expects an expression of type +Blob.
  • +
  • b.size() : Nat returns the number of bytes in the blob +b;
  • +
  • b.vals() : Iter.Iter<Nat8> returns an iterator to +enumerate the bytes of the blob b.
  • +
+

For example:

+
import Debug "mo:base/Debug";
+import Nat8 "mo:base/Nat8";
+
+let blob = "\00\00\00\ff" : Blob; // blob literals, where each byte is delimited by a back-slash and represented in hex
+let blob2 = "charsもあり" : Blob; // you can also use characters in the literals
+let numBytes = blob.size(); // => 4 (returns the number of bytes in the Blob)
+for (byte : Nat8 in blob.vals()) { // iterator over the Blob
+  Debug.print(Nat8.toText(byte))
+}
+

Type Blob

+
type Blob = Prim.Types.Blob
+

Function fromArray

+
func fromArray(bytes : [Nat8]) : Blob
+

Creates a Blob from an array of bytes +([Nat8]), by copying each element.

+

Example:

+
let bytes : [Nat8] = [0, 255, 0];
+let blob = Blob.fromArray(bytes); // => "\00\FF\00"
+

Function fromArrayMut

+
func fromArrayMut(bytes : [var Nat8]) : Blob
+

Creates a Blob from a mutable array of bytes +([var Nat8]), by copying each element.

+

Example:

+
let bytes : [var Nat8] = [var 0, 255, 0];
+let blob = Blob.fromArrayMut(bytes); // => "\00\FF\00"
+

Function toArray

+
func toArray(blob : Blob) : [Nat8]
+

Converts a Blob to an array of bytes +([Nat8]), by copying each element.

+

Example:

+
let blob = "\00\FF\00" : Blob;
+let bytes = Blob.toArray(blob); // => [0, 255, 0]
+

Function toArrayMut

+
func toArrayMut(blob : Blob) : [var Nat8]
+

Converts a Blob to a mutable array of bytes +([var Nat8]), by copying each element.

+

Example:

+
let blob = "\00\FF\00" : Blob;
+let bytes = Blob.toArrayMut(blob); // => [var 0, 255, 0]
+

Function hash

+
func hash(blob : Blob) : Nat32
+

Returns the (non-cryptographic) hash of blob.

+

Example:

+
let blob = "\00\FF\00" : Blob;
+Blob.hash(blob) // => 1_818_567_776
+

Function compare

+
func compare(b1 : Blob, b2 : Blob) : {#less; #equal; #greater}
+

General purpose comparison function for Blob by +comparing the value of the bytes. Returns the Order (either +#less, #equal, or #greater) by +comparing blob1 with blob2.

+

Example:

+
let blob1 = "\00\00\00" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+Blob.compare(blob1, blob2) // => #less
+

Function equal

+
func equal(blob1 : Blob, blob2 : Blob) : Bool
+

Equality function for Blob types. This is equivalent to +blob1 == blob2.

+

Example:

+
let blob1 = "\00\FF\00" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.equal(blob1, blob2);
+blob1 == blob2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Blob>(3);
+let buffer2 = Buffer.Buffer<Blob>(3);
+Buffer.equal(buffer1, buffer2, Blob.equal) // => true
+

Function notEqual

+
func notEqual(blob1 : Blob, blob2 : Blob) : Bool
+

Inequality function for Blob types. This is equivalent +to blob1 != blob2.

+

Example:

+
let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.notEqual(blob1, blob2);
+blob1 != blob2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(blob1 : Blob, blob2 : Blob) : Bool
+

"Less than" function for Blob types. This is equivalent +to blob1 < blob2.

+

Example:

+
let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.less(blob1, blob2);
+blob1 < blob2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(blob1 : Blob, blob2 : Blob) : Bool
+

"Less than or equal to" function for Blob types. This is +equivalent to blob1 <= blob2.

+

Example:

+
let blob1 = "\00\AA\AA" : Blob;
+let blob2 = "\00\FF\00" : Blob;
+ignore Blob.lessOrEqual(blob1, blob2);
+blob1 <= blob2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(blob1 : Blob, blob2 : Blob) : Bool
+

"Greater than" function for Blob types. This is +equivalent to blob1 > blob2.

+

Example:

+
let blob1 = "\BB\AA\AA" : Blob;
+let blob2 = "\00\00\00" : Blob;
+ignore Blob.greater(blob1, blob2);
+blob1 > blob2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(blob1 : Blob, blob2 : Blob) : Bool
+

"Greater than or equal to" function for Blob types. This +is equivalent to blob1 >= blob2.

+

Example:

+
let blob1 = "\BB\AA\AA" : Blob;
+let blob2 = "\00\00\00" : Blob;
+ignore Blob.greaterOrEqual(blob1, blob2);
+blob1 >= blob2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+ + diff --git a/docs/html/Bool.html b/docs/html/Bool.html new file mode 100644 index 00000000000..e997bdd8af9 --- /dev/null +++ b/docs/html/Bool.html @@ -0,0 +1,240 @@ + + + + + + + md/base/Bool.md + + + + +
+

md/base/Bool.md

+
+ +

Bool

+

Boolean type and operations.

+

While boolean operators _ and _ and _ or _ +are short-circuiting, avoiding computation of the right argument when +possible, the functions logand(_, _) and +logor(_, _) are strict and will always evaluate +both of their arguments.

+

Type Bool

+
type Bool = Prim.Types.Bool
+

Booleans with constants true and false.

+

Function toText

+
func toText(x : Bool) : Text
+

Conversion.

+

Function logand

+
func logand(x : Bool, y : Bool) : Bool
+

Returns x and y.

+

Function logor

+
func logor(x : Bool, y : Bool) : Bool
+

Returns x or y.

+

Function logxor

+
func logxor(x : Bool, y : Bool) : Bool
+

Returns exclusive or of x and y, +x != y.

+

Function lognot

+
func lognot(x : Bool) : Bool
+

Returns not x.

+

Function equal

+
func equal(x : Bool, y : Bool) : Bool
+

Returns x == y.

+

Function notEqual

+
func notEqual(x : Bool, y : Bool) : Bool
+

Returns x != y.

+

Function compare

+
func compare(x : Bool, y : Bool) : {#less; #equal; #greater}
+

Returns the order of x and y, where +false < true.

+ + diff --git a/docs/html/Buffer.html b/docs/html/Buffer.html new file mode 100644 index 00000000000..6a3e0acc80d --- /dev/null +++ b/docs/html/Buffer.html @@ -0,0 +1,1575 @@ + + + + + + + md/base/Buffer.md + + + + +
+

md/base/Buffer.md

+
+ +

Buffer

+

Class Buffer<X> provides a mutable list of +elements of type X. The class wraps and resizes an +underyling array that holds the elements, and thus is comparable to +ArrayLists or Vectors in other languages.

+

When required, the current state of a buffer object can be converted +to a fixed-size array of its elements. This is recommended for example +when storing a buffer to a stable variable.

+

Throughout this documentation, two terms come up that can be +confused: size and capacity. size +is the length of the list that the buffer represents. +capacity is the length of the underyling array that backs +this list. capacity >= size is an invariant +for this class.

+

Like arrays, elements in the buffer are ordered by indices from 0 to +size-1.

+

WARNING: Certain operations are amortized O(1) time, such as +add, but run in worst case O(n) time. These worst case +runtimes may exceed the cycles limit per message if the size of the +buffer is large enough. Grow these structures with discretion. All +amortized operations below also list the worst case runtime.

+

Constructor: The argument initCapacity determines the +initial capacity of the array. The underlying array grows by a factor of +1.5 when its current capacity is exceeded. Further, when the size of the +buffer shrinks to be less than 1/4th of the capacity, the underyling +array is shrunk by a factor of 2.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer = Buffer.Buffer<Nat>(3); // Creates a new Buffer
+

Runtime: O(initCapacity)

+

Space: O(initCapacity)

+

Class Buffer<X>

+
class Buffer<X>(initCapacity : Nat)
+

Function size

+
func size() : Nat
+

Returns the current number of elements in the buffer.

+

Example:

+
buffer.size() // => 0
+

Runtime: O(1)

+

Space: O(1)

+

Function add

+
func add(element : X)
+

Adds a single element to the end of the buffer, doubling the size of +the array if capacity is exceeded.

+

Example:

+

+buffer.add(0); // add 0 to buffer
+buffer.add(1);
+buffer.add(2);
+buffer.add(3); // causes underlying array to increase in capacity
+Buffer.toArray(buffer) // => [0, 1, 2, 3]
+

Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

Function get

+
func get(index : Nat) : X
+

Returns the element at index index. Traps if +index >= size. Indexing is zero-based.

+

Example:

+

+buffer.add(10);
+buffer.add(11);
+buffer.get(0); // => 10
+

Runtime: O(1)

+

Space: O(1)

+

Function getOpt

+
func getOpt(index : Nat) : ?X
+

Returns the element at index index as an option. Returns +null when index >= size. Indexing is +zero-based.

+

Example:

+

+buffer.add(10);
+buffer.add(11);
+let x = buffer.getOpt(0); // => ?10
+let y = buffer.getOpt(2); // => null
+

Runtime: O(1)

+

Space: O(1)

+

Function put

+
func put(index : Nat, element : X)
+

Overwrites the current element at index with +element. Traps if index >= size. Indexing +is zero-based.

+

Example:

+

+buffer.add(10);
+buffer.put(0, 20); // overwrites 10 at index 0 with 20
+Buffer.toArray(buffer) // => [20]
+

Runtime: O(1)

+

Space: O(1)

+

Function removeLast

+
func removeLast() : ?X
+

Removes and returns the last item in the buffer or null +if the buffer is empty.

+

Example:

+

+buffer.add(10);
+buffer.add(11);
+buffer.removeLast(); // => ?11
+

Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

Function remove

+
func remove(index : Nat) : X
+

Removes and returns the element at index from the +buffer. All elements with index > index are shifted one +position to the left. This may cause a downsizing of the array.

+

Traps if index >= size.

+

WARNING: Repeated removal of elements using this method is +ineffecient and might be a sign that you should consider a different +data-structure for your use case.

+

Example:

+

+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+let x = buffer.remove(1); // evaluates to 11. 11 no longer in list.
+Buffer.toArray(buffer) // => [10, 12]
+

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

Function clear

+
func clear()
+

Resets the buffer. Capacity is set to 8.

+

Example:

+

+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+buffer.clear(); // buffer is now empty
+Buffer.toArray(buffer) // => []
+

Runtime: O(1)

+

Space: O(1)

+

Function filterEntries

+
func filterEntries(predicate : (Nat, X) -> Bool)
+

Removes all elements from the buffer for which the predicate returns +false. The predicate is given both the index of the element and the +element itself. This may cause a downsizing of the array.

+

Example:

+

+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+buffer.filterEntries(func(_, x) = x % 2 == 0); // only keep even elements
+Buffer.toArray(buffer) // => [10, 12]
+

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

Function capacity

+
func capacity() : Nat
+

Returns the capacity of the buffer (the length of the underlying +array).

+

Example:

+

+let buffer = Buffer.Buffer<Nat>(2); // underlying array has capacity 2
+buffer.add(10);
+let c1 = buffer.capacity(); // => 2
+buffer.add(11);
+buffer.add(12); // causes capacity to increase by factor of 1.5
+let c2 = buffer.capacity(); // => 3
+

Runtime: O(1)

+

Space: O(1)

+

Function reserve

+
func reserve(capacity : Nat)
+

Changes the capacity to capacity. Traps if +capacity < size.

+

+buffer.reserve(4);
+buffer.add(10);
+buffer.add(11);
+buffer.capacity(); // => 4
+

Runtime: O(capacity)

+

Space: O(capacity)

+

Function append

+
func append(buffer2 : Buffer<X>)
+

Adds all elements in buffer b to this buffer.

+
let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer1.add(10);
+buffer1.add(11);
+buffer2.add(12);
+buffer2.add(13);
+buffer1.append(buffer2); // adds elements from buffer2 to buffer1
+Buffer.toArray(buffer1) // => [10, 11, 12, 13]
+

Amortized Runtime: O(size2), Worst Case Runtime: O(size1 + size2)

+

Amortized Space: O(1), Worst Case Space: O(size1 + size2)

+

Function insert

+
func insert(index : Nat, element : X)
+

Inserts element at index, shifts all +elements to the right of index over by one index. Traps if +index is greater than size.

+
let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer.add(10);
+buffer.add(11);
+buffer.insert(1, 9);
+Buffer.toArray(buffer) // => [10, 9, 11]
+

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size)

+

Function insertBuffer

+
func insertBuffer(index : Nat, buffer2 : Buffer<X>)
+

Inserts buffer2 at index, and shifts all +elements to the right of index over by size2. Traps if +index is greater than size.

+
let buffer1 = Buffer.Buffer<Nat>(2);
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer1.add(10);
+buffer1.add(11);
+buffer2.add(12);
+buffer2.add(13);
+buffer1.insertBuffer(1, buffer2);
+Buffer.toArray(buffer1) // => [10, 12, 13, 11]
+

Runtime: O(size)

+

Amortized Space: O(1), Worst Case Space: O(size1 + size2)

+

Function sort

+
func sort(compare : (X, X) -> Order.Order)
+

Sorts the elements in the buffer according to compare. +Sort is deterministic, stable, and in-place.

+

+import Nat "mo:base/Nat";
+
+buffer.add(11);
+buffer.add(12);
+buffer.add(10);
+buffer.sort(Nat.compare);
+Buffer.toArray(buffer) // => [10, 11, 12]
+

Runtime: O(size * log(size))

+

Space: O(size)

+

Function vals

+
func vals() : { next : () -> ?X }
+

Returns an Iterator (Iter) over the elements of this +buffer. Iterator provides a single method next(), which +returns elements in order, or null when out of elements to +iterate over.

+

+buffer.add(10);
+buffer.add(11);
+buffer.add(12);
+
+var sum = 0;
+for (element in buffer.vals()) {
+  sum += element;
+};
+sum // => 33
+

Runtime: O(1)

+

Space: O(1)

+

Function clone

+
func clone() : Buffer<X>
+

@deprecated Use static library function instead.

+

Function toArray

+
func toArray() : [X]
+

@deprecated Use static library function instead.

+

Function toVarArray

+
func toVarArray() : [var X]
+

@deprecated Use static library function instead.

+

Function isEmpty

+
func isEmpty<X>(buffer : Buffer<X>) : Bool
+

Returns true if and only if the buffer is empty.

+

Example:

+
buffer.add(2);
+buffer.add(0);
+buffer.add(3);
+Buffer.isEmpty(buffer); // => false
+
Buffer.isEmpty(buffer); // => true
+

Runtime: O(1)

+

Space: O(1)

+

Function contains

+
func contains<X>(buffer : Buffer<X>, element : X, equal : (X, X) -> Bool) : Bool
+

Returns true iff buffer contains element +with respect to equality defined by equal.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(2);
+buffer.add(0);
+buffer.add(3);
+Buffer.contains<Nat>(buffer, 2, Nat.equal); // => true
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function clone

+
func clone<X>(buffer : Buffer<X>) : Buffer<X>
+

Returns a copy of buffer, with the same capacity.

+

Example:

+

+buffer.add(1);
+
+let clone = Buffer.clone(buffer);
+Buffer.toArray(clone); // => [1]
+

Runtime: O(size)

+

Space: O(size)

+

Function max

+
func max<X>(buffer : Buffer<X>, compare : (X, X) -> Order) : ?X
+

Finds the greatest element in buffer defined by +compare. Returns null if buffer +is empty.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+
+Buffer.max(buffer, Nat.compare); // => ?2
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) +time and space.

+

Function min

+
func min<X>(buffer : Buffer<X>, compare : (X, X) -> Order) : ?X
+

Finds the least element in buffer defined by +compare. Returns null if buffer +is empty.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+
+Buffer.min(buffer, Nat.compare); // => ?1
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) +time and space.

+

Function equal

+
func equal<X>(buffer1 : Buffer<X>, buffer2 : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Defines equality for two buffers, using equal to +recursively compare elements in the buffers. Returns true iff the two +buffers are of the same size, and equal evaluates to true +for every pair of elements in the two buffers of the same index.

+

Example:

+
import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+
+let buffer2 = Buffer.Buffer<Nat>(5);
+buffer2.add(1);
+buffer2.add(2);
+
+Buffer.equal(buffer1, buffer2, Nat.equal); // => true
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function compare

+
func compare<X>(buffer1 : Buffer<X>, buffer2 : Buffer<X>, compare : (X, X) -> Order.Order) : Order.Order
+

Defines comparison for two buffers, using compare to +recursively compare elements in the buffers. Comparison is defined +lexicographically.

+

Example:

+
import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+
+let buffer2 = Buffer.Buffer<Nat>(3);
+buffer2.add(3);
+buffer2.add(4);
+
+Buffer.compare<Nat>(buffer1, buffer2, Nat.compare); // => #less
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) +time and space.

+

Function toText

+
func toText<X>(buffer : Buffer<X>, toText : X -> Text) : Text
+

Creates a textual representation of buffer, using +toText to recursively convert the elements into Text.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.toText(buffer, Nat.toText); // => "[1, 2, 3, 4]"
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that toText runs in O(1) time +and space.

+

Function hash

+
func hash<X>(buffer : Buffer<X>, hash : X -> Nat32) : Nat32
+

Hashes buffer using hash to hash the +underlying elements. The deterministic hash function is a function of +the elements in the Buffer, as well as their ordering.

+

Example:

+
import Hash "mo:base/Hash";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(1000);
+
+Buffer.hash<Nat>(buffer, Hash.hash); // => 2_872_640_342
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that hash runs in O(1) time +and space.

+

Function indexOf

+
func indexOf<X>(element : X, buffer : Buffer<X>, equal : (X, X) -> Bool) : ?Nat
+

Finds the first index of element in buffer +using equality of elements defined by equal. Returns +null if element is not found.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.indexOf<Nat>(3, buffer, Nat.equal); // => ?2
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function lastIndexOf

+
func lastIndexOf<X>(element : X, buffer : Buffer<X>, equal : (X, X) -> Bool) : ?Nat
+

Finds the last index of element in buffer +using equality of elements defined by equal. Returns +null if element is not found.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(2);
+buffer.add(2);
+
+Buffer.lastIndexOf<Nat>(2, buffer, Nat.equal); // => ?5
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function indexOfBuffer

+
func indexOfBuffer<X>(subBuffer : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : ?Nat
+

Searches for subBuffer in buffer, and +returns the starting index if it is found.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(4);
+sub.add(5);
+sub.add(6);
+
+Buffer.indexOfBuffer<Nat>(sub, buffer, Nat.equal); // => ?3
+

Runtime: O(size of buffer + size of subBuffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function binarySearch

+
func binarySearch<X>(element : X, buffer : Buffer<X>, compare : (X, X) -> Order.Order) : ?Nat
+

Similar to indexOf, but runs in logarithmic time. Assumes that +buffer is sorted. Behavior is undefined if +buffer is not sorted. Uses compare to perform +the search. Returns an index of element if it is found.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+Buffer.binarySearch<Nat>(5, buffer, Nat.compare); // => ?2
+

Runtime: O(log(size))

+

Space: O(1)

+

*Runtime and space assumes that compare runs in O(1) +time and space.

+

Function subBuffer

+
func subBuffer<X>(buffer : Buffer<X>, start : Nat, length : Nat) : Buffer<X>
+

Returns the sub-buffer of buffer starting at index +start of length length. Traps if +start is out of bounds, or start + length is +greater than the size of buffer.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.subBuffer(buffer, 3, 2);
+Buffer.toText(sub, Nat.toText); // => [4, 5]
+

Runtime: O(length)

+

Space: O(length)

+

Function isSubBufferOf

+
func isSubBufferOf<X>(subBuffer : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Checks if subBuffer is a sub-Buffer of +buffer. Uses equal to compare elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(2);
+sub.add(3);
+Buffer.isSubBufferOf(sub, buffer, Nat.equal); // => true
+

Runtime: O(size of subBuffer + size of buffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function +isStrictSubBufferOf

+
func isStrictSubBufferOf<X>(subBuffer : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Checks if subBuffer is a strict subBuffer of +buffer, i.e. subBuffer must be strictly +contained inside both the first and last indices of buffer. +Uses equal to compare elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let sub = Buffer.Buffer<Nat>(2);
+sub.add(2);
+sub.add(3);
+Buffer.isStrictSubBufferOf(sub, buffer, Nat.equal); // => true
+

Runtime: O(size of subBuffer + size of buffer)

+

Space: O(size of subBuffer)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function prefix

+
func prefix<X>(buffer : Buffer<X>, length : Nat) : Buffer<X>
+

Returns the prefix of buffer of length +length. Traps if length is greater than the +size of buffer.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.prefix(buffer, 3); // => [1, 2, 3]
+Buffer.toText(pre, Nat.toText);
+

Runtime: O(length)

+

Space: O(length)

+

Function isPrefixOf

+
func isPrefixOf<X>(prefix : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Checks if prefix is a prefix of buffer. +Uses equal to compare elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.Buffer<Nat>(2);
+pre.add(1);
+pre.add(2);
+Buffer.isPrefixOf(pre, buffer, Nat.equal); // => true
+

Runtime: O(size of prefix)

+

Space: O(size of prefix)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function +isStrictPrefixOf

+
func isStrictPrefixOf<X>(prefix : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Checks if prefix is a strict prefix of +buffer. Uses equal to compare elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let pre = Buffer.Buffer<Nat>(3);
+pre.add(1);
+pre.add(2);
+pre.add(3);
+Buffer.isStrictPrefixOf(pre, buffer, Nat.equal); // => true
+

Runtime: O(size of prefix)

+

Space: O(size of prefix)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function suffix

+
func suffix<X>(buffer : Buffer<X>, length : Nat) : Buffer<X>
+

Returns the suffix of buffer of length +length. Traps if lengthis greater than the +size of buffer.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.suffix(buffer, 3); // => [2, 3, 4]
+Buffer.toText(suf, Nat.toText);
+

Runtime: O(length)

+

Space: O(length)

+

Function isSuffixOf

+
func isSuffixOf<X>(suffix : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Checks if suffix is a suffix of buffer. +Uses equal to compare elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.Buffer<Nat>(3);
+suf.add(2);
+suf.add(3);
+suf.add(4);
+Buffer.isSuffixOf(suf, buffer, Nat.equal); // => true
+

Runtime: O(length of suffix)

+

Space: O(length of suffix)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function +isStrictSuffixOf

+
func isStrictSuffixOf<X>(suffix : Buffer<X>, buffer : Buffer<X>, equal : (X, X) -> Bool) : Bool
+

Checks if suffix is a strict suffix of +buffer. Uses equal to compare elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+let suf = Buffer.Buffer<Nat>(3);
+suf.add(2);
+suf.add(3);
+suf.add(4);
+Buffer.isStrictSuffixOf(suf, buffer, Nat.equal); // => true
+

Runtime: O(length of suffix)

+

Space: O(length of suffix)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function forAll

+
func forAll<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool
+

Returns true iff every element in buffer satisfies +predicate.

+

Example:

+

+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forAll<Nat>(buffer, func x { x > 1 }); // => true
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+

Function forSome

+
func forSome<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool
+

Returns true iff some element in buffer satisfies +predicate.

+

Example:

+

+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forSome<Nat>(buffer, func x { x > 3 }); // => true
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+

Function forNone

+
func forNone<X>(buffer : Buffer<X>, predicate : X -> Bool) : Bool
+

Returns true iff no element in buffer satisfies +predicate.

+

Example:

+

+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+
+Buffer.forNone<Nat>(buffer, func x { x == 0 }); // => true
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+

Function toArray

+
func toArray<X>(buffer : Buffer<X>) : [X]
+

Creates an array containing elements from buffer.

+

Example:

+

+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.toArray<Nat>(buffer); // => [1, 2, 3]
+
+

Runtime: O(size)

+

Space: O(size)

+

Function toVarArray

+
func toVarArray<X>(buffer : Buffer<X>) : [var X]
+

Creates a mutable array containing elements from +buffer.

+

Example:

+

+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.toVarArray<Nat>(buffer); // => [1, 2, 3]
+

Runtime: O(size)

+

Space: O(size)

+

Function fromArray

+
func fromArray<X>(array : [X]) : Buffer<X>
+

Creates a buffer containing elements from array.

+

Example:

+
import Nat "mo:base/Nat";
+
+let array = [2, 3];
+
+let buf = Buffer.fromArray<Nat>(array); // => [2, 3]
+Buffer.toText(buf, Nat.toText);
+

Runtime: O(size)

+

Space: O(size)

+

Function fromVarArray

+
func fromVarArray<X>(array : [var X]) : Buffer<X>
+

Creates a buffer containing elements from array.

+

Example:

+
import Nat "mo:base/Nat";
+
+let array = [var 1, 2, 3];
+
+let buf = Buffer.fromVarArray<Nat>(array); // => [1, 2, 3]
+Buffer.toText(buf, Nat.toText);
+

Runtime: O(size)

+

Space: O(size)

+

Function fromIter

+
func fromIter<X>(iter : { next : () -> ?X }) : Buffer<X>
+

Creates a buffer containing elements from iter.

+

Example:

+
import Nat "mo:base/Nat";
+
+let array = [1, 1, 1];
+let iter = array.vals();
+
+let buf = Buffer.fromIter<Nat>(iter); // => [1, 1, 1]
+Buffer.toText(buf, Nat.toText);
+

Runtime: O(size)

+

Space: O(size)

+

Function trimToSize

+
func trimToSize<X>(buffer : Buffer<X>)
+

Reallocates the array underlying buffer such that +capacity == size.

+

Example:

+

+let buffer = Buffer.Buffer<Nat>(10);
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.trimToSize<Nat>(buffer);
+buffer.capacity(); // => 3
+

Runtime: O(size)

+

Space: O(size)

+

Function map

+
func map<X, Y>(buffer : Buffer<X>, f : X -> Y) : Buffer<Y>
+

Creates a new buffer by applying f to each element in +buffer.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.map<Nat, Nat>(buffer, func (x) { x + 1 });
+Buffer.toText(newBuf, Nat.toText); // => [2, 3, 4]
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function iterate

+
func iterate<X>(buffer : Buffer<X>, f : X -> ())
+

Applies f to each element in buffer.

+

Example:

+
import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.iterate<Nat>(buffer, func (x) {
+  Debug.print(Nat.toText(x)); // prints each element in buffer
+});
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapEntries

+
func mapEntries<X, Y>(buffer : Buffer<X>, f : (Nat, X) -> Y) : Buffer<Y>
+

Applies f to each element in buffer and its +index.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.mapEntries<Nat, Nat>(buffer, func (x, i) { x + i + 1 });
+Buffer.toText(newBuf, Nat.toText); // => [2, 4, 6]
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapFilter

+
func mapFilter<X, Y>(buffer : Buffer<X>, f : X -> ?Y) : Buffer<Y>
+

Creates a new buffer by applying f to each element in +buffer, and keeping all non-null elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.mapFilter<Nat, Nat>(buffer, func (x) {
+  if (x > 1) {
+    ?(x * 2);
+  } else {
+    null;
+  }
+});
+Buffer.toText(newBuf, Nat.toText); // => [4, 6]
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapResult

+
func mapResult<X, Y, E>(buffer : Buffer<X>, f : X -> Result.Result<Y, E>) : Result.Result<Buffer<Y>, E>
+

Creates a new buffer by applying f to each element in +buffer. If any invocation of f produces an +#err, returns an #err. Otherwise Returns an +#ok containing the new buffer.

+

Example:

+
import Result "mo:base/Result";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let result = Buffer.mapResult<Nat, Nat, Text>(buffer, func (k) {
+  if (k > 0) {
+    #ok(k);
+  } else {
+    #err("One or more elements are zero.");
+  }
+});
+
+Result.mapOk<Buffer.Buffer<Nat>, [Nat], Text>(result, func buffer = Buffer.toArray(buffer)) // => #ok([1, 2, 3])
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function chain

+
func chain<X, Y>(buffer : Buffer<X>, k : X -> Buffer<Y>) : Buffer<Y>
+

Creates a new buffer by applying k to each element in +buffer, and concatenating the resulting buffers in order. +This operation is similar to what in other functional languages is known +as monadic bind.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let chain = Buffer.chain<Nat, Nat>(buffer, func (x) {
+  let b = Buffer.Buffer<Nat>(2);
+  b.add(x);
+  b.add(x * 2);
+  return b;
+});
+Buffer.toText(chain, Nat.toText); // => [1, 2, 2, 4, 3, 6]
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that k runs in O(1) time and +space.

+

Function foldLeft

+
func foldLeft<A, X>(buffer : Buffer<X>, base : A, combine : (A, X) -> A) : A
+

Collapses the elements in buffer into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs left to +right.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.foldLeft<Text, Nat>(buffer, "", func (acc, x) { acc # Nat.toText(x)}); // => "123"
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+

Function foldRight

+
func foldRight<X, A>(buffer : Buffer<X>, base : A, combine : (X, A) -> A) : A
+

Collapses the elements in buffer into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs right to +left.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.foldRight<Nat, Text>(buffer, "", func (x, acc) { Nat.toText(x) # acc }); // => "123"
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+

Function first

+
func first<X>(buffer : Buffer<X>) : X
+

Returns the first element of buffer. Traps if +buffer is empty.

+

Example:

+

+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.first(buffer); // => 1
+

Runtime: O(1)

+

Space: O(1)

+

Function last

+
func last<X>(buffer : Buffer<X>) : X
+

Returns the last element of buffer. Traps if +buffer is empty.

+

Example:

+

+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.last(buffer); // => 3
+

Runtime: O(1)

+

Space: O(1)

+

Function make

+
func make<X>(element : X) : Buffer<X>
+

Returns a new buffer with capacity and size 1, containing +element.

+

Example:

+
import Nat "mo:base/Nat";
+
+let buffer = Buffer.make<Nat>(1);
+Buffer.toText(buffer, Nat.toText); // => [1]
+

Runtime: O(1)

+

Space: O(1)

+

Function reverse

+
func reverse<X>(buffer : Buffer<X>)
+

Reverses the order of elements in buffer.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.reverse(buffer);
+Buffer.toText(buffer, Nat.toText); // => [3, 2, 1]
+

Runtime: O(size)

+

Space: O(1)

+

Function merge

+
func merge<X>(buffer1 : Buffer<X>, buffer2 : Buffer<X>, compare : (X, X) -> Order) : Buffer<X>
+

Merges two sorted buffers into a single sorted buffer, using +compare to define the ordering. The final ordering is +stable. Behavior is undefined if either buffer1 or +buffer2 is not sorted.

+

Example:

+
import Nat "mo:base/Nat";
+
+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(4);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(2);
+buffer2.add(4);
+buffer2.add(6);
+
+let merged = Buffer.merge<Nat>(buffer1, buffer2, Nat.compare);
+Buffer.toText(merged, Nat.toText); // => [1, 2, 2, 4, 4, 6]
+

Runtime: O(size1 + size2)

+

Space: O(size1 + size2)

+

*Runtime and space assumes that compare runs in O(1) +time and space.

+

Function +removeDuplicates

+
func removeDuplicates<X>(buffer : Buffer<X>, compare : (X, X) -> Order)
+

Eliminates all duplicate elements in buffer as defined +by compare. Elimination is stable with respect to the +original ordering of the elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+Buffer.removeDuplicates<Nat>(buffer, Nat.compare);
+Buffer.toText(buffer, Nat.toText); // => [1, 2, 3]
+

Runtime: O(size * log(size))

+

Space: O(size)

+

Function partition

+
func partition<X>(buffer : Buffer<X>, predicate : X -> Bool) : (Buffer<X>, Buffer<X>)
+

Splits buffer into a pair of buffers where all elements +in the left buffer satisfy predicate and all elements in +the right buffer do not.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let partitions = Buffer.partition<Nat>(buffer, func (x) { x % 2 == 0 });
+(Buffer.toArray(partitions.0), Buffer.toArray(partitions.1)) // => ([2, 4, 6], [1, 3, 5])
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+

Function split

+
func split<X>(buffer : Buffer<X>, index : Nat) : (Buffer<X>, Buffer<X>)
+

Splits the buffer into two buffers at index, where the +left buffer contains all elements with indices less than +index, and the right buffer contains all elements with +indices greater than or equal to index. Traps if +index is out of bounds.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let split = Buffer.split<Nat>(buffer, 3);
+(Buffer.toArray(split.0), Buffer.toArray(split.1)) // => ([1, 2, 3], [4, 5, 6])
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that compare runs in O(1) +time and space.

+

Function chunk

+
func chunk<X>(buffer : Buffer<X>, size : Nat) : Buffer<Buffer<X>>
+

Breaks up buffer into buffers of size size. +The last chunk may have less than size elements if the +number of elements is not divisible by the chunk size.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+buffer.add(4);
+buffer.add(5);
+buffer.add(6);
+
+let chunks = Buffer.chunk<Nat>(buffer, 3);
+Buffer.toText<Buffer.Buffer<Nat>>(chunks, func buf = Buffer.toText(buf, Nat.toText)); // => [[1, 2, 3], [4, 5, 6]]
+

Runtime: O(number of elements in buffer)

+

Space: O(number of elements in buffer)

+

Function groupBy

+
func groupBy<X>(buffer : Buffer<X>, equal : (X, X) -> Bool) : Buffer<Buffer<X>>
+

Groups equal and adjacent elements in the list into sub lists.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(2);
+buffer.add(4);
+buffer.add(5);
+buffer.add(5);
+
+let grouped = Buffer.groupBy<Nat>(buffer, func (x, y) { x == y });
+Buffer.toText<Buffer.Buffer<Nat>>(grouped, func buf = Buffer.toText(buf, Nat.toText)); // => [[1], [2, 2], [4], [5, 5]]
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that equal runs in O(1) time +and space.

+

Function flatten

+
func flatten<X>(buffer : Buffer<Buffer<X>>) : Buffer<X>
+

Flattens the buffer of buffers into a single buffer.

+

Example:

+
import Nat "mo:base/Nat";
+
+let buffer = Buffer.Buffer<Buffer.Buffer<Nat>>(1);
+
+let inner1 = Buffer.Buffer<Nat>(2);
+inner1.add(1);
+inner1.add(2);
+
+let inner2 = Buffer.Buffer<Nat>(2);
+inner2.add(3);
+inner2.add(4);
+
+buffer.add(inner1);
+buffer.add(inner2);
+// buffer = [[1, 2], [3, 4]]
+
+let flat = Buffer.flatten<Nat>(buffer);
+Buffer.toText<Nat>(flat, Nat.toText); // => [1, 2, 3, 4]
+

Runtime: O(number of elements in buffer)

+

Space: O(number of elements in buffer)

+

Function zip

+
func zip<X, Y>(buffer1 : Buffer<X>, buffer2 : Buffer<Y>) : Buffer<(X, Y)>
+

Combines the two buffers into a single buffer of pairs, pairing +together elements with the same index. If one buffer is longer than the +other, the remaining elements from the longer buffer are not +included.

+

Example:

+

+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(3);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(4);
+buffer2.add(5);
+
+let zipped = Buffer.zip(buffer1, buffer2);
+Buffer.toArray(zipped); // => [(1, 4), (2, 5)]
+

Runtime: O(min(size1, size2))

+

Space: O(min(size1, size2))

+

Function zipWith

+
func zipWith<X, Y, Z>(buffer1 : Buffer<X>, buffer2 : Buffer<Y>, zip : (X, Y) -> Z) : Buffer<Z>
+

Combines the two buffers into a single buffer, pairing together +elements with the same index and combining them using zip. +If one buffer is longer than the other, the remaining elements from the +longer buffer are not included.

+

Example:

+

+let buffer1 = Buffer.Buffer<Nat>(2);
+buffer1.add(1);
+buffer1.add(2);
+buffer1.add(3);
+
+let buffer2 = Buffer.Buffer<Nat>(2);
+buffer2.add(4);
+buffer2.add(5);
+buffer2.add(6);
+
+let zipped = Buffer.zipWith<Nat, Nat, Nat>(buffer1, buffer2, func (x, y) { x + y });
+Buffer.toArray(zipped) // => [5, 7, 9]
+

Runtime: O(min(size1, size2))

+

Space: O(min(size1, size2))

+

*Runtime and space assumes that zip runs in O(1) time +and space.

+

Function takeWhile

+
func takeWhile<X>(buffer : Buffer<X>, predicate : X -> Bool) : Buffer<X>
+

Creates a new buffer taking elements in order from +buffer until predicate returns false.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.takeWhile<Nat>(buffer, func (x) { x < 3 });
+Buffer.toText(newBuf, Nat.toText); // => [1, 2]
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+

Function dropWhile

+
func dropWhile<X>(buffer : Buffer<X>, predicate : X -> Bool) : Buffer<X>
+

Creates a new buffer excluding elements in order from +buffer until predicate returns false.

+

Example:

+
import Nat "mo:base/Nat";
+
+buffer.add(1);
+buffer.add(2);
+buffer.add(3);
+
+let newBuf = Buffer.dropWhile<Nat>(buffer, func x { x < 3 }); // => [3]
+Buffer.toText(newBuf, Nat.toText);
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that predicate runs in O(1) +time and space.

+ + diff --git a/docs/html/CertifiedData.html b/docs/html/CertifiedData.html new file mode 100644 index 00000000000..6d40fd7ad8a --- /dev/null +++ b/docs/html/CertifiedData.html @@ -0,0 +1,229 @@ + + + + + + + md/base/CertifiedData.md + + + + +
+

md/base/CertifiedData.md

+
+ +

CertifiedData

+

Certified data.

+

The Internet Computer allows canister smart contracts to store a +small amount of data during update method processing so that during +query call processing, the canister can obtain a certificate about that +data.

+

This module provides a low-level interface to this API, +aimed at advanced users and library implementors. See the Internet +Computer Functional Specification and corresponding documentation for +how to use this to make query calls to your canister tamperproof.

+

Value set

+
let set : (data : Blob) -> ()
+

Set the certified data.

+

Must be called from an update method, else traps. Must be passed a +blob of at most 32 bytes, else traps.

+

Example:

+
import CertifiedData "mo:base/CertifiedData";
+import Blob "mo:base/Blob";
+
+// Must be in an update call
+
+let array : [Nat8] = [1, 2, 3];
+let blob = Blob.fromArray(array);
+CertifiedData.set(blob);
+

See a full example on how to use certified variables here: https://github.com/dfinity/examples/tree/master/motoko/cert-var

+

Value getCertificate

+
let getCertificate : () -> ?Blob
+

Gets a certificate

+

Returns null if no certificate is available, e.g. when +processing an update call or inter-canister call. This returns a +non-null value only when processing a query call.

+

Example:

+
import CertifiedData "mo:base/CertifiedData";
+// Must be in a query call
+
+CertifiedData.getCertificate();
+

See a full example on how to use certified variables here: https://github.com/dfinity/examples/tree/master/motoko/cert-var

+ + diff --git a/docs/html/Char.html b/docs/html/Char.html new file mode 100644 index 00000000000..95a10c56f20 --- /dev/null +++ b/docs/html/Char.html @@ -0,0 +1,280 @@ + + + + + + + md/base/Char.md + + + + +
+

md/base/Char.md

+
+ +

Char

+

Characters

+

Type Char

+
type Char = Prim.Types.Char
+

Characters represented as Unicode code points.

+

Value toNat32

+
let toNat32 : (c : Char) -> Nat32
+

Convert character c to a word containing its Unicode +scalar value.

+

Value fromNat32

+
let fromNat32 : (w : Nat32) -> Char
+

Convert w to a character. Traps if w is not +a valid Unicode scalar value. Value w is valid if, and only +if, +w < 0xD800 or (0xE000 <= w and w <= 0x10FFFF).

+

Value toText

+
let toText : (c : Char) -> Text
+

Convert character c to single character text.

+

Function isDigit

+
func isDigit(c : Char) : Bool
+

Returns true when c is a decimal digit +between 0 and 9, otherwise +false.

+

Value isWhitespace

+
let isWhitespace : (c : Char) -> Bool
+

Returns the Unicode White_Space property of +c.

+

Value isLowercase

+
let isLowercase : (c : Char) -> Bool
+

Returns the Unicode Lowercase property of +c.

+

Value isUppercase

+
let isUppercase : (c : Char) -> Bool
+

Returns the Unicode Uppercase property of +c.

+

Value isAlphabetic

+
let isAlphabetic : (c : Char) -> Bool
+

Returns the Unicode Alphabetic property of +c.

+

Function equal

+
func equal(x : Char, y : Char) : Bool
+

Returns x == y.

+

Function notEqual

+
func notEqual(x : Char, y : Char) : Bool
+

Returns x != y.

+

Function less

+
func less(x : Char, y : Char) : Bool
+

Returns x < y.

+

Function lessOrEqual

+
func lessOrEqual(x : Char, y : Char) : Bool
+

Returns x <= y.

+

Function greater

+
func greater(x : Char, y : Char) : Bool
+

Returns x > y.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Char, y : Char) : Bool
+

Returns x >= y.

+

Function compare

+
func compare(x : Char, y : Char) : {#less; #equal; #greater}
+

Returns the order of x and y.

+ + diff --git a/docs/html/Debug.html b/docs/html/Debug.html new file mode 100644 index 00000000000..fc303454e56 --- /dev/null +++ b/docs/html/Debug.html @@ -0,0 +1,231 @@ + + + + + + + md/base/Debug.md + + + + +
+

md/base/Debug.md

+
+ +

Debug

+

Utility functions for debugging.

+

Import from the base library to use this module.

+
import Debug "mo:base/Debug";
+

Function print

+
func print(text : Text)
+

Prints text to output stream.

+

NOTE: The output is placed in the replica log. When running on +mainnet, this function has no effect.

+
Debug.print "Hello New World!";
+Debug.print(debug_show(4)) // Often used with `debug_show` to convert values to Text
+

Function trap

+
func trap(errorMessage : Text) : None
+

trap(t) traps execution with a user-provided diagnostic +message.

+

The caller of a future whose execution called trap(t) +will observe the trap as an Error value, thrown at +await, with code #canister_error and message +m. Here m is a more descriptive +Text message derived from the provided t. See +example for more details.

+

NOTE: Other execution environments that cannot handle traps may only +propagate the trap and terminate execution, with or without some +descriptive message.

+
import Debug "mo:base/Debug";
+import Error "mo:base/Error";
+
+actor {
+  func fail() : async () {
+    Debug.trap("user provided error message");
+  };
+
+  public func foo() : async () {
+    try {
+      await fail();
+    } catch e {
+      let code = Error.code(e); // evaluates to #canister_error
+      let message = Error.message(e); // contains user provided error message
+    }
+  };
+}
+ + diff --git a/docs/html/Deque.html b/docs/html/Deque.html new file mode 100644 index 00000000000..fe4a2073b6c --- /dev/null +++ b/docs/html/Deque.html @@ -0,0 +1,370 @@ + + + + + + + md/base/Deque.md + + + + +
+

md/base/Deque.md

+
+ +

Deque

+

Double-ended queue (deque) of a generic element type +T.

+

The interface to deques is purely functional, not imperative, and +deques are immutable values. In particular, deque operations such as +push and pop do not update their input deque but, instead, return the +value of the modified deque, alongside any other data. The input deque +is left unchanged.

+

Examples of use-cases: Queue (FIFO) by using pushBack() +and popFront(). Stack (LIFO) by using +pushFront() and popFront().

+

A deque is internally implemented as two lists, a head access list +and a (reversed) tail access list, that are dynamically size-balanced by +splitting.

+

Construction: Create a new deque with the +empty<T>() function.

+

Note on the costs of push and pop functions:

+
    +
  • Runtime: O(1) amortized costs, O(n)` worst case cost +per single call.
  • +
  • Space: O(1) amortized costs, O(n)` worst case cost per +single call.
  • +
+

n denotes the number of elements stored in the +deque.

+

Type Deque

+
type Deque<T> = (List<T>, List<T>)
+

Double-ended queue (deque) data type.

+

Function empty

+
func empty<T>() : Deque<T>
+

Create a new empty deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.empty<Nat>()
+

Runtime: O(1).

+

Space: O(1).

+

Function isEmpty

+
func isEmpty<T>(deque : Deque<T>) : Bool
+

Determine whether a deque is empty. Returns true if +deque is empty, otherwise false.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.empty<Nat>();
+Deque.isEmpty(deque) // => true
+

Runtime: O(1).

+

Space: O(1).

+

Function pushFront

+
func pushFront<T>(deque : Deque<T>, element : T) : Deque<T>
+

Insert a new element on the front end of a deque. Returns the new +deque with element in the front followed by the elements of +deque.

+

This may involve dynamic rebalancing of the two, internally used +lists.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1) // deque with elements [1, 2]
+

Runtime: O(n) worst-case, amortized to +O(1).

+

Space: O(n) worst-case, amortized to +O(1).

+

n denotes the number of elements stored in the +deque.

+

Function peekFront

+
func peekFront<T>(deque : Deque<T>) : ?T
+

Inspect the optional element on the front end of a deque. Returns +null if deque is empty. Otherwise, the front +element of deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1);
+Deque.peekFront(deque) // => ?1
+

Runtime: O(1).

+

Space: O(1).

+

Function popFront

+
func popFront<T>(deque : Deque<T>) : ?(T, Deque<T>)
+

Remove the element on the front end of a deque. Returns +null if deque is empty. Otherwise, it returns +a pair of the first element and a new deque that contains all the +remaining elements of deque.

+

This may involve dynamic rebalancing of the two, internally used +lists.

+

Example:

+
import Deque "mo:base/Deque";
+import Debug "mo:base/Debug";
+let initial = Deque.pushFront(Deque.pushFront(Deque.empty<Nat>(), 2), 1);
+// initial deque with elements [1, 2]
+let reduced = Deque.popFront(initial);
+switch reduced {
+  case null {
+    Debug.trap "Empty queue impossible"
+  };
+  case (?result) {
+    let removedElement = result.0; // 1
+    let reducedDeque = result.1; // deque with element [2].
+  }
+}
+

Runtime: O(n) worst-case, amortized to +O(1).

+

Space: O(n) worst-case, amortized to +O(1).

+

n denotes the number of elements stored in the +deque.

+

Function pushBack

+
func pushBack<T>(deque : Deque<T>, element : T) : Deque<T>
+

Insert a new element on the back end of a deque. Returns the new +deque with all the elements of deque, followed by +element on the back.

+

This may involve dynamic rebalancing of the two, internally used +lists.

+

Example:

+
import Deque "mo:base/Deque";
+
+Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2) // deque with elements [1, 2]
+

Runtime: O(n) worst-case, amortized to +O(1).

+

Space: O(n) worst-case, amortized to +O(1).

+

n denotes the number of elements stored in the +deque.

+

Function peekBack

+
func peekBack<T>(deque : Deque<T>) : ?T
+

Inspect the optional element on the back end of a deque. Returns +null if deque is empty. Otherwise, the back +element of deque.

+

Example:

+
import Deque "mo:base/Deque";
+
+let deque = Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2);
+Deque.peekBack(deque) // => ?2
+

Runtime: O(1).

+

Space: O(1).

+

Function popBack

+
func popBack<T>(deque : Deque<T>) : ?(Deque<T>, T)
+

Remove the element on the back end of a deque. Returns +null if deque is empty. Otherwise, it returns +a pair of a new deque that contains the remaining elements of +deque and, as the second pair item, the removed back +element.

+

This may involve dynamic rebalancing of the two, internally used +lists.

+

Example:

+
import Deque "mo:base/Deque";
+import Debug "mo:base/Debug";
+
+let initial = Deque.pushBack(Deque.pushBack(Deque.empty<Nat>(), 1), 2);
+// initial deque with elements [1, 2]
+let reduced = Deque.popBack(initial);
+switch reduced {
+  case null {
+    Debug.trap "Empty queue impossible"
+  };
+  case (?result) {
+    let reducedDeque = result.0; // deque with element [1].
+    let removedElement = result.1; // 2
+  }
+}
+

Runtime: O(n) worst-case, amortized to +O(1).

+

Space: O(n) worst-case, amortized to +O(1).

+

n denotes the number of elements stored in the +deque.

+ + diff --git a/docs/html/Error.html b/docs/html/Error.html new file mode 100644 index 00000000000..d27acd2f178 --- /dev/null +++ b/docs/html/Error.html @@ -0,0 +1,249 @@ + + + + + + + md/base/Error.md + + + + +
+

md/base/Error.md

+
+ +

Error

+

Error values and inspection.

+

The Error type is the argument to throw, +parameter of catch. The Error type is +opaque.

+

Type Error

+
type Error = Prim.Types.Error
+

Error value resulting from async computations

+

Type ErrorCode

+
type ErrorCode = Prim.ErrorCode
+

Error code to classify different kinds of user and system errors:

+
type ErrorCode = {
+  // Fatal error.
+  #system_fatal;
+  // Transient error.
+  #system_transient;
+  // Destination invalid.
+  #destination_invalid;
+  // Explicit reject by canister code.
+  #canister_reject;
+  // Canister trapped.
+  #canister_error;
+  // Future error code (with unrecognized numeric code).
+  #future : Nat32;
+  // Error issuing inter-canister call
+  // (indicating destination queue full or freezing threshold crossed).
+  #call_error : { err_code :  Nat32 }
+};
+

Value reject

+
let reject : (message : Text) -> Error
+

Create an error from the message with the code +#canister_reject.

+

Example:

+
import Error "mo:base/Error";
+
+Error.reject("Example error") // can be used as throw argument
+

Value code

+
let code : (error : Error) -> ErrorCode
+

Returns the code of an error.

+

Example:

+
import Error "mo:base/Error";
+
+let error = Error.reject("Example error");
+Error.code(error) // #canister_reject
+

Value message

+
let message : (error : Error) -> Text
+

Returns the message of an error.

+

Example:

+
import Error "mo:base/Error";
+import Debug "mo:base/Debug";
+
+let error = Error.reject("Example error");
+Error.message(error) // "Example error"
+ + diff --git a/docs/html/ExperimentalCycles.html b/docs/html/ExperimentalCycles.html new file mode 100644 index 00000000000..57d4093a0e3 --- /dev/null +++ b/docs/html/ExperimentalCycles.html @@ -0,0 +1,336 @@ + + + + + + + md/base/ExperimentalCycles.md + + + + +
+

md/base/ExperimentalCycles.md

+
+ +

ExperimentalCycles

+

Managing cycles within actors on the Internet Computer (IC).

+

The usage of the Internet Computer is measured, and paid for, in +cycles. This library provides imperative operations for +observing cycles, transferring cycles, and observing refunds of +cycles.

+

WARNING: This low-level API is +experimental and likely to change or even disappear. +Dedicated syntactic support for manipulating cycles may be added to the +language in future, obsoleting this library.

+

NOTE: Since cycles measure computational resources, +the value of balance() can change from one call to the +next.

+

Example for use on IC:

+
import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    Debug.print("Main balance: " # debug_show(Cycles.balance()));
+    Cycles.add<system>(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+    Debug.print("Main refunded: " # debug_show(Cycles.refunded())); // 5_000_000
+    Debug.print("Main balance: " # debug_show(Cycles.balance())); // decreased by around 10_000_000
+  };
+
+  func operation() : async() {
+    Debug.print("Operation balance: " # debug_show(Cycles.balance()));
+    Debug.print("Operation available: " # debug_show(Cycles.available()));
+    let obtained = Cycles.accept<system>(10_000_000);
+    Debug.print("Operation obtained: " # debug_show(obtained)); // => 10_000_000
+    Debug.print("Operation balance: " # debug_show(Cycles.balance())); // increased by 10_000_000
+    Debug.print("Operation available: " # debug_show(Cycles.available())); // decreased by 10_000_000
+  }
+}
+

Value balance

+
let balance : () -> (amount : Nat)
+

Returns the actor's current balance of cycles as +amount.

+

Example for use on the IC:

+
import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    let balance = Cycles.balance();
+    Debug.print("Balance: " # debug_show(balance));
+  }
+}
+

Value available

+
let available : () -> (amount : Nat)
+

Returns the currently available amount of cycles. The +amount available is the amount received in the current call, minus the +cumulative amount accepted by this call. On exit from the +current shared function or async expression via return or +throw, any remaining available amount is automatically +refunded to the caller/context.

+

Example for use on the IC:

+
import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    let available = Cycles.available();
+    Debug.print("Available: " # debug_show(available));
+  }
+}
+

Value accept

+
let accept : (amount : Nat) -> (accepted : Nat)
+

Transfers up to amount from available() to +balance(). Returns the amount actually transferred, which +may be less than requested, for example, if less is available, or if +canister balance limits are reached.

+

Example for use on the IC (for simplicity, only transferring cycles +to itself):

+
import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  public func main() : async() {
+    Cycles.add<system>(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+  };
+
+  func operation() : async() {
+    let obtained = Cycles.accept<system>(10_000_000);
+    Debug.print("Obtained: " # debug_show(obtained)); // => 10_000_000
+  }
+}
+

Value add

+
let add : (amount : Nat) -> ()
+

Indicates additional amount of cycles to be transferred +in the next call, that is, evaluation of a shared function call or async +expression. Traps if the current total would exceed +2 ** 128 cycles. Upon the call, but not before, the total +amount of cycles added since the last call is deducted from +balance(). If this total exceeds balance(), +the caller traps, aborting the call.

+

Note: The implicit register of added amounts is +reset to zero on entry to a shared function and after each shared +function call or resume from an await.

+

Example for use on the IC (for simplicity, only transferring cycles +to itself):

+
import Cycles "mo:base/ExperimentalCycles";
+
+actor {
+  func operation() : async() {
+    ignore Cycles.accept<system>(10_000_000);
+  };
+
+  public func main() : async() {
+    Cycles.add<system>(15_000_000);
+    await operation();
+  }
+}
+

Value refunded

+
let refunded : () -> (amount : Nat)
+

Reports amount of cycles refunded in the last +await of the current context, or zero if no await has +occurred yet. Calling refunded() is solely informational +and does not affect balance(). Instead, refunds are +automatically added to the current balance, whether or not +refunded is used to observe them.

+

Example for use on the IC (for simplicity, only transferring cycles +to itself):

+
import Cycles "mo:base/ExperimentalCycles";
+import Debug "mo:base/Debug";
+
+actor {
+  func operation() : async() {
+    ignore Cycles.accept<system>(10_000_000);
+  };
+
+  public func main() : async() {
+    Cycles.add<system>(15_000_000);
+    await operation(); // accepts 10_000_000 cycles
+    Debug.print("Refunded: " # debug_show(Cycles.refunded())); // 5_000_000
+  }
+}
+ + diff --git a/docs/html/ExperimentalInternetComputer.html b/docs/html/ExperimentalInternetComputer.html new file mode 100644 index 00000000000..3c43ec48b70 --- /dev/null +++ b/docs/html/ExperimentalInternetComputer.html @@ -0,0 +1,278 @@ + + + + + + + md/base/ExperimentalInternetComputer.md + + + + +
+

md/base/ExperimentalInternetComputer.md

+
+ +

ExperimentalInternetComputer

+

Low-level interface to the Internet Computer.

+

WARNING: This low-level API is +experimental and likely to change or even +disappear.

+

Value call

+
let call : (canister : Principal, name : Text, data : Blob) -> async (reply : Blob)
+

Calls canister's update or query function, +name, with the binary contents of data as IC +argument. Returns the response to the call, an IC reply or +reject, as a Motoko future:

+
    +
  • The message data of an IC reply determines the binary contents of +reply.
  • +
  • The error code and textual message data of an IC reject determines +the future's Error value.
  • +
+

Note: call is an asynchronous function and can only be +applied in an asynchronous context.

+

Example:

+
import IC "mo:base/ExperimentalInternetComputer";
+import Principal "mo:base/Principal";
+
+let ledger = Principal.fromText("ryjl3-tyaaa-aaaaa-aaaba-cai");
+let method = "decimals";
+let input = ();
+type OutputType = { decimals : Nat32 };
+
+let rawReply = await IC.call(ledger, method, to_candid(input)); // serialized Candid
+let output : ?OutputType = from_candid(rawReply); // { decimals = 8 }
+

Learn +more about Candid serialization

+

Function +countInstructions

+
func countInstructions(comp : () -> ()) : Nat64
+

Given computation, comp, counts the number of actual and +(for IC system calls) notional WebAssembly instructions performed during +the execution of comp().

+

More precisely, returns the difference between the state of the IC +instruction counter (performance counter 0) before +and after executing comp() (see Performance +Counter).

+

NB: countInstructions(comp) will not account +for any deferred garbage collection costs incurred by +comp().

+

Example:

+
import IC "mo:base/ExperimentalInternetComputer";
+
+let count = IC.countInstructions(func() {
+  // ...
+});
+

Value +performanceCounter

+
let performanceCounter : (counter : Nat32) -> (value : Nat64)
+

Returns the current value of IC performance counter +counter.

+
    +
  • Counter 0 is the current execution instruction +counter, counting instructions only since the beginning of the +current IC message. This counter is reset to value 0 on +shared function entry and every await. It is therefore only +suitable for measuring the cost of synchronous code.

  • +
  • Counter 1 is the call context instruction +counter for the current shared function call. For replicated +message executing, this excludes the cost of nested IC calls (even to +the current canister). For non-replicated messages, such as composite +queries, it includes the cost of nested calls. The current value of this +counter is preserved across awaits (unlike counter +0).

  • +
  • The function (currently) traps if counter >= +2.

  • +
+

Consult Performance +Counter for details.

+

Example:

+
import IC "mo:base/ExperimentalInternetComputer";
+
+let c1 = IC.performanceCounter(1);
+work();
+let diff : Nat64 = IC.performanceCounter(1) - c1;
+ + diff --git a/docs/html/ExperimentalStableMemory.html b/docs/html/ExperimentalStableMemory.html new file mode 100644 index 00000000000..91ac326391d --- /dev/null +++ b/docs/html/ExperimentalStableMemory.html @@ -0,0 +1,519 @@ + + + + + + + md/base/ExperimentalStableMemory.md + + + + +
+

md/base/ExperimentalStableMemory.md

+
+ +

ExperimentalStableMemory

+

Byte-level access to (virtual) stable memory.

+

WARNING: As its name suggests, this library is +experimental, subject to change and may be replaced by +safer alternatives in later versions of Motoko. Use at your own risk and +discretion.

+

DEPRECATION: Use of +ExperimentalStableMemory library may be deprecated in +future. Going forward, users should consider using library +Region.mo to allocate isolated regions of memory +instead. Using dedicated regions for different user applications ensures +that writing to one region will not affect the state of another, +unrelated region.

+

This is a lightweight abstraction over IC stable memory and +supports persisting raw binary data across Motoko upgrades. Use of this +module is fully compatible with Motoko's use of stable +variables, whose persistence mechanism also uses (real) IC stable +memory internally, but does not interfere with this API.

+

Memory is allocated, using grow(pages), sequentially and +on demand, in units of 64KiB pages, starting with 0 allocated pages. New +pages are zero initialized. Growth is capped by a soft limit on page +count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or +4GiB).

+

Each load operation loads from byte address +offset in little-endian format using the natural bit-width +of the type in question. The operation traps if attempting to read +beyond the current stable memory size.

+

Each store operation stores to byte address +offset in little-endian format using the natural bit-width +of the type in question. The operation traps if attempting to write +beyond the current stable memory size.

+

Text values can be handled by using Text.decodeUtf8 and +Text.encodeUtf8, in conjunction with loadBlob +and storeBlob.

+

The current page allocation and page contents is preserved across +upgrades.

+

NB: The IC's actual stable memory size (ic0.stable_size) +may exceed the page size reported by Motoko function +size(). This (and the cap on growth) are to accommodate +Motoko's stable variables. Applications that plan to use Motoko stable +variables sparingly or not at all can increase +--max-stable-pages as desired, approaching the IC maximum +(initially 8GiB, then 32Gib, currently 64Gib). All applications should +reserve at least one page for stable variable data, even when no stable +variables are used.

+

Usage:

+
import StableMemory "mo:base/ExperimentalStableMemory";
+

Value size

+
let size : () -> (pages : Nat64)
+

Current size of the stable memory, in pages. Each page is 64KiB +(65536 bytes). Initially 0. Preserved across upgrades, +together with contents of allocated stable memory.

+

Example:

+
let beforeSize = StableMemory.size();
+ignore StableMemory.grow(10);
+let afterSize = StableMemory.size();
+afterSize - beforeSize // => 10
+

Value grow

+
let grow : (newPages : Nat64) -> (oldPages : Nat64)
+

Grow current size of stable memory by the given number +of pages. Each page is 64KiB (65536 bytes). Returns the previous +size when able to grow. Returns +0xFFFF_FFFF_FFFF_FFFF if remaining pages insufficient. +Every new page is zero-initialized, containing byte 0x00 at every +offset. Function grow is capped by a soft limit on +size controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or +4GiB).

+

Example:

+
import Error "mo:base/Error";
+
+let beforeSize = StableMemory.grow(10);
+if (beforeSize == 0xFFFF_FFFF_FFFF_FFFF) {
+  throw Error.reject("Out of memory");
+};
+let afterSize = StableMemory.size();
+afterSize - beforeSize // => 10
+

Value stableVarQuery

+
let stableVarQuery : () -> (shared query () -> async { size : Nat64 })
+

Returns a query that, when called, returns the number of bytes of +(real) IC stable memory that would be occupied by persisting its current +stable variables before an upgrade. This function may be used to monitor +or limit real stable memory usage. The query computes the estimate by +running the first half of an upgrade, including any +preupgrade system method. Like any other query, its state +changes are discarded so no actual upgrade (or other state change) takes +place. The query can only be called by the enclosing actor and will trap +for other callers.

+

Example:

+
actor {
+  stable var state = "";
+  public func example() : async Text {
+    let memoryUsage = StableMemory.stableVarQuery();
+    let beforeSize = (await memoryUsage()).size;
+    state #= "abcdefghijklmnopqrstuvwxyz";
+    let afterSize = (await memoryUsage()).size;
+    debug_show (afterSize - beforeSize)
+  };
+};
+

Value loadNat32

+
let loadNat32 : (offset : Nat64) -> Nat32
+

Loads a Nat32 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat32(offset, value);
+StableMemory.loadNat32(offset) // => 123
+

Value storeNat32

+
let storeNat32 : (offset : Nat64, value : Nat32) -> ()
+

Stores a Nat32 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat32(offset, value);
+StableMemory.loadNat32(offset) // => 123
+

Value loadNat8

+
let loadNat8 : (offset : Nat64) -> Nat8
+

Loads a Nat8 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat8(offset, value);
+StableMemory.loadNat8(offset) // => 123
+

Value storeNat8

+
let storeNat8 : (offset : Nat64, value : Nat8) -> ()
+

Stores a Nat8 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat8(offset, value);
+StableMemory.loadNat8(offset) // => 123
+

Value loadNat16

+
let loadNat16 : (offset : Nat64) -> Nat16
+

Loads a Nat16 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat16(offset, value);
+StableMemory.loadNat16(offset) // => 123
+

Value storeNat16

+
let storeNat16 : (offset : Nat64, value : Nat16) -> ()
+

Stores a Nat16 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat16(offset, value);
+StableMemory.loadNat16(offset) // => 123
+

Value loadNat64

+
let loadNat64 : (offset : Nat64) -> Nat64
+

Loads a Nat64 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat64(offset, value);
+StableMemory.loadNat64(offset) // => 123
+

Value storeNat64

+
let storeNat64 : (offset : Nat64, value : Nat64) -> ()
+

Stores a Nat64 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeNat64(offset, value);
+StableMemory.loadNat64(offset) // => 123
+

Value loadInt32

+
let loadInt32 : (offset : Nat64) -> Int32
+

Loads an Int32 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt32(offset, value);
+StableMemory.loadInt32(offset) // => 123
+

Value storeInt32

+
let storeInt32 : (offset : Nat64, value : Int32) -> ()
+

Stores an Int32 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt32(offset, value);
+StableMemory.loadInt32(offset) // => 123
+

Value loadInt8

+
let loadInt8 : (offset : Nat64) -> Int8
+

Loads an Int8 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt8(offset, value);
+StableMemory.loadInt8(offset) // => 123
+

Value storeInt8

+
let storeInt8 : (offset : Nat64, value : Int8) -> ()
+

Stores an Int8 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt8(offset, value);
+StableMemory.loadInt8(offset) // => 123
+

Value loadInt16

+
let loadInt16 : (offset : Nat64) -> Int16
+

Loads an Int16 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt16(offset, value);
+StableMemory.loadInt16(offset) // => 123
+

Value storeInt16

+
let storeInt16 : (offset : Nat64, value : Int16) -> ()
+

Stores an Int16 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt16(offset, value);
+StableMemory.loadInt16(offset) // => 123
+

Value loadInt64

+
let loadInt64 : (offset : Nat64) -> Int64
+

Loads an Int64 value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt64(offset, value);
+StableMemory.loadInt64(offset) // => 123
+

Value storeInt64

+
let storeInt64 : (offset : Nat64, value : Int64) -> ()
+

Stores an Int64 value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 123;
+StableMemory.storeInt64(offset, value);
+StableMemory.loadInt64(offset) // => 123
+

Value loadFloat

+
let loadFloat : (offset : Nat64) -> Float
+

Loads a Float value from stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 1.25;
+StableMemory.storeFloat(offset, value);
+StableMemory.loadFloat(offset) // => 1.25
+

Value storeFloat

+
let storeFloat : (offset : Nat64, value : Float) -> ()
+

Stores a Float value in stable memory at the given +offset. Traps on an out-of-bounds access.

+

Example:

+
let offset = 0;
+let value = 1.25;
+StableMemory.storeFloat(offset, value);
+StableMemory.loadFloat(offset) // => 1.25
+

Value loadBlob

+
let loadBlob : (offset : Nat64, size : Nat) -> Blob
+

Load size bytes starting from offset as a +Blob. Traps on an out-of-bounds access.

+

Example:

+
import Blob "mo:base/Blob";
+
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+StableMemory.storeBlob(offset, value);
+Blob.toArray(StableMemory.loadBlob(offset, size)) // => [1, 2, 3]
+

Value storeBlob

+
let storeBlob : (offset : Nat64, value : Blob) -> ()
+

Write bytes of blob beginning at offset. +Traps on an out-of-bounds access.

+

Example:

+
import Blob "mo:base/Blob";
+
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+StableMemory.storeBlob(offset, value);
+Blob.toArray(StableMemory.loadBlob(offset, size)) // => [1, 2, 3]
+ + diff --git a/docs/html/Float.html b/docs/html/Float.html new file mode 100644 index 00000000000..84509121d26 --- /dev/null +++ b/docs/html/Float.html @@ -0,0 +1,905 @@ + + + + + + + md/base/Float.md + + + + +
+

md/base/Float.md

+
+ +

Float

+

Double precision (64-bit) floating-point numbers in IEEE 754 +representation.

+

This module contains common floating-point constants and utility +functions.

+

Notation for special values in the documentation below: ++inf: Positive infinity -inf: Negative +infinity NaN: "not a number" (can have different sign bit +values, but NaN != NaN regardless of the sign).

+

Note: Floating point numbers have limited precision and operations +may inherently result in numerical errors.

+

Examples of numerical errors:

+
0.1 + 0.1 + 0.1 == 0.3 // => false
+
1e16 + 1.0 != 1e16 // => false
+

(and many more cases)

+

Advice:

+
    +
  • Floating point number comparisons by == or +!= are discouraged. Instead, it is better to compare +floating-point numbers with a numerical tolerance, called epsilon.

    +

    Example:

    +
    import Float "mo:base/Float";
    +let x = 0.1 + 0.1 + 0.1;
    +let y = 0.3;
    +
    +let epsilon = 1e-6; // This depends on the application case (needs a numerical error analysis).
    +Float.equalWithin(x, y, epsilon) // => true
  • +
  • For absolute precision, it is recommened to encode the fraction +number as a pair of a Nat for the base and a Nat for the exponent +(decimal point).

  • +
+

NaN sign:

+
    +
  • The NaN sign is only applied by abs, neg, +and copySign. Other operations can have an arbitrary sign +bit for NaN results.
  • +
+

Type Float

+
type Float = Prim.Types.Float
+

64-bit floating point number type.

+

Value pi

+
let pi : Float
+

Ratio of the circumference of a circle to its diameter. Note: Limited +precision.

+

Value e

+
let e : Float
+

Base of the natural logarithm. Note: Limited precision.

+

Function isNaN

+
func isNaN(number : Float) : Bool
+

Determines whether the number is a NaN +("not a number" in the floating point representation). Notes:

+
    +
  • Equality test of NaN with itself or another number is +always false.
  • +
  • There exist many internal NaN value representations, +such as positive and negative NaN, signalling and quiet NaNs, each with +many different bit representations.
  • +
+

Example:

+
import Float "mo:base/Float";
+
+Float.isNaN(0.0/0.0) // => true
+

Value abs

+
let abs : (x : Float) -> Float
+

Returns the absolute value of x.

+

Special cases:

+
abs(+inf) => +inf
+abs(-inf) => +inf
+abs(-NaN)  => +NaN
+abs(-0.0) => 0.0
+

Example:

+
import Float "mo:base/Float";
+
+Float.abs(-1.2) // => 1.2
+

Value sqrt

+
let sqrt : (x : Float) -> Float
+

Returns the square root of x.

+

Special cases:

+
sqrt(+inf) => +inf
+sqrt(-0.0) => -0.0
+sqrt(x)    => NaN if x < 0.0
+sqrt(NaN)  => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.sqrt(6.25) // => 2.5
+

Value ceil

+
let ceil : (x : Float) -> Float
+

Returns the smallest integral float greater than or equal to +x.

+

Special cases:

+
ceil(+inf) => +inf
+ceil(-inf) => -inf
+ceil(NaN)  => NaN
+ceil(0.0)  => 0.0
+ceil(-0.0) => -0.0
+

Example:

+
import Float "mo:base/Float";
+
+Float.ceil(1.2) // => 2.0
+

Value floor

+
let floor : (x : Float) -> Float
+

Returns the largest integral float less than or equal to +x.

+

Special cases:

+
floor(+inf) => +inf
+floor(-inf) => -inf
+floor(NaN)  => NaN
+floor(0.0)  => 0.0
+floor(-0.0) => -0.0
+

Example:

+
import Float "mo:base/Float";
+
+Float.floor(1.2) // => 1.0
+

Value trunc

+
let trunc : (x : Float) -> Float
+

Returns the nearest integral float not greater in magnitude than +x. This is equilvent to returning x with +truncating its decimal places.

+

Special cases:

+
trunc(+inf) => +inf
+trunc(-inf) => -inf
+trunc(NaN)  => NaN
+trunc(0.0)  => 0.0
+trunc(-0.0) => -0.0
+

Example:

+
import Float "mo:base/Float";
+
+Float.trunc(2.75) // => 2.0
+

Value nearest

+
let nearest : (x : Float) -> Float
+

Returns the nearest integral float to x. A decimal place +of exactly .5 is rounded up for x > 0 and rounded down +for x < 0

+

Special cases:

+
nearest(+inf) => +inf
+nearest(-inf) => -inf
+nearest(NaN)  => NaN
+nearest(0.0)  => 0.0
+nearest(-0.0) => -0.0
+

Example:

+
import Float "mo:base/Float";
+
+Float.nearest(2.75) // => 3.0
+

Value copySign

+
let copySign : (x : Float, y : Float) -> Float
+

Returns x if x and y have same +sign, otherwise x with negated sign.

+

The sign bit of zero, infinity, and NaN is +considered.

+

Example:

+
import Float "mo:base/Float";
+
+Float.copySign(1.2, -2.3) // => -1.2
+

Value min

+
let min : (x : Float, y : Float) -> Float
+

Returns the smaller value of x and y.

+

Special cases:

+
min(NaN, y) => NaN for any Float y
+min(x, NaN) => NaN for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.min(1.2, -2.3) // => -2.3 (with numerical imprecision)
+

Value max

+
let max : (x : Float, y : Float) -> Float
+

Returns the larger value of x and y.

+

Special cases:

+
max(NaN, y) => NaN for any Float y
+max(x, NaN) => NaN for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.max(1.2, -2.3) // => 1.2
+

Value sin

+
let sin : (x : Float) -> Float
+

Returns the sine of the radian angle x.

+

Special cases:

+
sin(+inf) => NaN
+sin(-inf) => NaN
+sin(NaN) => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.sin(Float.pi / 2) // => 1.0
+

Value cos

+
let cos : (x : Float) -> Float
+

Returns the cosine of the radian angle x.

+

Special cases:

+
cos(+inf) => NaN
+cos(-inf) => NaN
+cos(NaN)  => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.cos(Float.pi / 2) // => 0.0 (with numerical imprecision)
+

Value tan

+
let tan : (x : Float) -> Float
+

Returns the tangent of the radian angle x.

+

Special cases:

+
tan(+inf) => NaN
+tan(-inf) => NaN
+tan(NaN)  => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.tan(Float.pi / 4) // => 1.0 (with numerical imprecision)
+

Value arcsin

+
let arcsin : (x : Float) -> Float
+

Returns the arc sine of x in radians.

+

Special cases:

+
arcsin(x)   => NaN if x > 1.0
+arcsin(x)   => NaN if x < -1.0
+arcsin(NaN) => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.arcsin(1.0) // => Float.pi / 2
+

Value arccos

+
let arccos : (x : Float) -> Float
+

Returns the arc cosine of x in radians.

+

Special cases:

+
arccos(x)  => NaN if x > 1.0
+arccos(x)  => NaN if x < -1.0
+arcos(NaN) => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.arccos(1.0) // => 0.0
+

Value arctan

+
let arctan : (x : Float) -> Float
+

Returns the arc tangent of x in radians.

+

Special cases:

+
arctan(+inf) => pi / 2
+arctan(-inf) => -pi / 2
+arctan(NaN)  => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.arctan(1.0) // => Float.pi / 4
+

Value arctan2

+
let arctan2 : (y : Float, x : Float) -> Float
+

Given (y,x), returns the arc tangent in radians of +y/x based on the signs of both values to determine the +correct quadrant.

+

Special cases:

+
arctan2(0.0, 0.0)   => 0.0
+arctan2(-0.0, 0.0)  => -0.0
+arctan2(0.0, -0.0)  => pi
+arctan2(-0.0, -0.0) => -pi
+arctan2(+inf, +inf) => pi / 4
+arctan2(+inf, -inf) => 3 * pi / 4
+arctan2(-inf, +inf) => -pi / 4
+arctan2(-inf, -inf) => -3 * pi / 4
+arctan2(NaN, x)     => NaN for any Float x
+arctan2(y, NaN)     => NaN for any Float y
+

Example:

+
import Float "mo:base/Float";
+
+let sqrt2over2 = Float.sqrt(2) / 2;
+Float.arctan2(sqrt2over2, sqrt2over2) // => Float.pi / 4
+

Value exp

+
let exp : (x : Float) -> Float
+

Returns the value of e raised to the x-th +power.

+

Special cases:

+
exp(+inf) => +inf
+exp(-inf) => 0.0
+exp(NaN)  => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.exp(1.0) // => Float.e
+

Value log

+
let log : (x : Float) -> Float
+

Returns the natural logarithm (base-e) of +x.

+

Special cases:

+
log(0.0)  => -inf
+log(-0.0) => -inf
+log(x)    => NaN if x < 0.0
+log(+inf) => +inf
+log(NaN)  => NaN
+

Example:

+
import Float "mo:base/Float";
+
+Float.log(Float.e) // => 1.0
+

Function format

+
func format(fmt : {#fix : Nat8; #exp : Nat8; #gen : Nat8; #hex : Nat8; #exact}, x : Float) : Text
+

Formatting. format(fmt, x) formats x to +Text according to the formatting directive +fmt, which can take one of the following forms:

+
    +
  • #fix prec as fixed-point format with prec +digits
  • +
  • #exp prec as exponential format with prec +digits
  • +
  • #gen prec as generic format with prec +digits
  • +
  • #hex prec as hexadecimal format with prec +digits
  • +
  • #exact as exact format that can be decoded without +loss.
  • +
+

-0.0 is formatted with negative sign bit. Positive +infinity is formatted as inf. Negative infinity is +formatted as -inf. NaN is formatted as +NaN or -NaN depending on its sign bit.

+

Example:

+
import Float "mo:base/Float";
+
+Float.format(#exp 3, 123.0) // => "1.230e+02"
+

Value toText

+
let toText : Float -> Text
+

Conversion to Text. Use format(fmt, x) for more detailed +control.

+

-0.0 is formatted with negative sign bit. Positive +infinity is formatted as inf. Negative infinity is +formatted as -inf. NaN is formatted as +NaN or -NaN depending on its sign bit.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toText(0.12) // => "0.12"
+

Value toInt64

+
let toInt64 : Float -> Int64
+

Conversion to Int64 by truncating Float, equivalent to +toInt64(trunc(f))

+

Traps if the floating point number is larger or smaller than the +representable Int64. Also traps for inf, -inf, +and NaN.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toInt64(-12.3) // => -12
+

Value fromInt64

+
let fromInt64 : Int64 -> Float
+

Conversion from Int64.

+

Note: The floating point number may be imprecise for large or small +Int64.

+

Example:

+
import Float "mo:base/Float";
+
+Float.fromInt64(-42) // => -42.0
+

Value toInt

+
let toInt : Float -> Int
+

Conversion to Int.

+

Traps for inf, -inf, and +NaN.

+

Example:

+
import Float "mo:base/Float";
+
+Float.toInt(1.2e6) // => +1_200_000
+

Value fromInt

+
let fromInt : Int -> Float
+

Conversion from Int. May result in Inf.

+

Note: The floating point number may be imprecise for large or small +Int values. Returns inf if the integer is greater than the +maximum floating point number. Returns -inf if the integer +is less than the minimum floating point number.

+

Example:

+
import Float "mo:base/Float";
+
+Float.fromInt(-123) // => -123.0
+

Function equal

+
func equal(x : Float, y : Float) : Bool
+

Returns x == y. @deprecated Use +Float.equalWithin() as this function does not consider +numerical errors.

+

Function notEqual

+
func notEqual(x : Float, y : Float) : Bool
+

Returns x != y. @deprecated Use +Float.notEqualWithin() as this function does not consider +numerical errors.

+

Function equalWithin

+
func equalWithin(x : Float, y : Float, epsilon : Float) : Bool
+

Determines whether x is equal to y within +the defined tolerance of epsilon. The epsilon +considers numerical erros, see comment above. Equivalent to +Float.abs(x - y) <= epsilon for a non-negative +epsilon.

+

Traps if epsilon is negative or NaN.

+

Special cases:

+
equal(+0.0, -0.0, epsilon) => true for any `epsilon >= 0.0`
+equal(-0.0, +0.0, epsilon) => true for any `epsilon >= 0.0`
+equal(+inf, +inf, epsilon) => true for any `epsilon >= 0.0`
+equal(-inf, -inf, epsilon) => true for any `epsilon >= 0.0`
+equal(x, NaN, epsilon)     => false for any x and `epsilon >= 0.0`
+equal(NaN, y, epsilon)     => false for any y and `epsilon >= 0.0`
+

Example:

+
import Float "mo:base/Float";
+
+let epsilon = 1e-6;
+Float.equal(-12.3, -1.23e1, epsilon) // => true
+

Function +notEqualWithin

+
func notEqualWithin(x : Float, y : Float, epsilon : Float) : Bool
+

Determines whether x is not equal to y +within the defined tolerance of epsilon. The +epsilon considers numerical erros, see comment above. +Equivalent to not equal(x, y, epsilon).

+

Traps if epsilon is negative or NaN.

+

Special cases:

+
notEqual(+0.0, -0.0, epsilon) => false for any `epsilon >= 0.0`
+notEqual(-0.0, +0.0, epsilon) => false for any `epsilon >= 0.0`
+notEqual(+inf, +inf, epsilon) => false for any `epsilon >= 0.0`
+notEqual(-inf, -inf, epsilon) => false for any `epsilon >= 0.0`
+notEqual(x, NaN, epsilon)     => true for any x and `epsilon >= 0.0`
+notEqual(NaN, y, epsilon)     => true for any y and `epsilon >= 0.0`
+

Example:

+
import Float "mo:base/Float";
+
+let epsilon = 1e-6;
+Float.notEqual(-12.3, -1.23e1, epsilon) // => false
+

Function less

+
func less(x : Float, y : Float) : Bool
+

Returns x < y.

+

Special cases:

+
less(+0.0, -0.0) => false
+less(-0.0, +0.0) => false
+less(NaN, y)     => false for any Float y
+less(x, NaN)     => false for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.less(Float.e, Float.pi) // => true
+

Function lessOrEqual

+
func lessOrEqual(x : Float, y : Float) : Bool
+

Returns x <= y.

+

Special cases:

+
lessOrEqual(+0.0, -0.0) => true
+lessOrEqual(-0.0, +0.0) => true
+lessOrEqual(NaN, y)     => false for any Float y
+lessOrEqual(x, NaN)     => false for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.lessOrEqual(0.123, 0.1234) // => true
+

Function greater

+
func greater(x : Float, y : Float) : Bool
+

Returns x > y.

+

Special cases:

+
greater(+0.0, -0.0) => false
+greater(-0.0, +0.0) => false
+greater(NaN, y)     => false for any Float y
+greater(x, NaN)     => false for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.greater(Float.pi, Float.e) // => true
+

Function +greaterOrEqual

+
func greaterOrEqual(x : Float, y : Float) : Bool
+

Returns x >= y.

+

Special cases:

+
greaterOrEqual(+0.0, -0.0) => true
+greaterOrEqual(-0.0, +0.0) => true
+greaterOrEqual(NaN, y)     => false for any Float y
+greaterOrEqual(x, NaN)     => false for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.greaterOrEqual(0.1234, 0.123) // => true
+

Function compare

+
func compare(x : Float, y : Float) : {#less; #equal; #greater}
+

Defines a total order of x and y for use in +sorting.

+

Note: Using this operation to determine equality or inequality is +discouraged for two reasons:

+
    +
  • It does not consider numerical errors, see comment above. Use +equal(x, y) or notEqual(x, y) to test for +equality or inequality, respectively.
  • +
  • NaN are here considered equal if their sign matches, +which is different to the standard equality by == or when +using equal() or notEqual().
  • +
+

Total order:

+
    +
  • negative NaN (no distinction between signalling and quiet negative +NaN)
  • +
  • negative infinity
  • +
  • negative numbers (including negative subnormal numbers in standard +order)
  • +
  • negative zero (-0.0)
  • +
  • positive zero (+0.0)
  • +
  • positive numbers (including positive subnormal numbers in standard +order)
  • +
  • positive infinity
  • +
  • positive NaN (no distinction between signalling and quiet positive +NaN)
  • +
+

Example:

+
import Float "mo:base/Float";
+
+Float.compare(0.123, 0.1234) // => #less
+

Function neg

+
func neg(x : Float) : Float
+

Returns the negation of x, -x .

+

Changes the sign bit for infinity.

+

Special cases:

+
neg(+inf) => -inf
+neg(-inf) => +inf
+neg(+NaN) => -NaN
+neg(-NaN) => +NaN
+neg(+0.0) => -0.0
+neg(-0.0) => +0.0
+

Example:

+
import Float "mo:base/Float";
+
+Float.neg(1.23) // => -1.23
+

Function add

+
func add(x : Float, y : Float) : Float
+

Returns the sum of x and y, +x + y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
add(+inf, y)    => +inf if y is any Float except -inf and NaN
+add(-inf, y)    => -inf if y is any Float except +inf and NaN
+add(+inf, -inf) => NaN
+add(NaN, y)     => NaN for any Float y
+

The same cases apply commutatively, i.e. for +add(y, x).

+

Example:

+
import Float "mo:base/Float";
+
+Float.add(1.23, 0.123) // => 1.353
+

Function sub

+
func sub(x : Float, y : Float) : Float
+

Returns the difference of x and y, +x - y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
sub(+inf, y)    => +inf if y is any Float except +inf or NaN
+sub(-inf, y)    => -inf if y is any Float except -inf and NaN
+sub(x, +inf)    => -inf if x is any Float except +inf and NaN
+sub(x, -inf)    => +inf if x is any Float except -inf and NaN
+sub(+inf, +inf) => NaN
+sub(-inf, -inf) => NaN
+sub(NaN, y)     => NaN for any Float y
+sub(x, NaN)     => NaN for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.sub(1.23, 0.123) // => 1.107
+

Function mul

+
func mul(x : Float, y : Float) : Float
+

Returns the product of x and y, +x * y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
mul(+inf, y) => +inf if y > 0.0
+mul(-inf, y) => -inf if y > 0.0
+mul(+inf, y) => -inf if y < 0.0
+mul(-inf, y) => +inf if y < 0.0
+mul(+inf, 0.0) => NaN
+mul(-inf, 0.0) => NaN
+mul(NaN, y) => NaN for any Float y
+

The same cases apply commutatively, i.e. for +mul(y, x).

+

Example:

+
import Float "mo:base/Float";
+
+Float.mul(1.23, 1e2) // => 123.0
+

Function div

+
func div(x : Float, y : Float) : Float
+

Returns the division of x by y, +x / y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
div(0.0, 0.0) => NaN
+div(x, 0.0)   => +inf for x > 0.0
+div(x, 0.0)   => -inf for x < 0.0
+div(x, +inf)  => 0.0 for any x except +inf, -inf, and NaN
+div(x, -inf)  => 0.0 for any x except +inf, -inf, and NaN
+div(+inf, y)  => +inf if y >= 0.0
+div(+inf, y)  => -inf if y < 0.0
+div(-inf, y)  => -inf if y >= 0.0
+div(-inf, y)  => +inf if y < 0.0
+div(NaN, y)   => NaN for any Float y
+div(x, NaN)   => NaN for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.div(1.23, 1e2) // => 0.0123
+

Function rem

+
func rem(x : Float, y : Float) : Float
+

Returns the floating point division remainder x % y, +which is defined as x - trunc(x / y) * y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
rem(0.0, 0.0) => NaN
+rem(x, y)     => +inf if sign(x) == sign(y) for any x and y not being +inf, -inf, or NaN
+rem(x, y)     => -inf if sign(x) != sign(y) for any x and y not being +inf, -inf, or NaN
+rem(x, +inf)  => x for any x except +inf, -inf, and NaN
+rem(x, -inf)  => x for any x except +inf, -inf, and NaN
+rem(+inf, y)  => NaN for any Float y
+rem(-inf, y)  => NaN for any Float y
+rem(NaN, y)   => NaN for any Float y
+rem(x, NaN)   => NaN for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.rem(7.2, 2.3) // => 0.3 (with numerical imprecision)
+

Function pow

+
func pow(x : Float, y : Float) : Float
+

Returns x to the power of y, +x ** y.

+

Note: Numerical errors may occur, see comment above.

+

Special cases:

+
pow(+inf, y)    => +inf for any y > 0.0 including +inf
+pow(+inf, 0.0)  => 1.0
+pow(+inf, y)    => 0.0 for any y < 0.0 including -inf
+pow(x, +inf)    => +inf if x > 0.0 or x < 0.0
+pow(0.0, +inf)  => 0.0
+pow(x, -inf)    => 0.0 if x > 0.0 or x < 0.0
+pow(0.0, -inf)  => +inf
+pow(x, y)       => NaN if x < 0.0 and y is a non-integral Float
+pow(-inf, y)    => +inf if y > 0.0 and y is a non-integral or an even integral Float
+pow(-inf, y)    => -inf if y > 0.0 and y is an odd integral Float
+pow(-inf, 0.0)  => 1.0
+pow(-inf, y)    => 0.0 if y < 0.0
+pow(-inf, +inf) => +inf
+pow(-inf, -inf) => 1.0
+pow(NaN, y)     => NaN if y != 0.0
+pow(NaN, 0.0)   => 1.0
+pow(x, NaN)     => NaN for any Float x
+

Example:

+
import Float "mo:base/Float";
+
+Float.pow(2.5, 2.0) // => 6.25
+ + diff --git a/docs/html/Func.html b/docs/html/Func.html new file mode 100644 index 00000000000..effcb0327ef --- /dev/null +++ b/docs/html/Func.html @@ -0,0 +1,220 @@ + + + + + + + md/base/Func.md + + + + +
+

md/base/Func.md

+
+ +

Func

+

Functions on functions, creating functions from simpler inputs.

+

(Most commonly used when programming in functional style using +higher-order functions.)

+

Function compose

+
func compose<A, B, C>(f : B -> C, g : A -> B) : A -> C
+

Import from the base library to use this module.

+
import { compose; const; identity } = "mo:base/Func";
+import Text = "mo:base/Text";
+import Char = "mo:base/Char";
+

The composition of two functions f and g is +a function that applies g and then f.

+

Example:

+
let textFromNat32 = compose(Text.fromChar, Char.fromNat32);
+assert textFromNat32(65) == "A";
+

Function identity

+
func identity<A>(x : A) : A
+

The identity function returns its argument. Example:

+
assert identity(10) == 10;
+assert identity(true) == true;
+

Function const

+
func const<A, B>(x : A) : B -> A
+

The const function is a curried function that accepts an +argument x, and then returns a function that discards its +argument and always returns the x.

+

Example:

+
assert const<Nat, Text>(10)("hello") == 10;
+assert const(true)(20) == true;
+ + diff --git a/docs/html/Hash.html b/docs/html/Hash.html new file mode 100644 index 00000000000..794ee93ae0f --- /dev/null +++ b/docs/html/Hash.html @@ -0,0 +1,242 @@ + + + + + + + md/base/Hash.md + + + + +
+

md/base/Hash.md

+
+ +

Hash

+

Hash values

+

Type Hash

+
type Hash = Nat32
+

Hash values represent a string of hash bits, packed into a +Nat32.

+

Value length

+
let length : Nat
+

The hash length, always 31.

+

Function bit

+
func bit(h : Hash, pos : Nat) : Bool
+

Project a given bit from the bit vector.

+

Function equal

+
func equal(ha : Hash, hb : Hash) : Bool
+

Test if two hashes are equal

+

Function hash

+
func hash(n : Nat) : Hash
+

Computes a hash from the least significant 32-bits of n, +ignoring other bits. @deprecated For large Nat values +consider using a bespoke hash function that considers all of the +argument's bits.

+

Function +debugPrintBits

+
func debugPrintBits(bits : Hash)
+

@deprecated This function will be removed in future.

+

Function +debugPrintBitsRev

+
func debugPrintBitsRev(bits : Hash)
+

@deprecated This function will be removed in future.

+

Function hashNat8

+
func hashNat8(key : [Hash]) : Hash
+

Jenkin's one at a time:

+

https://en.wikipedia.org/wiki/Jenkins_hash_function#one_at_a_time

+

The input type should actually be [Nat8]. Note: Be sure +to explode each Nat8 of a Nat32 into its own +Nat32, and to shift into lower 8 bits. @deprecated This +function may be removed or changed in future.

+ + diff --git a/docs/html/HashMap.html b/docs/html/HashMap.html new file mode 100644 index 00000000000..fe8b10bb931 --- /dev/null +++ b/docs/html/HashMap.html @@ -0,0 +1,436 @@ + + + + + + + md/base/HashMap.md + + + + +
+

md/base/HashMap.md

+
+ +

HashMap

+

Class HashMap<K, V> provides a hashmap from keys +of type K to values of type V. The class is +parameterized by the key's equality and hash functions, and an initial +capacity. However, the underlying allocation happens only when the first +key-value entry is inserted.

+

Internally, the map is represented as an array of +AssocList (buckets). The growth policy of the underyling +array is very simple, for now: double the current capacity when the +expected bucket list size grows beyond a certain constant.

+

WARNING: Certain operations are amortized O(1) time, such as +put, but run in worst case O(size) time. These worst case +runtimes may exceed the cycles limit per message if the size of the map +is large enough. Further, this runtime analysis assumes that the hash +functions uniformly maps keys over the hash space. Grow these structures +with discretion, and with good hash functions. All amortized operations +below also list the worst case runtime.

+

For maps without amortization, see TrieMap.

+

Note on the constructor: The argument initCapacity +determines the initial number of buckets in the underyling array. Also, +the runtime and space anlyses in this documentation assumes that the +equality and hash functions for keys used to construct the map run in +O(1) time and space.

+

Example:

+
import HashMap "mo:base/HashMap";
+import Text "mo:base/Text";
+
+let map = HashMap.HashMap<Text, Nat>(5, Text.equal, Text.hash);
+

Runtime: O(1)

+

Space: O(1)

+

Class HashMap<K, V>

+
class HashMap<K, V>(initCapacity : Nat, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash)
+

Function size

+
func size() : Nat
+

Returns the current number of key-value entries in the map.

+

Example:

+
map.size() // => 0
+

Runtime: O(1)

+

Space: O(1)

+

Function get

+
func get(key : K) : (value : ?V)
+

Returns the value assocaited with key key if present and +null otherwise.

+

Example:

+
map.put("key", 3);
+map.get("key") // => ?3
+

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Space: O(1)

+

Function put

+
func put(key : K, value : V)
+

Insert the value value with key key. +Overwrites any existing entry with key key.

+

Example:

+
map.put("key", 3);
+map.get("key") // => ?3
+

Expected Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Amortized Space: O(1), Worst Case Space: O(size)

+

Note: If this is the first entry into this map, this operation will +cause the initial allocation of the underlying array.

+

Function replace

+
func replace(key : K, value : V) : (oldValue : ?V)
+

Insert the value value with key key. +Returns the previous value associated with key key or +null if no such value exists.

+

Example:

+
map.put("key", 3);
+ignore map.replace("key", 2); // => ?3
+map.get("key") // => ?2
+

Expected Amortized Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Amortized Space: O(1), Worst Case Space: O(size)

+

Note: If this is the first entry into this map, this operation will +cause the initial allocation of the underlying array.

+

Function delete

+
func delete(key : K)
+

Deletes the entry with the key key. Has no effect if +key is not present in the map.

+

Example:

+
map.put("key", 3);
+map.delete("key");
+map.get("key"); // => null
+

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Space: O(1), Worst Case Space: O(size)

+

Function remove

+
func remove(key : K) : (oldValue : ?V)
+

Deletes the entry with the key key. Returns the previous +value associated with key key or null if no +such value exists.

+

Example:

+
map.put("key", 3);
+map.remove("key"); // => ?3
+

Expected Runtime: O(1), Worst Case Runtime: O(size)

+

Expected Space: O(1), Worst Case Space: O(size)

+

Function keys

+
func keys() : Iter.Iter<K>
+

Returns an Iterator (Iter) over the keys of the map. +Iterator provides a single method next(), which returns +keys in no specific order, or null when out of keys to +iterate over.

+

Example:

+

+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var keys = "";
+for (key in map.keys()) {
+  keys := key # " " # keys
+};
+keys // => "key3 key2 key1 "
+

Cost of iteration over all keys:

+

Runtime: O(size)

+

Space: O(1)

+

Function vals

+
func vals() : Iter.Iter<V>
+

Returns an Iterator (Iter) over the values of the map. +Iterator provides a single method next(), which returns +values in no specific order, or null when out of values to +iterate over.

+

Example:

+

+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var sum = 0;
+for (value in map.vals()) {
+  sum += value;
+};
+sum // => 6
+

Cost of iteration over all values:

+

Runtime: O(size)

+

Space: O(1)

+

Function entries

+
func entries() : Iter.Iter<(K, V)>
+

Returns an Iterator (Iter) over the key-value pairs in +the map. Iterator provides a single method next(), which +returns pairs in no specific order, or null when out of +pairs to iterate over.

+

Example:

+
import Nat "mo:base/Nat";
+
+map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+var pairs = "";
+for ((key, value) in map.entries()) {
+  pairs := "(" # key # ", " # Nat.toText(value) # ") " # pairs
+};
+pairs // => "(key3, 3) (key2, 2) (key1, 1)"
+

Cost of iteration over all pairs:

+

Runtime: O(size)

+

Space: O(1)

+

Function clone

+
func clone<K, V>(map : HashMap<K, V>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash) : HashMap<K, V>
+

Returns a copy of map, initializing the copy with the +provided equality and hash functions.

+

Example:

+
map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 = HashMap.clone(map, Text.equal, Text.hash);
+map2.get("key1") // => ?1
+

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

Function fromIter

+
func fromIter<K, V>(iter : Iter.Iter<(K, V)>, initCapacity : Nat, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash) : HashMap<K, V>
+

Returns a new map, containing all entries given by the iterator +iter. The new map is initialized with the provided initial +capacity, equality, and hash functions.

+

Example:

+
let entries = [("key3", 3), ("key2", 2), ("key1", 1)];
+let iter = entries.vals();
+
+let map2 = HashMap.fromIter<Text, Nat>(iter, entries.size(), Text.equal, Text.hash);
+map2.get("key1") // => ?1
+

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

Function map

+
func map<K, V1, V2>(hashMap : HashMap<K, V1>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash, f : (K, V1) -> V2) : HashMap<K, V2>
+

Creates a new map by applying f to each entry in +hashMap. Each entry (k, v) in the old map is +transformed into a new entry (k, v2), where the new value +v2 is created by applying f to +(k, v).

+
map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 = HashMap.map<Text, Nat, Nat>(map, Text.equal, Text.hash, func (k, v) = v * 2);
+map2.get("key2") // => ?4
+

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapFilter

+
func mapFilter<K, V1, V2>(hashMap : HashMap<K, V1>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash, f : (K, V1) -> ?V2) : HashMap<K, V2>
+

Creates a new map by applying f to each entry in +hashMap. For each entry (k, v) in the old map, +if f evaluates to null, the entry is +discarded. Otherwise, the entry is transformed into a new entry +(k, v2), where the new value v2 is the result +of applying f to (k, v).

+
map.put("key1", 1);
+map.put("key2", 2);
+map.put("key3", 3);
+
+let map2 =
+  HashMap.mapFilter<Text, Nat, Nat>(
+    map,
+    Text.equal,
+    Text.hash,
+    func (k, v) = if (v == 2) { null } else { ?(v * 2)}
+);
+map2.get("key3") // => ?6
+

Expected Runtime: O(size), Worst Case Runtime: O(size * size)

+

Expected Space: O(size), Worst Case Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+ + diff --git a/docs/html/Heap.html b/docs/html/Heap.html new file mode 100644 index 00000000000..08c3630d965 --- /dev/null +++ b/docs/html/Heap.html @@ -0,0 +1,319 @@ + + + + + + + md/base/Heap.md + + + + +
+

md/base/Heap.md

+
+ +

Heap

+

Class Heap<X> provides a priority queue of +elements of type X.

+

The class wraps a purely-functional implementation based on a leftist +heap.

+

Note on the constructor: The constructor takes in a comparison +function compare that defines the ordering between elements +of type X. Most primitive types have a default version of +this comparison function defined in their modules (e.g. +Nat.compare). The runtime analysis in this documentation +assumes that the compare function runs in O(1) +time and space.

+

Example:

+
import Heap "mo:base/Heap";
+import Text "mo:base/Text";
+
+let heap = Heap.Heap<Text>(Text.compare);
+

Runtime: O(1)

+

Space: O(1)

+

Type Tree

+
type Tree<X> = ?(Int, X, Tree<X>, Tree<X>)
+

Class Heap<X>

+
class Heap<X>(compare : (X, X) -> O.Order)
+

Function put

+
func put(x : X)
+

Inserts an element into the heap.

+

Example:

+

+heap.put("apple");
+heap.peekMin() // => ?"apple"
+

Runtime: O(log(n))

+

Space: O(log(n))

+

Function peekMin

+
func peekMin() : ?X
+

Return the minimal element in the heap, or null if the +heap is empty.

+

Example:

+

+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.peekMin() // => ?"apple"
+

Runtime: O(1)

+

Space: O(1)

+

Function deleteMin

+
func deleteMin()
+

Delete the minimal element in the heap, if it exists.

+

Example:

+

+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.deleteMin();
+heap.peekMin(); // => ?"banana"
+

Runtime: O(log(n))

+

Space: O(log(n))

+

Function removeMin

+
func removeMin() : (minElement : ?X)
+

Delete and return the minimal element in the heap, if it exists.

+

Example:

+

+heap.put("apple");
+heap.put("banana");
+heap.put("cantaloupe");
+heap.removeMin(); // => ?"apple"
+

Runtime: O(log(n))

+

Space: O(log(n))

+

Function share

+
func share() : Tree<X>
+

Return a snapshot of the internal functional tree representation as +sharable data. The returned tree representation is not affected by +subsequent changes of the Heap instance.

+

Example:

+

+heap.put("banana");
+heap.share();
+

Useful for storing the heap as a stable variable, pretty-printing, +and sharing it across async function calls, i.e. passing it in async +arguments or async results.

+

Runtime: O(1)

+

Space: O(1)

+

Function unsafeUnshare

+
func unsafeUnshare(tree : Tree<X>)
+

Rewraps a snapshot of a heap (obtained by share()) in a +Heap instance. The wrapping instance must be initialized +with the same compare function that created the +snapshot.

+

Example:

+

+heap.put("apple");
+heap.put("banana");
+let snapshot = heap.share();
+let heapCopy = Heap.Heap<Text>(Text.compare);
+heapCopy.unsafeUnshare(snapshot);
+heapCopy.peekMin() // => ?"apple"
+

Useful for loading a stored heap from a stable variable or accesing a +heap snapshot passed from an async function call.

+

Runtime: O(1).

+

Space: O(1).

+

Function fromIter

+
func fromIter<X>(iter : I.Iter<X>, compare : (X, X) -> O.Order) : Heap<X>
+

Returns a new Heap, containing all entries given by the +iterator iter. The new map is initialized with the provided +compare function.

+

Example:

+
let entries = ["banana", "apple", "cantaloupe"];
+let iter = entries.vals();
+
+let newHeap = Heap.fromIter<Text>(iter, Text.compare);
+newHeap.peekMin() // => ?"apple"
+

Runtime: O(size)

+

Space: O(size)

+ + diff --git a/docs/html/Int.html b/docs/html/Int.html new file mode 100644 index 00000000000..7cb6f5d4f34 --- /dev/null +++ b/docs/html/Int.html @@ -0,0 +1,446 @@ + + + + + + + md/base/Int.md + + + + +
+

md/base/Int.md

+
+ +

Int

+

Signed integer numbers with infinite precision (also called big +integers).

+

Most operations on integer numbers (e.g. addition) are available as +built-in operators (e.g. -1 + 1). This module provides +equivalent functions and Text conversion.

+

Import from the base library to use this module.

+
import Int "mo:base/Int";
+

Type Int

+
type Int = Prim.Types.Int
+

Infinite precision signed integers.

+

Function abs

+
func abs(x : Int) : Nat
+

Returns the absolute value of x.

+

Example:

+
Int.abs(-12) // => 12
+

Function toText

+
func toText(x : Int) : Text
+

Converts an integer number to its textual representation. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Int.toText(-1234) // => "-1234"
+

Function min

+
func min(x : Int, y : Int) : Int
+

Returns the minimum of x and y.

+

Example:

+
Int.min(2, -3) // => -3
+

Function max

+
func max(x : Int, y : Int) : Int
+

Returns the maximum of x and y.

+

Example:

+
Int.max(2, -3) // => 2
+

Function hash

+
func hash(i : Int) : Hash.Hash
+

Computes a hash from the least significant 32-bits of i, +ignoring other bits. @deprecated For large Int values +consider using a bespoke hash function that considers all of the +argument's bits.

+

Function hashAcc

+
func hashAcc(h1 : Hash.Hash, i : Int) : Hash.Hash
+

Computes an accumulated hash from h1 and the least +significant 32-bits of i, ignoring other bits in +i. @deprecated For large Int values consider +using a bespoke hash function that considers all of the argument's +bits.

+

Function equal

+
func equal(x : Int, y : Int) : Bool
+

Equality function for Int types. This is equivalent to +x == y.

+

Example:

+
Int.equal(-1, -1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int.equal) // => true
+

Function notEqual

+
func notEqual(x : Int, y : Int) : Bool
+

Inequality function for Int types. This is equivalent to +x != y.

+

Example:

+
Int.notEqual(-1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Int, y : Int) : Bool
+

"Less than" function for Int types. This is equivalent to +x < y.

+

Example:

+
Int.less(-2, 1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Int, y : Int) : Bool
+

"Less than or equal" function for Int types. This is equivalent to +x <= y.

+

Example:

+
Int.lessOrEqual(-2, 1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Int, y : Int) : Bool
+

"Greater than" function for Int types. This is equivalent to +x > y.

+

Example:

+
Int.greater(1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Int, y : Int) : Bool
+

"Greater than or equal" function for Int types. This is equivalent to +x >= y.

+

Example:

+
Int.greaterOrEqual(1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Int, y : Int) : {#less; #equal; #greater}
+

General-purpose comparison function for Int. Returns the +Order ( either #less, #equal, or +#greater) of comparing x with +y.

+

Example:

+
Int.compare(-3, 2) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([1, -2, -3], Int.compare) // => [-3, -2, 1]
+

Function neg

+
func neg(x : Int) : Int
+

Returns the negation of x, -x .

+

Example:

+
Int.neg(123) // => -123
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Function add

+
func add(x : Int, y : Int) : Int
+

Returns the sum of x and y, +x + y.

+

No overflow since Int has infinite precision.

+

Example:

+
Int.add(1, -2); // => -1
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 0, Int.add) // => -4
+

Function sub

+
func sub(x : Int, y : Int) : Int
+

Returns the difference of x and y, +x - y.

+

No overflow since Int has infinite precision.

+

Example:

+
Int.sub(1, 2); // => -1
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 0, Int.sub) // => 4
+

Function mul

+
func mul(x : Int, y : Int) : Int
+

Returns the product of x and y, +x * y.

+

No overflow since Int has infinite precision.

+

Example:

+
Int.mul(-2, 3); // => -6
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft([1, -2, -3], 1, Int.mul) // => 6
+

Function div

+
func div(x : Int, y : Int) : Int
+

Returns the signed integer division of x by +y, x / y. Rounds the quotient towards zero, +which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
Int.div(6, -2); // => -3
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Int, y : Int) : Int
+

Returns the remainder of the signed integer division of +x by y, x % y, which is defined +as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
Int.rem(6, -4); // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Int, y : Int) : Int
+

Returns x to the power of y, +x ** y.

+

Traps when y is negative or +y > 2 ** 32 - 1. No overflow since Int has +infinite precision.

+

Example:

+
Int.pow(-2, 3); // => -8
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+ + diff --git a/docs/html/Int16.html b/docs/html/Int16.html new file mode 100644 index 00000000000..c0dd7de72ba --- /dev/null +++ b/docs/html/Int16.html @@ -0,0 +1,748 @@ + + + + + + + md/base/Int16.md + + + + +
+

md/base/Int16.md

+
+ +

Int16

+

Provides utility functions on 16-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Int16 "mo:base/Int16";
+

Type Int16

+
type Int16 = Prim.Types.Int16
+

16-bit signed integers.

+

Value minimumValue

+
let minimumValue : Int16
+

Minimum 16-bit integer value, -2 ** 15.

+

Example:

+
Int16.minimumValue // => -32_768 : Int16
+

Value maximumValue

+
let maximumValue : Int16
+

Maximum 16-bit integer value, +2 ** 15 - 1.

+

Example:

+
Int16.maximumValue // => +32_767 : Int16
+

Value toInt

+
let toInt : Int16 -> Int
+

Converts a 16-bit signed integer to a signed integer with infinite +precision.

+

Example:

+
Int16.toInt(12_345) // => 12_345 : Int
+

Value fromInt

+
let fromInt : Int -> Int16
+

Converts a signed integer with infinite precision to a 16-bit signed +integer.

+

Traps on overflow/underflow.

+

Example:

+
Int16.fromInt(12_345) // => +12_345 : Int16
+

Value fromIntWrap

+
let fromIntWrap : Int -> Int16
+

Converts a signed integer with infinite precision to a 16-bit signed +integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int16.fromIntWrap(-12_345) // => -12_345 : Int
+

Value fromInt8

+
let fromInt8 : Int8 -> Int16
+

Converts a 8-bit signed integer to a 16-bit signed integer.

+

Example:

+
Int16.fromInt8(-123) // => -123 : Int16
+

Value toInt8

+
let toInt8 : Int16 -> Int8
+

Converts a 16-bit signed integer to a 8-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
Int16.toInt8(-123) // => -123 : Int8
+

Value fromInt32

+
let fromInt32 : Int32 -> Int16
+

Converts a 32-bit signed integer to a 16-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
Int16.fromInt32(-12_345) // => -12_345 : Int16
+

Value toInt32

+
let toInt32 : Int16 -> Int32
+

Converts a 16-bit signed integer to a 32-bit signed integer.

+

Example:

+
Int16.toInt32(-12_345) // => -12_345 : Int32
+

Value fromNat16

+
let fromNat16 : Nat16 -> Int16
+

Converts an unsigned 16-bit integer to a signed 16-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int16.fromNat16(12_345) // => +12_345 : Int16
+

Value toNat16

+
let toNat16 : Int16 -> Nat16
+

Converts a signed 16-bit integer to an unsigned 16-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int16.toNat16(-1) // => 65_535 : Nat16 // underflow
+

Function toText

+
func toText(x : Int16) : Text
+

Returns the Text representation of x. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Int16.toText(-12345) // => "-12345"
+

Function abs

+
func abs(x : Int16) : Int16
+

Returns the absolute value of x.

+

Traps when x == -2 ** 15 (the minimum Int16 +value).

+

Example:

+
Int16.abs(-12345) // => +12_345
+

Function min

+
func min(x : Int16, y : Int16) : Int16
+

Returns the minimum of x and y.

+

Example:

+
Int16.min(+2, -3) // => -3
+

Function max

+
func max(x : Int16, y : Int16) : Int16
+

Returns the maximum of x and y.

+

Example:

+
Int16.max(+2, -3) // => +2
+

Function equal

+
func equal(x : Int16, y : Int16) : Bool
+

Equality function for Int16 types. This is equivalent to +x == y.

+

Example:

+
Int16.equal(-1, -1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int16>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int16>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int16.equal) // => true
+

Function notEqual

+
func notEqual(x : Int16, y : Int16) : Bool
+

Inequality function for Int16 types. This is equivalent to +x != y.

+

Example:

+
Int16.notEqual(-1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Int16, y : Int16) : Bool
+

"Less than" function for Int16 types. This is equivalent to +x < y.

+

Example:

+
Int16.less(-2, 1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Int16, y : Int16) : Bool
+

"Less than or equal" function for Int16 types. This is equivalent to +x <= y.

+

Example:

+
Int16.lessOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Int16, y : Int16) : Bool
+

"Greater than" function for Int16 types. This is equivalent to +x > y.

+

Example:

+
Int16.greater(-2, 1); // => false
+

Function +greaterOrEqual

+
func greaterOrEqual(x : Int16, y : Int16) : Bool
+

"Greater than or equal" function for Int16 types. This is equivalent +to x >= y.

+

Example:

+
Int16.greaterOrEqual(-2, -2); // => true
+

Function compare

+
func compare(x : Int16, y : Int16) : {#less; #equal; #greater}
+

General-purpose comparison function for Int16. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Int16.compare(-3, 2) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int16], Int16.compare) // => [-3, -2, 1]
+

Function neg

+
func neg(x : Int16) : Int16
+

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 15).

+

Example:

+
Int16.neg(123) // => -123
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Function add

+
func add(x : Int16, y : Int16) : Int16
+

Returns the sum of x and y, +x + y.

+

Traps on overflow/underflow.

+

Example:

+
Int16.add(100, 23) // => +123
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int16, Int16>([1, -2, -3], 0, Int16.add) // => -4
+

Function sub

+
func sub(x : Int16, y : Int16) : Int16
+

Returns the difference of x and y, +x - y.

+

Traps on overflow/underflow.

+

Example:

+
Int16.sub(123, 100) // => +23
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int16, Int16>([1, -2, -3], 0, Int16.sub) // => 4
+

Function mul

+
func mul(x : Int16, y : Int16) : Int16
+

Returns the product of x and y, +x * y.

+

Traps on overflow/underflow.

+

Example:

+
Int16.mul(12, 10) // => +120
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int16, Int16>([1, -2, -3], 1, Int16.mul) // => 6
+

Function div

+
func div(x : Int16, y : Int16) : Int16
+

Returns the signed integer division of x by +y, x / y. Rounds the quotient towards zero, +which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
Int16.div(123, 10) // => +12
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Int16, y : Int16) : Int16
+

Returns the remainder of the signed integer division of +x by y, x % y, which is defined +as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
Int16.rem(123, 10) // => +3
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Int16, y : Int16) : Int16
+

Returns x to the power of y, +x ** y.

+

Traps on overflow/underflow and when +y < 0 or y >= 16.

+

Example:

+
Int16.pow(2, 10) // => +1_024
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Int16) : Int16
+

Returns the bitwise negation of x, ^x.

+

Example:

+
Int16.bitnot(-256 /* 0xff00 */) // => +255 // 0xff
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Int16, y : Int16) : Int16
+

Returns the bitwise "and" of x and y, +x & y.

+

Example:

+
Int16.bitand(0x0fff, 0x00f0) // => +240 // 0xf0
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Int16, y : Int16) : Int16
+

Returns the bitwise "or" of x and y, +x | y.

+

Example:

+
Int16.bitor(0x0f0f, 0x00f0) // => +4_095 // 0x0fff
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Int16, y : Int16) : Int16
+

Returns the bitwise "exclusive or" of x and +y, x ^ y.

+

Example:

+
Int16.bitxor(0x0fff, 0x00f0) // => +3_855 // 0x0f0f
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Int16, y : Int16) : Int16
+

Returns the bitwise left shift of x by y, +x << y. The right bits of the shift filled with +zeros. Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 16, the semantics is the same as for +bitshiftLeft(x, y % 16). For y < 0, the +semantics is the same as for +bitshiftLeft(x, y + y % 16).

+

Example:

+
Int16.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Int16, y : Int16) : Int16
+

Returns the signed bitwise right shift of x by +y, x >> y. The sign bit is retained and +the left side is filled with the sign bit. Right-underflowing bits are +discarded, i.e. not rotated to the left side.

+

For y >= 16, the semantics is the same as for +bitshiftRight(x, y % 16). For y < 0, the +semantics is the same as for +bitshiftRight (x, y + y % 16).

+

Example:

+
Int16.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Int16, y : Int16) : Int16
+

Returns the bitwise left rotatation of x by +y, x <<> y. Each left-overflowing bit +is inserted again on the right side. The sign bit is rotated like other +bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 16, the semantics is the same as for +bitrotLeft(x, y % 16).

+

Example:

+
Int16.bitrotLeft(0x2001, 4) // => +18 // 0x12.
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Int16, y : Int16) : Int16
+

Returns the bitwise right rotation of x by +y, x <>> y. Each right-underflowing +bit is inserted again on the right side. The sign bit is rotated like +other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 16, the semantics is the same as for +bitrotRight(x, y % 16).

+

Example:

+
Int16.bitrotRight(0x2010, 8) // => +4_128 // 0x01020.
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Int16, p : Nat) : Bool
+

Returns the value of bit p in x, +x & 2**p == 2**p. If p >= 16, the +semantics is the same as for bittest(x, p % 16). This is +equivalent to checking if the p-th bit is set in +x, using 0 indexing.

+

Example:

+
Int16.bittest(128, 7) // => true
+

Function bitset

+
func bitset(x : Int16, p : Nat) : Int16
+

Returns the value of setting bit p in x to +1. If p >= 16, the semantics is the same as +for bitset(x, p % 16).

+

Example:

+
Int16.bitset(0, 7) // => +128
+

Function bitclear

+
func bitclear(x : Int16, p : Nat) : Int16
+

Returns the value of clearing bit p in x to +0. If p >= 16, the semantics is the same as +for bitclear(x, p % 16).

+

Example:

+
Int16.bitclear(-1, 7) // => -129
+

Function bitflip

+
func bitflip(x : Int16, p : Nat) : Int16
+

Returns the value of flipping bit p in x. +If p >= 16, the semantics is the same as for +bitclear(x, p % 16).

+

Example:

+
Int16.bitflip(255, 7) // => +127
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Int16) -> Int16
+

Returns the count of non-zero bits in x.

+

Example:

+
Int16.bitcountNonZero(0xff) // => +8
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Int16) -> Int16
+

Returns the count of leading zero bits in x.

+

Example:

+
Int16.bitcountLeadingZero(0x80) // => +8
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Int16) -> Int16
+

Returns the count of trailing zero bits in x.

+

Example:

+
Int16.bitcountTrailingZero(0x0100) // => +8
+

Function addWrap

+
func addWrap(x : Int16, y : Int16) : Int16
+

Returns the sum of x and y, +x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int16.addWrap(2 ** 14, 2 ** 14) // => -32_768 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Int16, y : Int16) : Int16
+

Returns the difference of x and y, +x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int16.subWrap(-2 ** 15, 1) // => +32_767 // underflow
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Int16, y : Int16) : Int16
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
Int16.mulWrap(2 ** 8, 2 ** 8) // => 0 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Int16, y : Int16) : Int16
+

Returns x to the power of y, +x **% y.

+

Wraps on overflow/underflow. Traps if +y < 0 or y >= 16.

+

Example:

+

+Int16.powWrap(2, 15) // => -32_768 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Int32.html b/docs/html/Int32.html new file mode 100644 index 00000000000..f7cb9fc0459 --- /dev/null +++ b/docs/html/Int32.html @@ -0,0 +1,756 @@ + + + + + + + md/base/Int32.md + + + + +
+

md/base/Int32.md

+
+ +

Int32

+

Provides utility functions on 32-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Int32 "mo:base/Int32";
+

Type Int32

+
type Int32 = Prim.Types.Int32
+

32-bit signed integers.

+

Value minimumValue

+
let minimumValue : Int32
+

Minimum 32-bit integer value, -2 ** 31.

+

Example:

+
Int32.minimumValue // => -2_147_483_648
+

Value maximumValue

+
let maximumValue : Int32
+

Maximum 32-bit integer value, +2 ** 31 - 1.

+

Example:

+
Int32.maximumValue // => +2_147_483_647
+

Value toInt

+
let toInt : Int32 -> Int
+

Converts a 32-bit signed integer to a signed integer with infinite +precision.

+

Example:

+
Int32.toInt(123_456) // => 123_456 : Int
+

Value fromInt

+
let fromInt : Int -> Int32
+

Converts a signed integer with infinite precision to a 32-bit signed +integer.

+

Traps on overflow/underflow.

+

Example:

+
Int32.fromInt(123_456) // => +123_456 : Int32
+

Value fromIntWrap

+
let fromIntWrap : Int -> Int32
+

Converts a signed integer with infinite precision to a 32-bit signed +integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int32.fromIntWrap(-123_456) // => -123_456 : Int
+

Value fromInt16

+
let fromInt16 : Int16 -> Int32
+

Converts a 16-bit signed integer to a 32-bit signed integer.

+

Example:

+
Int32.fromInt16(-123) // => -123 : Int32
+

Value toInt16

+
let toInt16 : Int32 -> Int16
+

Converts a 32-bit signed integer to a 16-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
Int32.toInt16(-123) // => -123 : Int16
+

Value fromInt64

+
let fromInt64 : Int64 -> Int32
+

Converts a 64-bit signed integer to a 32-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
Int32.fromInt64(-123_456) // => -123_456 : Int32
+

Value toInt64

+
let toInt64 : Int32 -> Int64
+

Converts a 32-bit signed integer to a 64-bit signed integer.

+

Example:

+
Int32.toInt64(-123_456) // => -123_456 : Int64
+

Value fromNat32

+
let fromNat32 : Nat32 -> Int32
+

Converts an unsigned 32-bit integer to a signed 32-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int32.fromNat32(123_456) // => +123_456 : Int32
+

Value toNat32

+
let toNat32 : Int32 -> Nat32
+

Converts a signed 32-bit integer to an unsigned 32-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int32.toNat32(-1) // => 4_294_967_295 : Nat32 // underflow
+

Function toText

+
func toText(x : Int32) : Text
+

Returns the Text representation of x. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Int32.toText(-123456) // => "-123456"
+

Function abs

+
func abs(x : Int32) : Int32
+

Returns the absolute value of x.

+

Traps when x == -2 ** 31 (the minimum Int32 +value).

+

Example:

+
Int32.abs(-123456) // => +123_456
+

Function min

+
func min(x : Int32, y : Int32) : Int32
+

Returns the minimum of x and y.

+

Example:

+
Int32.min(+2, -3) // => -3
+

Function max

+
func max(x : Int32, y : Int32) : Int32
+

Returns the maximum of x and y.

+

Example:

+
Int32.max(+2, -3) // => +2
+

Function equal

+
func equal(x : Int32, y : Int32) : Bool
+

Equality function for Int32 types. This is equivalent to +x == y.

+

Example:

+
Int32.equal(-1, -1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int32>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int32>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int32.equal) // => true
+

Function notEqual

+
func notEqual(x : Int32, y : Int32) : Bool
+

Inequality function for Int32 types. This is equivalent to +x != y.

+

Example:

+
Int32.notEqual(-1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Int32, y : Int32) : Bool
+

"Less than" function for Int32 types. This is equivalent to +x < y.

+

Example:

+
Int32.less(-2, 1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Int32, y : Int32) : Bool
+

"Less than or equal" function for Int32 types. This is equivalent to +x <= y.

+

Example:

+
Int32.lessOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Int32, y : Int32) : Bool
+

"Greater than" function for Int32 types. This is equivalent to +x > y.

+

Example:

+
Int32.greater(-2, -3); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Int32, y : Int32) : Bool
+

"Greater than or equal" function for Int32 types. This is equivalent +to x >= y.

+

Example:

+
Int32.greaterOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Int32, y : Int32) : {#less; #equal; #greater}
+

General-purpose comparison function for Int32. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Int32.compare(-3, 2) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int32], Int32.compare) // => [-3, -2, 1]
+

Function neg

+
func neg(x : Int32) : Int32
+

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 31).

+

Example:

+
Int32.neg(123) // => -123
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Function add

+
func add(x : Int32, y : Int32) : Int32
+

Returns the sum of x and y, +x + y.

+

Traps on overflow/underflow.

+

Example:

+
Int32.add(100, 23) // => +123
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int32, Int32>([1, -2, -3], 0, Int32.add) // => -4
+

Function sub

+
func sub(x : Int32, y : Int32) : Int32
+

Returns the difference of x and y, +x - y.

+

Traps on overflow/underflow.

+

Example:

+
Int32.sub(1234, 123) // => +1_111
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int32, Int32>([1, -2, -3], 0, Int32.sub) // => 6
+

Function mul

+
func mul(x : Int32, y : Int32) : Int32
+

Returns the product of x and y, +x * y.

+

Traps on overflow/underflow.

+

Example:

+
Int32.mul(123, 100) // => +12_300
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int32, Int32>([1, -2, -3], 1, Int32.mul) // => 6
+

Function div

+
func div(x : Int32, y : Int32) : Int32
+

Returns the signed integer division of x by +y, x / y. Rounds the quotient towards zero, +which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
Int32.div(123, 10) // => +12
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Int32, y : Int32) : Int32
+

Returns the remainder of the signed integer division of +x by y, x % y, which is defined +as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
Int32.rem(123, 10) // => +3
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Int32, y : Int32) : Int32
+

Returns x to the power of y, +x ** y.

+

Traps on overflow/underflow and when +y < 0 or y >= 32.

+

Example:

+
Int32.pow(2, 10) // => +1_024
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Int32) : Int32
+

Returns the bitwise negation of x, ^x.

+

Example:

+
Int32.bitnot(-256 /* 0xffff_ff00 */) // => +255 // 0xff
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Int32, y : Int32) : Int32
+

Returns the bitwise "and" of x and y, +x & y.

+

Example:

+
Int32.bitand(0xffff, 0x00f0) // => +240 // 0xf0
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Int32, y : Int32) : Int32
+

Returns the bitwise "or" of x and y, +x | y.

+

Example:

+
Int32.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Int32, y : Int32) : Int32
+

Returns the bitwise "exclusive or" of x and +y, x ^ y.

+

Example:

+
Int32.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Int32, y : Int32) : Int32
+

Returns the bitwise left shift of x by y, +x << y. The right bits of the shift filled with +zeros. Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 32, the semantics is the same as for +bitshiftLeft(x, y % 32). For y < 0, the +semantics is the same as for +bitshiftLeft(x, y + y % 32).

+

Example:

+
Int32.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Int32, y : Int32) : Int32
+

Returns the signed bitwise right shift of x by +y, x >> y. The sign bit is retained and +the left side is filled with the sign bit. Right-underflowing bits are +discarded, i.e. not rotated to the left side.

+

For y >= 32, the semantics is the same as for +bitshiftRight(x, y % 32). For y < 0, the +semantics is the same as for +bitshiftRight (x, y + y % 32).

+

Example:

+
Int32.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Int32, y : Int32) : Int32
+

Returns the bitwise left rotatation of x by +y, x <<> y. Each left-overflowing bit +is inserted again on the right side. The sign bit is rotated like other +bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 32, the semantics is the same as for +bitrotLeft(x, y % 32).

+

Example:

+
Int32.bitrotLeft(0x2000_0001, 4) // => +18 // 0x12.
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Int32, y : Int32) : Int32
+

Returns the bitwise right rotation of x by +y, x <>> y. Each right-underflowing +bit is inserted again on the right side. The sign bit is rotated like +other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 32, the semantics is the same as for +bitrotRight(x, y % 32).

+

Example:

+
Int32.bitrotRight(0x0002_0001, 8) // => +16_777_728 // 0x0100_0200.
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Int32, p : Nat) : Bool
+

Returns the value of bit p in x, +x & 2**p == 2**p. If p >= 32, the +semantics is the same as for bittest(x, p % 32). This is +equivalent to checking if the p-th bit is set in +x, using 0 indexing.

+

Example:

+
Int32.bittest(128, 7) // => true
+

Function bitset

+
func bitset(x : Int32, p : Nat) : Int32
+

Returns the value of setting bit p in x to +1. If p >= 32, the semantics is the same as +for bitset(x, p % 32).

+

Example:

+
Int32.bitset(0, 7) // => +128
+

Function bitclear

+
func bitclear(x : Int32, p : Nat) : Int32
+

Returns the value of clearing bit p in x to +0. If p >= 32, the semantics is the same as +for bitclear(x, p % 32).

+

Example:

+
Int32.bitclear(-1, 7) // => -129
+

Function bitflip

+
func bitflip(x : Int32, p : Nat) : Int32
+

Returns the value of flipping bit p in x. +If p >= 32, the semantics is the same as for +bitclear(x, p % 32).

+

Example:

+
Int32.bitflip(255, 7) // => +127
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Int32) -> Int32
+

Returns the count of non-zero bits in x.

+

Example:

+
Int32.bitcountNonZero(0xffff) // => +16
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Int32) -> Int32
+

Returns the count of leading zero bits in x.

+

Example:

+
Int32.bitcountLeadingZero(0x8000) // => +16
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Int32) -> Int32
+

Returns the count of trailing zero bits in x.

+

Example:

+
Int32.bitcountTrailingZero(0x0201_0000) // => +16
+

Function addWrap

+
func addWrap(x : Int32, y : Int32) : Int32
+

Returns the sum of x and y, +x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int32.addWrap(2 ** 30, 2 ** 30) // => -2_147_483_648 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Int32, y : Int32) : Int32
+

Returns the difference of x and y, +x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int32.subWrap(-2 ** 31, 1) // => +2_147_483_647 // underflow
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Int32, y : Int32) : Int32
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
Int32.mulWrap(2 ** 16, 2 ** 16) // => 0 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Int32, y : Int32) : Int32
+

Returns x to the power of y, +x **% y.

+

Wraps on overflow/underflow. Traps if +y < 0 or y >= 32.

+

Example:

+
Int32.powWrap(2, 31) // => -2_147_483_648 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Int64.html b/docs/html/Int64.html new file mode 100644 index 00000000000..031279ccb45 --- /dev/null +++ b/docs/html/Int64.html @@ -0,0 +1,743 @@ + + + + + + + md/base/Int64.md + + + + +
+

md/base/Int64.md

+
+ +

Int64

+

Provides utility functions on 64-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Int64 "mo:base/Int64";
+

Type Int64

+
type Int64 = Prim.Types.Int64
+

64-bit signed integers.

+

Value minimumValue

+
let minimumValue : Int64
+

Minimum 64-bit integer value, -2 ** 63.

+

Example:

+
Int64.minimumValue // => -9_223_372_036_854_775_808
+

Value maximumValue

+
let maximumValue : Int64
+

Maximum 64-bit integer value, +2 ** 63 - 1.

+

Example:

+
Int64.maximumValue // => +9_223_372_036_854_775_807
+

Value toInt

+
let toInt : Int64 -> Int
+

Converts a 64-bit signed integer to a signed integer with infinite +precision.

+

Example:

+
Int64.toInt(123_456) // => 123_456 : Int
+

Value fromInt

+
let fromInt : Int -> Int64
+

Converts a signed integer with infinite precision to a 64-bit signed +integer.

+

Traps on overflow/underflow.

+

Example:

+
Int64.fromInt(123_456) // => +123_456 : Int64
+

Value fromInt32

+
let fromInt32 : Int32 -> Int64
+

Converts a 32-bit signed integer to a 64-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
Int64.fromInt32(-123_456) // => -123_456 : Int64
+

Value toInt32

+
let toInt32 : Int64 -> Int32
+

Converts a 64-bit signed integer to a 32-bit signed integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.toInt32(-123_456) // => -123_456 : Int32
+

Value fromIntWrap

+
let fromIntWrap : Int -> Int64
+

Converts a signed integer with infinite precision to a 64-bit signed +integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.fromIntWrap(-123_456) // => -123_456 : Int64
+

Value fromNat64

+
let fromNat64 : Nat64 -> Int64
+

Converts an unsigned 64-bit integer to a signed 64-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.fromNat64(123_456) // => +123_456 : Int64
+

Value toNat64

+
let toNat64 : Int64 -> Nat64
+

Converts a signed 64-bit integer to an unsigned 64-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.toNat64(-1) // => 18_446_744_073_709_551_615 : Nat64 // underflow
+

Function toText

+
func toText(x : Int64) : Text
+

Returns the Text representation of x. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Int64.toText(-123456) // => "-123456"
+

Function abs

+
func abs(x : Int64) : Int64
+

Returns the absolute value of x.

+

Traps when x == -2 ** 63 (the minimum Int64 +value).

+

Example:

+
Int64.abs(-123456) // => +123_456
+

Function min

+
func min(x : Int64, y : Int64) : Int64
+

Returns the minimum of x and y.

+

Example:

+
Int64.min(+2, -3) // => -3
+

Function max

+
func max(x : Int64, y : Int64) : Int64
+

Returns the maximum of x and y.

+

Example:

+
Int64.max(+2, -3) // => +2
+

Function equal

+
func equal(x : Int64, y : Int64) : Bool
+

Equality function for Int64 types. This is equivalent to +x == y.

+

Example:

+
Int64.equal(-1, -1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int64>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int64>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int64.equal) // => true
+

Function notEqual

+
func notEqual(x : Int64, y : Int64) : Bool
+

Inequality function for Int64 types. This is equivalent to +x != y.

+

Example:

+
Int64.notEqual(-1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Int64, y : Int64) : Bool
+

"Less than" function for Int64 types. This is equivalent to +x < y.

+

Example:

+
Int64.less(-2, 1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Int64, y : Int64) : Bool
+

"Less than or equal" function for Int64 types. This is equivalent to +x <= y.

+

Example:

+
Int64.lessOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Int64, y : Int64) : Bool
+

"Greater than" function for Int64 types. This is equivalent to +x > y.

+

Example:

+
Int64.greater(-2, -3); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Int64, y : Int64) : Bool
+

"Greater than or equal" function for Int64 types. This is equivalent +to x >= y.

+

Example:

+
Int64.greaterOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Int64, y : Int64) : {#less; #equal; #greater}
+

General-purpose comparison function for Int64. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Int64.compare(-3, 2) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int64], Int64.compare) // => [-3, -2, 1]
+

Function neg

+
func neg(x : Int64) : Int64
+

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 63).

+

Example:

+
Int64.neg(123) // => -123
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Function add

+
func add(x : Int64, y : Int64) : Int64
+

Returns the sum of x and y, +x + y.

+

Traps on overflow/underflow.

+

Example:

+
Int64.add(1234, 123) // => +1_357
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int64, Int64>([1, -2, -3], 0, Int64.add) // => -4
+

Function sub

+
func sub(x : Int64, y : Int64) : Int64
+

Returns the difference of x and y, +x - y.

+

Traps on overflow/underflow.

+

Example:

+
Int64.sub(123, 100) // => +23
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int64, Int64>([1, -2, -3], 0, Int64.sub) // => 4
+

Function mul

+
func mul(x : Int64, y : Int64) : Int64
+

Returns the product of x and y, +x * y.

+

Traps on overflow/underflow.

+

Example:

+
Int64.mul(123, 10) // => +1_230
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int64, Int64>([1, -2, -3], 1, Int64.mul) // => 6
+

Function div

+
func div(x : Int64, y : Int64) : Int64
+

Returns the signed integer division of x by +y, x / y. Rounds the quotient towards zero, +which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
Int64.div(123, 10) // => +12
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Int64, y : Int64) : Int64
+

Returns the remainder of the signed integer division of +x by y, x % y, which is defined +as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
Int64.rem(123, 10) // => +3
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Int64, y : Int64) : Int64
+

Returns x to the power of y, +x ** y.

+

Traps on overflow/underflow and when +y < 0 or y >= 64.

+

Example:

+
Int64.pow(2, 10) // => +1_024
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Int64) : Int64
+

Returns the bitwise negation of x, ^x.

+

Example:

+
Int64.bitnot(-256 /* 0xffff_ffff_ffff_ff00 */) // => +255 // 0xff
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Int64, y : Int64) : Int64
+

Returns the bitwise "and" of x and y, +x & y.

+

Example:

+
Int64.bitand(0xffff, 0x00f0) // => +240 // 0xf0
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Int64, y : Int64) : Int64
+

Returns the bitwise "or" of x and y, +x | y.

+

Example:

+
Int64.bitor(0xffff, 0x00f0) // => +65_535 // 0xffff
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Int64, y : Int64) : Int64
+

Returns the bitwise "exclusive or" of x and +y, x ^ y.

+

Example:

+
Int64.bitxor(0xffff, 0x00f0) // => +65_295 // 0xff0f
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Int64, y : Int64) : Int64
+

Returns the bitwise left shift of x by y, +x << y. The right bits of the shift filled with +zeros. Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 64, the semantics is the same as for +bitshiftLeft(x, y % 64). For y < 0, the +semantics is the same as for +bitshiftLeft(x, y + y % 64).

+

Example:

+
Int64.bitshiftLeft(1, 8) // => +256 // 0x100 equivalent to `2 ** 8`.
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Int64, y : Int64) : Int64
+

Returns the signed bitwise right shift of x by +y, x >> y. The sign bit is retained and +the left side is filled with the sign bit. Right-underflowing bits are +discarded, i.e. not rotated to the left side.

+

For y >= 64, the semantics is the same as for +bitshiftRight(x, y % 64). For y < 0, the +semantics is the same as for +bitshiftRight (x, y + y % 64).

+

Example:

+
Int64.bitshiftRight(1024, 8) // => +4 // equivalent to `1024 / (2 ** 8)`
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Int64, y : Int64) : Int64
+

Returns the bitwise left rotatation of x by +y, x <<> y. Each left-overflowing bit +is inserted again on the right side. The sign bit is rotated like other +bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 64, the semantics is the same as for +bitrotLeft(x, y % 64).

+

Example:

+

+Int64.bitrotLeft(0x2000_0000_0000_0001, 4) // => +18 // 0x12.
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Int64, y : Int64) : Int64
+

Returns the bitwise right rotation of x by +y, x <>> y. Each right-underflowing +bit is inserted again on the right side. The sign bit is rotated like +other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 64, the semantics is the same as for +bitrotRight(x, y % 64).

+

Example:

+
Int64.bitrotRight(0x0002_0000_0000_0001, 48) // => +65538 // 0x1_0002.
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Int64, p : Nat) : Bool
+

Returns the value of bit p in x, +x & 2**p == 2**p. If p >= 64, the +semantics is the same as for bittest(x, p % 64). This is +equivalent to checking if the p-th bit is set in +x, using 0 indexing.

+

Example:

+
Int64.bittest(128, 7) // => true
+

Function bitset

+
func bitset(x : Int64, p : Nat) : Int64
+

Returns the value of setting bit p in x to +1. If p >= 64, the semantics is the same as +for bitset(x, p % 64).

+

Example:

+
Int64.bitset(0, 7) // => +128
+

Function bitclear

+
func bitclear(x : Int64, p : Nat) : Int64
+

Returns the value of clearing bit p in x to +0. If p >= 64, the semantics is the same as +for bitclear(x, p % 64).

+

Example:

+
Int64.bitclear(-1, 7) // => -129
+

Function bitflip

+
func bitflip(x : Int64, p : Nat) : Int64
+

Returns the value of flipping bit p in x. +If p >= 64, the semantics is the same as for +bitclear(x, p % 64).

+

Example:

+
Int64.bitflip(255, 7) // => +127
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Int64) -> Int64
+

Returns the count of non-zero bits in x.

+

Example:

+
Int64.bitcountNonZero(0xffff) // => +16
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Int64) -> Int64
+

Returns the count of leading zero bits in x.

+

Example:

+
Int64.bitcountLeadingZero(0x8000_0000) // => +32
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Int64) -> Int64
+

Returns the count of trailing zero bits in x.

+

Example:

+
Int64.bitcountTrailingZero(0x0201_0000) // => +16
+

Function addWrap

+
func addWrap(x : Int64, y : Int64) : Int64
+

Returns the sum of x and y, +x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.addWrap(2 ** 62, 2 ** 62) // => -9_223_372_036_854_775_808 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Int64, y : Int64) : Int64
+

Returns the difference of x and y, +x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.subWrap(-2 ** 63, 1) // => +9_223_372_036_854_775_807 // underflow
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Int64, y : Int64) : Int64
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
Int64.mulWrap(2 ** 32, 2 ** 32) // => 0 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Int64, y : Int64) : Int64
+

Returns x to the power of y, +x **% y.

+

Wraps on overflow/underflow. Traps if +y < 0 or y >= 64.

+

Example:

+
Int64.powWrap(2, 63) // => -9_223_372_036_854_775_808 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Int8.html b/docs/html/Int8.html new file mode 100644 index 00000000000..ac3a43b7c39 --- /dev/null +++ b/docs/html/Int8.html @@ -0,0 +1,739 @@ + + + + + + + md/base/Int8.md + + + + +
+

md/base/Int8.md

+
+ +

Int8

+

Provides utility functions on 8-bit signed integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Int8 "mo:base/Int8";
+

Type Int8

+
type Int8 = Prim.Types.Int8
+

8-bit signed integers.

+

Value minimumValue

+
let minimumValue : Int8
+

Minimum 8-bit integer value, -2 ** 7.

+

Example:

+
Int8.minimumValue // => -128
+

Value maximumValue

+
let maximumValue : Int8
+

Maximum 8-bit integer value, +2 ** 7 - 1.

+

Example:

+
Int8.maximumValue // => +127
+

Value toInt

+
let toInt : Int8 -> Int
+

Converts an 8-bit signed integer to a signed integer with infinite +precision.

+

Example:

+
Int8.toInt(123) // => 123 : Int
+

Value fromInt

+
let fromInt : Int -> Int8
+

Converts a signed integer with infinite precision to an 8-bit signed +integer.

+

Traps on overflow/underflow.

+

Example:

+
Int8.fromInt(123) // => +123 : Int8
+

Value fromIntWrap

+
let fromIntWrap : Int -> Int8
+

Converts a signed integer with infinite precision to an 8-bit signed +integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int8.fromIntWrap(-123) // => -123 : Int
+

Value fromInt16

+
let fromInt16 : Int16 -> Int8
+

Converts a 16-bit signed integer to an 8-bit signed integer.

+

Traps on overflow/underflow.

+

Example:

+
Int8.fromInt16(123) // => +123 : Int8
+

Value toInt16

+
let toInt16 : Int8 -> Int16
+

Converts an 8-bit signed integer to a 16-bit signed integer.

+

Example:

+
Int8.toInt16(123) // => +123 : Int16
+

Value fromNat8

+
let fromNat8 : Nat8 -> Int8
+

Converts an unsigned 8-bit integer to a signed 8-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int8.fromNat8(123) // => +123 : Int8
+

Value toNat8

+
let toNat8 : Int8 -> Nat8
+

Converts a signed 8-bit integer to an unsigned 8-bit integer.

+

Wraps on overflow/underflow.

+

Example:

+
Int8.toNat8(-1) // => 255 : Nat8 // underflow
+

Function toText

+
func toText(x : Int8) : Text
+

Converts an integer number to its textual representation.

+

Example:

+
Int8.toText(-123) // => "-123"
+

Function abs

+
func abs(x : Int8) : Int8
+

Returns the absolute value of x.

+

Traps when x == -2 ** 7 (the minimum Int8 +value).

+

Example:

+
Int8.abs(-123) // => +123
+

Function min

+
func min(x : Int8, y : Int8) : Int8
+

Returns the minimum of x and y.

+

Example:

+
Int8.min(+2, -3) // => -3
+

Function max

+
func max(x : Int8, y : Int8) : Int8
+

Returns the maximum of x and y.

+

Example:

+
Int8.max(+2, -3) // => +2
+

Function equal

+
func equal(x : Int8, y : Int8) : Bool
+

Equality function for Int8 types. This is equivalent to +x == y.

+

Example:

+
Int8.equal(-1, -1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Int8>(1);
+buffer1.add(-3);
+let buffer2 = Buffer.Buffer<Int8>(1);
+buffer2.add(-3);
+Buffer.equal(buffer1, buffer2, Int8.equal) // => true
+

Function notEqual

+
func notEqual(x : Int8, y : Int8) : Bool
+

Inequality function for Int8 types. This is equivalent to +x != y.

+

Example:

+
Int8.notEqual(-1, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Int8, y : Int8) : Bool
+

"Less than" function for Int8 types. This is equivalent to +x < y.

+

Example:

+
Int8.less(-2, 1); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Int8, y : Int8) : Bool
+

"Less than or equal" function for Int8 types. This is equivalent to +x <= y.

+

Example:

+
Int8.lessOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Int8, y : Int8) : Bool
+

"Greater than" function for Int8 types. This is equivalent to +x > y.

+

Example:

+
Int8.greater(-2, -3); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Int8, y : Int8) : Bool
+

"Greater than or equal" function for Int8 types. This is equivalent +to x >= y.

+

Example:

+
Int8.greaterOrEqual(-2, -2); // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Int8, y : Int8) : {#less; #equal; #greater}
+

General-purpose comparison function for Int8. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Int8.compare(-3, 2) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([1, -2, -3] : [Int8], Int8.compare) // => [-3, -2, 1]
+

Function neg

+
func neg(x : Int8) : Int8
+

Returns the negation of x, -x.

+

Traps on overflow, i.e. for neg(-2 ** 7).

+

Example:

+
Int8.neg(123) // => -123
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Function add

+
func add(x : Int8, y : Int8) : Int8
+

Returns the sum of x and y, +x + y.

+

Traps on overflow/underflow.

+

Example:

+
Int8.add(100, 23) // => +123
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int8, Int8>([1, -2, -3], 0, Int8.add) // => -4
+

Function sub

+
func sub(x : Int8, y : Int8) : Int8
+

Returns the difference of x and y, +x - y.

+

Traps on overflow/underflow.

+

Example:

+
Int8.sub(123, 23) // => +100
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int8, Int8>([1, -2, -3], 0, Int8.sub) // => 4
+

Function mul

+
func mul(x : Int8, y : Int8) : Int8
+

Returns the product of x and y, +x * y.

+

Traps on overflow/underflow.

+

Example:

+
Int8.mul(12, 10) // => +120
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Int8, Int8>([1, -2, -3], 1, Int8.mul) // => 6
+

Function div

+
func div(x : Int8, y : Int8) : Int8
+

Returns the signed integer division of x by +y, x / y. Rounds the quotient towards zero, +which is the same as truncating the decimal places of the quotient.

+

Traps when y is zero.

+

Example:

+
Int8.div(123, 10) // => +12
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Int8, y : Int8) : Int8
+

Returns the remainder of the signed integer division of +x by y, x % y, which is defined +as x - x / y * y.

+

Traps when y is zero.

+

Example:

+
Int8.rem(123, 10) // => +3
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Int8, y : Int8) : Int8
+

Returns x to the power of y, +x ** y.

+

Traps on overflow/underflow and when +y < 0 or y >= 8.

+

Example:

+
Int8.pow(2, 6) // => +64
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Int8) : Int8
+

Returns the bitwise negation of x, ^x.

+

Example:

+
Int8.bitnot(-16 /* 0xf0 */) // => +15 // 0x0f
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Int8, y : Int8) : Int8
+

Returns the bitwise "and" of x and y, +x & y.

+

Example:

+
Int8.bitand(0x1f, 0x70) // => +16 // 0x10
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Int8, y : Int8) : Int8
+

Returns the bitwise "or" of x and y, +x | y.

+

Example:

+
Int8.bitor(0x0f, 0x70) // => +127 // 0x7f
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Int8, y : Int8) : Int8
+

Returns the bitwise "exclusive or" of x and +y, x ^ y.

+

Example:

+
Int8.bitxor(0x70, 0x7f) // => +15 // 0x0f
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Int8, y : Int8) : Int8
+

Returns the bitwise left shift of x by y, +x << y. The right bits of the shift filled with +zeros. Left-overflowing bits, including the sign bit, are discarded.

+

For y >= 8, the semantics is the same as for +bitshiftLeft(x, y % 8). For y < 0, the +semantics is the same as for +bitshiftLeft(x, y + y % 8).

+

Example:

+
Int8.bitshiftLeft(1, 4) // => +16 // 0x10 equivalent to `2 ** 4`.
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Int8, y : Int8) : Int8
+

Returns the signed bitwise right shift of x by +y, x >> y. The sign bit is retained and +the left side is filled with the sign bit. Right-underflowing bits are +discarded, i.e. not rotated to the left side.

+

For y >= 8, the semantics is the same as for +bitshiftRight(x, y % 8). For y < 0, the +semantics is the same as for +bitshiftRight (x, y + y % 8).

+

Example:

+
Int8.bitshiftRight(64, 4) // => +4 // equivalent to `64 / (2 ** 4)`
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Int8, y : Int8) : Int8
+

Returns the bitwise left rotatation of x by +y, x <<> y. Each left-overflowing bit +is inserted again on the right side. The sign bit is rotated like other +bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 8, the semantics is the same as for +bitrotLeft(x, y % 8).

+

Example:

+
Int8.bitrotLeft(0x11 /* 0b0001_0001 */, 2) // => +68 // 0b0100_0100 == 0x44.
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Int8, y : Int8) : Int8
+

Returns the bitwise right rotation of x by +y, x <>> y. Each right-underflowing +bit is inserted again on the right side. The sign bit is rotated like +other bits, i.e. the rotation interprets the number as unsigned.

+

Changes the direction of rotation for negative y. For +y >= 8, the semantics is the same as for +bitrotRight(x, y % 8).

+

Example:

+
Int8.bitrotRight(0x11 /* 0b0001_0001 */, 1) // => -120 // 0b1000_1000 == 0x88.
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Int8, p : Nat) : Bool
+

Returns the value of bit p in x, +x & 2**p == 2**p. If p >= 8, the +semantics is the same as for bittest(x, p % 8). This is +equivalent to checking if the p-th bit is set in +x, using 0 indexing.

+

Example:

+
Int8.bittest(64, 6) // => true
+

Function bitset

+
func bitset(x : Int8, p : Nat) : Int8
+

Returns the value of setting bit p in x to +1. If p >= 8, the semantics is the same as +for bitset(x, p % 8).

+

Example:

+
Int8.bitset(0, 6) // => +64
+

Function bitclear

+
func bitclear(x : Int8, p : Nat) : Int8
+

Returns the value of clearing bit p in x to +0. If p >= 8, the semantics is the same as +for bitclear(x, p % 8).

+

Example:

+
Int8.bitclear(-1, 6) // => -65
+

Function bitflip

+
func bitflip(x : Int8, p : Nat) : Int8
+

Returns the value of flipping bit p in x. +If p >= 8, the semantics is the same as for +bitclear(x, p % 8).

+

Example:

+
Int8.bitflip(127, 6) // => +63
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Int8) -> Int8
+

Returns the count of non-zero bits in x.

+

Example:

+
Int8.bitcountNonZero(0x0f) // => +4
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Int8) -> Int8
+

Returns the count of leading zero bits in x.

+

Example:

+
Int8.bitcountLeadingZero(0x08) // => +4
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Int8) -> Int8
+

Returns the count of trailing zero bits in x.

+

Example:

+
Int8.bitcountTrailingZero(0x10) // => +4
+

Function addWrap

+
func addWrap(x : Int8, y : Int8) : Int8
+

Returns the sum of x and y, +x +% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int8.addWrap(2 ** 6, 2 ** 6) // => -128 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Int8, y : Int8) : Int8
+

Returns the difference of x and y, +x -% y.

+

Wraps on overflow/underflow.

+

Example:

+
Int8.subWrap(-2 ** 7, 1) // => +127 // underflow
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Int8, y : Int8) : Int8
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Wraps on overflow/underflow.

+

Example:

+
Int8.mulWrap(2 ** 4, 2 ** 4) // => 0 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Int8, y : Int8) : Int8
+

Returns x to the power of y, +x **% y.

+

Wraps on overflow/underflow. Traps if +y < 0 or y >= 8.

+

Example:

+
Int8.powWrap(2, 7) // => -128 // overflow
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Iter.html b/docs/html/Iter.html new file mode 100644 index 00000000000..5b84ff61597 --- /dev/null +++ b/docs/html/Iter.html @@ -0,0 +1,340 @@ + + + + + + + md/base/Iter.md + + + + +
+

md/base/Iter.md

+
+ +

Iter

+

Iterators

+

Type Iter

+
type Iter<T> = { next : () -> ?T }
+

An iterator that produces values of type T. Calling +next returns null when iteration is +finished.

+

Iterators are inherently stateful. Calling next +"consumes" a value from the Iterator that cannot be put back, so keep +that in mind when sharing iterators between consumers.

+

An iterater i can be iterated over using

+
for (x in i) {
+  …do something with x…
+}
+

Class range

+
class range(x : Nat, y : Int)
+

Creates an iterator that produces all Nats from +x to y including both of the bounds.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+assert(?1 == iter.next());
+assert(?2 == iter.next());
+assert(?3 == iter.next());
+assert(null == iter.next());
+

Function next

+
func next() : ?Nat
+

Class revRange

+
class revRange(x : Int, y : Int)
+

Like range but produces the values in the opposite +order.

+

Function next

+
func next() : ?Int
+

Function iterate

+
func iterate<A>(xs : Iter<A>, f : (A, Nat) -> ())
+

Calls a function f on every value produced by an +iterator and discards the results. If you're looking to keep these +results use map instead.

+
import Iter "mo:base/Iter";
+var sum = 0;
+Iter.iterate<Nat>(Iter.range(1, 3), func(x, _index) {
+  sum += x;
+});
+assert(6 == sum)
+

Function size

+
func size<A>(xs : Iter<A>) : Nat
+

Consumes an iterator and counts how many elements were produced +(discarding them in the process).

+

Function map

+
func map<A, B>(xs : Iter<A>, f : A -> B) : Iter<B>
+

Takes a function and an iterator and returns a new iterator that +lazily applies the function to every element produced by the argument +iterator.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+let mappedIter = Iter.map(iter, func (x : Nat) : Nat { x * 2 });
+assert(?2 == mappedIter.next());
+assert(?4 == mappedIter.next());
+assert(?6 == mappedIter.next());
+assert(null == mappedIter.next());
+

Function filter

+
func filter<A>(xs : Iter<A>, f : A -> Bool) : Iter<A>
+

Takes a function and an iterator and returns a new iterator that +produces elements from the original iterator if and only if the +predicate is true.

+
import Iter "o:base/Iter";
+let iter = Iter.range(1, 3);
+let mappedIter = Iter.filter(iter, func (x : Nat) : Bool { x % 2 == 1 });
+assert(?1 == mappedIter.next());
+assert(?3 == mappedIter.next());
+assert(null == mappedIter.next());
+

Function make

+
func make<A>(x : A) : Iter<A>
+

Creates an iterator that produces an infinite sequence of +x.

+
import Iter "mo:base/Iter";
+let iter = Iter.make(10);
+assert(?10 == iter.next());
+assert(?10 == iter.next());
+assert(?10 == iter.next());
+// ...
+

Function fromArray

+
func fromArray<A>(xs : [A]) : Iter<A>
+

Creates an iterator that produces the elements of an Array in +ascending index order.

+
import Iter "mo:base/Iter";
+let iter = Iter.fromArray([1, 2, 3]);
+assert(?1 == iter.next());
+assert(?2 == iter.next());
+assert(?3 == iter.next());
+assert(null == iter.next());
+

Function fromArrayMut

+
func fromArrayMut<A>(xs : [var A]) : Iter<A>
+

Like fromArray but for Arrays with mutable elements. +Captures the elements of the Array at the time the iterator is created, +so further modifications won't be reflected in the iterator.

+

Value fromList

+
let fromList
+

Like fromArray but for Lists.

+

Function toArray

+
func toArray<A>(xs : Iter<A>) : [A]
+

Consumes an iterator and collects its produced elements in an +Array.

+
import Iter "mo:base/Iter";
+let iter = Iter.range(1, 3);
+assert([1, 2, 3] == Iter.toArray(iter));
+

Function toArrayMut

+
func toArrayMut<A>(xs : Iter<A>) : [var A]
+

Like toArray but for Arrays with mutable elements.

+

Function toList

+
func toList<A>(xs : Iter<A>) : List.List<A>
+

Like toArray but for Lists.

+

Function sort

+
func sort<A>(xs : Iter<A>, compare : (A, A) -> Order.Order) : Iter<A>
+

Sorted iterator. Will iterate over all elements to sort +them, necessarily.

+ + diff --git a/docs/html/IterType.html b/docs/html/IterType.html new file mode 100644 index 00000000000..6ee2e9bbc7a --- /dev/null +++ b/docs/html/IterType.html @@ -0,0 +1,192 @@ + + + + + + + md/base/IterType.md + + + + +
+

md/base/IterType.md

+
+ +

IterType

+

The Iterator type

+

Type Iter

+
type Iter<T> = { next : () -> ?T }
+ + diff --git a/docs/html/List.html b/docs/html/List.html new file mode 100644 index 00000000000..ee1ece28862 --- /dev/null +++ b/docs/html/List.html @@ -0,0 +1,718 @@ + + + + + + + md/base/List.md + + + + +
+

md/base/List.md

+
+ +

List

+

Purely-functional, singly-linked lists. A list of type +List<T> is either null or an optional +pair of a value of type T and a tail, itself of type +List<T>.

+

To use this library, import it using:

+
import List "mo:base/List";
+

Type List

+
type List<T> = ?(T, List<T>)
+

Function nil

+
func nil<T>() : List<T>
+

Create an empty list.

+

Example:

+
List.nil<Nat>() // => null
+

Runtime: O(1)

+

Space: O(1)

+

Function isNil

+
func isNil<T>(l : List<T>) : Bool
+

Check whether a list is empty and return true if the list is +empty.

+

Example:

+
List.isNil<Nat>(null) // => true
+

Runtime: O(1)

+

Space: O(1)

+

Function push

+
func push<T>(x : T, l : List<T>) : List<T>
+

Add x to the head of list, and return the +new list.

+

Example:

+
List.push<Nat>(0, null) // => ?(0, null);
+

Runtime: O(1)

+

Space: O(1)

+

Function last

+
func last<T>(l : List<T>) : ?T
+

Return the last element of the list, if present. Example:

+
List.last<Nat>(?(0, ?(1, null))) // => ?1
+

Runtime: O(size)

+

Space: O(1)

+

Function pop

+
func pop<T>(l : List<T>) : (?T, List<T>)
+

Remove the head of the list, returning the optioned head and the tail +of the list in a pair. Returns (null, null) if the list is +empty.

+

Example:

+
List.pop<Nat>(?(0, ?(1, null))) // => (?0, ?(1, null))
+

Runtime: O(1)

+

Space: O(1)

+

Function size

+
func size<T>(l : List<T>) : Nat
+

Return the length of the list.

+

Example:

+
List.size<Nat>(?(0, ?(1, null))) // => 2
+

Runtime: O(size)

+

Space: O(1)

+

Function get

+
func get<T>(l : List<T>, n : Nat) : ?T
+

Access any item in a list, zero-based.

+

NOTE: Indexing into a list is a linear operation, and usually an +indication that a list might not be the best data structure to use.

+

Example:

+
List.get<Nat>(?(0, ?(1, null)), 1) // => ?1
+

Runtime: O(size)

+

Space: O(1)

+

Function reverse

+
func reverse<T>(l : List<T>) : List<T>
+

Reverses the list.

+

Example:

+
List.reverse<Nat>(?(0, ?(1, ?(2, null)))) // => ?(2, ?(1, ?(0, null)))
+

Runtime: O(size)

+

Space: O(size)

+

Function iterate

+
func iterate<T>(l : List<T>, f : T -> ())
+

Call the given function for its side effect, with each list element +in turn.

+

Example:

+
var sum = 0;
+List.iterate<Nat>(?(0, ?(1, ?(2, null))), func n { sum += n });
+sum // => 3
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function map

+
func map<T, U>(l : List<T>, f : T -> U) : List<U>
+

Call the given function f on each list element and +collect the results in a new list.

+

Example:

+
import Nat = "mo:base/Nat"
+List.map<Nat, Text>(?(0, ?(1, ?(2, null))), Nat.toText) // => ?("0", ?("1", ?("2", null))
+

Runtime: O(size)

+

Space: O(size) *Runtime and space assumes that f runs in +O(1) time and space.

+

Function filter

+
func filter<T>(l : List<T>, f : T -> Bool) : List<T>
+

Create a new list with only those elements of the original list for +which the given function (often called the predicate) returns +true.

+

Example:

+
List.filter<Nat>(?(0, ?(1, ?(2, null))), func n { n != 1 }) // => ?(0, ?(2, null))
+

Runtime: O(size)

+

Space: O(size)

+

Function partition

+
func partition<T>(l : List<T>, f : T -> Bool) : (List<T>, List<T>)
+

Create two new lists from the results of a given function +(f). The first list only includes the elements for which +the given function f returns true and the second list only +includes the elements for which the function returns false.

+

Example:

+
List.partition<Nat>(?(0, ?(1, ?(2, null))), func n { n != 1 }) // => (?(0, ?(2, null)), ?(1, null))
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapFilter

+
func mapFilter<T, U>(l : List<T>, f : T -> ?U) : List<U>
+

Call the given function on each list element, and collect the +non-null results in a new list.

+

Example:

+
List.mapFilter<Nat, Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n {
+    if (n > 1) {
+      ?(n * 2);
+    } else {
+      null
+    }
+  }
+) // => ?(4, ?(6, null))
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function mapResult

+
func mapResult<T, R, E>(xs : List<T>, f : T -> Result.Result<R, E>) : Result.Result<List<R>, E>
+

Maps a Result-returning function f over a List and +returns either the first error or a list of successful values.

+

Example:

+
List.mapResult<Nat, Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  func n {
+    if (n > 0) {
+      #ok(n * 2);
+    } else {
+      #err("Some element is zero")
+    }
+  }
+); // => #ok ?(2, ?(4, ?(6, null))
+

Runtime: O(size)

+

Space: O(size)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function append

+
func append<T>(l : List<T>, m : List<T>) : List<T>
+

Append the elements from one list to another list.

+

Example:

+
List.append<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  ?(3, ?(4, ?(5, null)))
+) // => ?(0, ?(1, ?(2, ?(3, ?(4, ?(5, null))))))
+

Runtime: O(size(l))

+

Space: O(size(l))

+

Function flatten

+
func flatten<T>(l : List<List<T>>) : List<T>
+

Flatten, or concatenate, a list of lists as a list.

+

Example:

+
List.flatten<Nat>(
+  ?(?(0, ?(1, ?(2, null))),
+    ?(?(3, ?(4, ?(5, null))),
+      null))
+); // => ?(0, ?(1, ?(2, ?(3, ?(4, ?(5, null))))))
+

Runtime: O(size*size)

+

Space: O(size*size)

+

Function take

+
func take<T>(l : List<T>, n : Nat) : List<T>
+

Returns the first n elements of the given list. If the +given list has fewer than n elements, this function returns +a copy of the full input list.

+

Example:

+
List.take<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  2
+); // => ?(0, ?(1, null))
+

Runtime: O(n)

+

Space: O(n)

+

Function drop

+
func drop<T>(l : List<T>, n : Nat) : List<T>
+

Drop the first n elements from the given list.

+

Example:

+
List.drop<Nat>(
+  ?(0, ?(1, ?(2, null))),
+  2
+); // => ?(2, null)
+

Runtime: O(n)

+

Space: O(1)

+

Function foldLeft

+
func foldLeft<T, S>(list : List<T>, base : S, combine : (S, T) -> S) : S
+

Collapses the elements in list into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs left to +right.

+

Example:

+
import Nat "mo:base/Nat";
+
+List.foldLeft<Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  "",
+  func (acc, x) { acc # Nat.toText(x)}
+) // => "123"
+

Runtime: O(size(list))

+

Space: O(1) heap, O(1) stack

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+

Function foldRight

+
func foldRight<T, S>(list : List<T>, base : S, combine : (T, S) -> S) : S
+

Collapses the elements in buffer into a single value by +starting with base and progessively combining elements into +base with combine. Iteration runs right to +left.

+

Example:

+
import Nat "mo:base/Nat";
+
+List.foldRight<Nat, Text>(
+  ?(1, ?(2, ?(3, null))),
+  "",
+  func (x, acc) { Nat.toText(x) # acc}
+) // => "123"
+

Runtime: O(size(list))

+

Space: O(1) heap, O(size(list)) stack

+

*Runtime and space assumes that combine runs in O(1) +time and space.

+

Function find

+
func find<T>(l : List<T>, f : T -> Bool) : ?T
+

Return the first element for which the given predicate f +is true, if such an element exists.

+

Example:

+

+List.find<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+); // => ?2
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function some

+
func some<T>(l : List<T>, f : T -> Bool) : Bool
+

Return true if there exists a list element for which the given +predicate f is true.

+

Example:

+

+List.some<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+) // => true
+

Runtime: O(size(list))

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function all

+
func all<T>(l : List<T>, f : T -> Bool) : Bool
+

Return true if the given predicate f is true for all +list elements.

+

Example:

+

+List.all<Nat>(
+  ?(1, ?(2, ?(3, null))),
+  func n { n > 1 }
+); // => false
+

Runtime: O(size)

+

Space: O(1)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function merge

+
func merge<T>(l1 : List<T>, l2 : List<T>, lessThanOrEqual : (T, T) -> Bool) : List<T>
+

Merge two ordered lists into a single ordered list. This function +requires both list to be ordered as specified by the given relation +lessThanOrEqual.

+

Example:

+

+List.merge<Nat>(
+  ?(1, ?(2, ?(4, null))),
+  ?(2, ?(4, ?(6, null))),
+  func (n1, n2) { n1 <= n2 }
+); // => ?(1, ?(2, ?(2, ?(4, ?(4, ?(6, null))))))),
+

Runtime: O(size(l1) + size(l2))

+

Space: O(size(l1) + size(l2))

+

*Runtime and space assumes that lessThanOrEqual runs in +O(1) time and space.

+

Function compare

+
func compare<T>(l1 : List<T>, l2 : List<T>, compare : (T, T) -> Order.Order) : Order.Order
+

Compare two lists using lexicographic ordering specified by argument +function compare.

+

Example:

+
import Nat "mo:base/Nat";
+
+List.compare<Nat>(
+  ?(1, ?(2, null)),
+  ?(3, ?(4, null)),
+  Nat.compare
+) // => #less
+

Runtime: O(size(l1))

+

Space: O(1)

+

*Runtime and space assumes that argument compare runs in +O(1) time and space.

+

Function equal

+
func equal<T>(l1 : List<T>, l2 : List<T>, equal : (T, T) -> Bool) : Bool
+

Compare two lists for equality using the argument function +equal to determine equality of their elements.

+

Example:

+
import Nat "mo:base/Nat";
+
+List.equal<Nat>(
+  ?(1, ?(2, null)),
+  ?(3, ?(4, null)),
+  Nat.equal
+); // => false
+

Runtime: O(size(l1))

+

Space: O(1)

+

*Runtime and space assumes that argument equal runs in +O(1) time and space.

+

Function tabulate

+
func tabulate<T>(n : Nat, f : Nat -> T) : List<T>
+

Generate a list based on a length and a function that maps from a +list index to a list element.

+

Example:

+
List.tabulate<Nat>(
+  3,
+  func n { n * 2 }
+) // => ?(0, ?(2, (?4, null)))
+

Runtime: O(n)

+

Space: O(n)

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function make

+
func make<T>(x : T) : List<T>
+

Create a list with exactly one element.

+

Example:

+
List.make<Nat>(
+  0
+) // => ?(0, null)
+

Runtime: O(1)

+

Space: O(1)

+

Function replicate

+
func replicate<T>(n : Nat, x : T) : List<T>
+

Create a list of the given length with the same value in each +position.

+

Example:

+
List.replicate<Nat>(
+  3,
+  0
+) // => ?(0, ?(0, ?(0, null)))
+

Runtime: O(n)

+

Space: O(n)

+

Function zip

+
func zip<T, U>(xs : List<T>, ys : List<U>) : List<(T, U)>
+

Create a list of pairs from a pair of lists.

+

If the given lists have different lengths, then the created list will +have a length equal to the length of the smaller list.

+

Example:

+
List.zip<Nat, Text>(
+  ?(0, ?(1, ?(2, null))),
+  ?("0", ?("1", null)),
+) // => ?((0, "0"), ?((1, "1"), null))
+

Runtime: O(min(size(xs), size(ys)))

+

Space: O(min(size(xs), size(ys)))

+

Function zipWith

+
func zipWith<T, U, V>(xs : List<T>, ys : List<U>, f : (T, U) -> V) : List<V>
+

Create a list in which elements are created by applying function +f to each pair (x, y) of elements occuring at +the same position in list xs and list ys.

+

If the given lists have different lengths, then the created list will +have a length equal to the length of the smaller list.

+

Example:

+
import Nat = "mo:base/Nat";
+import Char = "mo:base/Char";
+
+List.zipWith<Nat, Char, Text>(
+  ?(0, ?(1, ?(2, null))),
+  ?('a', ?('b', null)),
+  func (n, c) { Nat.toText(n) # Char.toText(c) }
+) // => ?("0a", ?("1b", null))
+

Runtime: O(min(size(xs), size(ys)))

+

Space: O(min(size(xs), size(ys)))

+

*Runtime and space assumes that f runs in O(1) time and +space.

+

Function split

+
func split<T>(n : Nat, xs : List<T>) : (List<T>, List<T>)
+

Split the given list at the given zero-based index.

+

Example:

+
List.split<Nat>(
+  2,
+  ?(0, ?(1, ?(2, null)))
+) // => (?(0, ?(1, null)), ?(2, null))
+

Runtime: O(n)

+

Space: O(n)

+

Function chunks

+
func chunks<T>(n : Nat, xs : List<T>) : List<List<T>>
+

Split the given list into chunks of length n. The last +chunk will be shorter if the length of the given list does not divide by +n evenly.

+

Example:

+
List.chunks<Nat>(
+  2,
+  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+)
+/* => ?(?(0, ?(1, null)),
+        ?(?(2, ?(3, null)),
+          ?(?(4, null),
+            null)))
+*/
+

Runtime: O(size)

+

Space: O(size)

+

Function fromArray

+
func fromArray<T>(xs : [T]) : List<T>
+

Convert an array into a list.

+

Example:

+
List.fromArray<Nat>([ 0, 1, 2, 3, 4])
+// =>  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+

Runtime: O(size)

+

Space: O(size)

+

Function fromVarArray

+
func fromVarArray<T>(xs : [var T]) : List<T>
+

Convert a mutable array into a list.

+

Example:

+
List.fromVarArray<Nat>([var 0, 1, 2, 3, 4])
+// =>  ?(0, ?(1, ?(2, ?(3, ?(4, null)))))
+

Runtime: O(size)

+

Space: O(size)

+

Function toArray

+
func toArray<T>(xs : List<T>) : [T]
+

Create an array from a list. Example:

+
List.toArray<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))
+// => [0, 1, 2, 3, 4]
+

Runtime: O(size)

+

Space: O(size)

+

Function toVarArray

+
func toVarArray<T>(xs : List<T>) : [var T]
+

Create a mutable array from a list. Example:

+
List.toVarArray<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))
+// => [var 0, 1, 2, 3, 4]
+

Runtime: O(size)

+

Space: O(size)

+

Function toIter

+
func toIter<T>(xs : List<T>) : Iter.Iter<T>
+

Create an iterator from a list. Example:

+
var sum = 0;
+for (n in List.toIter<Nat>(?(0, ?(1, ?(2, ?(3, ?(4, null))))))) {
+  sum += n;
+};
+sum
+// => 10
+

Runtime: O(1)

+

Space: O(1)

+ + diff --git a/docs/html/Nat.html b/docs/html/Nat.html new file mode 100644 index 00000000000..344a7d2bfb3 --- /dev/null +++ b/docs/html/Nat.html @@ -0,0 +1,458 @@ + + + + + + + md/base/Nat.md + + + + +
+

md/base/Nat.md

+
+ +

Nat

+

Natural numbers with infinite precision.

+

Most operations on natural numbers (e.g. addition) are available as +built-in operators (e.g. 1 + 1). This module provides +equivalent functions and Text conversion.

+

Import from the base library to use this module.

+
import Nat "mo:base/Nat";
+

Type Nat

+
type Nat = Prim.Types.Nat
+

Infinite precision natural numbers.

+

Function toText

+
func toText(n : Nat) : Text
+

Converts a natural number to its textual representation. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Nat.toText 1234 // => "1234"
+

Function fromText

+
func fromText(text : Text) : ?Nat
+

Creates a natural number from its textual representation. Returns +null if the input is not a valid natural number.

+

Note: The textual representation must not contain +underscores.

+

Example:

+
Nat.fromText "1234" // => ?1234
+

Function min

+
func min(x : Nat, y : Nat) : Nat
+

Returns the minimum of x and y.

+

Example:

+
Nat.min(1, 2) // => 1
+

Function max

+
func max(x : Nat, y : Nat) : Nat
+

Returns the maximum of x and y.

+

Example:

+
Nat.max(1, 2) // => 2
+

Function equal

+
func equal(x : Nat, y : Nat) : Bool
+

Equality function for Nat types. This is equivalent to +x == y.

+

Example:

+
ignore Nat.equal(1, 1); // => true
+1 == 1 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat>(3);
+let buffer2 = Buffer.Buffer<Nat>(3);
+Buffer.equal(buffer1, buffer2, Nat.equal) // => true
+

Function notEqual

+
func notEqual(x : Nat, y : Nat) : Bool
+

Inequality function for Nat types. This is equivalent to +x != y.

+

Example:

+
ignore Nat.notEqual(1, 2); // => true
+1 != 2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Nat, y : Nat) : Bool
+

"Less than" function for Nat types. This is equivalent to +x < y.

+

Example:

+
ignore Nat.less(1, 2); // => true
+1 < 2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Nat, y : Nat) : Bool
+

"Less than or equal" function for Nat types. This is equivalent to +x <= y.

+

Example:

+
ignore Nat.lessOrEqual(1, 2); // => true
+1 <= 2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Nat, y : Nat) : Bool
+

"Greater than" function for Nat types. This is equivalent to +x > y.

+

Example:

+
ignore Nat.greater(2, 1); // => true
+2 > 1 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Nat, y : Nat) : Bool
+

"Greater than or equal" function for Nat types. This is equivalent to +x >= y.

+

Example:

+
ignore Nat.greaterOrEqual(2, 1); // => true
+2 >= 1 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Nat, y : Nat) : {#less; #equal; #greater}
+

General purpose comparison function for Nat. Returns the +Order ( either #less, #equal, or +#greater) of comparing x with +y.

+

Example:

+
Nat.compare(2, 3) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([2, 3, 1], Nat.compare) // => [1, 2, 3]
+

Function add

+
func add(x : Nat, y : Nat) : Nat
+

Returns the sum of x and y, +x + y. This operator will never overflow because +Nat is infinite precision.

+

Example:

+
ignore Nat.add(1, 2); // => 3
+1 + 2 // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 0, Nat.add) // => 6
+

Function sub

+
func sub(x : Nat, y : Nat) : Nat
+

Returns the difference of x and y, +x - y. Traps on underflow below 0.

+

Example:

+
ignore Nat.sub(2, 1); // => 1
+// Add a type annotation to avoid a warning about the subtraction
+2 - 1 : Nat // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 10, Nat.sub) // => 4
+

Function mul

+
func mul(x : Nat, y : Nat) : Nat
+

Returns the product of x and y, +x * y. This operator will never overflow because +Nat is infinite precision.

+

Example:

+
ignore Nat.mul(2, 3); // => 6
+2 * 3 // => 6
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft([2, 3, 1], 1, Nat.mul) // => 6
+

Function div

+
func div(x : Nat, y : Nat) : Nat
+

Returns the unsigned integer division of x by +y, x / y. Traps when y is +zero.

+

The quotient is rounded down, which is equivalent to truncating the +decimal places of the quotient.

+

Example:

+
ignore Nat.div(6, 2); // => 3
+6 / 2 // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Nat, y : Nat) : Nat
+

Returns the remainder of unsigned integer division of x +by y, x % y. Traps when y is +zero.

+

Example:

+
ignore Nat.rem(6, 4); // => 2
+6 % 4 // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Nat, y : Nat) : Nat
+

Returns x to the power of y, +x ** y. Traps when y > 2^32. This operator +will never overflow because Nat is infinite precision.

+

Example:

+
ignore Nat.pow(2, 3); // => 8
+2 ** 3 // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Nat, y : Nat32) : Nat
+

Returns the (conceptual) bitwise shift left of x by +y, x * (2 ** y).

+

Example:

+
Nat.bitshiftLeft(1, 3); // => 8
+

Note: The reason why this function is defined in this library (in +absence of the << operator) is so that you can use it +as a function value to pass to a higher order function. While +Nat is not defined in terms of bit patterns, conceptually +it can be regarded as such, and the operation is provided as a +high-performance version of the corresponding arithmetic rule.

+

Function bitshiftRight

+
func bitshiftRight(x : Nat, y : Nat32) : Nat
+

Returns the (conceptual) bitwise shift right of x by +y, x / (2 ** y).

+

Example:

+
Nat.bitshiftRight(8, 3); // => 1
+

Note: The reason why this function is defined in this library (in +absence of the >> operator) is so that you can use it +as a function value to pass to a higher order function. While +Nat is not defined in terms of bit patterns, conceptually +it can be regarded as such, and the operation is provided as a +high-performance version of the corresponding arithmetic rule.

+ + diff --git a/docs/html/Nat16.html b/docs/html/Nat16.html new file mode 100644 index 00000000000..ae6e4158a9f --- /dev/null +++ b/docs/html/Nat16.html @@ -0,0 +1,687 @@ + + + + + + + md/base/Nat16.md + + + + +
+

md/base/Nat16.md

+
+ +

Nat16

+

Provides utility functions on 16-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Nat16 "mo:base/Nat16";
+

Type Nat16

+
type Nat16 = Prim.Types.Nat16
+

16-bit natural numbers.

+

Value maximumValue

+
let maximumValue : Nat16
+

Maximum 16-bit natural number. 2 ** 16 - 1.

+

Example:

+
Nat16.maximumValue; // => 65536 : Nat16
+

Value toNat

+
let toNat : Nat16 -> Nat
+

Converts a 16-bit unsigned integer to an unsigned integer with +infinite precision.

+

Example:

+
Nat16.toNat(123); // => 123 : Nat
+

Value fromNat

+
let fromNat : Nat -> Nat16
+

Converts an unsigned integer with infinite precision to a 16-bit +unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat16.fromNat(123); // => 123 : Nat16
+

Function fromNat8

+
func fromNat8(x : Nat8) : Nat16
+

Converts an 8-bit unsigned integer to a 16-bit unsigned integer.

+

Example:

+
Nat16.fromNat8(123); // => 123 : Nat16
+

Function toNat8

+
func toNat8(x : Nat16) : Nat8
+

Converts a 16-bit unsigned integer to an 8-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat16.toNat8(123); // => 123 : Nat8
+

Function fromNat32

+
func fromNat32(x : Nat32) : Nat16
+

Converts a 32-bit unsigned integer to a 16-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat16.fromNat32(123); // => 123 : Nat16
+

Function toNat32

+
func toNat32(x : Nat16) : Nat32
+

Converts a 16-bit unsigned integer to a 32-bit unsigned integer.

+

Example:

+
Nat16.toNat32(123); // => 123 : Nat32
+

Value fromIntWrap

+
let fromIntWrap : Int -> Nat16
+

Converts a signed integer with infinite precision to a 16-bit +unsigned integer.

+

Wraps on overflow/underflow.

+

Example:

+
Nat16.fromIntWrap(123 : Int); // => 123 : Nat16
+

Function toText

+
func toText(x : Nat16) : Text
+

Converts x to its textual representation. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Nat16.toText(1234); // => "1234" : Text
+

Function min

+
func min(x : Nat16, y : Nat16) : Nat16
+

Returns the minimum of x and y.

+

Example:

+
Nat16.min(123, 200); // => 123 : Nat16
+

Function max

+
func max(x : Nat16, y : Nat16) : Nat16
+

Returns the maximum of x and y.

+

Example:

+
Nat16.max(123, 200); // => 200 : Nat16
+

Function equal

+
func equal(x : Nat16, y : Nat16) : Bool
+

Equality function for Nat16 types. This is equivalent to +x == y.

+

Example:

+
ignore Nat16.equal(1, 1); // => true
+(1 : Nat16) == (1 : Nat16) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat16>(3);
+let buffer2 = Buffer.Buffer<Nat16>(3);
+Buffer.equal(buffer1, buffer2, Nat16.equal) // => true
+

Function notEqual

+
func notEqual(x : Nat16, y : Nat16) : Bool
+

Inequality function for Nat16 types. This is equivalent to +x != y.

+

Example:

+
ignore Nat16.notEqual(1, 2); // => true
+(1 : Nat16) != (2 : Nat16) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Nat16, y : Nat16) : Bool
+

"Less than" function for Nat16 types. This is equivalent to +x < y.

+

Example:

+
ignore Nat16.less(1, 2); // => true
+(1 : Nat16) < (2 : Nat16) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Nat16, y : Nat16) : Bool
+

"Less than or equal" function for Nat16 types. This is equivalent to +x <= y.

+

Example:

+
ignore Nat16.lessOrEqual(1, 2); // => true
+(1 : Nat16) <= (2 : Nat16) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Nat16, y : Nat16) : Bool
+

"Greater than" function for Nat16 types. This is equivalent to +x > y.

+

Example:

+
ignore Nat16.greater(2, 1); // => true
+(2 : Nat16) > (1 : Nat16) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Nat16, y : Nat16) : Bool
+

"Greater than or equal" function for Nat16 types. This is equivalent +to x >= y.

+

Example:

+
ignore Nat16.greaterOrEqual(2, 1); // => true
+(2 : Nat16) >= (1 : Nat16) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Nat16, y : Nat16) : {#less; #equal; #greater}
+

General purpose comparison function for Nat16. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Nat16.compare(2, 3) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat16], Nat16.compare) // => [1, 2, 3]
+

Function add

+
func add(x : Nat16, y : Nat16) : Nat16
+

Returns the sum of x and y, +x + y. Traps on overflow.

+

Example:

+
ignore Nat16.add(1, 2); // => 3
+(1 : Nat16) + (2 : Nat16) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat16, Nat16>([2, 3, 1], 0, Nat16.add) // => 6
+

Function sub

+
func sub(x : Nat16, y : Nat16) : Nat16
+

Returns the difference of x and y, +x - y. Traps on underflow.

+

Example:

+
ignore Nat16.sub(2, 1); // => 1
+(2 : Nat16) - (1 : Nat16) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat16, Nat16>([2, 3, 1], 20, Nat16.sub) // => 14
+

Function mul

+
func mul(x : Nat16, y : Nat16) : Nat16
+

Returns the product of x and y, +x * y. Traps on overflow.

+

Example:

+
ignore Nat16.mul(2, 3); // => 6
+(2 : Nat16) * (3 : Nat16) // => 6
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat16, Nat16>([2, 3, 1], 1, Nat16.mul) // => 6
+

Function div

+
func div(x : Nat16, y : Nat16) : Nat16
+

Returns the quotient of x divided by y, +x / y. Traps when y is zero.

+

Example:

+
ignore Nat16.div(6, 2); // => 3
+(6 : Nat16) / (2 : Nat16) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Nat16, y : Nat16) : Nat16
+

Returns the remainder of x divided by y, +x % y. Traps when y is zero.

+

Example:

+
ignore Nat16.rem(6, 4); // => 2
+(6 : Nat16) % (4 : Nat16) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Nat16, y : Nat16) : Nat16
+

Returns the power of x to y, +x ** y. Traps on overflow.

+

Example:

+
ignore Nat16.pow(2, 3); // => 8
+(2 : Nat16) ** (3 : Nat16) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Nat16) : Nat16
+

Returns the bitwise negation of x, ^x.

+

Example:

+
ignore Nat16.bitnot(0); // => 65535
+^(0 : Nat16) // => 65535
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise and of x and y, +x & y.

+

Example:

+
ignore Nat16.bitand(0, 1); // => 0
+(0 : Nat16) & (1 : Nat16) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise or of x and y, +x | y.

+

Example:

+
ignore Nat16.bitor(0, 1); // => 1
+(0 : Nat16) | (1 : Nat16) // => 1
+

Function bitxor

+
func bitxor(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise exclusive or of x and +y, x ^ y.

+

Example:

+
ignore Nat16.bitxor(0, 1); // => 1
+(0 : Nat16) ^ (1 : Nat16) // => 1
+

Function bitshiftLeft

+
func bitshiftLeft(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise shift left of x by y, +x << y.

+

Example:

+
ignore Nat16.bitshiftLeft(1, 3); // => 8
+(1 : Nat16) << (3 : Nat16) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise shift right of x by y, +x >> y.

+

Example:

+
ignore Nat16.bitshiftRight(8, 3); // => 1
+(8 : Nat16) >> (3 : Nat16) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise rotate left of x by y, +x <<> y.

+

Example:

+
ignore Nat16.bitrotLeft(2, 1); // => 4
+(2 : Nat16) <<> (1 : Nat16) // => 4
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Nat16, y : Nat16) : Nat16
+

Returns the bitwise rotate right of x by y, +x <>> y.

+

Example:

+
ignore Nat16.bitrotRight(1, 1); // => 32768
+(1 : Nat16) <>> (1 : Nat16) // => 32768
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Nat16, p : Nat) : Bool
+

Returns the value of bit p mod 16 in x, +(x & 2^(p mod 16)) == 2^(p mod 16). This is equivalent +to checking if the p-th bit is set in x, using +0 indexing.

+

Example:

+
Nat16.bittest(5, 2); // => true
+

Function bitset

+
func bitset(x : Nat16, p : Nat) : Nat16
+

Returns the value of setting bit p mod 16 in +x to 1.

+

Example:

+
Nat16.bitset(0, 2); // => 4
+

Function bitclear

+
func bitclear(x : Nat16, p : Nat) : Nat16
+

Returns the value of clearing bit p mod 16 in +x to 0.

+

Example:

+
Nat16.bitclear(5, 2); // => 1
+

Function bitflip

+
func bitflip(x : Nat16, p : Nat) : Nat16
+

Returns the value of flipping bit p mod 16 in +x.

+

Example:

+
Nat16.bitflip(5, 2); // => 1
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Nat16) -> Nat16
+

Returns the count of non-zero bits in x.

+

Example:

+
Nat16.bitcountNonZero(5); // => 2
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Nat16) -> Nat16
+

Returns the count of leading zero bits in x.

+

Example:

+
Nat16.bitcountLeadingZero(5); // => 13
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Nat16) -> Nat16
+

Returns the count of trailing zero bits in x.

+

Example:

+
Nat16.bitcountTrailingZero(5); // => 0
+

Function addWrap

+
func addWrap(x : Nat16, y : Nat16) : Nat16
+

Returns the sum of x and y, +x +% y. Wraps on overflow.

+

Example:

+
ignore Nat16.addWrap(65532, 5); // => 1
+(65532 : Nat16) +% (5 : Nat16) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Nat16, y : Nat16) : Nat16
+

Returns the difference of x and y, +x -% y. Wraps on underflow.

+

Example:

+
ignore Nat16.subWrap(1, 2); // => 65535
+(1 : Nat16) -% (2 : Nat16) // => 65535
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Nat16, y : Nat16) : Nat16
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Example:

+
ignore Nat16.mulWrap(655, 101); // => 619
+(655 : Nat16) *% (101 : Nat16) // => 619
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Nat16, y : Nat16) : Nat16
+

Returns x to the power of y, +x **% y. Wraps on overflow.

+

Example:

+
ignore Nat16.powWrap(2, 16); // => 0
+(2 : Nat16) **% (16 : Nat16) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Nat32.html b/docs/html/Nat32.html new file mode 100644 index 00000000000..1618579d45e --- /dev/null +++ b/docs/html/Nat32.html @@ -0,0 +1,695 @@ + + + + + + + md/base/Nat32.md + + + + +
+

md/base/Nat32.md

+
+ +

Nat32

+

Provides utility functions on 32-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Nat32 "mo:base/Nat32";
+

Type Nat32

+
type Nat32 = Prim.Types.Nat32
+

32-bit natural numbers.

+

Value maximumValue

+
let maximumValue : Nat32
+

Maximum 32-bit natural number. 2 ** 32 - 1.

+

Example:

+
Nat32.maximumValue; // => 4294967295 : Nat32
+

Value toNat

+
let toNat : Nat32 -> Nat
+

Converts a 32-bit unsigned integer to an unsigned integer with +infinite precision.

+

Example:

+
Nat32.toNat(123); // => 123 : Nat
+

Value fromNat

+
let fromNat : Nat -> Nat32
+

Converts an unsigned integer with infinite precision to a 32-bit +unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat32.fromNat(123); // => 123 : Nat32
+

Function fromNat16

+
func fromNat16(x : Nat16) : Nat32
+

Converts a 16-bit unsigned integer to a 32-bit unsigned integer.

+

Example:

+
Nat32.fromNat16(123); // => 123 : Nat32
+

Function toNat16

+
func toNat16(x : Nat32) : Nat16
+

Converts a 32-bit unsigned integer to a 16-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat32.toNat16(123); // => 123 : Nat16
+

Function fromNat64

+
func fromNat64(x : Nat64) : Nat32
+

Converts a 64-bit unsigned integer to a 32-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat32.fromNat64(123); // => 123 : Nat32
+

Function toNat64

+
func toNat64(x : Nat32) : Nat64
+

Converts a 32-bit unsigned integer to a 64-bit unsigned integer.

+

Example:

+
Nat32.toNat64(123); // => 123 : Nat64
+

Value fromIntWrap

+
let fromIntWrap : Int -> Nat32
+

Converts a signed integer with infinite precision to a 32-bit +unsigned integer.

+

Traps on overflow/underflow.

+

Example:

+
Nat32.fromIntWrap(123); // => 123 : Nat32
+

Function toText

+
func toText(x : Nat32) : Text
+

Converts x to its textual representation. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Nat32.toText(1234); // => "1234" : Text
+

Function min

+
func min(x : Nat32, y : Nat32) : Nat32
+

Returns the minimum of x and y.

+

Example:

+
Nat32.min(123, 456); // => 123 : Nat32
+

Function max

+
func max(x : Nat32, y : Nat32) : Nat32
+

Returns the maximum of x and y.

+

Example:

+
Nat32.max(123, 456); // => 456 : Nat32
+

Function equal

+
func equal(x : Nat32, y : Nat32) : Bool
+

Equality function for Nat32 types. This is equivalent to +x == y.

+

Example:

+
ignore Nat32.equal(1, 1); // => true
+(1 : Nat32) == (1 : Nat32) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat32>(3);
+let buffer2 = Buffer.Buffer<Nat32>(3);
+Buffer.equal(buffer1, buffer2, Nat32.equal) // => true
+

Function notEqual

+
func notEqual(x : Nat32, y : Nat32) : Bool
+

Inequality function for Nat32 types. This is equivalent to +x != y.

+

Example:

+
ignore Nat32.notEqual(1, 2); // => true
+(1 : Nat32) != (2 : Nat32) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Nat32, y : Nat32) : Bool
+

"Less than" function for Nat32 types. This is equivalent to +x < y.

+

Example:

+
ignore Nat32.less(1, 2); // => true
+(1 : Nat32) < (2 : Nat32) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Nat32, y : Nat32) : Bool
+

"Less than or equal" function for Nat32 types. This is equivalent to +x <= y.

+

Example:

+
ignore Nat32.lessOrEqual(1, 2); // => true
+(1 : Nat32) <= (2 : Nat32) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Nat32, y : Nat32) : Bool
+

"Greater than" function for Nat32 types. This is equivalent to +x > y.

+

Example:

+
ignore Nat32.greater(2, 1); // => true
+(2 : Nat32) > (1 : Nat32) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Nat32, y : Nat32) : Bool
+

"Greater than or equal" function for Nat32 types. This is equivalent +to x >= y.

+

Example:

+
ignore Nat32.greaterOrEqual(2, 1); // => true
+(2 : Nat32) >= (1 : Nat32) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Nat32, y : Nat32) : {#less; #equal; #greater}
+

General purpose comparison function for Nat32. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Nat32.compare(2, 3) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat32], Nat32.compare) // => [1, 2, 3]
+

Function add

+
func add(x : Nat32, y : Nat32) : Nat32
+

Returns the sum of x and y, +x + y. Traps on overflow.

+

Example:

+
ignore Nat32.add(1, 2); // => 3
+(1 : Nat32) + (2 : Nat32) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat32, Nat32>([2, 3, 1], 0, Nat32.add) // => 6
+

Function sub

+
func sub(x : Nat32, y : Nat32) : Nat32
+

Returns the difference of x and y, +x - y. Traps on underflow.

+

Example:

+
ignore Nat32.sub(2, 1); // => 1
+(2 : Nat32) - (1 : Nat32) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat32, Nat32>([2, 3, 1], 20, Nat32.sub) // => 14
+

Function mul

+
func mul(x : Nat32, y : Nat32) : Nat32
+

Returns the product of x and y, +x * y. Traps on overflow.

+

Example:

+
ignore Nat32.mul(2, 3); // => 6
+(2 : Nat32) * (3 : Nat32) // => 6
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat32, Nat32>([2, 3, 1], 1, Nat32.mul) // => 6
+

Function div

+
func div(x : Nat32, y : Nat32) : Nat32
+

Returns the division of x by y, x / y. +Traps when y is zero.

+

Example:

+
ignore Nat32.div(6, 2); // => 3
+(6 : Nat32) / (2 : Nat32) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Nat32, y : Nat32) : Nat32
+

Returns the remainder of x divided by y, +x % y. Traps when y is zero.

+

Example:

+
ignore Nat32.rem(6, 4); // => 2
+(6 : Nat32) % (4 : Nat32) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Nat32, y : Nat32) : Nat32
+

Returns x to the power of y, +x ** y. Traps on overflow.

+

Example:

+
ignore Nat32.pow(2, 3); // => 8
+(2 : Nat32) ** (3 : Nat32) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Nat32) : Nat32
+

Returns the bitwise negation of x, ^x.

+

Example:

+
ignore Nat32.bitnot(0) // => 4294967295
+^(0 : Nat32) // => 4294967295
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise and of x and y, +x & y.

+

Example:

+
ignore Nat32.bitand(1, 3); // => 1
+(1 : Nat32) & (3 : Nat32) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise or of x and y, +x | y.

+

Example:

+
ignore Nat32.bitor(1, 3); // => 3
+(1 : Nat32) | (3 : Nat32) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise exclusive or of x and +y, x ^ y.

+

Example:

+
ignore Nat32.bitxor(1, 3); // => 2
+(1 : Nat32) ^ (3 : Nat32) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise shift left of x by y, +x << y.

+

Example:

+
ignore Nat32.bitshiftLeft(1, 3); // => 8
+(1 : Nat32) << (3 : Nat32) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise shift right of x by y, +x >> y.

+

Example:

+
ignore Nat32.bitshiftRight(8, 3); // => 1
+(8 : Nat32) >> (3 : Nat32) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise rotate left of x by y, +x <<> y.

+

Example:

+
ignore Nat32.bitrotLeft(1, 3); // => 8
+(1 : Nat32) <<> (3 : Nat32) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Nat32, y : Nat32) : Nat32
+

Returns the bitwise rotate right of x by y, +x <>> y.

+

Example:

+
ignore Nat32.bitrotRight(1, 1); // => 2147483648
+(1 : Nat32) <>> (1 : Nat32) // => 2147483648
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Nat32, p : Nat) : Bool
+

Returns the value of bit p mod 32 in x, +(x & 2^(p mod 32)) == 2^(p mod 32). This is equivalent +to checking if the p-th bit is set in x, using +0 indexing.

+

Example:

+
Nat32.bittest(5, 2); // => true
+

Function bitset

+
func bitset(x : Nat32, p : Nat) : Nat32
+

Returns the value of setting bit p mod 32 in +x to 1.

+

Example:

+
Nat32.bitset(5, 1); // => 7
+

Function bitclear

+
func bitclear(x : Nat32, p : Nat) : Nat32
+

Returns the value of clearing bit p mod 32 in +x to 0.

+

Example:

+
Nat32.bitclear(5, 2); // => 1
+

Function bitflip

+
func bitflip(x : Nat32, p : Nat) : Nat32
+

Returns the value of flipping bit p mod 32 in +x.

+

Example:

+
Nat32.bitflip(5, 2); // => 1
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Nat32) -> Nat32
+

Returns the count of non-zero bits in x.

+

Example:

+
Nat32.bitcountNonZero(5); // => 2
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Nat32) -> Nat32
+

Returns the count of leading zero bits in x.

+

Example:

+
Nat32.bitcountLeadingZero(5); // => 29
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Nat32) -> Nat32
+

Returns the count of trailing zero bits in x.

+

Example:

+
Nat32.bitcountTrailingZero(16); // => 4
+

Function addWrap

+
func addWrap(x : Nat32, y : Nat32) : Nat32
+

Returns the sum of x and y, +x +% y. Wraps on overflow.

+

Example:

+
ignore Nat32.addWrap(4294967295, 1); // => 0
+(4294967295 : Nat32) +% (1 : Nat32) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Nat32, y : Nat32) : Nat32
+

Returns the difference of x and y, +x -% y. Wraps on underflow.

+

Example:

+
ignore Nat32.subWrap(0, 1); // => 4294967295
+(0 : Nat32) -% (1 : Nat32) // => 4294967295
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Nat32, y : Nat32) : Nat32
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Example:

+
ignore Nat32.mulWrap(2147483648, 2); // => 0
+(2147483648 : Nat32) *% (2 : Nat32) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Nat32, y : Nat32) : Nat32
+

Returns x to the power of y, +x **% y. Wraps on overflow.

+

Example:

+
ignore Nat32.powWrap(2, 32); // => 0
+(2 : Nat32) **% (32 : Nat32) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Nat64.html b/docs/html/Nat64.html new file mode 100644 index 00000000000..198d4057710 --- /dev/null +++ b/docs/html/Nat64.html @@ -0,0 +1,680 @@ + + + + + + + md/base/Nat64.md + + + + +
+

md/base/Nat64.md

+
+ +

Nat64

+

Provides utility functions on 64-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Nat64 "mo:base/Nat64";
+

Type Nat64

+
type Nat64 = Prim.Types.Nat64
+

64-bit natural numbers.

+

Value maximumValue

+
let maximumValue : Nat64
+

Maximum 64-bit natural number. 2 ** 64 - 1.

+

Example:

+
Nat64.maximumValue; // => 18446744073709551615 : Nat64
+

Value toNat

+
let toNat : Nat64 -> Nat
+

Converts a 64-bit unsigned integer to an unsigned integer with +infinite precision.

+

Example:

+
Nat64.toNat(123); // => 123 : Nat
+

Value fromNat

+
let fromNat : Nat -> Nat64
+

Converts an unsigned integer with infinite precision to a 64-bit +unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat64.fromNat(123); // => 123 : Nat64
+

Function fromNat32

+
func fromNat32(x : Nat32) : Nat64
+

Converts a 32-bit unsigned integer to a 64-bit unsigned integer.

+

Example:

+
Nat64.fromNat32(123); // => 123 : Nat64
+

Function toNat32

+
func toNat32(x : Nat64) : Nat32
+

Converts a 64-bit unsigned integer to a 32-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat64.toNat32(123); // => 123 : Nat32
+

Value fromIntWrap

+
let fromIntWrap : Int -> Nat64
+

Converts a signed integer with infinite precision to a 64-bit +unsigned integer.

+

Traps on overflow/underflow.

+

Example:

+
Nat64.fromIntWrap(123); // => 123 : Nat64
+

Function toText

+
func toText(x : Nat64) : Text
+

Converts x to its textual representation. Textual +representation do not contain underscores to represent +commas.

+

Example:

+
Nat64.toText(1234); // => "1234" : Text
+

Function min

+
func min(x : Nat64, y : Nat64) : Nat64
+

Returns the minimum of x and y.

+

Example:

+
Nat64.min(123, 456); // => 123 : Nat64
+

Function max

+
func max(x : Nat64, y : Nat64) : Nat64
+

Returns the maximum of x and y.

+

Example:

+
Nat64.max(123, 456); // => 456 : Nat64
+

Function equal

+
func equal(x : Nat64, y : Nat64) : Bool
+

Equality function for Nat64 types. This is equivalent to +x == y.

+

Example:

+
ignore Nat64.equal(1, 1); // => true
+(1 : Nat64) == (1 : Nat64) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat64>(3);
+let buffer2 = Buffer.Buffer<Nat64>(3);
+Buffer.equal(buffer1, buffer2, Nat64.equal) // => true
+

Function notEqual

+
func notEqual(x : Nat64, y : Nat64) : Bool
+

Inequality function for Nat64 types. This is equivalent to +x != y.

+

Example:

+
ignore Nat64.notEqual(1, 2); // => true
+(1 : Nat64) != (2 : Nat64) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Nat64, y : Nat64) : Bool
+

"Less than" function for Nat64 types. This is equivalent to +x < y.

+

Example:

+
ignore Nat64.less(1, 2); // => true
+(1 : Nat64) < (2 : Nat64) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Nat64, y : Nat64) : Bool
+

"Less than or equal" function for Nat64 types. This is equivalent to +x <= y.

+

Example:

+
ignore Nat64.lessOrEqual(1, 2); // => true
+(1 : Nat64) <= (2 : Nat64) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Nat64, y : Nat64) : Bool
+

"Greater than" function for Nat64 types. This is equivalent to +x > y.

+

Example:

+
ignore Nat64.greater(2, 1); // => true
+(2 : Nat64) > (1 : Nat64) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Nat64, y : Nat64) : Bool
+

"Greater than or equal" function for Nat64 types. This is equivalent +to x >= y.

+

Example:

+
ignore Nat64.greaterOrEqual(2, 1); // => true
+(2 : Nat64) >= (1 : Nat64) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Nat64, y : Nat64) : {#less; #equal; #greater}
+

General purpose comparison function for Nat64. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Nat64.compare(2, 3) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat64], Nat64.compare) // => [1, 2, 3]
+

Function add

+
func add(x : Nat64, y : Nat64) : Nat64
+

Returns the sum of x and y, +x + y. Traps on overflow.

+

Example:

+
ignore Nat64.add(1, 2); // => 3
+(1 : Nat64) + (2 : Nat64) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat64, Nat64>([2, 3, 1], 0, Nat64.add) // => 6
+

Function sub

+
func sub(x : Nat64, y : Nat64) : Nat64
+

Returns the difference of x and y, +x - y. Traps on underflow.

+

Example:

+
ignore Nat64.sub(3, 1); // => 2
+(3 : Nat64) - (1 : Nat64) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat64, Nat64>([2, 3, 1], 10, Nat64.sub) // => 4
+

Function mul

+
func mul(x : Nat64, y : Nat64) : Nat64
+

Returns the product of x and y, +x * y. Traps on overflow.

+

Example:

+
ignore Nat64.mul(2, 3); // => 6
+(2 : Nat64) * (3 : Nat64) // => 6
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat64, Nat64>([2, 3, 1], 1, Nat64.mul) // => 6
+

Function div

+
func div(x : Nat64, y : Nat64) : Nat64
+

Returns the quotient of x divided by y, +x / y. Traps when y is zero.

+

Example:

+
ignore Nat64.div(6, 2); // => 3
+(6 : Nat64) / (2 : Nat64) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Nat64, y : Nat64) : Nat64
+

Returns the remainder of x divided by y, +x % y. Traps when y is zero.

+

Example:

+
ignore Nat64.rem(6, 4); // => 2
+(6 : Nat64) % (4 : Nat64) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Nat64, y : Nat64) : Nat64
+

Returns x to the power of y, +x ** y. Traps on overflow.

+

Example:

+
ignore Nat64.pow(2, 3); // => 8
+(2 : Nat64) ** (3 : Nat64) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Nat64) : Nat64
+

Returns the bitwise negation of x, ^x.

+

Example:

+
ignore Nat64.bitnot(0); // => 18446744073709551615
+^(0 : Nat64) // => 18446744073709551615
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise and of x and y, +x & y.

+

Example:

+
ignore Nat64.bitand(1, 3); // => 1
+(1 : Nat64) & (3 : Nat64) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise or of x and y, +x | y.

+

Example:

+
ignore Nat64.bitor(1, 3); // => 3
+(1 : Nat64) | (3 : Nat64) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise exclusive or of x and +y, x ^ y.

+

Example:

+
ignore Nat64.bitxor(1, 3); // => 2
+(1 : Nat64) ^ (3 : Nat64) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise shift left of x by y, +x << y.

+

Example:

+
ignore Nat64.bitshiftLeft(1, 3); // => 8
+(1 : Nat64) << (3 : Nat64) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise shift right of x by y, +x >> y.

+

Example:

+
ignore Nat64.bitshiftRight(8, 3); // => 1
+(8 : Nat64) >> (3 : Nat64) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise rotate left of x by y, +x <<> y.

+

Example:

+
ignore Nat64.bitrotLeft(1, 3); // => 8
+(1 : Nat64) <<> (3 : Nat64) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Nat64, y : Nat64) : Nat64
+

Returns the bitwise rotate right of x by y, +x <>> y.

+

Example:

+
ignore Nat64.bitrotRight(8, 3); // => 1
+(8 : Nat64) <>> (3 : Nat64) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Nat64, p : Nat) : Bool
+

Returns the value of bit p mod 64 in x, +(x & 2^(p mod 64)) == 2^(p mod 64). This is equivalent +to checking if the p-th bit is set in x, using +0 indexing.

+

Example:

+
Nat64.bittest(5, 2); // => true
+

Function bitset

+
func bitset(x : Nat64, p : Nat) : Nat64
+

Returns the value of setting bit p mod 64 in +x to 1.

+

Example:

+
Nat64.bitset(5, 1); // => 7
+

Function bitclear

+
func bitclear(x : Nat64, p : Nat) : Nat64
+

Returns the value of clearing bit p mod 64 in +x to 0.

+

Example:

+
Nat64.bitclear(5, 2); // => 1
+

Function bitflip

+
func bitflip(x : Nat64, p : Nat) : Nat64
+

Returns the value of flipping bit p mod 64 in +x.

+

Example:

+
Nat64.bitflip(5, 2); // => 1
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Nat64) -> Nat64
+

Returns the count of non-zero bits in x.

+

Example:

+
Nat64.bitcountNonZero(5); // => 2
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Nat64) -> Nat64
+

Returns the count of leading zero bits in x.

+

Example:

+
Nat64.bitcountLeadingZero(5); // => 61
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Nat64) -> Nat64
+

Returns the count of trailing zero bits in x.

+

Example:

+
Nat64.bitcountTrailingZero(16); // => 4
+

Function addWrap

+
func addWrap(x : Nat64, y : Nat64) : Nat64
+

Returns the sum of x and y, +x +% y. Wraps on overflow.

+

Example:

+
ignore Nat64.addWrap(Nat64.maximumValue, 1); // => 0
+Nat64.maximumValue +% (1 : Nat64) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Nat64, y : Nat64) : Nat64
+

Returns the difference of x and y, +x -% y. Wraps on underflow.

+

Example:

+
ignore Nat64.subWrap(0, 1); // => 18446744073709551615
+(0 : Nat64) -% (1 : Nat64) // => 18446744073709551615
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Nat64, y : Nat64) : Nat64
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Example:

+
ignore Nat64.mulWrap(4294967296, 4294967296); // => 0
+(4294967296 : Nat64) *% (4294967296 : Nat64) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Nat64, y : Nat64) : Nat64
+

Returns x to the power of y, +x **% y. Wraps on overflow.

+

Example:

+
ignore Nat64.powWrap(2, 64); // => 0
+(2 : Nat64) **% (64 : Nat64) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/Nat8.html b/docs/html/Nat8.html new file mode 100644 index 00000000000..6a9c3d5d26d --- /dev/null +++ b/docs/html/Nat8.html @@ -0,0 +1,678 @@ + + + + + + + md/base/Nat8.md + + + + +
+

md/base/Nat8.md

+
+ +

Nat8

+

Provides utility functions on 8-bit unsigned integers.

+

Note that most operations are available as built-in operators (e.g. +1 + 1).

+

Import from the base library to use this module.

+
import Nat8 "mo:base/Nat8";
+

Type Nat8

+
type Nat8 = Prim.Types.Nat8
+

8-bit natural numbers.

+

Value maximumValue

+
let maximumValue : Nat8
+

Maximum 8-bit natural number. 2 ** 8 - 1.

+

Example:

+
Nat8.maximumValue; // => 255 : Nat8
+

Value toNat

+
let toNat : Nat8 -> Nat
+

Converts an 8-bit unsigned integer to an unsigned integer with +infinite precision.

+

Example:

+
Nat8.toNat(123); // => 123 : Nat
+

Value fromNat

+
let fromNat : Nat -> Nat8
+

Converts an unsigned integer with infinite precision to an 8-bit +unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat8.fromNat(123); // => 123 : Nat8
+

Value fromNat16

+
let fromNat16 : Nat16 -> Nat8
+

Converts a 16-bit unsigned integer to a 8-bit unsigned integer.

+

Traps on overflow.

+

Example:

+
Nat8.fromNat16(123); // => 123 : Nat8
+

Value toNat16

+
let toNat16 : Nat8 -> Nat16
+

Converts an 8-bit unsigned integer to a 16-bit unsigned integer.

+

Example:

+
Nat8.toNat16(123); // => 123 : Nat16
+

Value fromIntWrap

+
let fromIntWrap : Int -> Nat8
+

Converts a signed integer with infinite precision to an 8-bit +unsigned integer.

+

Wraps on overflow/underflow.

+

Example:

+
Nat8.fromIntWrap(123); // => 123 : Nat8
+

Function toText

+
func toText(x : Nat8) : Text
+

Converts x to its textual representation.

+

Example:

+
Nat8.toText(123); // => "123" : Text
+

Function min

+
func min(x : Nat8, y : Nat8) : Nat8
+

Returns the minimum of x and y.

+

Example:

+
Nat8.min(123, 200); // => 123 : Nat8
+

Function max

+
func max(x : Nat8, y : Nat8) : Nat8
+

Returns the maximum of x and y.

+

Example:

+
Nat8.max(123, 200); // => 200 : Nat8
+

Function equal

+
func equal(x : Nat8, y : Nat8) : Bool
+

Equality function for Nat8 types. This is equivalent to +x == y.

+

Example:

+
ignore Nat8.equal(1, 1); // => true
+(1 : Nat8) == (1 : Nat8) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Nat8>(3);
+let buffer2 = Buffer.Buffer<Nat8>(3);
+Buffer.equal(buffer1, buffer2, Nat8.equal) // => true
+

Function notEqual

+
func notEqual(x : Nat8, y : Nat8) : Bool
+

Inequality function for Nat8 types. This is equivalent to +x != y.

+

Example:

+
ignore Nat8.notEqual(1, 2); // => true
+(1 : Nat8) != (2 : Nat8) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(x : Nat8, y : Nat8) : Bool
+

"Less than" function for Nat8 types. This is equivalent to +x < y.

+

Example:

+
ignore Nat8.less(1, 2); // => true
+(1 : Nat8) < (2 : Nat8) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(x : Nat8, y : Nat8) : Bool
+

"Less than or equal" function for Nat8 types. This is equivalent to +x <= y.

+

Example:

+
ignore Nat.lessOrEqual(1, 2); // => true
+1 <= 2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(x : Nat8, y : Nat8) : Bool
+

"Greater than" function for Nat8 types. This is equivalent to +x > y.

+

Example:

+
ignore Nat8.greater(2, 1); // => true
+(2 : Nat8) > (1 : Nat8) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(x : Nat8, y : Nat8) : Bool
+

"Greater than or equal" function for Nat8 types. This is equivalent +to x >= y.

+

Example:

+
ignore Nat8.greaterOrEqual(2, 1); // => true
+(2 : Nat8) >= (1 : Nat8) // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+

Function compare

+
func compare(x : Nat8, y : Nat8) : {#less; #equal; #greater}
+

General purpose comparison function for Nat8. Returns +the Order ( either #less, #equal, +or #greater) of comparing x with +y.

+

Example:

+
Nat8.compare(2, 3) // => #less
+

This function can be used as value for a high order function, such as +a sort function.

+

Example:

+
import Array "mo:base/Array";
+Array.sort([2, 3, 1] : [Nat8], Nat8.compare) // => [1, 2, 3]
+

Function add

+
func add(x : Nat8, y : Nat8) : Nat8
+

Returns the sum of x and y, +x + y. Traps on overflow.

+

Example:

+
ignore Nat8.add(1, 2); // => 3
+(1 : Nat8) + (2 : Nat8) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing + operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use + as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat8, Nat8>([2, 3, 1], 0, Nat8.add) // => 6
+

Function sub

+
func sub(x : Nat8, y : Nat8) : Nat8
+

Returns the difference of x and y, +x - y. Traps on underflow.

+

Example:

+
ignore Nat8.sub(2, 1); // => 1
+(2 : Nat8) - (1 : Nat8) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing - operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use - as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat8, Nat8>([2, 3, 1], 20, Nat8.sub) // => 14
+

Function mul

+
func mul(x : Nat8, y : Nat8) : Nat8
+

Returns the product of x and y, +x * y. Traps on overflow.

+

Example:

+
ignore Nat8.mul(2, 3); // => 6
+(2 : Nat8) * (3 : Nat8) // => 6
+

Note: The reason why this function is defined in this library (in +addition to the existing * operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use * as a function value at the moment.

+

Example:

+
import Array "mo:base/Array";
+Array.foldLeft<Nat8, Nat8>([2, 3, 1], 1, Nat8.mul) // => 6
+

Function div

+
func div(x : Nat8, y : Nat8) : Nat8
+

Returns the quotient of x divided by y, +x / y. Traps when y is zero.

+

Example:

+
ignore Nat8.div(6, 2); // => 3
+(6 : Nat8) / (2 : Nat8) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing / operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use / as a function value at the moment.

+

Function rem

+
func rem(x : Nat8, y : Nat8) : Nat8
+

Returns the remainder of x divided by y, +x % y. Traps when y is zero.

+

Example:

+
ignore Nat8.rem(6, 4); // => 2
+(6 : Nat8) % (4 : Nat8) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing % operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use % as a function value at the moment.

+

Function pow

+
func pow(x : Nat8, y : Nat8) : Nat8
+

Returns x to the power of y, +x ** y. Traps on overflow.

+

Example:

+
ignore Nat8.pow(2, 3); // => 8
+(2 : Nat8) ** (3 : Nat8) // => 8
+

Note: The reason why this function is defined in this library (in +addition to the existing ** operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use ** as a function value at the moment.

+

Function bitnot

+
func bitnot(x : Nat8) : Nat8
+

Returns the bitwise negation of x, ^x.

+

Example:

+
ignore Nat8.bitnot(0); // => 255
+^(0 : Nat8) // => 255
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitand

+
func bitand(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise and of x and y, +x & y.

+

Example:

+
ignore Nat8.bitand(3, 2); // => 2
+(3 : Nat8) & (2 : Nat8) // => 2
+

Note: The reason why this function is defined in this library (in +addition to the existing & operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use & as a function value at the +moment.

+

Function bitor

+
func bitor(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise or of x and y, +x | y.

+

Example:

+
ignore Nat8.bitor(3, 2); // => 3
+(3 : Nat8) | (2 : Nat8) // => 3
+

Note: The reason why this function is defined in this library (in +addition to the existing | operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use | as a function value at the moment.

+

Function bitxor

+
func bitxor(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise exclusive or of x and +y, x ^ y.

+

Example:

+
ignore Nat8.bitxor(3, 2); // => 1
+(3 : Nat8) ^ (2 : Nat8) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing ^ operator) is so that you can use +it as a function value to pass to a higher order function. It is not +possible to use ^ as a function value at the moment.

+

Function bitshiftLeft

+
func bitshiftLeft(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise shift left of x by y, +x << y.

+

Example:

+
ignore Nat8.bitshiftLeft(1, 2); // => 4
+(1 : Nat8) << (2 : Nat8) // => 4
+

Note: The reason why this function is defined in this library (in +addition to the existing << operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use << as a function value at the +moment.

+

Function bitshiftRight

+
func bitshiftRight(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise shift right of x by y, +x >> y.

+

Example:

+
ignore Nat8.bitshiftRight(4, 2); // => 1
+(4 : Nat8) >> (2 : Nat8) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing >> operator) is so that you +can use it as a function value to pass to a higher order function. It is +not possible to use >> as a function value at the +moment.

+

Function bitrotLeft

+
func bitrotLeft(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise rotate left of x by y, +x <<> y.

+

Example:

+
ignore Nat8.bitrotLeft(128, 1); // => 1
+(128 : Nat8) <<> (1 : Nat8) // => 1
+

Note: The reason why this function is defined in this library (in +addition to the existing <<> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <<> as a function value +at the moment.

+

Function bitrotRight

+
func bitrotRight(x : Nat8, y : Nat8) : Nat8
+

Returns the bitwise rotate right of x by y, +x <>> y.

+

Example:

+
ignore Nat8.bitrotRight(1, 1); // => 128
+(1 : Nat8) <>> (1 : Nat8) // => 128
+

Note: The reason why this function is defined in this library (in +addition to the existing <>> operator) is so that +you can use it as a function value to pass to a higher order function. +It is not possible to use <>> as a function value +at the moment.

+

Function bittest

+
func bittest(x : Nat8, p : Nat) : Bool
+

Returns the value of bit p mod 8 in x, +(x & 2^(p mod 8)) == 2^(p mod 8). This is equivalent to +checking if the p-th bit is set in x, using 0 +indexing.

+

Example:

+
Nat8.bittest(5, 2); // => true
+

Function bitset

+
func bitset(x : Nat8, p : Nat) : Nat8
+

Returns the value of setting bit p mod 8 in +x to 1.

+

Example:

+
Nat8.bitset(5, 1); // => 7
+

Function bitclear

+
func bitclear(x : Nat8, p : Nat) : Nat8
+

Returns the value of clearing bit p mod 8 in +x to 0.

+

Example:

+
Nat8.bitclear(5, 2); // => 1
+

Function bitflip

+
func bitflip(x : Nat8, p : Nat) : Nat8
+

Returns the value of flipping bit p mod 8 in +x.

+

Example:

+
Nat8.bitflip(5, 2); // => 1
+

Value bitcountNonZero

+
let bitcountNonZero : (x : Nat8) -> Nat8
+

Returns the count of non-zero bits in x.

+

Example:

+
Nat8.bitcountNonZero(5); // => 2
+

Value +bitcountLeadingZero

+
let bitcountLeadingZero : (x : Nat8) -> Nat8
+

Returns the count of leading zero bits in x.

+

Example:

+
Nat8.bitcountLeadingZero(5); // => 5
+

Value +bitcountTrailingZero

+
let bitcountTrailingZero : (x : Nat8) -> Nat8
+

Returns the count of trailing zero bits in x.

+

Example:

+
Nat8.bitcountTrailingZero(6); // => 1
+

Function addWrap

+
func addWrap(x : Nat8, y : Nat8) : Nat8
+

Returns the sum of x and y, +x +% y. Wraps on overflow.

+

Example:

+
ignore Nat8.addWrap(230, 26); // => 0
+(230 : Nat8) +% (26 : Nat8) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing +% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use +% as a function value at the moment.

+

Function subWrap

+
func subWrap(x : Nat8, y : Nat8) : Nat8
+

Returns the difference of x and y, +x -% y. Wraps on underflow.

+

Example:

+
ignore Nat8.subWrap(0, 1); // => 255
+(0 : Nat8) -% (1 : Nat8) // => 255
+

Note: The reason why this function is defined in this library (in +addition to the existing -% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use -% as a function value at the moment.

+

Function mulWrap

+
func mulWrap(x : Nat8, y : Nat8) : Nat8
+

Returns the product of x and y, +x *% y. Wraps on overflow.

+

Example:

+
ignore Nat8.mulWrap(230, 26); // => 92
+(230 : Nat8) *% (26 : Nat8) // => 92
+

Note: The reason why this function is defined in this library (in +addition to the existing *% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use *% as a function value at the moment.

+

Function powWrap

+
func powWrap(x : Nat8, y : Nat8) : Nat8
+

Returns x to the power of y, +x **% y. Wraps on overflow.

+

Example:

+
ignore Nat8.powWrap(2, 8); // => 0
+(2 : Nat8) **% (8 : Nat8) // => 0
+

Note: The reason why this function is defined in this library (in +addition to the existing **% operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use **% as a function value at the moment.

+ + diff --git a/docs/html/None.html b/docs/html/None.html new file mode 100644 index 00000000000..2937f5d6cef --- /dev/null +++ b/docs/html/None.html @@ -0,0 +1,203 @@ + + + + + + + md/base/None.md + + + + +
+

md/base/None.md

+
+ +

None

+

The absent value

+

The None type represents a type with no +value.

+

It is often used to type code that fails to return control (e.g. an +infinite loop) or to designate impossible values (e.g. the type +?None only contains null).

+

Type None

+
type None = Prim.Types.None
+

The empty type. A subtype of all types.

+

Value impossible

+
let impossible : <A>None -> A
+

Turns an absurd value into an arbitrary type.

+ + diff --git a/docs/html/Option.html b/docs/html/Option.html new file mode 100644 index 00000000000..824d250cc33 --- /dev/null +++ b/docs/html/Option.html @@ -0,0 +1,315 @@ + + + + + + + md/base/Option.md + + + + +
+

md/base/Option.md

+
+ +

Option

+

Typesafe nulls

+

Optional values can be seen as a typesafe null. A value +of type ?Int can be constructed with either +null or ?42. The simplest way to get at the +contents of an optional is to use pattern matching:

+
let optionalInt1 : ?Int = ?42;
+let optionalInt2 : ?Int = null;
+
+let int1orZero : Int = switch optionalInt1 {
+  case null 0;
+  case (?int) int;
+};
+assert int1orZero == 42;
+
+let int2orZero : Int = switch optionalInt2 {
+  case null 0;
+  case (?int) int;
+};
+assert int2orZero == 0;
+

The functions in this module capture some common operations when +working with optionals that can be more succinct than using pattern +matching.

+

Function get

+
func get<T>(x : ?T, default : T) : T
+

Unwraps an optional value, with a default value, i.e. +get(?x, d) = x and get(null, d) = d.

+

Function getMapped

+
func getMapped<A, B>(x : ?A, f : A -> B, default : B) : B
+

Unwraps an optional value using a function, or returns the default, +i.e. option(?x, f, d) = f x and +option(null, f, d) = d.

+

Function map

+
func map<A, B>(x : ?A, f : A -> B) : ?B
+

Applies a function to the wrapped value. null's are left +untouched.

+
import Option "mo:base/Option";
+assert Option.map<Nat, Nat>(?42, func x = x + 1) == ?43;
+assert Option.map<Nat, Nat>(null, func x = x + 1) == null;
+

Function iterate

+
func iterate<A>(x : ?A, f : A -> ())
+

Applies a function to the wrapped value, but discards the result. Use +iterate if you're only interested in the side effect +f produces.

+
import Option "mo:base/Option";
+var counter : Nat = 0;
+Option.iterate(?5, func (x : Nat) { counter += x });
+assert counter == 5;
+Option.iterate(null, func (x : Nat) { counter += x });
+assert counter == 5;
+

Function apply

+
func apply<A, B>(x : ?A, f : ?(A -> B)) : ?B
+

Applies an optional function to an optional value. Returns +null if at least one of the arguments is +null.

+

Function chain

+
func chain<A, B>(x : ?A, f : A -> ?B) : ?B
+

Applies a function to an optional value. Returns null if +the argument is null, or the function returns +null.

+

Function flatten

+
func flatten<A>(x : ??A) : ?A
+

Given an optional optional value, removes one layer of +optionality.

+
import Option "mo:base/Option";
+assert Option.flatten(?(?(42))) == ?42;
+assert Option.flatten(?(null)) == null;
+assert Option.flatten(null) == null;
+

Function make

+
func make<A>(x : A) : ?A
+

Creates an optional value from a definite value.

+
import Option "mo:base/Option";
+assert Option.make(42) == ?42;
+

Function isSome

+
func isSome(x : ?Any) : Bool
+

Returns true if the argument is not null, otherwise +returns false.

+

Function isNull

+
func isNull(x : ?Any) : Bool
+

Returns true if the argument is null, otherwise returns +false.

+

Function equal

+
func equal<A>(x : ?A, y : ?A, eq : (A, A) -> Bool) : Bool
+

Returns true if the optional arguments are equal according to the +equality function provided, otherwise returns false.

+

Function assertSome

+
func assertSome(x : ?Any)
+

Asserts that the value is not null; fails otherwise. +@deprecated Option.assertSome will be removed soon; use an assert +expression instead

+

Function assertNull

+
func assertNull(x : ?Any)
+

Asserts that the value is null; fails +otherwise. @deprecated Option.assertNull will be removed soon; use an +assert expression instead

+

Function unwrap

+
func unwrap<T>(x : ?T) : T
+

Unwraps an optional value, i.e. unwrap(?x) = x.

+

@deprecated Option.unwrap is unsafe and fails if the argument is +null; it will be removed soon; use a switch or +do? expression instead

+ + diff --git a/docs/html/Order.html b/docs/html/Order.html new file mode 100644 index 00000000000..fe8645d81a3 --- /dev/null +++ b/docs/html/Order.html @@ -0,0 +1,214 @@ + + + + + + + md/base/Order.md + + + + +
+

md/base/Order.md

+
+ +

Order

+

Order

+

Type Order

+
type Order = {#less; #equal; #greater}
+

A type to represent an order.

+

Function isLess

+
func isLess(order : Order) : Bool
+

Check if an order is #less.

+

Function isEqual

+
func isEqual(order : Order) : Bool
+

Check if an order is #equal.

+

Function isGreater

+
func isGreater(order : Order) : Bool
+

Check if an order is #greater.

+

Function equal

+
func equal(o1 : Order, o2 : Order) : Bool
+

Returns true if only if o1 and o2 are the +same ordering.

+ + diff --git a/docs/html/Prelude.html b/docs/html/Prelude.html new file mode 100644 index 00000000000..bd205e294ad --- /dev/null +++ b/docs/html/Prelude.html @@ -0,0 +1,212 @@ + + + + + + + md/base/Prelude.md + + + + +
+

md/base/Prelude.md

+
+ +

Prelude

+

General utilities

+

This prelude file proposes standard library features that +may belong in the language (compiler-internal) prelude +sometime, after some further experience and discussion. Until then, they +live here.

+

Function nyi

+
func nyi() : None
+

Not yet implemented

+

Mark incomplete code with the nyi and xxx +functions.

+

Each have calls are well-typed in all typing contexts, which trap in +all execution contexts.

+

Function xxx

+
func xxx() : None
+

Function unreachable

+
func unreachable() : None
+

Mark unreachable code with the unreachable function.

+

Calls are well-typed in all typing contexts, and they trap in all +execution contexts.

+ + diff --git a/docs/html/Principal.html b/docs/html/Principal.html new file mode 100644 index 00000000000..8ad572a48c5 --- /dev/null +++ b/docs/html/Principal.html @@ -0,0 +1,404 @@ + + + + + + + md/base/Principal.md + + + + +
+

md/base/Principal.md

+
+ +

Principal

+

Module for interacting with Principals (users and canisters).

+

Principals are used to identify entities that can interact with the +Internet Computer. These entities are either users or canisters.

+

Example textual representation of Principals:

+

un4fu-tqaaa-aaaab-qadjq-cai

+

In Motoko, there is a primitive Principal type called +Principal. As an example of where you might see Principals, +you can access the Principal of the caller of your shared function.

+
shared(msg) func foo() {
+  let caller : Principal = msg.caller;
+};
+

Then, you can use this module to work with the +Principal.

+

Import from the base library to use this module.

+
import Principal "mo:base/Principal";
+

Type Principal

+
type Principal = Prim.Types.Principal
+

Function fromActor

+
func fromActor(a : actor {  }) : Principal
+

Get the Principal identifier of an actor.

+

Example:

+
actor MyCanister {
+  func getPrincipal() : Principal {
+    let principal = Principal.fromActor(MyCanister);
+  }
+}
+

Function +toLedgerAccount

+
func toLedgerAccount(principal : Principal, subAccount : ?Blob) : Blob
+

Compute the Ledger account identifier of a principal. Optionally +specify a sub-account.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let subAccount : Blob = "\4A\8D\3F\2B\6E\01\C8\7D\9E\03\B4\56\7C\F8\9A\01\D2\34\56\78\9A\BC\DE\F0\12\34\56\78\9A\BC\DE\F0";
+let account = Principal.toLedgerAccount(principal, ?subAccount); // => \8C\5C\20\C6\15\3F\7F\51\E2\0D\0F\0F\B5\08\51\5B\47\65\63\A9\62\B4\A9\91\5F\4F\02\70\8A\ED\4F\82
+

Function toBlob

+
func toBlob(p : Principal) : Blob
+

Convert a Principal to its Blob (bytes) +representation.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let blob = Principal.toBlob(principal); // => \00\00\00\00\00\30\00\D3\01\01
+

Function fromBlob

+
func fromBlob(b : Blob) : Principal
+

Converts a Blob (bytes) representation of a +Principal to a Principal value.

+

Example:

+
let blob = "\00\00\00\00\00\30\00\D3\01\01" : Blob;
+let principal = Principal.fromBlob(blob);
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"
+

Function toText

+
func toText(p : Principal) : Text
+

Converts a Principal to its Text +representation.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"
+

Function fromText

+
func fromText(t : Text) : Principal
+

Converts a Text representation of a +Principal to a Principal value.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.toText(principal) // => "un4fu-tqaaa-aaaab-qadjq-cai"
+

Function isAnonymous

+
func isAnonymous(p : Principal) : Bool
+

Checks if the given principal represents an anonymous user.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.isAnonymous(principal) // => false
+

Function isController

+
func isController(p : Principal) : Bool
+

Checks if the given principal can control this canister.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.isController(principal) // => false
+

Function hash

+
func hash(principal : Principal) : Hash.Hash
+

Hashes the given principal by hashing its Blob +representation.

+

Example:

+
let principal = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.hash(principal) // => 2_742_573_646
+

Function compare

+
func compare(principal1 : Principal, principal2 : Principal) : {#less; #equal; #greater}
+

General purpose comparison function for Principal. +Returns the Order ( either #less, +#equal, or #greater) of comparing +principal1 with principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+Principal.compare(principal1, principal2) // => #equal
+

Function equal

+
func equal(principal1 : Principal, principal2 : Principal) : Bool
+

Equality function for Principal types. This is equivalent to +principal1 == principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.equal(principal1, principal2);
+principal1 == principal2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing == operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use == as a function value at the moment.

+

Example:

+
import Buffer "mo:base/Buffer";
+
+let buffer1 = Buffer.Buffer<Principal>(3);
+let buffer2 = Buffer.Buffer<Principal>(3);
+Buffer.equal(buffer1, buffer2, Principal.equal) // => true
+

Function notEqual

+
func notEqual(principal1 : Principal, principal2 : Principal) : Bool
+

Inequality function for Principal types. This is equivalent to +principal1 != principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.notEqual(principal1, principal2);
+principal1 != principal2 // => false
+

Note: The reason why this function is defined in this library (in +addition to the existing != operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use != as a function value at the moment.

+

Function less

+
func less(principal1 : Principal, principal2 : Principal) : Bool
+

"Less than" function for Principal types. This is equivalent to +principal1 < principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.less(principal1, principal2);
+principal1 < principal2 // => false
+

Note: The reason why this function is defined in this library (in +addition to the existing < operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use < as a function value at the moment.

+

Function lessOrEqual

+
func lessOrEqual(principal1 : Principal, principal2 : Principal) : Bool
+

"Less than or equal to" function for Principal types. This is +equivalent to principal1 <= principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.lessOrEqual(principal1, principal2);
+principal1 <= principal2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing <= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use <= as a function value at the +moment.

+

Function greater

+
func greater(principal1 : Principal, principal2 : Principal) : Bool
+

"Greater than" function for Principal types. This is equivalent to +principal1 > principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.greater(principal1, principal2);
+principal1 > principal2 // => false
+

Note: The reason why this function is defined in this library (in +addition to the existing > operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use > as a function value at the moment.

+

Function +greaterOrEqual

+
func greaterOrEqual(principal1 : Principal, principal2 : Principal) : Bool
+

"Greater than or equal to" function for Principal types. This is +equivalent to principal1 >= principal2.

+

Example:

+
let principal1 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+let principal2 = Principal.fromText("un4fu-tqaaa-aaaab-qadjq-cai");
+ignore Principal.greaterOrEqual(principal1, principal2);
+principal1 >= principal2 // => true
+

Note: The reason why this function is defined in this library (in +addition to the existing >= operator) is so that you can +use it as a function value to pass to a higher order function. It is not +possible to use >= as a function value at the +moment.

+ + diff --git a/docs/html/RBTree.html b/docs/html/RBTree.html new file mode 100644 index 00000000000..269ab68b426 --- /dev/null +++ b/docs/html/RBTree.html @@ -0,0 +1,519 @@ + + + + + + + md/base/RBTree.md + + + + +
+

md/base/RBTree.md

+
+ +

RBTree

+

Key-value map implemented as a red-black tree (RBTree) with nodes +storing key-value pairs.

+

A red-black tree is a balanced binary search tree ordered by the +keys.

+

The tree data structure internally colors each of its nodes either +red or black, and uses this information to balance the tree during the +modifying operations.

+

Creation: Instantiate class RBTree<K, V> that +provides a map from keys of type K to values of type +V.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a new red-black tree mapping Nat to Text
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "tree");
+for (entry in tree.entries()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+

Performance:

+
    +
  • Runtime: O(log(n)) worst case cost per insertion, +removal, and retrieval operation.
  • +
  • Space: O(n) for storing the entire tree. n +denotes the number of key-value entries (i.e. nodes) stored in the +tree.
  • +
+

Note:

+
    +
  • Tree operations, such as retrieval, insertion, and removal create +O(log(n)) temporary objects that become garbage.
  • +
+

Credits:

+

The core of this implementation is derived from:

+ +

Type Color

+
type Color = {#R; #B}
+

Node color: Either red (#R) or black +(#B).

+

Type Tree

+
type Tree<K, V> = {#node : (Color, Tree<K, V>, (K, ?V), Tree<K, V>); #leaf}
+

Red-black tree of nodes with key-value entries, ordered by the keys. +The keys have the generic type K and the values the generic +type V. Leaves are considered implicitly black.

+

Class RBTree<K, V>

+
class RBTree<K, V>(compare : (K, K) -> O.Order)
+

A map from keys of type K to values of type +V implemented as a red-black tree. The entries of key-value +pairs are ordered by compare function applied to the +keys.

+

The class enables imperative usage in object-oriented-style. However, +internally, the class uses a functional implementation.

+

The compare function should implement a consistent total +order among all possible values of K and for efficiency, +only involves O(1) runtime costs without space +allocation.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare); // Create a map of `Nat` to `Text` using the `Nat.compare` order
+

Costs of instantiation (only empty tree): Runtime: O(1). +Space: O(1).

+

Function share

+
func share() : Tree<K, V>
+

Return a snapshot of the internal functional tree representation as +sharable data. The returned tree representation is not affected by +subsequent changes of the RBTree instance.

+

Example:

+

+tree.put(1, "one");
+let treeSnapshot = tree.share();
+tree.put(2, "second");
+RBTree.size(treeSnapshot) // => 1 (Only the first insertion is part of the snapshot.)
+

Useful for storing the state of a tree object as a stable variable, +determining its size, pretty-printing, and sharing it across async +function calls, i.e. passing it in async arguments or async results.

+

Runtime: O(1). Space: O(1).

+

Function unshare

+
func unshare(t : Tree<K, V>) : ()
+

Reset the current state of the tree object from a functional tree +representation.

+

Example:

+
import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+let snapshot = tree.share(); // save the current state of the tree object in a snapshot
+tree.put(2, "two");
+tree.unshare(snapshot); // restore the tree object from the snapshot
+Iter.toArray(tree.entries()) // => [(1, "one")]
+

Useful for restoring the state of a tree object from stable data, +saved, for example, in a stable variable.

+

Runtime: O(1). Space: O(1).

+

Function get

+
func get(key : K) : ?V
+

Retrieve the value associated with a given key, if present. Returns +null, if the key is absent. The key is searched according +to the compare function defined on the class +instantiation.

+

Example:

+

+tree.put(1, "one");
+tree.put(2, "two");
+
+tree.get(1) // => ?"one"
+

Runtime: O(log(n)). Space: O(1) retained +memory plus garbage, see the note below. where n denotes +the number of key-value entries stored in the tree and assuming that the +compare function implements an O(1) +comparison.

+

Note: Creates O(log(n)) temporary objects that will be +collected as garbage.

+

Function replace

+
func replace(key : K, value : V) : ?V
+

Replace the value associated with a given key, if the key is present. +Otherwise, if the key does not yet exist, insert the key-value +entry.

+

Returns the previous value of the key, if the key already existed. +Otherwise, null, if the key did not yet exist before.

+

Example:

+
import Iter "mo:base/Iter";
+
+tree.put(1, "old one");
+tree.put(2, "two");
+
+ignore tree.replace(1, "new one");
+Iter.toArray(tree.entries()) // => [(1, "new one"), (2, "two")]
+

Runtime: O(log(n)). Space: O(1) retained +memory plus garbage, see the note below. where n denotes +the number of key-value entries stored in the tree and assuming that the +compare function implements an O(1) +comparison.

+

Note: Creates O(log(n)) temporary objects that will be +collected as garbage.

+

Function put

+
func put(key : K, value : V)
+

Insert a key-value entry in the tree. If the key already exists, it +overwrites the associated value.

+

Example:

+
import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "three");
+Iter.toArray(tree.entries()) // now contains three entries
+

Runtime: O(log(n)). Space: O(1) retained +memory plus garbage, see the note below. where n denotes +the number of key-value entries stored in the tree and assuming that the +compare function implements an O(1) +comparison.

+

Note: Creates O(log(n)) temporary objects that will be +collected as garbage.

+

Function delete

+
func delete(key : K)
+

Delete the entry associated with a given key, if the key exists. No +effect if the key is absent. Same as remove(key) except +that it does not have a return value.

+

Example:

+
import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+tree.delete(1);
+Iter.toArray(tree.entries()) // => [(2, "two")].
+

Runtime: O(log(n)). Space: O(1) retained +memory plus garbage, see the note below. where n denotes +the number of key-value entries stored in the tree and assuming that the +compare function implements an O(1) +comparison.

+

Note: Creates O(log(n)) temporary objects that will be +collected as garbage.

+

Function remove

+
func remove(key : K) : ?V
+

Remove the entry associated with a given key, if the key exists, and +return the associated value. Returns null without any other +effect if the key is absent.

+

Example:

+
import Iter "mo:base/Iter";
+
+tree.put(1, "one");
+tree.put(2, "two");
+
+ignore tree.remove(1);
+Iter.toArray(tree.entries()) // => [(2, "two")].
+

Runtime: O(log(n)). Space: O(1) retained +memory plus garbage, see the note below. where n denotes +the number of key-value entries stored in the tree and assuming that the +compare function implements an O(1) +comparison.

+

Note: Creates O(log(n)) temporary objects that will be +collected as garbage.

+

Function entries

+
func entries() : I.Iter<(K, V)>
+

An iterator for the key-value entries of the map, in ascending key +order. The iterator takes a snapshot view of the tree and is not +affected by concurrent modifications.

+

Example:

+
import Debug "mo:base/Debug";
+
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in tree.entries()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=1 value="one"
+// Entry key=2 value="two"
+// Entry key=3 value="three"
+

Cost of iteration over all elements: Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note +below. where n denotes the number of key-value entries +stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects +that will be collected as garbage.

+

Function entriesRev

+
func entriesRev() : I.Iter<(K, V)>
+

An iterator for the key-value entries of the map, in descending key +order. The iterator takes a snapshot view of the tree and is not +affected by concurrent modifications.

+

Example:

+
import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in tree.entriesRev()) {
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=3 value="three"
+// Entry key=2 value="two"
+// Entry key=1 value="one"
+

Cost of iteration over all elements: Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note +below. where n denotes the number of key-value entries +stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects +that will be collected as garbage.

+

Function iter

+
func iter<X, Y>(tree : Tree<X, Y>, direction : {#fwd; #bwd}) : I.Iter<(X, Y)>
+

Get an iterator for the entries of the tree, in +ascending (#fwd) or descending (#bwd) order as +specified by direction. The iterator takes a snapshot view +of the tree and is not affected by concurrent modifications.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+import Debug "mo:base/Debug";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "two");
+
+for (entry in RBTree.iter(tree.share(), #bwd)) { // backward iteration
+  Debug.print("Entry key=" # debug_show(entry.0) # " value=\"" # entry.1 #"\"");
+}
+
+// Entry key=3 value="three"
+// Entry key=2 value="two"
+// Entry key=1 value="one"
+

Cost of iteration over all elements: Runtime: O(n). +Space: O(log(n)) retained memory plus garbage, see the note +below. where n denotes the number of key-value entries +stored in the tree.

+

Note: Full tree iteration creates O(n) temporary objects +that will be collected as garbage.

+

Function size

+
func size<X, Y>(t : Tree<X, Y>) : Nat
+

Determine the size of the tree as the number of key-value +entries.

+

Example:

+
import RBTree "mo:base/RBTree";
+import Nat "mo:base/Nat";
+
+let tree = RBTree.RBTree<Nat, Text>(Nat.compare);
+tree.put(1, "one");
+tree.put(2, "two");
+tree.put(3, "three");
+
+RBTree.size(tree.share()) // 3 entries
+

Runtime: O(log(n)). Space: O(1) retained +memory plus garbage, see the note below. where n denotes +the number of key-value entries stored in the tree.

+

Note: Creates O(log(n)) temporary objects that will be +collected as garbage.

+ + diff --git a/docs/html/Random.html b/docs/html/Random.html new file mode 100644 index 00000000000..34d60ef67ad --- /dev/null +++ b/docs/html/Random.html @@ -0,0 +1,313 @@ + + + + + + + md/base/Random.md + + + + +
+

md/base/Random.md

+
+ +

Random

+

A module for obtaining randomness on the Internet Computer (IC).

+

This module provides the fundamentals for user abstractions to build +on.

+

Dealing with randomness on a deterministic computing platform, such +as the IC, is intricate. Some basic rules need to be followed by the +user of this module to obtain (and maintain) the benefits of crypto- +graphic randomness:

+
    +
  • cryptographic entropy (randomness source) is only obtainable +asyncronously in discrete chunks of 256 bits (32-byte sized +Blobs)
  • +
  • all bets must be closed before entropy is being asked for +in order to decide them
  • +
  • this implies that the same entropy (i.e. Blob) - or +surplus entropy not utilised yet - cannot be used for a new round of +bets without losing the cryptographic guarantees.
  • +
+

Concretely, the below class Finite, as well as the +*From methods risk the carrying-over of state from previous +rounds. These are provided for performance (and convenience) reasons, +and need special care when used. Similar caveats apply for user-defined +(pseudo) random number generators.

+

Usage:

+
import Random "mo:base/Random";
+

Value blob

+
let blob : shared () -> async Blob
+

Obtains a full blob (32 bytes) worth of fresh entropy.

+

Example:

+
let random = Random.Finite(await Random.blob());
+

Class Finite

+
class Finite(entropy : Blob)
+

Drawing from a finite supply of entropy, Finite provides +methods to obtain random values. When the entropy is used up, +null is returned. Otherwise the outcomes' distributions are +stated for each method. The uniformity of outcomes is guaranteed only +when the supplied entropy is originally obtained by the +blob() call, and is never reused.

+

Example:

+
import Random "mo:base/Random";
+
+let random = Random.Finite(await Random.blob());
+
+let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let seedRandom = Random.Finite(seed);
+

Function byte

+
func byte() : ?Nat8
+

Uniformly distributes outcomes in the numeric range [0 .. 255]. +Consumes 1 byte of entropy.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.byte() // => ?20
+

Function coin

+
func coin() : ?Bool
+

Simulates a coin toss. Both outcomes have equal probability. Consumes +1 bit of entropy (amortised).

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.coin() // => ?false
+

Function range

+
func range(p : Nat8) : ?Nat
+

Uniformly distributes outcomes in the numeric range [0 .. 2^p - 1]. +Consumes ⌈p/8⌉ bytes of entropy.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.range(32) // => ?348746249
+

Function binomial

+
func binomial(n : Nat8) : ?Nat8
+

Counts the number of heads in n fair coin tosses. +Consumes ⌈n/8⌉ bytes of entropy.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+let random = Random.Finite(seed);
+random.binomial(5) // => ?1
+

Function byteFrom

+
func byteFrom(seed : Blob) : Nat8
+

Distributes outcomes in the numeric range [0 .. 255]. Seed blob must +contain at least a byte.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.byteFrom(seed) // => 20
+

Function coinFrom

+
func coinFrom(seed : Blob) : Bool
+

Simulates a coin toss. Seed blob must contain at least a byte.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.coinFrom(seed) // => false
+

Function rangeFrom

+
func rangeFrom(p : Nat8, seed : Blob) : Nat
+

Distributes outcomes in the numeric range [0 .. 2^p - 1]. Seed blob +must contain at least ((p+7) / 8) bytes.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.rangeFrom(32, seed) // => 348746249
+

Function binomialFrom

+
func binomialFrom(n : Nat8, seed : Blob) : Nat8
+

Counts the number of heads in n coin tosses. Seed blob +must contain at least ((n+7) / 8) bytes.

+

Example:

+
let seed : Blob = "\14\C9\72\09\03\D4\D5\72\82\95\E5\43\AF\FA\A9\44\49\2F\25\56\13\F3\6E\C7\B0\87\DC\76\08\69\14\CF";
+Random.binomialFrom(5, seed) // => 1
+ + diff --git a/docs/html/Region.html b/docs/html/Region.html new file mode 100644 index 00000000000..a57a28e121a --- /dev/null +++ b/docs/html/Region.html @@ -0,0 +1,538 @@ + + + + + + + md/base/Region.md + + + + +
+

md/base/Region.md

+
+ +

Region

+

Byte-level access to isolated, (virtual) stable memory +regions.

+

This is a moderately lightweight abstraction over IC stable +memory and supports persisting regions of binary data across Motoko +upgrades. Use of this module is fully compatible with Motoko's use of +stable variables, whose persistence mechanism also uses (real) +IC stable memory internally, but does not interfere with this API. It is +also fully compatible with existing uses of the +ExperimentalStableMemory library, which has a similar +interface, but, only supported a single memory region, without isolation +between different applications.

+

Memory is allocated, using grow(region, pages), +sequentially and on demand, in units of 64KiB logical pages, starting +with 0 allocated pages. New pages are zero initialized. Growth is capped +by a soft limit on physical page count controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or +4GiB).

+

Each load operation loads from region relative byte +address offset in little-endian format using the natural +bit-width of the type in question. The operation traps if attempting to +read beyond the current region size.

+

Each store operation stores to region relative byte +address offset in little-endian format using the natural +bit-width of the type in question. The operation traps if attempting to +write beyond the current region size.

+

Text values can be handled by using Text.decodeUtf8 and +Text.encodeUtf8, in conjunction with loadBlob +and storeBlob.

+

The current region allocation and region contents are preserved +across upgrades.

+

NB: The IC's actual stable memory size (ic0.stable_size) +may exceed the total page size reported by summing all regions sizes. +This (and the cap on growth) are to accommodate Motoko's stable +variables and bookkeeping for regions. Applications that plan to use +Motoko stable variables sparingly or not at all can increase +--max-stable-pages as desired, approaching the IC maximum +(initially 8GiB, then 32Gib, currently 64Gib). All applications should +reserve at least one page for stable variable data, even when no stable +variables are used.

+

Usage:

+
import Region "mo:base/Region";
+

Type Region

+
type Region = Prim.Types.Region
+

A stateful handle to an isolated region of IC stable memory. +Region is a stable type and regions can be stored in stable +variables.

+

Value new

+
let new : () -> Region
+

Allocate a new, isolated Region of size 0.

+

Example:

+
let region = Region.new();
+assert Region.size(region) == 0;
+

Value id

+
let id : Region -> Nat
+

Return a Nat identifying the given region. Maybe be used for +equality, comparison and hashing. NB: Regions returned by +new() are numbered from 16 (regions 0..15 are currently +reserved for internal use). Allocate a new, isolated Region of size +0.

+

Example:

+
let region = Region.new();
+assert Region.id(region) == 16;
+

Value size

+
let size : (region : Region) -> (pages : Nat64)
+

Current size of region, in pages. Each page is 64KiB +(65536 bytes). Initially 0. Preserved across upgrades, +together with contents of allocated stable memory.

+

Example:

+
let region = Region.new();
+let beforeSize = Region.size(region);
+ignore Region.grow(region, 10);
+let afterSize = Region.size(region);
+afterSize - beforeSize // => 10
+

Value grow

+
let grow : (region : Region, newPages : Nat64) -> (oldPages : Nat64)
+

Grow current size of region by the given +number of pages. Each page is 64KiB (65536 bytes). Returns the previous +size when able to grow. Returns +0xFFFF_FFFF_FFFF_FFFF if remaining pages insufficient. +Every new page is zero-initialized, containing byte 0x00 at every +offset. Function grow is capped by a soft limit on +size controlled by compile-time flag +--max-stable-pages <n> (the default is 65536, or +4GiB).

+

Example:

+
import Error "mo:base/Error";
+
+let region = Region.new();
+let beforeSize = Region.grow(region, 10);
+if (beforeSize == 0xFFFF_FFFF_FFFF_FFFF) {
+  throw Error.reject("Out of memory");
+};
+let afterSize = Region.size(region);
+afterSize - beforeSize // => 10
+

Value loadNat8

+
let loadNat8 : (region : Region, offset : Nat64) -> Nat8
+

Within region, load a Nat8 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat8(region, offset, value);
+Region.loadNat8(region, offset) // => 123
+

Value storeNat8

+
let storeNat8 : (region : Region, offset : Nat64, value : Nat8) -> ()
+

Within region, store a Nat8 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat8(region, offset, value);
+Region.loadNat8(region, offset) // => 123
+

Value loadNat16

+
let loadNat16 : (region : Region, offset : Nat64) -> Nat16
+

Within region, load a Nat16 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat16(region, offset, value);
+Region.loadNat16(region, offset) // => 123
+

Value storeNat16

+
let storeNat16 : (region : Region, offset : Nat64, value : Nat16) -> ()
+

Within region, store a Nat16 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat16(region, offset, value);
+Region.loadNat16(region, offset) // => 123
+

Value loadNat32

+
let loadNat32 : (region : Region, offset : Nat64) -> Nat32
+

Within region, load a Nat32 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat32(region, offset, value);
+Region.loadNat32(region, offset) // => 123
+

Value storeNat32

+
let storeNat32 : (region : Region, offset : Nat64, value : Nat32) -> ()
+

Within region, store a Nat32 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat32(region, offset, value);
+Region.loadNat32(region, offset) // => 123
+

Value loadNat64

+
let loadNat64 : (region : Region, offset : Nat64) -> Nat64
+

Within region, load a Nat64 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat64(region, offset, value);
+Region.loadNat64(region, offset) // => 123
+

Value storeNat64

+
let storeNat64 : (region : Region, offset : Nat64, value : Nat64) -> ()
+

Within region, store a Nat64 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeNat64(region, offset, value);
+Region.loadNat64(region, offset) // => 123
+

Value loadInt8

+
let loadInt8 : (region : Region, offset : Nat64) -> Int8
+

Within region, load a Int8 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt8(region, offset, value);
+Region.loadInt8(region, offset) // => 123
+

Value storeInt8

+
let storeInt8 : (region : Region, offset : Nat64, value : Int8) -> ()
+

Within region, store a Int8 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt8(region, offset, value);
+Region.loadInt8(region, offset) // => 123
+

Value loadInt16

+
let loadInt16 : (region : Region, offset : Nat64) -> Int16
+

Within region, load a Int16 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt16(region, offset, value);
+Region.loadInt16(region, offset) // => 123
+

Value storeInt16

+
let storeInt16 : (region : Region, offset : Nat64, value : Int16) -> ()
+

Within region, store a Int16 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt16(region, offset, value);
+Region.loadInt16(region, offset) // => 123
+

Value loadInt32

+
let loadInt32 : (region : Region, offset : Nat64) -> Int32
+

Within region, load a Int32 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt32(region, offset, value);
+Region.loadInt32(region, offset) // => 123
+

Value storeInt32

+
let storeInt32 : (region : Region, offset : Nat64, value : Int32) -> ()
+

Within region, store a Int32 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt32(region, offset, value);
+Region.loadInt32(region, offset) // => 123
+

Value loadInt64

+
let loadInt64 : (region : Region, offset : Nat64) -> Int64
+

Within region, load a Int64 value from +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt64(region, offset, value);
+Region.loadInt64(region, offset) // => 123
+

Value storeInt64

+
let storeInt64 : (region : Region, offset : Nat64, value : Int64) -> ()
+

Within region, store a Int64 value at +offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 123;
+Region.storeInt64(region, offset, value);
+Region.loadInt64(region, offset) // => 123
+

Value loadFloat

+
let loadFloat : (region : Region, offset : Nat64) -> Float
+

Within region, loads a Float value from the +given offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 1.25;
+Region.storeFloat(region, offset, value);
+Region.loadFloat(region, offset) // => 1.25
+

Value storeFloat

+
let storeFloat : (region : Region, offset : Nat64, value : Float) -> ()
+

Within region, store float value at the +given offset. Traps on an out-of-bounds access.

+

Example:

+
let region = Region.new();
+let offset = 0;
+let value = 1.25;
+Region.storeFloat(region, offset, value);
+Region.loadFloat(region, offset) // => 1.25
+

Value loadBlob

+
let loadBlob : (region : Region, offset : Nat64, size : Nat) -> Blob
+

Within region, load size bytes starting +from offset as a Blob. Traps on an +out-of-bounds access.

+

Example:

+
import Blob "mo:base/Blob";
+
+let region = Region.new();
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+Region.storeBlob(region, offset, value);
+Blob.toArray(Region.loadBlob(region, offset, size)) // => [1, 2, 3]
+

Value storeBlob

+
let storeBlob : (region : Region, offset : Nat64, value : Blob) -> ()
+

Within +region, write blob.size()bytes ofblobbeginning atoffset`. +Traps on an out-of-bounds access.

+

Example:

+
import Blob "mo:base/Blob";
+
+let region = Region.new();
+let offset = 0;
+let value = Blob.fromArray([1, 2, 3]);
+let size = value.size();
+Region.storeBlob(region, offset, value);
+Blob.toArray(Region.loadBlob(region, offset, size)) // => [1, 2, 3]
+ + diff --git a/docs/html/Result.html b/docs/html/Result.html new file mode 100644 index 00000000000..5c9b5d750dd --- /dev/null +++ b/docs/html/Result.html @@ -0,0 +1,306 @@ + + + + + + + md/base/Result.md + + + + +
+

md/base/Result.md

+
+ +

Result

+

Error handling with the Result type.

+

Type Result

+
type Result<Ok, Err> = {#ok : Ok; #err : Err}
+

Result<Ok, Err> is the type used for returning and +propagating errors. It is a type with the variants, +#ok(Ok), representing success and containing a value, and +#err(Err), representing error and containing an error +value.

+

The simplest way of working with Results is to pattern +match on them:

+

For example, given a function +createUser(user : User) : Result<Id, String> where +String is an error message we could use it like so:

+
switch(createUser(myUser)) {
+  case (#ok(id)) { Debug.print("Created new user with id: " # id) };
+  case (#err(msg)) { Debug.print("Failed to create user with the error: " # msg) };
+}
+

Function equal

+
func equal<Ok, Err>(eqOk : (Ok, Ok) -> Bool, eqErr : (Err, Err) -> Bool, r1 : Result<Ok, Err>, r2 : Result<Ok, Err>) : Bool
+

Function compare

+
func compare<Ok, Err>(compareOk : (Ok, Ok) -> Order.Order, compareErr : (Err, Err) -> Order.Order, r1 : Result<Ok, Err>, r2 : Result<Ok, Err>) : Order.Order
+

Function chain

+
func chain<R1, R2, Error>(x : Result<R1, Error>, y : R1 -> Result<R2, Error>) : Result<R2, Error>
+

Allows sequencing of Result values and functions that +return Result's themselves.

+
import Result "mo:base/Result";
+type Result<T,E> = Result.Result<T, E>;
+func largerThan10(x : Nat) : Result<Nat, Text> =
+  if (x > 10) { #ok(x) } else { #err("Not larger than 10.") };
+
+func smallerThan20(x : Nat) : Result<Nat, Text> =
+  if (x < 20) { #ok(x) } else { #err("Not smaller than 20.") };
+
+func between10And20(x : Nat) : Result<Nat, Text> =
+  Result.chain(largerThan10(x), smallerThan20);
+
+assert(between10And20(15) == #ok(15));
+assert(between10And20(9) == #err("Not larger than 10."));
+assert(between10And20(21) == #err("Not smaller than 20."));
+

Function flatten

+
func flatten<Ok, Error>(result : Result<Result<Ok, Error>, Error>) : Result<Ok, Error>
+

Flattens a nested Result.

+
import Result "mo:base/Result";
+assert(Result.flatten<Nat, Text>(#ok(#ok(10))) == #ok(10));
+assert(Result.flatten<Nat, Text>(#err("Wrong")) == #err("Wrong"));
+assert(Result.flatten<Nat, Text>(#ok(#err("Wrong"))) == #err("Wrong"));
+

Function mapOk

+
func mapOk<Ok1, Ok2, Error>(x : Result<Ok1, Error>, f : Ok1 -> Ok2) : Result<Ok2, Error>
+

Maps the Ok type/value, leaving any Error +type/value unchanged.

+

Function mapErr

+
func mapErr<Ok, Error1, Error2>(x : Result<Ok, Error1>, f : Error1 -> Error2) : Result<Ok, Error2>
+

Maps the Err type/value, leaving any Ok +type/value unchanged.

+

Function fromOption

+
func fromOption<R, E>(x : ?R, err : E) : Result<R, E>
+

Create a result from an option, including an error value to handle +the null case.

+
import Result "mo:base/Result";
+assert(Result.fromOption(?42, "err") == #ok(42));
+assert(Result.fromOption(null, "err") == #err("err"));
+

Function toOption

+
func toOption<R, E>(r : Result<R, E>) : ?R
+

Create an option from a result, turning all #err into +null.

+
import Result "mo:base/Result";
+assert(Result.toOption(#ok(42)) == ?42);
+assert(Result.toOption(#err("err")) == null);
+

Function iterate

+
func iterate<Ok, Err>(res : Result<Ok, Err>, f : Ok -> ())
+

Applies a function to a successful value, but discards the result. +Use iterate if you're only interested in the side effect +f produces.

+
import Result "mo:base/Result";
+var counter : Nat = 0;
+Result.iterate<Nat, Text>(#ok(5), func (x : Nat) { counter += x });
+assert(counter == 5);
+Result.iterate<Nat, Text>(#err("Wrong"), func (x : Nat) { counter += x });
+assert(counter == 5);
+

Function isOk

+
func isOk(r : Result<Any, Any>) : Bool
+

Function isErr

+
func isErr(r : Result<Any, Any>) : Bool
+

Function assertOk

+
func assertOk(r : Result<Any, Any>)
+

Asserts that its argument is an #ok result, traps +otherwise.

+

Function assertErr

+
func assertErr(r : Result<Any, Any>)
+

Asserts that its argument is an #err result, traps +otherwise.

+ + diff --git a/docs/html/Stack.html b/docs/html/Stack.html new file mode 100644 index 00000000000..7cb3110a761 --- /dev/null +++ b/docs/html/Stack.html @@ -0,0 +1,248 @@ + + + + + + + md/base/Stack.md + + + + +
+

md/base/Stack.md

+
+ +

Stack

+

Class Stack<X> provides a Minimal LIFO stack of +elements of type X.

+

See library Deque for mixed LIFO/FIFO behavior.

+

Example:

+
import Stack "mo:base/Stack";
+
+let stack = Stack.Stack<Nat>(); // create a stack
+

Runtime: O(1)

+

Space: O(1)

+

Class Stack<T>

+
class Stack<T>()
+

Function push

+
func push(x : T)
+

Push an element on the top of the stack.

+

Example:

+
stack.push(1);
+stack.push(2);
+stack.push(3);
+stack.peek(); // examine the top most element
+

Runtime: O(1)

+

Space: O(1)

+

Function isEmpty

+
func isEmpty() : Bool
+

True when the stack is empty and false otherwise.

+

Example:

+
stack.isEmpty();
+

Runtime: O(1)

+

Space: O(1)

+

Function peek

+
func peek() : ?T
+

Return (without removing) the top element, or return null if the +stack is empty.

+

Example:

+
stack.push(1);
+stack.push(2);
+stack.push(3);
+stack.peek();
+

Runtime: O(1)

+

Space: O(1)

+

Function pop

+
func pop() : ?T
+

Remove and return the top element, or return null if the stack is +empty.

+

Example:

+
stack.push(1);
+ignore stack.pop();
+stack.isEmpty();
+

Runtime: O(1)

+

Space: O(1)

+ + diff --git a/docs/html/Text.html b/docs/html/Text.html new file mode 100644 index 00000000000..55a196a91da --- /dev/null +++ b/docs/html/Text.html @@ -0,0 +1,501 @@ + + + + + + + md/base/Text.md + + + + +
+

md/base/Text.md

+
+ +

Text

+

Utility functions for Text values.

+

A Text value represents human-readable text as a +sequence of characters of type Char.

+
let text = "Hello!";
+let size = text.size(); // 6
+let iter = text.chars(); // iterator ('H', 'e', 'l', 'l', 'o', '!')
+let concat = text # " 👋"; // "Hello! 👋"
+

The "mo:base/Text" module defines additional operations +on Text values.

+

Import the module from the base library:

+
import Text "mo:base/Text";
+

Note: Text values are represented as ropes of UTF-8 +character sequences with O(1) concatenation.

+

Type Text

+
type Text = Prim.Types.Text
+

The type corresponding to primitive Text values.

+
let hello = "Hello!";
+let emoji = "👋";
+let concat = hello # " " # emoji; // "Hello! 👋"
+

Value fromChar

+
let fromChar : (c : Char) -> Text
+

Converts the given Char to a Text +value.

+
let text = Text.fromChar('A'); // "A"
+

Function toIter

+
func toIter(t : Text) : Iter.Iter<Char>
+

Iterates over each Char value in the given +Text.

+

Equivalent to calling the t.chars() method where +t is a Text value.

+
import { print } "mo:base/Debug";
+
+for (c in Text.toIter("abc")) {
+  print(debug_show c);
+}
+

Function toArray

+
func toArray(t : Text) : [Char]
+

Creates a new Array containing characters of the given +Text.

+

Equivalent to Iter.toArray(t.chars()).

+
assert Text.toArray("Café") == ['C', 'a', 'f', 'é'];
+

Runtime: O(t.size()) Space: O(t.size())

+

Function toVarArray

+
func toVarArray(t : Text) : [var Char]
+

Creates a new mutable Array containing characters of the +given Text.

+

Equivalent to Iter.toArrayMut(t.chars()).

+
assert Text.toVarArray("Café") == [var 'C', 'a', 'f', 'é'];
+

Runtime: O(t.size()) Space: O(t.size())

+

Function fromIter

+
func fromIter(cs : Iter.Iter<Char>) : Text
+

Creates a Text value from a Char +iterator.

+
let text = Text.fromIter(['a', 'b', 'c'].vals()); // "abc"
+

Function size

+
func size(t : Text) : Nat
+

Returns the number of characters in the given Text.

+

Equivalent to calling t.size() where t is a +Text value.

+
let size = Text.size("abc"); // 3
+

Function hash

+
func hash(t : Text) : Hash.Hash
+

Returns a hash obtained by using the djb2 algorithm (more details).

+
let hash = Text.hash("abc");
+

Note: this algorithm is intended for use in data structures rather +than as a cryptographic hash function.

+

Function concat

+
func concat(t1 : Text, t2 : Text) : Text
+

Returns t1 # t2, where # is the +Text concatenation operator.

+
let a = "Hello";
+let b = "There";
+let together = a # b; // "HelloThere"
+let withSpace = a # " " # b; // "Hello There"
+let togetherAgain = Text.concat(a, b); // "HelloThere"
+

Function equal

+
func equal(t1 : Text, t2 : Text) : Bool
+

Returns t1 == t2.

+

Function notEqual

+
func notEqual(t1 : Text, t2 : Text) : Bool
+

Returns t1 != t2.

+

Function less

+
func less(t1 : Text, t2 : Text) : Bool
+

Returns t1 < t2.

+

Function lessOrEqual

+
func lessOrEqual(t1 : Text, t2 : Text) : Bool
+

Returns t1 <= t2.

+

Function greater

+
func greater(t1 : Text, t2 : Text) : Bool
+

Returns t1 > t2.

+

Function +greaterOrEqual

+
func greaterOrEqual(t1 : Text, t2 : Text) : Bool
+

Returns t1 >= t2.

+

Function compare

+
func compare(t1 : Text, t2 : Text) : {#less; #equal; #greater}
+

Compares t1 and t2 lexicographically.

+
import { print } "mo:base/Debug";
+
+print(debug_show Text.compare("abc", "abc")); // #equal
+print(debug_show Text.compare("abc", "def")); // #less
+print(debug_show Text.compare("abc", "ABC")); // #greater
+

Function join

+
func join(sep : Text, ts : Iter.Iter<Text>) : Text
+

Join an iterator of Text values with a given +delimiter.

+
let joined = Text.join(", ", ["a", "b", "c"].vals()); // "a, b, c"
+

Function map

+
func map(t : Text, f : Char -> Char) : Text
+

Applies a function to each character in a Text value, +returning the concatenated Char results.

+
// Replace all occurrences of '?' with '!'
+let result = Text.map("Motoko?", func(c) {
+  if (c == '?') '!'
+  else c
+});
+

Function translate

+
func translate(t : Text, f : Char -> Text) : Text
+

Returns the result of applying f to each character in +ts, concatenating the intermediate text values.

+
// Replace all occurrences of '?' with "!!"
+let result = Text.translate("Motoko?", func(c) {
+  if (c == '?') "!!"
+  else Text.fromChar(c)
+}); // "Motoko!!"
+

Type Pattern

+
type Pattern = {#char : Char; #text : Text; #predicate : (Char -> Bool)}
+

A pattern p describes a sequence of characters. A +pattern has one of the following forms:

+
    +
  • #char c matches the single character sequence, +c.
  • +
  • #text t matches multi-character text sequence +t.
  • +
  • #predicate p matches any single character sequence +c satisfying predicate p(c).
  • +
+

A match for p is any sequence of characters +matching the pattern p.

+
let charPattern = #char 'A';
+let textPattern = #text "phrase";
+let predicatePattern : Text.Pattern = #predicate (func(c) { c == 'A' or c == 'B' }); // matches "A" or "B"
+

Function split

+
func split(t : Text, p : Pattern) : Iter.Iter<Text>
+

Splits the input Text with the specified +Pattern.

+

Two fields are separated by exactly one match.

+
let words = Text.split("This is a sentence.", #char ' ');
+Text.join("|", words) // "This|is|a|sentence."
+

Function tokens

+
func tokens(t : Text, p : Pattern) : Iter.Iter<Text>
+

Returns a sequence of tokens from the input Text +delimited by the specified Pattern, derived from start to +end. A "token" is a non-empty maximal subsequence of t not +containing a match for pattern p. Two tokens may be +separated by one or more matches of p.

+
let tokens = Text.tokens("this needs\n an   example", #predicate (func(c) { c == ' ' or c == '\n' }));
+Text.join("|", tokens) // "this|needs|an|example"
+

Function contains

+
func contains(t : Text, p : Pattern) : Bool
+

Returns true if the input Text contains a +match for the specified Pattern.

+
Text.contains("Motoko", #text "oto") // true
+

Function startsWith

+
func startsWith(t : Text, p : Pattern) : Bool
+

Returns true if the input Text starts with +a prefix matching the specified Pattern.

+
Text.startsWith("Motoko", #text "Mo") // true
+

Function endsWith

+
func endsWith(t : Text, p : Pattern) : Bool
+

Returns true if the input Text ends with a +suffix matching the specified Pattern.

+
Text.endsWith("Motoko", #char 'o') // true
+

Function replace

+
func replace(t : Text, p : Pattern, r : Text) : Text
+

Returns the input text t with all matches of pattern +p replaced by text r.

+
let result = Text.replace("abcabc", #char 'a', "A"); // "AbcAbc"
+

Function stripStart

+
func stripStart(t : Text, p : Pattern) : ?Text
+

Strips one occurrence of the given Pattern from the +beginning of the input Text. If you want to remove multiple +instances of the pattern, use Text.trimStart() instead.

+
// Try to strip a nonexistent character
+let none = Text.stripStart("abc", #char '-'); // null
+// Strip just one '-'
+let one = Text.stripStart("--abc", #char '-'); // ?"-abc"
+

Function stripEnd

+
func stripEnd(t : Text, p : Pattern) : ?Text
+

Strips one occurrence of the given Pattern from the end +of the input Text. If you want to remove multiple instances +of the pattern, use Text.trimEnd() instead.

+
// Try to strip a nonexistent character
+let none = Text.stripEnd("xyz", #char '-'); // null
+// Strip just one '-'
+let one = Text.stripEnd("xyz--", #char '-'); // ?"xyz-"
+

Function trimStart

+
func trimStart(t : Text, p : Pattern) : Text
+

Trims the given Pattern from the start of the input +Text. If you only want to remove a single instance of the +pattern, use Text.stripStart() instead.

+
let trimmed = Text.trimStart("---abc", #char '-'); // "abc"
+

Function trimEnd

+
func trimEnd(t : Text, p : Pattern) : Text
+

Trims the given Pattern from the end of the input +Text. If you only want to remove a single instance of the +pattern, use Text.stripEnd() instead.

+
let trimmed = Text.trimEnd("xyz---", #char '-'); // "xyz"
+

Function trim

+
func trim(t : Text, p : Pattern) : Text
+

Trims the given Pattern from both the start and end of +the input Text.

+
let trimmed = Text.trim("---abcxyz---", #char '-'); // "abcxyz"
+

Function compareWith

+
func compareWith(t1 : Text, t2 : Text, cmp : (Char, Char) -> {#less; #equal; #greater}) : {#less; #equal; #greater}
+

Compares t1 and t2 using the provided +character-wise comparison function.

+
import Char "mo:base/Char";
+
+Text.compareWith("abc", "ABC", func(c1, c2) { Char.compare(c1, c2) }) // #greater
+

Value encodeUtf8

+
let encodeUtf8 : Text -> Blob
+

Returns a UTF-8 encoded Blob from the given +Text.

+
let blob = Text.encodeUtf8("Hello");
+

Value decodeUtf8

+
let decodeUtf8 : Blob -> ?Text
+

Tries to decode the given Blob as UTF-8. Returns +null if the blob is not valid UTF-8.

+
let text = Text.decodeUtf8("\48\65\6C\6C\6F"); // ?"Hello"
+

Value toLowercase

+
let toLowercase : Text -> Text
+

Returns the text argument in lowercase. WARNING: Unicode compliant +only when compiled, not interpreted.

+
let text = Text.toLowercase("Good Day"); // ?"good day"
+

Value toUppercase

+
let toUppercase : Text -> Text
+

Returns the text argument in uppercase. Unicode compliant. WARNING: +Unicode compliant only when compiled, not interpreted.

+
let text = Text.toUppercase("Good Day"); // ?"GOOD DAY"
+ + diff --git a/docs/html/Time.html b/docs/html/Time.html new file mode 100644 index 00000000000..d34e6d110e3 --- /dev/null +++ b/docs/html/Time.html @@ -0,0 +1,208 @@ + + + + + + + md/base/Time.md + + + + +
+

md/base/Time.md

+
+ +

Time

+

System time

+

Type Time

+
type Time = Int
+

System time is represent as nanoseconds since 1970-01-01.

+

Value now

+
let now : () -> Time
+

Current system time given as nanoseconds since 1970-01-01. The system +guarantees that:

+
    +
  • the time, as observed by the canister smart contract, is +monotonically increasing, even across canister upgrades.
  • +
  • within an invocation of one entry point, the time is constant.
  • +
+

The system times of different canisters are unrelated, and calls from +one canister to another may appear to travel "backwards in time"

+

Note: While an implementation will likely try to keep the system time +close to the real time, this is not formally guaranteed.

+ + diff --git a/docs/html/Timer.html b/docs/html/Timer.html new file mode 100644 index 00000000000..5a63e8952f2 --- /dev/null +++ b/docs/html/Timer.html @@ -0,0 +1,237 @@ + + + + + + + md/base/Timer.md + + + + +
+

md/base/Timer.md

+
+ +

Timer

+

Timers for one-off or periodic tasks.

+

Note: If moc is invoked with -no-timer, the +importing will fail. Note: The resolution of the timers is in the order +of the block rate, so durations should be chosen well above that. For +frequent canister wake-ups the heatbeat mechanism should be +considered.

+

Type Duration

+
type Duration = {#seconds : Nat; #nanoseconds : Nat}
+

Type TimerId

+
type TimerId = Nat
+

Function setTimer

+
func setTimer(d : Duration, job : () -> async ()) : TimerId
+

Installs a one-off timer that upon expiration after given duration +d executes the future job().

+
let now = Time.now();
+let thirtyMinutes = 1_000_000_000 * 60 * 30;
+func alarmUser() : async () {
+  // ...
+};
+appt.reminder = setTimer(#nanoseconds (Int.abs(appt.when - now - thirtyMinutes)), alarmUser);
+

Function +recurringTimer

+
func recurringTimer(d : Duration, job : () -> async ()) : TimerId
+

Installs a recurring timer that upon expiration after given duration +d executes the future job() and reinserts +itself for another expiration.

+

Note: A duration of 0 will only expire once.

+
func checkAndWaterPlants() : async () {
+  // ...
+};
+let daily = recurringTimer(#seconds (24 * 60 * 60), checkAndWaterPlants);
+

Value cancelTimer

+
let cancelTimer : TimerId -> ()
+

Cancels a still active timer with (id : TimerId). For +expired timers and not recognised ids nothing happens.

+
func deleteAppt(appt : Appointment) {
+  cancelTimer (appt.reminder);
+  // ...
+};
+ + diff --git a/docs/html/Trie.html b/docs/html/Trie.html new file mode 100644 index 00000000000..f8924086893 --- /dev/null +++ b/docs/html/Trie.html @@ -0,0 +1,931 @@ + + + + + + + md/base/Trie.md + + + + +
+

md/base/Trie.md

+
+ +

Trie

+

Functional key-value hash maps.

+

Functional maps (and sets) whose representation is "canonical", and +independent of operation history (unlike other popular search +trees).

+

The representation we use here comes from Section 6 of "Incremental computation +via function caching", Pugh & Teitelbaum.

+

User's overview

+

This module provides an applicative (functional) hash map. Notably, +each put produces a new trie and value being +replaced, if any.

+

Those looking for a more familiar (imperative, object-oriented) hash +map should consider TrieMap or HashMap +instead.

+

The basic Trie operations consist of:

+
    +
  • put - put a key-value into the trie, producing a new +version.
  • +
  • get - get a key's value from the trie, or +null if none.
  • +
  • remove - remove a key's value from the trie
  • +
  • iter - visit every key-value in the trie.
  • +
+

The put, get and remove +operations work over Key records, which group the hash of +the key with its non-hash key value.

+

Example:

+
import Trie "mo:base/Trie";
+import Text "mo:base/Text";
+
+// we do this to have shorter type names and thus
+// better readibility
+type Trie<K, V> = Trie.Trie<K, V>;
+type Key<K> = Trie.Key<K>;
+
+// we have to provide `put`, `get` and `remove` with
+// a record of type `Key<K> = { hash : Hash.Hash; key : K }`;
+// thus we define the following function that takes a value of type `K`
+// (in this case `Text`) and returns a `Key<K>` record.
+func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
+
+// we start off by creating an empty `Trie`
+let t0 : Trie<Text, Nat> = Trie.empty();
+
+// `put` requires 4 arguments:
+// - the trie we want to insert the value into,
+// - the key of the value we want to insert (note that we use the `key` function defined above),
+// - a function that checks for equality of keys, and
+// - the value we want to insert.
+//
+// When inserting a value, `put` returns a tuple of type `(Trie<K, V>, ?V)`.
+// to get the new trie that contains the value,  we use the `0` projection
+// and assign it to `t1` and `t2` respectively.
+let t1 : Trie<Text, Nat> = Trie.put(t0, key "hello", Text.equal, 42).0;
+let t2 : Trie<Text, Nat> = Trie.put(t1, key "world", Text.equal, 24).0;
+
+// If for a given key there already was a value in the trie, `put` returns
+// that previous value as the second element of the tuple.
+// in our case we have already inserted the value 42 for the key "hello", so
+// `put` returns 42 as the second element of the tuple.
+let (t3, n) : (Trie<Text, Nat>, ?Nat) = Trie.put(
+  t2,
+  key "hello",
+  Text.equal,
+  0,
+);
+assert (n == ?42);
+
+// `get` requires 3 arguments:
+// - the trie we want to get the value from
+// - the key of the value we want to get (note that we use the `key` function defined above)
+// - a function that checks for equality of keys
+//
+// If the given key is nonexistent in the trie, `get` returns `null`.
+var value = Trie.get(t3, key "hello", Text.equal); // Returns `?42`
+assert(value == ?0);
+value := Trie.get(t3, key "universe", Text.equal); // Returns `null`
+assert(value == null);
+
+// `remove` requires 3 arguments:
+// - the trie we want to remove the value from,
+// - the key of the value we want to remove (note that we use the `key` function defined above), and
+// - a function that checks for equality of keys.
+//
+// In the case of keys of type `Text`, we can use `Text.equal`
+// to check for equality of keys. Function `remove` returns a tuple of type `(Trie<K, V>, ?V)`.
+// where the second element of the tuple is the value that was removed, or `null` if
+// there was no value for the given key.
+let removedValue : ?Nat = Trie.remove(
+  t3,
+  key "hello",
+  Text.equal,
+).1;
+assert (removedValue == ?0);
+
+// To iterate over the Trie, we use the `iter` function that takes a trie
+// of type `Trie<K,V>` and returns an iterator of type `Iter<(K,V)>`:
+var sum : Nat = 0;
+for (kv in Trie.iter(t3)) {
+  sum += kv.1;
+};
+assert(sum == 24);
+

Type Trie

+
type Trie<K, V> = {#empty; #leaf : Leaf<K, V>; #branch : Branch<K, V>}
+

Binary hash tries: either empty, a leaf node, or a branch node

+

Type Leaf

+
type Leaf<K, V> = { size : Nat; keyvals : AssocList<Key<K>, V> }
+

Leaf nodes of trie consist of key-value pairs as a list.

+

Type Branch

+
type Branch<K, V> = { size : Nat; left : Trie<K, V>; right : Trie<K, V> }
+

Branch nodes of the trie discriminate on a bit position of the keys' +hashes. we never store this bitpos; rather, we enforce a style where +this position is always known from context.

+

Type AssocList

+
type AssocList<K, V> = AssocList.AssocList<K, V>
+

Type Key

+
type Key<K> = { hash : Hash.Hash; key : K }
+

A Key for the trie has an associated hash value

+
    +
  • hash permits fast inequality checks, and permits +collisions, while
  • +
  • key permits precise equality checks, but is only used +on values with equal hashes.
  • +
+

Function equalKey

+
func equalKey<K>(keq : (K, K) -> Bool) : ((Key<K>, Key<K>) -> Bool)
+

Equality function for two Key<K>s, in terms of +equality of K's.

+

Function isValid

+
func isValid<K, V>(t : Trie<K, V>, _enforceNormal : Bool) : Bool
+

@deprecated isValid is an internal predicate and will be +removed in future.

+

Type Trie2D

+
type Trie2D<K1, K2, V> = Trie<K1, Trie<K2, V>>
+

A 2D trie maps dimension-1 keys to another layer of tries, each keyed +on the dimension-2 keys.

+

Type Trie3D

+
type Trie3D<K1, K2, K3, V> = Trie<K1, Trie2D<K2, K3, V>>
+

A 3D trie maps dimension-1 keys to another Composition of 2D tries, +each keyed on the dimension-2 and dimension-3 keys.

+

Function empty

+
func empty<K, V>() : Trie<K, V>
+

An empty trie. This is usually the starting point for building a +trie.

+

Example:

+
import { print } "mo:base/Debug";
+import Trie "mo:base/Trie";
+import Text "mo:base/Text";
+
+// we do this to have shorter type names and thus
+// better readibility
+type Trie<K, V> = Trie.Trie<K, V>;
+type Key<K> = Trie.Key<K>;
+
+// We have to provide `put`, `get` and `remove` with
+// a function of return type `Key<K> = { hash : Hash.Hash; key : K }`
+func key(t: Text) : Key<Text> { { hash = Text.hash t; key = t } };
+// We start off by creating an empty `Trie`
+var trie : Trie<Text, Nat> = Trie.empty();
+

Function size

+
func size<K, V>(t : Trie<K, V>) : Nat
+

Get the size in O(1) time.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
var size = Trie.size(trie); // Returns 0, as `trie` is empty
+assert(size == 0);
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+size := Trie.size(trie); // Returns 1, as we just added a new entry
+assert(size == 1);
+

Function branch

+
func branch<K, V>(l : Trie<K, V>, r : Trie<K, V>) : Trie<K, V>
+

Construct a branch node, computing the size stored there.

+

Function leaf

+
func leaf<K, V>(kvs : AssocList<Key<K>, V>, bitpos : Nat) : Trie<K, V>
+

Construct a leaf node, computing the size stored there.

+

This helper function automatically enforces the MAX_LEAF_SIZE by +constructing branches as necessary; to do so, it also needs the bitpos +of the leaf.

+

Function fromList

+
func fromList<K, V>(kvc : ?Nat, kvs : AssocList<Key<K>, V>, bitpos : Nat) : Trie<K, V>
+

Transform a list into a trie, splitting input list into small (leaf) +lists, if necessary.

+

Function clone

+
func clone<K, V>(t : Trie<K, V>) : Trie<K, V>
+

Clone the trie efficiently, via sharing.

+

Purely-functional representation permits O(1) copy, via +persistent sharing.

+

Function replace

+
func replace<K, V>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool, v : ?V) : (Trie<K, V>, ?V)
+

Replace the given key's value option with the given value, returning +the modified trie. Also returns the replaced value if the key existed +and null otherwise. Compares keys using the provided +function k_eq.

+

Note: Replacing a key's value by null removes the key +and also shrinks the trie.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "test", Text.equal, 1).0;
+trie := Trie.replace(trie, key "test", Text.equal, 42).0;
+assert (Trie.get(trie, key "hello", Text.equal) == ?42);
+

Function put

+
func put<K, V>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool, v : V) : (Trie<K, V>, ?V)
+

Put the given key's value in the trie; return the new trie, and the +previous value associated with the key, if any.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+let previousValue = Trie.put(trie, key "hello", Text.equal, 33).1; // Returns ?42
+assert(previousValue == ?42);
+

Function get

+
func get<K, V>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool) : ?V
+

Get the value of the given key in the trie, or return null if +nonexistent.

+

For a more detailed overview of how to use a Trie, see the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+var value = Trie.get(trie, key "hello", Text.equal); // Returns `?42`
+assert(value == ?42);
+value := Trie.get(trie, key "world", Text.equal); // Returns `null`
+assert(value == null);
+

Function find

+
func find<K, V>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool) : ?V
+

Find the given key's value in the trie, or return null +if nonexistent

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+var value = Trie.find(trie, key "hello", Text.equal); // Returns `?42`
+assert(value == ?42);
+value := Trie.find(trie, key "world", Text.equal); // Returns `null`
+assert(value == null);
+

Function merge

+
func merge<K, V>(tl : Trie<K, V>, tr : Trie<K, V>, k_eq : (K, K) -> Bool) : Trie<K, V>
+

Merge tries, preferring the left trie where there are collisions in +common keys.

+

note: the disj operation generalizes this +merge operation in various ways, and does not (in general) +lose information; this operation is a simpler, special case.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 has a different value for "hello"
+trie2 := Trie.put(trie2, key "hello", Text.equal, 33).0;
+// mergedTrie has the value 42 for "hello", as the left trie is preferred
+// in the case of a collision
+var mergedTrie = Trie.merge(trie, trie2, Text.equal);
+var value = Trie.get(mergedTrie, key "hello", Text.equal);
+assert(value == ?42);
+

Function mergeDisjoint

+
func mergeDisjoint<K, V>(tl : Trie<K, V>, tr : Trie<K, V>, k_eq : (K, K) -> Bool) : Trie<K, V>
+

+

Merge tries like merge, but traps if there are +collisions in common keys between the left and right inputs.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 has a different value for "hello"
+trie2 := Trie.put(trie2, key "hello", Text.equal, 33).0;
+// `mergeDisjoint` signals a dynamic errror
+// in the case of a collision
+var mergedTrie = Trie.mergeDisjoint(trie, trie2, Text.equal);
+

Function diff

+
func diff<K, V, W>(tl : Trie<K, V>, tr : Trie<K, W>, k_eq : (K, K) -> Bool) : Trie<K, V>
+

Difference of tries. The output consists of pairs of the left trie +whose keys are not present in the right trie; the values of the right +trie are irrelevant.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 42).0;
+// trie2 is a copy of trie
+var trie2 = Trie.clone(trie);
+// trie2 now has an additional key
+trie2 := Trie.put(trie2, key "ciao", Text.equal, 33).0;
+// `diff` returns a trie with the key "ciao",
+// as this key is not present in `trie`
+// (note that we pass `trie2` as the left trie)
+Trie.diff(trie2, trie, Text.equal);
+

Function disj

+
func disj<K, V, W, X>(tl : Trie<K, V>, tr : Trie<K, W>, k_eq : (K, K) -> Bool, vbin : (?V, ?W) -> X) : Trie<K, X>
+

Map disjunction.

+

This operation generalizes the notion of "set union" to finite +maps.

+

Produces a "disjunctive image" of the two tries, where the values of +matching keys are combined with the given binary operator.

+

For unmatched key-value pairs, the operator is still applied to +create the value in the image. To accomodate these various situations, +the operator accepts optional values, but is never applied to (null, +null).

+

Implements the database idea of an "outer +join".

+

Function join

+
func join<K, V, W, X>(tl : Trie<K, V>, tr : Trie<K, W>, k_eq : (K, K) -> Bool, vbin : (V, W) -> X) : Trie<K, X>
+

Map join.

+

Implements the database idea of an "inner +join".

+

This operation generalizes the notion of "set intersection" to finite +maps. The values of matching keys are combined with the given binary +operator, and unmatched key-value pairs are not present in the +output.

+

Function foldUp

+
func foldUp<K, V, X>(t : Trie<K, V>, bin : (X, X) -> X, leaf : (K, V) -> X, empty : X) : X
+

This operation gives a recursor for the internal structure of tries. +Many common operations are instantiations of this function, either as +clients, or as hand-specialized versions (e.g., see , map, mapFilter, +some and all below).

+

Function prod

+
func prod<K1, V1, K2, V2, K3, V3>(tl : Trie<K1, V1>, tr : Trie<K2, V2>, op : (K1, V1, K2, V2) -> ?(Key<K3>, V3), k3_eq : (K3, K3) -> Bool) : Trie<K3, V3>
+

Map product.

+

Conditional catesian product, where the given operation +op conditionally creates output elements in the +resulting trie.

+

The keyed structure of the input tries are not relevant for this +operation: all pairs are considered, regardless of keys matching or not. +Moreover, the resulting trie may use keys that are unrelated to these +input keys.

+

Function iter

+
func iter<K, V>(t : Trie<K, V>) : I.Iter<(K, V)>
+

Returns an iterator of type Iter over the key-value +entries of the trie.

+

Each iterator gets a persistent view of the mapping, +independent of concurrent updates to the iterated map.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+// create an Iterator over key-value pairs of trie
+let iter = Trie.iter(trie);
+// add another key-value pair to `trie`.
+// because we created our iterator before
+// this update, it will not contain this new key-value pair
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+var sum : Nat = 0;
+for ((k,v) in iter) {
+  sum += v;
+};
+assert(sum == 74);
+

Module Build

+
module Build
+

Represent the construction of tries as data.

+

This module provides optimized variants of normal tries, for more +efficient join queries.

+

The central insight is that for (unmaterialized) join query results, +we do not need to actually build any resulting trie of the resulting +data, but rather, just need a collection of what would be in that trie. +Since query results can be large (quadratic in the DB size), avoiding +the construction of this trie provides a considerable savings.

+

To get this savings, we use an ADT for the operations that +would build this trie, if evaluated. This structure specializes +a rope: a balanced tree representing a sequence. It is only as balanced +as the tries from which we generate these build ASTs. They have no +intrinsic balance properties of their own.

+

Type Build

+
type Build<K, V> = {#skip; #put : (K, ?Hash.Hash, V); #seq : { size : Nat; left : Build<K, V>; right : Build<K, V> }}
+

The build of a trie, as an AST for a simple DSL.

+

Function size

+
func size<K, V>(tb : Build<K, V>) : Nat
+

Size of the build, measured in #put operations

+

Function seq

+
func seq<K, V>(l : Build<K, V>, r : Build<K, V>) : Build<K, V>
+

Build sequence of two sub-builds

+

Function prod

+
func prod<K1, V1, K2, V2, K3, V3>(tl : Trie<K1, V1>, tr : Trie<K2, V2>, op : (K1, V1, K2, V2) -> ?(K3, V3), _k3_eq : (K3, K3) -> Bool) : Build<K3, V3>
+

Like prod, except do not actually do +the put calls, just record them, as a (binary tree) data structure, +isomorphic to the recursion of this function (which is balanced, in +expectation).

+

Function nth

+
func nth<K, V>(tb : Build<K, V>, i : Nat) : ?(K, ?Hash.Hash, V)
+

Project the nth key-value pair from the trie build.

+

This position is meaningful only when the build contains multiple +uses of one or more keys, otherwise it is not.

+

Function projectInner

+
func projectInner<K1, K2, V>(t : Trie<K1, Build<K2, V>>) : Build<K2, V>
+

Like mergeDisjoint, except +that it avoids the work of actually merging any tries; rather, just +record the work for latter (if ever).

+

Function toArray

+
func toArray<K, V, W>(tb : Build<K, V>, f : (K, V) -> W) : [W]
+

Gather the collection of key-value pairs into an array of a +(possibly-distinct) type.

+

Function fold

+
func fold<K, V, X>(t : Trie<K, V>, f : (K, V, X) -> X, x : X) : X
+

Fold over the key-value pairs of the trie, using an accumulator. The +key-value pairs have no reliable or meaningful ordering.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+// create an accumulator, in our case the sum of all values
+func calculateSum(k : Text, v : Nat, acc : Nat) : Nat = acc + v;
+// Fold over the trie using the accumulator.
+// Note that 0 is the initial value of the accumulator.
+let sum = Trie.fold(trie, calculateSum, 0);
+assert(sum == 77);
+

Function some

+
func some<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Bool
+

Test whether a given key-value pair is present, or not.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 3).0;
+// `some` takes a function that returns a Boolean indicating whether
+// the key-value pair is present or not
+var isPresent = Trie.some(
+  trie,
+  func(k : Text, v : Nat) : Bool = k == "bye" and v == 32,
+);
+assert(isPresent == true);
+isPresent := Trie.some(
+  trie,
+  func(k : Text, v : Nat) : Bool = k == "hello" and v == 32,
+);
+assert(isPresent == false);
+

Function all

+
func all<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Bool
+

Test whether all key-value pairs have a given property.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `all` takes a function that returns a boolean indicating whether
+// the key-value pairs all have a given property, in our case that
+// all values are greater than 9
+var hasProperty = Trie.all(
+  trie,
+  func(k : Text, v : Nat) : Bool = v > 9,
+);
+assert(hasProperty == true);
+// now we check if all values are greater than 100
+hasProperty := Trie.all(
+  trie,
+  func(k : Text, v : Nat) : Bool = v > 100,
+);
+assert(hasProperty == false);
+

Function nth

+
func nth<K, V>(t : Trie<K, V>, i : Nat) : ?(Key<K>, V)
+

Project the nth key-value pair from the trie.

+

Note: This position is not meaningful; it's only here so that we can +inject tries into arrays using functions like +Array.tabulate.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
import Array "mo:base/Array";
+trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `tabulate` takes a size parameter, so we check the size of
+// the trie first
+let size = Trie.size(trie);
+// Now we can create an array of the same size passing `nth` as
+// the generator used to fill the array.
+// Note that `toArray` is a convenience function that does the
+// same thing without you having to check whether the tuple is
+// `null` or not, which we're not doing in this example
+let array = Array.tabulate<?(Key<Text>, Nat)>(
+  size,
+  func n = Trie.nth(trie, n)
+);
+

Function toArray

+
func toArray<K, V, W>(t : Trie<K, V>, f : (K, V) -> W) : [W]
+

Gather the collection of key-value pairs into an array of a +(possibly-distinct) type.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `toArray` takes a function that takes a key-value tuple
+// and returns a value of the type you want to use to fill
+// the array.
+// In our case we just return the value
+let array = Trie.toArray<Text, Nat, Nat>(
+  trie,
+  func (k, v) = v
+);
+

Function isEmpty

+
func isEmpty<K, V>(t : Trie<K, V>) : Bool
+

Test for "deep emptiness": subtrees that have branching structure, +but no leaves. These can result from naive filtering operations; filter +uses this function to avoid creating such subtrees.

+

Function filter

+
func filter<K, V>(t : Trie<K, V>, f : (K, V) -> Bool) : Trie<K, V>
+

Filter the key-value pairs by a given predicate.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `filter` takes a function that takes a key-value tuple
+// and returns true if the key-value pair should be included.
+// In our case those are pairs with a value greater than 20
+let filteredTrie = Trie.filter<Text, Nat>(
+  trie,
+  func (k, v) = v > 20
+);
+assert (Trie.all<Text, Nat>(filteredTrie, func(k, v) = v > 20) == true);
+

Function mapFilter

+
func mapFilter<K, V, W>(t : Trie<K, V>, f : (K, V) -> ?W) : Trie<K, W>
+

Map and filter the key-value pairs by a given predicate.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `mapFilter` takes a function that takes a key-value tuple
+// and returns a possibly-distinct value if the key-value pair should be included.
+// In our case, we filter for values greater than 20 and map them to their square.
+let filteredTrie = Trie.mapFilter<Text, Nat, Nat>(
+  trie,
+  func (k, v) = if (v > 20) return ?(v**2) else return null
+);
+assert (Trie.all<Text, Nat>(filteredTrie, func(k, v) = v > 60) == true);
+

Function +equalStructure

+
func equalStructure<K, V>(tl : Trie<K, V>, tr : Trie<K, V>, keq : (K, K) -> Bool, veq : (V, V) -> Bool) : Bool
+

Test for equality, but naively, based on structure. Does not attempt +to remove "junk" in the tree; For instance, a "smarter" approach would +equate #bin {left = #empty; right = #empty} with +#empty. We do not observe that equality here.

+

Function replaceThen

+
func replaceThen<K, V, X>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool, v2 : V, success : (Trie<K, V>, V) -> X, fail : () -> X) : X
+

Replace the given key's value in the trie, and only if successful, do +the success continuation, otherwise, return the failure value

+

For a more detailed overview of how to use a Trie, see the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+trie := Trie.put(trie, key "ciao", Text.equal, 10).0;
+// `replaceThen` takes the same arguments as `replace` but also a success continuation
+// and a failure connection that are called in the respective scenarios.
+// if the replace fails, that is the key is not present in the trie, the failure continuation is called.
+// if the replace succeeds, that is the key is present in the trie, the success continuation is called.
+// in this example we are simply returning the Text values `success` and `fail` respectively.
+var continuation = Trie.replaceThen<Text, Nat, Text>(
+  trie,
+  key "hello",
+  Text.equal,
+  12,
+  func (t, v) = "success",
+  func () = "fail"
+);
+assert (continuation == "success");
+continuation := Trie.replaceThen<Text, Nat, Text>(
+  trie,
+  key "shalom",
+  Text.equal,
+  12,
+  func (t, v) = "success",
+  func () = "fail"
+);
+assert (continuation == "fail");
+

Function putFresh

+
func putFresh<K, V>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool, v : V) : Trie<K, V>
+

Put the given key's value in the trie; return the new trie; assert +that no prior value is associated with the key

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
// note that compared to `put`, `putFresh` does not return a tuple
+trie := Trie.putFresh(trie, key "hello", Text.equal, 42);
+trie := Trie.putFresh(trie, key "bye", Text.equal, 32);
+// this will fail as "hello" is already present in the trie
+trie := Trie.putFresh(trie, key "hello", Text.equal, 10);
+

Function put2D

+
func put2D<K1, K2, V>(t : Trie2D<K1, K2, V>, k1 : Key<K1>, k1_eq : (K1, K1) -> Bool, k2 : Key<K2>, k2_eq : (K2, K2) -> Bool, v : V) : Trie2D<K1, K2, V>
+

Put the given key's value in the 2D trie; return the new 2D trie.

+

Function put3D

+
func put3D<K1, K2, K3, V>(t : Trie3D<K1, K2, K3, V>, k1 : Key<K1>, k1_eq : (K1, K1) -> Bool, k2 : Key<K2>, k2_eq : (K2, K2) -> Bool, k3 : Key<K3>, k3_eq : (K3, K3) -> Bool, v : V) : Trie3D<K1, K2, K3, V>
+

Put the given key's value in the trie; return the new trie;

+

Function remove

+
func remove<K, V>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool) : (Trie<K, V>, ?V)
+

Remove the entry for the given key from the trie, by returning the +reduced trie. Also returns the removed value if the key existed and +null otherwise. Compares keys using the provided function +k_eq.

+

Note: The removal of an existing key shrinks the trie.

+

For a more detailed overview of how to use a Trie, see +the User's Overview.

+

Example:

+
trie := Trie.put(trie, key "hello", Text.equal, 42).0;
+trie := Trie.put(trie, key "bye", Text.equal, 32).0;
+// remove the entry associated with "hello"
+trie := Trie.remove(trie, key "hello", Text.equal).0;
+assert (Trie.get(trie, key "hello", Text.equal) == null);
+

Function removeThen

+
func removeThen<K, V, X>(t : Trie<K, V>, k : Key<K>, k_eq : (K, K) -> Bool, success : (Trie<K, V>, V) -> X, fail : () -> X) : X
+

Remove the given key's value in the trie, and only if successful, do +the success continuation, otherwise, return the failure value

+

Function remove2D

+
func remove2D<K1, K2, V>(t : Trie2D<K1, K2, V>, k1 : Key<K1>, k1_eq : (K1, K1) -> Bool, k2 : Key<K2>, k2_eq : (K2, K2) -> Bool) : (Trie2D<K1, K2, V>, ?V)
+

remove the given key-key pair's value in the 2D trie; return the new +trie, and the prior value, if any.

+

Function remove3D

+
func remove3D<K1, K2, K3, V>(t : Trie3D<K1, K2, K3, V>, k1 : Key<K1>, k1_eq : (K1, K1) -> Bool, k2 : Key<K2>, k2_eq : (K2, K2) -> Bool, k3 : Key<K3>, k3_eq : (K3, K3) -> Bool) : (Trie3D<K1, K2, K3, V>, ?V)
+

Remove the given key-key pair's value in the 3D trie; return the new +trie, and the prior value, if any.

+

Function +mergeDisjoint2D

+
func mergeDisjoint2D<K1, K2, V>(t : Trie2D<K1, K2, V>, _k1_eq : (K1, K1) -> Bool, k2_eq : (K2, K2) -> Bool) : Trie<K2, V>
+

Like mergeDisjoint, except +instead of merging a pair, it merges the collection of dimension-2 +sub-trees of a 2D trie.

+ + diff --git a/docs/html/TrieMap.html b/docs/html/TrieMap.html new file mode 100644 index 00000000000..b4dca3b45f4 --- /dev/null +++ b/docs/html/TrieMap.html @@ -0,0 +1,430 @@ + + + + + + + md/base/TrieMap.md + + + + +
+

md/base/TrieMap.md

+
+ +

TrieMap

+

Class TrieMap<K, V> provides a map from keys of +type K to values of type V. The class wraps +and manipulates an underyling hash trie, found in the Trie +module. The trie is a binary tree in which the position of elements in +the tree are determined using the hash of the elements.

+

Note: The class TrieMap exposes the same +interface as HashMap.

+

Creating a map: The equality function is used to compare keys, and +the hash function is used to hash keys. See the example below.

+
import TrieMap "mo:base/TrieMap";
+import Nat "mo:base/Nat";
+import Hash "mo:base/Hash";
+import Iter "mo:base/Iter";
+
+let map = TrieMap.TrieMap<Nat, Nat>(Nat.equal, Hash.hash)
+

Class TrieMap<K, V>

+
class TrieMap<K, V>(isEq : (K, K) -> Bool, hashOf : K -> Hash.Hash)
+

Function size

+
func size() : Nat
+

Returns the number of entries in the map.

+

Example:

+
map.size()
+

Runtime: O(1) Space: O(1)

+

Function put

+
func put(key : K, value : V)
+

Maps key to value, and overwrites the old +entry if the key was already present.

+

Example:

+
map.put(0, 10);
+map.put(2, 12);
+Iter.toArray(map.entries())
+

Runtime: O(log(size)) Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and +the map is using a constant time and space equality and hash +function.

+

Function replace

+
func replace(key : K, value : V) : ?V
+

Maps key to value. Overwrites and +returns the old entry as an option if the key was already present, and +null otherwise.

+

Example:

+
map.put(0, 10);
+map.replace(0, 20)
+

Runtime: O(log(size)) Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and +the map is using a constant time and space equality and hash +function.

+

Function get

+
func get(key : K) : ?V
+

Gets the value associated with the key key in an option, +or null if it doesn't exist.

+

Example:

+
map.put(0, 10);
+map.get(0)
+

Runtime: O(log(size)) Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and +the map is using a constant time and space equality and hash +function.

+

Function delete

+
func delete(key : K)
+

Delete the entry associated with key key, if it exists. +If the key is absent, there is no effect.

+

Note: The deletion of an existing key shrinks the trie map.

+

Example:

+
map.put(0, 10);
+map.delete(0);
+map.get(0)
+

Runtime: O(log(size)) Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and +the map is using a constant time and space equality and hash +function.

+

Function remove

+
func remove(key : K) : ?V
+

Delete the entry associated with key key. Return the +deleted value as an option if it exists, and null +otherwise.

+

Note: The deletion of an existing key shrinks the trie map.

+

Example:

+
map.put(0, 10);
+map.remove(0)
+

Runtime: O(log(size)) Space: O(log(size))

+

*Runtime and space assumes that the trie is reasonably balanced and +the map is using a constant time and space equality and hash +function.

+

Function keys

+
func keys() : I.Iter<K>
+

Returns an iterator over the keys of the map.

+

Each iterator gets a snapshot view of the mapping, and is +unaffected by concurrent updates to the iterated map.

+

Example:

+
map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the keys
+var sum = 0;
+for (key in map.keys()) {
+  sum += key;
+};
+// 0 + 1 + 2
+sum
+

Runtime: O(1) Space: O(1)

+

*The above runtime and space are for the construction of the +iterator. The iteration itself takes linear time and logarithmic space +to execute.

+

Function vals

+
func vals() : I.Iter<V>
+

Returns an iterator over the values in the map.

+

Each iterator gets a snapshot view of the mapping, and is +unaffected by concurrent updates to the iterated map.

+

Example:

+
map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the values
+var sum = 0;
+for (key in map.vals()) {
+  sum += key;
+};
+// 10 + 11 + 12
+sum
+

Runtime: O(1) Space: O(1)

+

*The above runtime and space are for the construction of the +iterator. The iteration itself takes linear time and logarithmic space +to execute.

+

Function entries

+
func entries() : I.Iter<(K, V)>
+

Returns an iterator over the entries (key-value pairs) in the +map.

+

Each iterator gets a snapshot view of the mapping, and is +unaffected by concurrent updates to the iterated map.

+

Example:

+
map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+
+// find the sum of all the products of key-value pairs
+var sum = 0;
+for ((key, value) in map.entries()) {
+  sum += key * value;
+};
+// (0 * 10) + (1 * 11) + (2 * 12)
+sum
+

Runtime: O(1) Space: O(1)

+

*The above runtime and space are for the construction of the +iterator. The iteration itself takes linear time and logarithmic space +to execute.

+

Function clone

+
func clone<K, V>(map : TrieMap<K, V>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash) : TrieMap<K, V>
+

Produce a copy of map, using keyEq to +compare keys and keyHash to hash keys.

+

Example:

+
map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// Clone using the same equality and hash functions used to initialize `map`
+let mapCopy = TrieMap.clone(map, Nat.equal, Hash.hash);
+Iter.toArray(mapCopy.entries())
+

Runtime: O(size * log(size)) Space: O(size)

+

*Runtime and space assumes that the trie underlying map +is reasonably balanced and that keyEq and +keyHash run in O(1) time and space.

+

Function fromEntries

+
func fromEntries<K, V>(entries : I.Iter<(K, V)>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash) : TrieMap<K, V>
+

Create a new map from the entries in entries, using +keyEq to compare keys and keyHash to hash +keys.

+

Example:

+
let entries = [(0, 10), (1, 11), (2, 12)];
+let newMap = TrieMap.fromEntries<Nat, Nat>(entries.vals(), Nat.equal, Hash.hash);
+newMap.get(2)
+

Runtime: O(size * log(size)) Space: O(size)

+

*Runtime and space assumes that entries returns elements +in O(1) time, and keyEq and keyHash run in +O(1) time and space.

+

Function map

+
func map<K, V1, V2>(map : TrieMap<K, V1>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash, f : (K, V1) -> V2) : TrieMap<K, V2>
+

Transform (map) the values in map using function +f, retaining the keys. Uses keyEq to compare +keys and keyHash to hash keys.

+

Example:

+
map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// double all the values in map
+let newMap = TrieMap.map<Nat, Nat, Nat>(map, Nat.equal, Hash.hash, func(key, value) = value * 2);
+Iter.toArray(newMap.entries())
+

Runtime: O(size * log(size)) Space: O(size)

+

*Runtime and space assumes that f, keyEq, +and keyHash run in O(1) time and space.

+

Function mapFilter

+
func mapFilter<K, V1, V2>(map : TrieMap<K, V1>, keyEq : (K, K) -> Bool, keyHash : K -> Hash.Hash, f : (K, V1) -> ?V2) : TrieMap<K, V2>
+

Transform (map) the values in map using function +f, discarding entries for which f evaluates to +null. Uses keyEq to compare keys and +keyHash to hash keys.

+

Example:

+
map.put(0, 10);
+map.put(1, 11);
+map.put(2, 12);
+// double all the values in map, only keeping entries that have an even key
+let newMap =
+  TrieMap.mapFilter<Nat, Nat, Nat>(
+    map,
+    Nat.equal,
+    Hash.hash,
+    func(key, value) = if (key % 2 == 0) { ?(value * 2) } else { null }
+  );
+Iter.toArray(newMap.entries())
+

Runtime: O(size * log(size)) Space: O(size)

+

*Runtime and space assumes that f, keyEq, +and keyHash run in O(1) time and space.

+ + diff --git a/docs/html/TrieSet.html b/docs/html/TrieSet.html new file mode 100644 index 00000000000..c7c85352d82 --- /dev/null +++ b/docs/html/TrieSet.html @@ -0,0 +1,269 @@ + + + + + + + md/base/TrieSet.md + + + + +
+

md/base/TrieSet.md

+
+ +

TrieSet

+

Functional set

+

Sets are partial maps from element type to unit type, i.e., the +partial map represents the set with its domain.

+

Type Hash

+
type Hash = Hash.Hash
+

Type Set

+
type Set<T> = Trie.Trie<T, ()>
+

Function empty

+
func empty<T>() : Set<T>
+

Empty set.

+

Function put

+
func put<T>(s : Set<T>, x : T, xh : Hash, eq : (T, T) -> Bool) : Set<T>
+

Put an element into the set.

+

Function delete

+
func delete<T>(s : Set<T>, x : T, xh : Hash, eq : (T, T) -> Bool) : Set<T>
+

Delete an element from the set.

+

Function equal

+
func equal<T>(s1 : Set<T>, s2 : Set<T>, eq : (T, T) -> Bool) : Bool
+

Test if two sets are equal.

+

Function size

+
func size<T>(s : Set<T>) : Nat
+

The number of set elements, set's cardinality.

+

Function isEmpty

+
func isEmpty<T>(s : Set<T>) : Bool
+

Test if s is the empty set.

+

Function isSubset

+
func isSubset<T>(s1 : Set<T>, s2 : Set<T>, eq : (T, T) -> Bool) : Bool
+

Test if s1 is a subset of s2.

+

Function mem

+
func mem<T>(s : Set<T>, x : T, xh : Hash, eq : (T, T) -> Bool) : Bool
+

@deprecated: use TrieSet.contains()

+

Test if a set contains a given element.

+

Function contains

+
func contains<T>(s : Set<T>, x : T, xh : Hash, eq : (T, T) -> Bool) : Bool
+

Test if a set contains a given element.

+

Function union

+
func union<T>(s1 : Set<T>, s2 : Set<T>, eq : (T, T) -> Bool) : Set<T>
+

Set +union.

+

Function diff

+
func diff<T>(s1 : Set<T>, s2 : Set<T>, eq : (T, T) -> Bool) : Set<T>
+

Set +difference.

+

Function intersect

+
func intersect<T>(s1 : Set<T>, s2 : Set<T>, eq : (T, T) -> Bool) : Set<T>
+

Set +intersection.

+

Function fromArray

+
func fromArray<T>(arr : [T], elemHash : T -> Hash, eq : (T, T) -> Bool) : Set<T>
+

Function toArray

+
func toArray<T>(s : Set<T>) : [T]
+ + diff --git a/docs/html/about-this-guide.html b/docs/html/about-this-guide.html new file mode 100644 index 00000000000..09426a2e5e3 --- /dev/null +++ b/docs/html/about-this-guide.html @@ -0,0 +1,378 @@ + + + + + + + md/attic/about-this-guide.md + + + + +
+

md/attic/about-this-guide.md

+
+ +

Motoko Programming Language +Guide

+

About this guide

+

The Motoko Programming Language Guide introduces key +features of the general-purpose Motoko programming language and provides +examples and reference information to help you learn the nuances of the +language and the practical implications of how to apply it.

+

The Motoko programming language is optimized for developing programs +that run on the Internet Computer blockchain network and to work with +the IC +SDK. You could, in principle, also write programs using Motoko for +more traditional platforms and to run in other contexts, though support +for this is currently best-effort and incomplete. This guide attempts to +strike a balance between highlighting features that are uniquely suited +to running on the Internet Computer and features that are +generally-applicable or well-suited for programs running on all +targets.

+

Intended audience

+

This guide provides reference information and examples for +programmers who want to explore or plan to use the Motoko programming +language. Most of the information in this guide is applicable +independent of whether you are developing programs to run on the +Internet Computer or working with the IC +SDK.

+

The guide assumes you are familiar with basic programming principles +and terminology and have at least some experience writing programs in a +high-level programming language such as C++ or Rust, or have practical +experience working with a scripting language such as JavaScript or +TypeScript. In addition, Motoko incorporates some aspects of functional +programming, so you might find some knowledge of functional programming +design principles helpful in learning to use Motoko.

+

Although this guide is intended to help readers from different +backgrounds understand the basic design principles and semantics of the +Motoko, you should keep in mind that the language implementation and the +documentation are also continuing to evolve.

+

Using this guide

+

To provide a framework for learning Motoko, you might want to start +by reviewing Engineering values +and goals. The Engineering +values and goals describe the core design considerations for the +development and evolution of the Motoko programming language.

+

With those considerations in mind, you can start to explore +fundamental concepts, including the role of types and type annotations, +in simple code examples and small programs.

+

Once you are familiar with the basic concepts and terminology, later +sections introduce programs that compute in more interesting ways, +including function abstractions, user-defined type definitions, +user-defined actors, and asynchronous communication.

+

As you begin using Motoko to write your own programs, you can return +to this guide for reference information and examples.

+

Most of the code examples in this guide are interactive: you can live +edit the example, interpret the code in the browser and see the result. +The interpreter is provided for education purposes. While most of the +language features are supported in the interpreter, they are not exactly +the same as the real compiler. For example, you may get a stack overflow +for a medium-size input, while the real compiler handles the input just +fine. Some of the system features are not fully supported, such as +cycles, canister imports and state-mutating query calls.

+

Documentation conventions

+

The following conventions are used in this guide:

+
    +
  • Fixed-width font is used for sample code, program +names, program output, file names, and commands that you type at the +command line.

  • +
  • Bold text is used to emphasize commands, +buttons, or user interface text, and to introduce new terms.

  • +
  • Italics are used for book titles and to emphasize +specific words or terms.

  • +
  • The CAUTION style is used to indicate content that is missing or +incomplete.

  • +
  • The WARNING style is used to indicate where content is outdated +or potentially inaccurate.

  • +
  • The NOTE style is used to indicate content that describes a +feature that is not yet supported but is planned for a future +release.

  • +
+

Engineering values and goals

+

The engineering effort behind the design and implementation of Motoko +is driven by a core set of values and goals. The DFINITY engineering +organization uses these values and goals to define and prioritize the +language features and enhancements to add and improve as part of +ongoing language development.

+

For transparency into the principles that guide the engineering +effort, the engineering organization has identified the following sets +of core values and secondary values for driving the direction of the +Motoko programming language.

+

Core values

+

The following guiding principles represent the core values of the +engineering organization in prioritized order:

+
    +
  1. Seamless integration with the Internet Computer blockchain +network to ensure that Motoko provides full language support for the +actor-based model, asynchronous messaging, data persistence, interface +description language interoperability, and other features.

  2. +
  3. Ergonomics to ensure that Motoko embraces familiarity, +simplicity, clarity, explicitness, and other human factors.

  4. +
  5. Formal correctness to ensure that Motoko maintains state +isolation, a sound type system and type safety, precision, pattern +matching, appropriate defaults, and coding best-practices.

  6. +
+

Secondary values

+

The following principles represent the secondary values of the +engineering organization that are deemed important but not primary +driving factors:

+
    +
  1. Expressiveness, so that Motoko provides first-class functions, +polymorphism, pattern matching, and more as the language +evolves.

  2. +
  3. Performance, so that Motoko provides reasonably fast operation +initially and continues to improves as the language evolves.

  4. +
  5. Readiness, so the Motoko comes with "batteries included" in the +form of libraries and examples and out-of-the-box integration with the +IC +SDK.

  6. +
+

Non-goals

+

As a counterpoint to the core values and goals, the engineering +organization also identified the following as "non-goals" that are +outside of the scope of the engineering effort:

+
    +
  1. Having a more advanced type system, with cutting-edge +features.

  2. +
  3. Simplicity over functionality in design or implementation (the +"Worse is Better" approach).

  4. +
  5. Interoperability or support for running Motoko programs on +blockchains other than the Internet Computer.

  6. +
+

Finding more information

+

For information about using Motoko with the IC SDK for creating and +managing canisters, see the Developer +Resources.

+

For background information on various topics relevant to the design, +use, or deployment of Motoko services, or the language’s design itself, +consider the following resources as a starting point:

+

WebAssembly

+ +

Modern type systems

+ +

Getting additional support

+

If you are looking for more information or technical support, the +DFINITY website provides quick access to frequently-asked questions, +technical articles, developer updates, and other resources. From the +website, you can search knowledge base articles, open and view support +cases, sign up for the newsletter, read the latest blog posts, view +how-to videos, download software updates, or exchange ideas with members +of the community.

+

In addition to the resources available on the website, you can +connect with DFINITY or other developers using social media or by +visiting the DFINITY Community Forum on Discourse and joining the +conversation.

+ + diff --git a/docs/html/actor-classes.html b/docs/html/actor-classes.html new file mode 100644 index 00000000000..9f1d34d93fc --- /dev/null +++ b/docs/html/actor-classes.html @@ -0,0 +1,293 @@ + + + + + + + md/writing-motoko/actor-classes.md + + + + +
+

md/writing-motoko/actor-classes.md

+
+ +

Actor classes

+

Overview

+

Actor classes enable you to create networks of actors +programmatically. Actor classes have to be defined in a separate source +file. To illustrate how to define and import actor classes, the +following example implements a distributed map of keys of type [Nat](../base/Nat.md) to values of +type Text. It provides simple +insert and lookup functions, put(k, v) and +get(k), for working with these keys and values.

+

Defining an actor class

+

To distribute the data for this example, the set of keys is +partitioned into n buckets. For now, we just fix +n = 8. The bucket, i, of a key, +k, is determined by the remainder of k divided +by n, that is, i = k % n. The ith +bucket (i in [0..n)) receives a dedicated +actor to store text values assigned to keys in that bucket.

+

The actor responsible for bucket i is obtained as an +instance of the actor class Bucket(i), defined in the +sample Buckets.mo file, as follows:

+

Buckets.mo:

+
+

A bucket stores the current mapping of keys to values in a mutable +map variable containing an imperative RedBlack tree, +map, that is initially empty.

+

On get(k), the bucket actor simply returns any value +stored at k, returning map.get(k).

+

On put(k, v), the bucket actor updates the current +map to map k to ?v by calling +map.put(k, v).

+

Both functions use the class parameters n and +i to verify that the key is appropriate for the bucket by +asserting ((k % n) == i).

+

Clients of the map can then communicate with a coordinating +Map actor, implemented as follows:

+
+

As this example illustrates, the Map code imports the +Bucket actor class as module Buckets.

+

The actor maintains an array of n allocated buckets, +with all entries initially null. Entries are populated with +Bucket actors on demand.

+

On get(k, v), the Map actor:

+
    +
  • Uses the remainder of key k divided by +n to determine the index i of the bucket +responsible for that key.

  • +
  • Returns null if the ith bucket does not +exist, or

  • +
  • Delegates to that bucket by calling bucket.get(k, v) +if it does.

  • +
+

On put(k, v), the Map actor:

+
    +
  • Uses the remainder of key k divided by +n to determine the index i of the bucket +responsible for that key.

  • +
  • Installs bucket i if the bucket does not exist by +using an asynchronous call to the constructor, +Buckets.Bucket(i), and, after awaiting the result, records +it in the array buckets.

  • +
  • Delegates the insertion to that bucket by calling +bucket.put(k, v).

  • +
+

While this example sets the number of buckets to 8, you +can generalize the example by making the Map actor an actor +class, adding a parameter (n : Nat) and omitting the +declaration let n = 8;.

+

For example:

+
actor class Map(n : Nat) {
+
+  type Key = Nat
+  ...
+}
+

Clients of actor class Map are now free to determine the +maximum number of buckets in the network by passing an argument on +construction.

+

:::note

+

On ICP, calls to a class constructor must be provisioned with cycles +to pay for the creation of a principal. See ExperimentalCycles for +instructions on how to add cycles to a call using the imperative +ExperimentalCycles.add<system>(cycles) function.

+

:::

+

Configuring and +managing actor class instances

+

On ICP, the primary constructor of an imported actor class always +creates a new principal and installs a fresh instance of the class as +the code for that principal.

+

To provide further control over actor class installation, Motoko +endows each imported actor class with an extra, secondary constructor. +This constructor takes an additional first argument that specifies the +desired installation mode. The constructor is only available via special +syntax that stresses its system functionality.

+

Using this syntax, it's possible to specify initial canister settings +(such as an array of controllers), manually install, upgrade and +reinstall canisters, exposing all of the lower-level facilities of the +Internet Computer.

+

See actor class +management for more details.

+ + diff --git a/docs/html/actors-async.html b/docs/html/actors-async.html new file mode 100644 index 00000000000..64757141d97 --- /dev/null +++ b/docs/html/actors-async.html @@ -0,0 +1,420 @@ + + + + + + + md/writing-motoko/actors-async.md + + + + +
+

md/writing-motoko/actors-async.md

+
+ +

Actors

+

Overview

+

The programming model of the Internet Computer consists of +memory-isolated canisters communicating by asynchronous message passing +of binary data encoding Candid values. A canister processes its messages +one-at-a-time, preventing race conditions. A canister uses call-backs to +register what needs to be done with the result of any inter-canister +messages it issues.

+

Motoko provides an actor-based programming model to +developers to express services, including those of +canister smart contracts on ICP. Each canister is represented as a typed +actor. The type of an actor lists the messages it can handle. Each +message is abstracted as a typed, asynchronous function. A translation +from actor types to Candid types imposes structure on the raw binary +data of the underlying Internet Computer. An actor is similar to an +object, but is different in that its state is completely isolated, its +interactions with the world are entirely through asynchronous messaging, +and its messages are processed one-at-a-time, even when issued in +parallel by concurrent actors.

+

Actors

+

An actor is similar to an object, but is different in that:

+
    +
  • Its state is completely isolated.

  • +
  • Its interactions with the world are done entirely through +asynchronous messaging.

  • +
  • Its messages are processed one-at-a-time, even when issued in +parallel by concurrent actors.

  • +
+

All communication with and between actors involves passing messages +asynchronously over the network using the Internet Computer’s messaging +protocol. An actor’s messages are processed in sequence, so state +modifications never admit race conditions, unless explicitly allowed by +punctuating await expressions.

+

The Internet Computer ensures that each message that is sent receives +a response. The response is either success with some value or an error. +An error can be the explicit rejection of the message by the receiving +canister, a trap due to an illegal instruction such as division by zero, +or a system error due to distribution or resource constraints. For +example, a system error might be the transient or permanent +unavailability of the receiver (either because the receiving actor is +oversubscribed or has been deleted).

+

In Motoko, actors have dedicated syntax and types:

+
    +
  • Messaging is handled by so called shared +functions returning futures. Shared functions are accessible to remote +callers and have additional restrictions: their arguments and return +value must be shared types. Shared types are a subset of types that +includes immutable data, actor references, and shared function +references, but excludes references to local functions and mutable +data.

  • +
  • Future, f, is a value of the special type +async T for some type T.

  • +
  • Waiting on f to be completed is expressed using +await f to obtain a value of type T. To avoid +introducing shared state through messaging, for example, by sending an +object or mutable array, the data that can be transmitted through shared +functions is restricted to immutable, shared types.

  • +
+

Defining an actor

+

Consider the following actor declaration:

+
+

The Counter actor declares one field and three public, +shared functions:

+
    +
  • Fhe field count is mutable, initialized to zero and +implicitly private.

  • +
  • Function inc() asynchronously increments the counter +and returns a future of type async () for +synchronization.

  • +
  • Function read() asynchronously reads the counter +value and returns a future of type async Nat containing its +value.

  • +
  • Function bump() asynchronously increments and reads +the counter.

  • +
+

Shared functions, unlike local functions, are accessible to remote +callers and have additional restrictions. Their arguments and return +value must be shared type. Shared types are a subset of types that +includes immutable data, actor references, and shared function +references, but excludes references to local functions and mutable data. +Because all interaction with actors is asynchronous, an actor’s +functions must return futures, that is, types of the form +async T, for some type T.

+

The only way to read or modify the state (count) of the +Counter actor is through its shared functions.

+

A value of type async T is a future. The producer of the +future completes the future when it returns a result, either a value or +error.

+

Unlike objects and modules, actors can only expose functions, and +these functions must be shared. For this reason, Motoko +allows you to omit the shared modifier on public actor +functions, allowing the more concise, but equivalent, actor +declaration:

+
+

For now, the only place shared functions can be declared is in the +body of an actor or actor class. Despite this restriction, shared +functions are still first-class values in Motoko and can be passed as +arguments or results, and stored in data structures.

+

The type of a shared function is specified using a shared function +type. For example, the value inc has type +shared () → async Nat and could be supplied as a standalone +callback to some other service.

+

Actor types

+

Just as objects have object types, actors have actor types. The +Counter example above has the following type:

+
actor {
+  inc  : shared () -> async ();
+  read : shared () -> async Nat;
+  bump : shared () -> async Nat;
+}
+

Unlike objects and modules, actors can only expose functions, and +these functions must be shared. For now, the only place +shared functions can be declared is in the body of an actor or actor +class. Despite this restriction, shared functions are still first-class +values in Motoko and can be passed as arguments or results, and stored +in data structures.

+

The shared modifier is required on every member of an +actor. Motoko both elides them on display and allows you to omit them +when authoring an actor type.

+

Thus, the previous type can be expressed more succinctly as:

+
actor {
+  inc  : () -> async ();
+  read : () -> async Nat;
+  bump : () -> async Nat;
+}
+

Like object types, actor types support subtyping: an actor type is a +subtype of a more general one that offers fewer functions with more +general types.

+

Asynchronous behavior

+

Like other modern programming languages, Motoko permits an ergonomic +syntax for asynchronous communication among +components.

+

In the case of Motoko, each communicating component is an actor. As +an example of using actors, consider this three-line program:

+
let result1 = service1.computeAnswer(params);
+let result2 = service2.computeAnswer(params);
+finalStep(await result1, await result2)
+

This program’s behavior can be summarized as:

+
    +
  1. The program makes two requests (lines 1 and 2) to two distinct +services, each implemented as a Motoko actor or canister smart contract +implemented in some other language.

  2. +
  3. The program waits for each result to be ready (line 3) using the +keyword await on each result value.

  4. +
  5. The program uses both results in the final step (line 3) by +calling the finalStep function.

  6. +
+

The services interleave their executions rather than +wait for one another, since this reduces overall latency. If you try to +reduce latency this way without special language support, such +interleaving will quickly sacrifice clarity and simplicity.

+

Even in cases where there are no interleaving executions, for +example, if there were only one call above, not two, the programming +abstractions still permit clarity and simplicity for the same reason. +Namely, they signal to the compiler where to transform the program, +freeing the programmer from contorting the program’s logic in order to +interleave its execution with the underlying system’s message-passing +loop.

+

In the above example, the program uses await in line 3 +to express that interleaving behavior in a simple fashion.

+

In other programming languages that lack these abstractions, +developers would not merely call these two functions directly, but would +instead employ very advanced programming patterns, possibly registering +developer-provided “callback functions” within system-provided “event +handlers”. Each callback would handle an asynchronous event that arises +when an answer is ready. This kind of systems-level programming is +powerful, but very error-prone, since it decomposes a high-level data +flow into low-level system events that communicate through shared +state.

+

Traps and commit points

+

A trap is a non-recoverable runtime failure caused by errors such as +division-by-zero, out-of-bounds array indexing, numeric overflow, cycle +exhaustion or assertion failure.

+

A shared function call that executes without executing an +await expression never suspends and executes atomically. A +shared function that contains no await expression is +syntactically atomic.

+

Commit points

+

An atomic shared function whose execution traps has no visible effect +on the state of the enclosing actor or its environment - any state +change is reverted, and any message that it has sent is revoked. In +fact, all state changes and message sends are tentative during +execution: they are committed only after a successful commit point is +reached.

+

The points at which tentative state changes and message sends are +irrevocably committed are:

+
    +
  • Implicit exit from a shared function by producing a +result.

  • +
  • Explicit exit via return or throw +expressions.

  • +
  • Explicit await expressions.

  • +
+

Traps

+

A trap will only revoke changes made since the last commit point. In +particular, in a non-atomic function that does multiple awaits, a trap +will only revoke changes attempted since the last await - all preceding +effects will have been committed and cannot be undone.

+

Consider the following stateful Atomicity actor:

+
+

Calling the shared function atomic() will fail with an +error, since the last statement causes a trap. However, the trap leaves +the mutable variable s with value 0, not +1, and variable pinged with value +false, not true. This is because the trap +happens before the method atomic has executed an +await, or exited with a result. Even though +atomic calls ping(), ping() is +queued until the next commit point.

+

Calling the shared function nonAtomic() will also fail +with an error due to a trap. In this function, the trap leaves the +variable s with value 3, not 0, +and variable pinged with value true, not +false. This is because each await commits its +preceding side-effects, including message sends. Even though +f is complete by the second await, this await also forces a +commit of the state, suspends execution and allows for interleaved +processing of other messages to this actor.

+ + diff --git a/docs/html/advanced-discussion.html b/docs/html/advanced-discussion.html new file mode 100644 index 00000000000..e31c7c6243b --- /dev/null +++ b/docs/html/advanced-discussion.html @@ -0,0 +1,197 @@ + + + + + + + md/attic/advanced-discussion.md + + + + +
+

md/attic/advanced-discussion.md

+
+ +

Advanced discussion topics

+ + + diff --git a/docs/html/arguments.html b/docs/html/arguments.html new file mode 100644 index 00000000000..3c6ba48d6ef --- /dev/null +++ b/docs/html/arguments.html @@ -0,0 +1,265 @@ + + + + + + + md/writing-motoko/arguments.md + + + + +
+

md/writing-motoko/arguments.md

+
+ +

Arguments

+

Overview

+

Arguments can be passed to an actor's function for the function to +use as input. Arguments can be primitive +values, such as Int, Nat, Bool, or Text, or they can be +non-primitive values such as tuples, arrays, or objects. To showcase a +basic example of how an actor can accept an argument, this page will use +an example Motoko actor that accepts multiple text arguments.

+

Single text argument

+

First, define an argument that has a location function +and the name argument with a city +argument:

+
actor {
+public func location(city : Text) : async Text {
+    return "Hello, " # city # "!";
+};
+};
+

Once your canister is deployed, +you can call the location method in the program and pass +your city argument of type Text by running the following +command:

+
dfx canister call location_hello_backend location "San Francisco"
+

Passing multiple arguments

+

You might want to try modifying the source code to return different +results. For example, you might want to modify the location +function to return multiple city names.

+

Revise the location function with two new functions:

+
actor {
+
+public func location(cities : [Text]) : async Text {
+    return "Hello, from " # (debug_show cities) # "!";
+};
+
+public func location_pretty(cities : [Text]) : async Text {
+    var str = "Hello from ";
+    for (city in cities.vals()) {
+        str := str # city # ", ";
+    };
+    return str # "bon voyage!";
+}
+};
+
+

You might notice that Text +in this code example is enclosed by square ([ ]) brackets. +By itself, Text represents a +(UTF-8 encoded) sequence of Unicode characters. Placing square brackets +around a type describes an array of that type. In this +context, therefore, [Text] indicates an array of text +values, enabling the program to accept multiple text values as an +array.

+

For information about the functions that perform operations on +arrays, see the description of the Array +module in the Motoko base library or the Motoko programming +language reference. For another example focused on the use of +arrays, see the quick +sort project in the examples repository.

+

Call the location method in the program and pass your +city argument using the Candid interface description syntax +by running the following command:

+
dfx canister call favorite_cities location '(vec {"San Francisco";"Paris";"Rome"})'
+

The command uses the Candid interface description syntax +(vec { val1; val2; val3; }) to return a vector of values. +For more information about the Candid interface description language, +see the Candid +language guide.

+ + diff --git a/docs/html/async-data.html b/docs/html/async-data.html new file mode 100644 index 00000000000..ef1c65f9029 --- /dev/null +++ b/docs/html/async-data.html @@ -0,0 +1,304 @@ + + + + + + + md/writing-motoko/async-data.md + + + + +
+

md/writing-motoko/async-data.md

+
+ +

Async data

+

Overview

+

On ICP, communication between canisters is asynchronous. Sending a +message together with a callback from one canister to another schedules +a request in the receiver. Completion of the request triggers the +callback to the sender, allowing the sender to process the result.

+

In Motoko, sending an ICP asynchronous message is abstracted as +calling a shared function that returns an asynchronous result. Like +several other languages, Motoko offers async and +await to support convenient programming with asynchronous +functions and computations.

+

In Motoko, executing an asynchronous expression, whether a call to a +shared function, or just a local async expression, produces +a future, an object of type async T, for some result type +T. Instead of blocking the caller until the call has +returned, the message is enqueued on the callee and the future +representing that pending request is immediately returned to the caller. +The future is a placeholder for the eventual result of the request that +the caller can later query.

+

The syntax await synchronizes on a future, and suspends +computation until the future is completed by its producer.

+

Between issuing the request and deciding to wait for the result, the +caller is free to do other work. Once the callee has processed the +request, the future is completed and its result made available to the +caller. If the caller is waiting on the future, its execution can resume +with the result, otherwise the result is simply stored in the future for +later use.

+

The combination of async/await constructs +simplifies asynchronous programming by allowing awaits to +be embedded within ordinary sequential code, without requiring tricky +management of asynchronous callbacks.

+

Async functions

+

Here is an example program that uses async functions:

+
+

The Counter actor declares one field and three public, +shared functions:

+
    +
  • The field count is mutable, initialized to zero and +implicitly private.

  • +
  • Function inc() asynchronously increments the counter +and returns a future of type async () for +synchronization.

  • +
  • Function read() asynchronously reads the counter +value and returns a future of type async Nat containing its +value.

  • +
  • Function bump() asynchronously increments and reads +the counter.

  • +
+

The only way to read or modify the state (count) of the +Counter actor is through its shared functions.

+

Using await +to consume async futures

+

The caller of a shared function typically receives a future, a value +of type async T for some T.

+

The only thing the caller can do with this future is wait for it to +be completed by the producer, throw it away, or store it for later +use.

+

To access the result of an async value, the receiver of +the future uses an await expression.

+

For example, to use the result of Counter.read() above, +we can first bind the future to an identifier a, and then +await a to retrieve the underlying Nat, n:

+
let a : async Nat = Counter.read();
+let n : Nat = await a;
+

The first line immediately receives a future of the counter value, +but does not wait for it, and thus cannot use it as a natural number +yet.

+

The second line awaits this future and extracts the +result, a natural number. This line may suspend execution until the +future has been completed.

+

Typically, one rolls the two steps into one and just awaits an +asynchronous call directly:

+
let n : Nat = await Counter.read();
+

Unlike a local function call, which blocks the caller until the +callee has returned a result, a shared function call immediately returns +a future, f, without blocking. Instead of blocking, a later +call to await f suspends the current computation until +f is complete. Once the future is completed (by the +producer), execution of await p resumes with its result. If +the result is a value, await f returns that value. +Otherwise the result is some error, and await f propagates +the error to the consumer of await f.

+

Awaiting a future a second time will just produce the same result, +including re-throwing any error stored in the future. Suspension occurs +even if the future is already complete; this ensures state changes and +message sends prior to every await are committed.

+

:::danger

+

A function that does not await in its body is guaranteed +to execute atomically. In particular, the environment cannot change the +state of the actor while the function is executing. If a function +performs an await, however, atomicity is no longer +guaranteed. Between suspension and resumption around the +await, the state of the enclosing actor may change due to +concurrent processing of other incoming actor messages. It is the +programmer’s responsibility to guard against non-synchronized state +changes. A programmer may, however, rely on any state change prior to +the await being committed.

+

:::

+

For example, the implementation of bump() above is +guaranteed to increment and read the value of count, in one +atomic step. The following alternative implementation does not have the +same semantics and allows another client of the actor to interfere with +its operation.

+
  public shared func bump() : async Nat {
+    await inc();
+    await read();
+  };
+

Each await suspends execution, allowing an interloper to +change the state of the actor. By design, the explicit +awaits make the potential points of interference clear to +the reader.

+ + diff --git a/docs/html/basic-concepts.html b/docs/html/basic-concepts.html new file mode 100644 index 00000000000..558ff88a87f --- /dev/null +++ b/docs/html/basic-concepts.html @@ -0,0 +1,470 @@ + + + + + + + md/getting-started/basic-concepts.md + + + + +
+

md/getting-started/basic-concepts.md

+
+ +

Basic concepts and terms

+

Overview

+

Motoko is designed for distributed programming with +actors. When programming on ICP in Motoko, each actor +represents an ICP canister smart contract with a Candid interface. +Within Motoko, the term actor is used to refer to any canister authored +in any language that deploys to ICP. The role of Motoko is to make these +actors easy to author and use programmatically once deployed.

+

Before you begin writing canisters in Motoko, you should be familiar +with a few of the basic concepts and terms specific to Motoko.

+

Values

+

Primitive values

+

Motoko supports the following primitive types and values:

+
    +
  • Bool: Boolean values +(true and false).

  • +
  • Int: Integers +(…​,-2, -1, 0, 1, +2, …​) - bounded and unbounded variants.

  • +
  • Nat: Natural numbers +(0, 1, 2, …​) - bounded and +unbounded variants.

  • +
  • Char: Unicode text characters ('a', +'B', '☃').

  • +
  • Text: Text values of +strings of unicode characters.

  • +
+

By default, integers and natural +numbers are unbounded and do not overflow. +Instead, they use representations that grow to accommodate any finite +number.

+

For practical reasons, Motoko also includes bounded +types for integers and natural numbers, distinct from the default +versions. Each bounded variant has a fixed bit-width (one of +8, 16, 32, 64) that +determines the range of representable values, and each carries the +potential for overflow. Exceeding a bound is a run-time fault that +causes the program to trap.

+

There are no unchecked, uncaught overflows in Motoko, except in +well-defined situations, for explicitly wrapping +operations, indicated by a conventional % character in the +operator. The language provides primitive built-ins to convert between +these various number representations.

+

Non-primitive values

+

Motoko permits user-defined types and each of the following +non-primitive value forms and associated types:

+ +

For precise language definitions of primitive and non-primitive +values, see the language +reference.

+

Printing values

+

The function print, from base library Debug, accepts a text string of +type Text as input, and +produces the unit value of unit type or (), as its +output.

+

Because unit values carry no information, all values of type unit are +identical, so the print function doesn’t actually produce +an interesting result. Instead of a result, the function +print has the effect of emitting the text string in a +human-readable form to the output terminal. Functions that have side +effects, such as emitting output or modifying state, are often called +impure. Functions that just return values without +further side-effects, are called pure.

+

You can transform most Motoko values into human-readable text strings +for debugging purposes, without having to write those transformations by +hand. The debug_show primitive permits converting a large +class of values into values of type Text.

+

Motoko program syntax

+

Each Motoko program is comprised of declarations and +expressions whose syntactic classes are distinct but related.

+

Declarations introduce immutable variables, +mutable state, actors, +objects, classes and other types. +Declarations can be mutually recursive, but in cases where they are not, +they permit substitution semantics such as replacing values with an +equal value.

+

Expressions describe computations that involve these notions.

+

To deploy a valid program to ICP, the program must consist of an +actor expression introduced with the keyword actor.

+

As a starting point, the following code snippet consists of two +declarations for the variables x and y +followed by an expression to form a single program:

+
let x = 1;
+let y = x + 1;
+x * y + x;
+

This program’s type is Nat +(natural number), and when run, it evaluates to the Nat value of 3.

+

This program is a declaration list that consists of three +declarations:

+
    +
  1. Immutable variable x, via declaration +let x = 1;.

  2. +
  3. Immutable variable y, via declaration +let y = x + 1;.

  4. +
  5. An unnamed, implicit variable holding the final expression’s +value, x * y + x.

  6. +
+

The expression x * y + x illustrates that each +expression can be thought of as a declaration where necessary, since the +language implicitly declares an unnamed variable with that expression’s +result value.

+

When the expression appears as the final declaration, this expression +may have any type. Here, the expression x * y + x has type +Nat.

+

Expressions that do not appear at the end, but rather within the list +of declarations must have unit type ().

+

Unit-type restrictions can be ignored by explicitly using the +ignore keyword to disregard any unused result values.

+

Lexical scoping

+

A declaration list is not itself an expression, so you cannot declare +another variable with its final value.

+

Block expressions can be formed from a list of +declarations by enclosing it with matching curly braces. Blocks are only +allowed as sub-expressions of control flow expressions like +if, loop, case, etc. A block +expression produces a value and, when enclosed in parentheses, can occur +within some larger, compound expression.

+

In all other places, do { … } is used to represent block +expressions and distinguish blocks from object literals. For example, +do {} is the empty block of type (), while +{} is an empty record of record type {}. This +block form preserves the autonomy of the declaration list and its choice +of variable names. This means that variables' scopes may nest, but they +may not interfere as they nest. Language theorists call this idea +lexical scoping.

+

Aside from mathematical clarity, the chief practical benefit of +lexical scoping is security and its use in building +compositionally-secure systems. Specifically, Motoko gives very strong +composition properties. For example, nesting your program within a +program you do not trust cannot arbitrarily redefine your variables with +different meanings.

+

Type soundness

+

Each Motoko expression that type checks is considered +well-typed. The type of a Motoko +expression serves as a promise from the language to the developer about +the future behavior of the program, if executed.

+

First, each well-typed program will evaluate without undefined +behavior. There is a precise space of meaningful programs. The type +system enforces that programs stay within it and that all well-typed +programs have a precise meaning.

+

Furthermore, the types make a precise prediction over the program’s +result. If it yields control, the program will generate a result +value that agrees with that of the original program.

+

In either case, the static and dynamic views of the program are +linked by and agree with the static type system. This agreement is the +central principle of a static type system, and is delivered by Motoko as +a core aspect of its design.

+

The same type system also enforces that asynchronous interactions +agree between static and dynamic views of the program, and that the +resulting messages generated never mismatch at runtime. This agreement +is similar in spirit to the caller/callee argument type and return type +agreements that one ordinarily expects in a typed language.

+

Type annotations and +variables

+

Variables relate static names and static types with dynamic values +that are present only at runtime.

+

In this sense, Motoko types provide a form of trusted, +compiler-verified documentation in the program source code.

+

Consider this very short program:

+
let x : Nat = 1
+

In this example, the compiler infers that the expression +1 has type Nat, +and that x has the same type.

+

In this case, we can omit this annotation without changing the +meaning of the program:

+
let x = 1
+

Except for some esoteric situations involving operator overloading, +type annotations do not typically affect the meaning of the program as +it runs. If they are omitted and the compiler accepts the program, as is +the case above, the program has the same meaning and behavior as it did +originally.

+

However, sometimes type annotations are required by the compiler to +infer other assumptions and to check the program as a whole. When they +are added and the compiler still accepts the program, you can confirm +that the added annotations are consistent with the existing ones.

+

Type errors and messages

+

Motoko is a statically typed programming language. That means that +the compiler will reject any program that contains obviously +non-sensical code.

+

For example, while adding two numbers is allowed, adding a number to +a text value makes no sense to the Motoko compiler and is flagged as an +error that must be fixed before the code can be run or deployed.

+

The rules that Motoko applies to verify the correctness of code +before compiling and running it are called its type system. Motoko's +type system will detect and reject static errors such as applying a +function to the wrong number of arguments, or to arguments of the wrong +type.

+

The type system is a safety feature that prevents a slew of errors +that would otherwise have to be detected and reported at runtime, when +they would be difficult or impossible to address.

+

Motoko base library

+

For various practical language engineering reasons, the design of +Motoko strives to minimize built-in types and operations.

+

Instead, whenever possible, the Motoko base library provides the +types and operations that make the language feel complete. However, this +base library is still under development, and is still incomplete.

+

The Motoko base library lists a +selection of modules, focusing on core features used in the examples +that are unlikely to change radically. The base library APIs will likely +evolve over time and in particular, grow in size and number as Motoko +matures.

+

To import from the base library, use the import keyword. +Give a local module name to introduce, in this example D +for “Debug”, and a URL where the import +declaration may locate the imported module:

+
+

In this case, we import Motoko code with the mo: prefix, +specify the base/ path, followed by the module’s file name +Debug.mo minus its extension.

+

Traps

+

Some errors, such as division by zero, out-of-bounds array indexing, +and pattern match failure are by design not prevented by the type +system, but instead cause dynamic faults called +traps.

+

Because the meaning of execution is ill-defined after a faulting +trap, execution of the code ends by aborting at the trap.

+

:::note

+

Traps that occur within actor messages are more subtle: they don’t +abort the entire actor, but prevent that particular message from +proceeding, rolling back any yet uncommitted state changes. Other +messages on the actor will continue execution.

+

:::

+

Occasionally it can be useful to force an unconditional trap, with a +user-defined message.

+

The Debug library +provides the function trap(t) for this purpose, which can +be used in any context:

+
import Debug "mo:base/Debug";
+
+Debug.trap("oops!");
+

Assertions allow you to conditionally trap when some +Boolean test fails to hold, but continue execution otherwise:

+
let n = 65535;
+assert n % 2 == 0; // traps when n not even
+

Because an assertion may succeed, and thus proceed with execution, it +may only be used in context where a value of type () is +expected.

+ + diff --git a/docs/html/caller-id.html b/docs/html/caller-id.html new file mode 100644 index 00000000000..c5425073ff9 --- /dev/null +++ b/docs/html/caller-id.html @@ -0,0 +1,247 @@ + + + + + + + md/writing-motoko/caller-id.md + + + + +
+

md/writing-motoko/caller-id.md

+
+ +

Caller identification

+

Overview

+

Motoko’s shared functions support a simple form of caller +identification that allows you to inspect the ICP +principal associated with the caller of a function. +Principals are a value that identifies a unique user or canister.

+

You can use the principal associated with the caller of a function to +implement a basic form of access control in your program.

+

Using caller identification

+

In Motoko, the shared keyword is used to declare a +shared function. The shared function can also declare an optional +parameter of type {caller : Principal}.

+

To illustrate how to access the caller of a shared function, consider +the following:

+
shared(msg) func inc() : async () {
+  // ... msg.caller ...
+}
+

In this example, the shared function inc() specifies a +msg parameter, a record, and the msg.caller +accesses the principal field of msg.

+

The calls to the inc() function do not change. At each +call site, the caller’s principal is provided by the system, not the +user. The principal cannot be forged or spoofed by a malicious user.

+

To access the caller of an actor class constructor, you use the same +syntax on the actor class declaration. For example:

+
shared(msg) actor class Counter(init : Nat) {
+  // ... msg.caller ...
+}
+

Adding access control

+

To extend this example, assume you want to restrict the +Counter actor so it can only be modified by the installer +of the Counter. To do this, you can record the principal +that installed the actor by binding it to an owner +variable. You can then check that the caller of each method is equal to +owner like this:

+
+

In this example, the assert (owner == msg.caller) +expression causes the functions inc() and +bump() to trap if the call is unauthorized, preventing any +modification of the count variable while the +read() function permits any caller.

+

The argument to shared is just a pattern. You can +rewrite the above to use pattern matching:

+
+

:::note

+

Simple actor declarations do not let you access their installer. If +you need access to the installer of an actor, rewrite the actor +declaration as a zero-argument actor class instead.

+

:::

+

Principals support equality, ordering, and hashing, so you can +efficiently store principals in containers for functions such as +maintaining an allow or deny list. More operations on principals are +available in the principal base +library.

+ + diff --git a/docs/html/candid-ui.html b/docs/html/candid-ui.html new file mode 100644 index 00000000000..1954491d818 --- /dev/null +++ b/docs/html/candid-ui.html @@ -0,0 +1,220 @@ + + + + + + + md/writing-motoko/candid-ui.md + + + + +
+

md/writing-motoko/candid-ui.md

+
+ +

Candid UI

+

Overview

+

The canister interface description language, often referred to as +Candid or more generally as the IDL, provides a common language for +specifying the signature of a canister smart contract.

+

Candid provides a unified way for you to interact with canister smart +contracts that are written in different languages or accessed using +different tools. For example, Candid provides a consistent view of a +service whether the underlying program is native Rust, JavaScript, or +any other programming language. Candid also enables different tools, +such as the dfx command-line interface and the Network +Nervous System dapp, to share a common description for a service.

+

Based on the type signature of the actor, Candid also provides a web +interface that allows you to call canister functions for testing and +debugging.

+

Using Candid UI

+

To learn how to use Candid, check out the documentation here:

+ + + diff --git a/docs/html/compatibility.html b/docs/html/compatibility.html new file mode 100644 index 00000000000..da9a3065f70 --- /dev/null +++ b/docs/html/compatibility.html @@ -0,0 +1,362 @@ + + + + + + + md/canister-maintenance/compatibility.md + + + + +
+

md/canister-maintenance/compatibility.md

+
+ +

Verifying upgrade +compatibility

+

Overview

+

When upgrading a canister, it is important to verify that an upgrade +can proceed without:

+
    +
  • Breaking clients due to a Candid interface change.

  • +
  • Discarding the Motoko stable state due to a change in stable +declarations.

  • +
+

Motoko checks these properties statically before attempting the +upgrade.

+

Upgrade example

+

The following is a simple example of how to declare a stateful +counter:

+
+

In this example, when the counter is upgraded, its state is lost.

+

To fix this, you can declare a stable variable that is retained +across upgrades:

+
+

If the variable state were not declared +stable, state would restart from +0 on upgrade.

+

Evolving the Candid +interface

+

In this extension of our interface, old clients remain satisfied, +while new ones get extra features such as the read query in +this example.

+
+

Changing the stable +interface

+

Let's take a look at an example where the counter is refactored from +using Int to Nat.

+
+

Now, the code has been upgraded, but the counter value is back to +0. The state was lost in an upgrade.

+

This is because the Candid interface evolved safely​ but the stable +types did not.

+

An upgrade must be able to:

+
    +
  • Consume any stable variable value from its predecessor, +or

  • +
  • Run the initializer for a new stable variable.

  • +
+

Since Int </: Nat, the upgrade logic discards the +saved Int and re-runs the +initializer instead. The upgrade silently "succeeded", resetting the +counter to 0.

+

Stable type signatures

+

A stable type signature describes the stable content of a Motoko +actor. You can think of this as the interior interface of the actor, +that it presents to its future upgrades.

+

For example, v2's stable types:

+
+

An upgrade from v2 to v3's stable types +requires consuming an Int as a +Nat, which is a type +error. For example, -1 is an Int, but is not a Nat.

+
+

Dual interface evolution

+

An upgrade is safe provided that the Candid interface evolves to a +subtype and the stable interface evolves to a compatible one: a stable +variable must either be newly declared, or re-declared at a supertype of +its old type.

+

Consider the following four versions of the counter example:

+

Version v0 with Candid interface v0.did and +stable type interface v0.most:

+
+
+

Version v1 with Candid interface v1.did and +stable type interface v1.most,

+
+
+

Version v2 with Candid interface v2.did and +stable type interface v2.most,

+
+
+

Version v3 with Candid interface v3.did and +stable type interface v3.most:

+
+
+

Upgrade tooling

+

The Motoko compiler (moc) supports:

+
    +
  • moc --stable-types …​: Emits stable types to a +.most file.

  • +
  • moc --stable-compatible <pre> <post>: +Checks two .most files for upgrade compatibility.

  • +
+

To upgrade from cur.wasm to nxt.wasm we +need check that both the Candid interface and stable variables are +compatible.

+
didc check nxt.did cur.did  // nxt <: cur
+moc --stable-compatible cur.most nxt.most  // cur <<: nxt
+

Using the versions above, the upgrade from v2 to +v3 fails this check:

+
> moc --stable-compatible v2.most v3.most
+(unknown location): Compatibility error [M0170], stable variable state of previous type
+  var Int
+cannot be consumed at new type
+  var Nat
+

Because of the compatibility error, you should not attempt to upgrade +from v2.wasm to v3.wasm. The result of +upgrading is unpredictable. At best, the upgrade will detect the +incompatibility, trap and roll back to the current version, as if the +upgrade had never been attempted. At worst, the upgrade will appear to +succeed, but lose some or all of the state of the previous version, +re-initializing some of the stable variables you intended to +preserve.

+

One way to correctly change the logical state to Nat, is to introduce a new stable +variable, newState, of type Nat, initialized from the old one +(state). Unlike the stable signature of v3.wasm, the stable +signature of v4.wasm:

+
+
+

Incompatible upgrade example

+

A common, real-world example of an incompatible upgrade can be found +on +the forum.

+

In that example, a user was attempting to add a field to the record +payload of an array, by upgrading from stable type interface:

+
type Card = {
+  title : Text
+};
+actor {
+  stable var map: [(Nat32, Card)]
+}
+

to incompatible stable type interface:

+
type Card = {
+  title : Text;
+  description : Text
+};
+actor {
+  stable var map : [(Nat32, Card)]
+}
+

Adding a new record field does not work. The reason is simple: the +upgrade would need to supply values for the new field out of thin air. +In this example, the upgrade would need to conjure up some value for the +description field of every existing card in +map.

+

Metadata sections

+

Motoko embeds .did and .most files as Wasm +custom sections for use by other tools, e.g. dfx.

+

dfx deploy and +dfx canister install --all --mode upgrade commands check +that the interface is compatible, and if not, show this message and ask +if you want to continue:

+
let msg = format!("Candid interface compatibility check failed for canister '{}'.\nYou are making a BREAKING change. Other canisters or frontend clients relying on your canister may stop working.\n\n", canister_info.get_name()) + &err;
+ + diff --git a/docs/html/compiler-ref.html b/docs/html/compiler-ref.html new file mode 100644 index 00000000000..9dd2c7a9a01 --- /dev/null +++ b/docs/html/compiler-ref.html @@ -0,0 +1,471 @@ + + + + + + + md/reference/compiler-ref.md + + + + +
+

md/reference/compiler-ref.md

+
+ +

Compiler reference

+

Overview

+

The Motoko compiler (moc) is the primary tool for +compiling Motoko programs into executable WebAssembly (Wasm) modules. +The compiler runs in the background when you build projects using the IC +SDK. If you invoke the compiler directly on the command-line, you +can press CTRL-C to exit.

+

This section provides compiler command-line reference +information.

+

moc

+

Use the Motoko compiler (moc) to compile Motoko programs +into executable WebAssembly (Wasm) modules.

+

Basic usage

+
moc [option] [file ...]
+

Options

+

You can use the following options with the moc +command.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OptionDescription
--actor-idl <idl-path>Specifies a path to actor IDL (Candid) files.
--actor-alias <alias> <principal>Specifies an actor import alias.
--args <file>Read additional newline separated command line arguments from +<file>.
--args0 <file>Read additional NUL separated command line arguments +from <file>.
-cCompile to WebAssembly.
--checkPerforms type checking only.
--compacting-gcUse compacting GC.
--copying-gcUse copying GC (default).
--debugRespects debug expressions in the source (the default).
--error-detail <n>Set level of error message detail for syntax errors, n in [0..3] +(default 2).
-fno-shared-codeDo not share low-level utility code: larger code size but decreased +cycle consumption (default).
-fshared-codeDo share low-level utility code: smaller code size but increased +cycle consumption.
--generational-gcUse generational GC
-help,--helpDisplays usage information.
--hide-warningsHides compiler warnings.
-WerrorTreat warnings as errors.
--incremental-gcUse incremental GC
--idlCompile binary and emit Candid IDL specification to +.did file.
-iRuns the compiler in an interactive read–eval–print loop (REPL) +shell so you can evaluate program execution (implies -r).
--mapOutputs a JavaScript source map.
--max-stable-pages <n>Set maximum number of pages available for library +ExperimentStableMemory.mo (default 65536).
-no-system-apiDisables system API imports.
-no-timerDisables timer API imports and hides timer primitives.
-o <file>Specifies the output file.
-p <n>Sets the print depth.
--package <package-name> <package-path>Specifies a <package-name> +<package-path> pair, separated by a space.
--public-metadata <name>Emit ICP custom section <name> +(candid:args or candid:service or +motoko:stable-types or motoko:compiler) as +public (default is private).
--omit-metadata <name>Omit ICP custom section <name> +(candid:args or candid:service or +motoko:stable-types or motoko:compiler).
--print-depsPrints the dependencies for a given source file.
-rInterprets programs.
--releaseIgnores debug expressions in the source.
--stable-regionsForce eager initialization of stable regions metadata (for testing +purposes); consumes between 386KiB or 8MiB of additional physical stable +memory, depending on current use of ExperimentalStableMemory.
--stable-typesCompile binary and emit signature of stable types to +.most file.
--stable-compatible <pre> <post>Test upgrade compatibility between stable-type signatures +<pre> and <post>.
--rts-stack-pages <n>Set maximum number of pages available for runtime system stack +(default 32).
--trap-on-call-errorTrap, don't throw an Error, when an IC call fails +due to destination queue full or freezing threshold is crossed.
Emulates behaviour of moc versions < 0.8.0.
-tActivates tracing in interpreter.
-vGenerates verbose output.
--versionDisplays version information.
-wasi-system-apiUses the WASI system API (wasmtime).
+ + diff --git a/docs/html/control-flow.html b/docs/html/control-flow.html new file mode 100644 index 00000000000..2e7f11c82f3 --- /dev/null +++ b/docs/html/control-flow.html @@ -0,0 +1,488 @@ + + + + + + + md/writing-motoko/control-flow.md + + + + +
+

md/writing-motoko/control-flow.md

+
+ +

Imperative control flow

+

Overview

+

There are two key categories of control flow:

+
    +
  • Declarative : The structure of some value guides +both control and the selection of the next expression to evaluate, such +as in if and switch expressions.

  • +
  • Imperative : Control changes abruptly according +to a programmer’s command, abandoning regular control flow. Examples are +break and continue, but also +return and throw.

  • +
+

Imperative control flow often goes hand-in-hand with state changes +and other side effects, such as error handling and input/output.

+

Early return from +func

+

Typically, the result of a function is the value of its body. +Sometimes, during evaluation of the body, the result is available before +the end of evaluation. In such situations the +return <exp> construct can be used to abandon the +rest of the computation and immediately exit the function with a result. +Similarly, where permitted, throw may be used to abandon a +computation with an error.

+

When a function has unit result type, the shorthand +return may be used instead of the equivalent +return ().

+

Loops and labels

+

Motoko provides several kinds of repetition constructs, +including:

+
    +
  • for expressions for iterating over members of +structured data.

  • +
  • loop expressions for programmatic repetition, +optionally with termination condition.

  • +
  • while loops for programmatic repetition with entry +condition.

  • +
+

Any of these can be prefixed with a label <name> +qualifier to give the loop a symbolic name. Named loops are useful for +imperatively changing control flow to continue from the entry or exit of +the named loop, such as:

+
    +
  • Re-entering the loop with +continue <name>.

  • +
  • Exiting the loop altogether with +break <name>.

  • +
+

In the following example, the for expression loops over +characters of some text and abandons iteration as soon as an exclamation +sign is encountered.

+
import Debug "mo:base/Debug";
+label letters for (c in "ran!!dom".chars()) {
+  Debug.print(debug_show(c));
+  if (c == '!') { break letters };
+  // ...
+}
+

Labeled expressions

+

There are two other facets to label​s that are less +mainstream, but come in handy in certain situations:

+
    +
  • label​s can be typed.

  • +
  • Any expression, not just loops, can be named by prefixing it with +a label. break allows one to short-circuit the expression’s +evaluation by providing an immediate value for its result. This is +similar to exiting a function early using return, but +without the overhead of declaring and calling a function.

  • +
+

The syntax for type-annotated labels is +label <name> : <type> <expr>, signifying +that any expression can be exited using a +break <name> <alt-expr> construct that returns +the value of <alt-expr> as the value of +<expr>, short-circuiting evaluation of +<expr>.

+

Judicious use of these constructs allows the programmer to focus on +the primary program logic and handle exceptional case via +break.

+
import Text "mo:base/Text";
+import Iter "mo:base/Iter";
+
+type Host = Text;
+let formInput = "us@dfn";
+
+let address = label exit : ?(Text, Host) {
+  let splitted = Text.split(formInput, #char '@');
+  let array = Iter.toArray<Text>(splitted);
+  if (array.size() != 2) { break exit(null) };
+  let account = array[0];
+  let host = array[1];
+  // if (not (parseHost(host))) { break exit(null) };
+  ?(account, host)
+}
+

Labeled common expressions don’t allow continue. In +terms of typing, both <expr> and +<alt-expr>​'s types must conform with the label’s +declared <type>. If a label is only given a +<name>, then its <type> defaults +to unit (()). Similarly a break without an +<alt-expr> is shorthand for the value unit +(()).

+

Option blocks and null +breaks

+

Motoko lets you opt in to null values, tracking possible +occurrences of null values using option types of the form +?T. This is to both to encourage you to avoid using +null values when possible, and to consider the possibility +of null values when necessary. Motoko simplifies the +handling of option types with some dedicated syntax: option blocks and +null breaks.

+

The option block, do ? <block>, produces a value +of type ?T, when block <block> has type +T and, importantly, introduces the possibility of a break +from <block>. Within a +do ? <block>, the null break +<exp> !, tests whether the result of the expression, +<exp>, of unrelated option type, ?U, is +null. If the result <exp> is +null, control immediately exits the +do ? <block> with value null. Otherwise, +the result of <exp> must be an option value +?v, and evaluation of <exp> ! proceeds +with its contents, v of type U.

+

The following example defines a simple function that evaluates +expressions built from natural numbers, division and a zero test, +encoded as a variant type:

+ + +
+

To guard against division by 0 without trapping, the +eval function returns an option result, using +null to indicate failure.

+

Each recursive call is checked for null using +!, immediately exiting the outer do ? block, +and then the function itself, when a result is null.

+

Repetition with loop

+

The simplest way to indefinitely repeat a sequence of imperative +expressions is by using a loop construct:

+
loop { <expr1>; <expr2>; ... }
+

The loop can only be abandoned with a return or +break construct.

+

A re-entry condition can be affixed to allow a conditional repetition +of the loop with loop <body> while <cond>.

+

The body of such a loop is always executed at least once.

+

while loops with +precondition

+

Sometimes an entry condition is needed to guard each iteration of a +loop. For this kind of repetition use the +while <cond> <body> form of loop:

+
while (earned < need) { earned += earn() };
+

Unlike a loop, the body of a while loop may +never be executed.

+

for loops for +iteration

+

An iteration over elements of some homogeneous collection can be +performed using a for loop. The values are drawn from an +iterator and bound to the loop pattern in turn.

+
let carsInStock = [
+  ("Buick", 2020, 23.000),
+  ("Toyota", 2019, 17.500),
+  ("Audi", 2020, 34.900)
+];
+var inventory : { var value : Float } = { var value = 0.0 };
+for ((model, year, price) in carsInStock.vals()) {
+  inventory.value += price;
+};
+inventory
+

Using range with a +for loop

+

The range function produces an iterator of type +Iter<Nat> with the given lower and upper bound, +inclusive.

+

The following loop example prints the numbers 0 through +10 over its eleven iterations:

+
import Iter "mo:base/Iter";
+import Debug "mo:base/Debug";
+var i = 0;
+for (j in Iter.range(0, 10)) {
+  Debug.print(debug_show(j));
+  assert(j == i);
+  i += 1;
+};
+assert(i == 11);
+

More generally, the function range is a +class that constructs iterators over sequences of natural +numbers. Each such iterator has type Iter<Nat>.

+

As a constructor function, range has a function +type:

+
(lower : Nat, upper : Int) -> Iter<Nat>
+

Iter<Nat> is an iterator object type with a +next method that produces optional elements, each of type +?Nat:

+
type Iter<A> = {next : () -> ?A};
+

For each invocation, next returns an optional element of +type ?Nat.

+

The value null indicates that the iteration sequence has +terminated.

+

Until reaching null, each non-null value, +of the form ?n for some number n, contains the +next successive element in the iteration sequence.

+

Using revRange

+

The function revRange is a class that +constructs iterators, each of type Iter<Int>. As a +constructor function, it has a function type:

+
(upper : Int, lower : Int) -> Iter<Int>
+

Unlike range, the revRange function +descends in its iteration sequence, from an initial upper bound to a +final lower bound.

+

Using iterators of +specific data structures

+

Many built-in data structures come with pre-defined iterators. Below +table lists them

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TypeNameIteratorElementsElement type
[T]Array of T​svalsThe array’s membersT
[T]Array of T​skeysThe array’s valid indicesNat
[var T]Mutable array of T​svalsThe array’s membersT
[var T]Mutable array of T​skeysThe array’s valid indicesNat
TextTextcharsThe text’s charactersChar
BlobBlobvalsThe blob’s bytesNat8
+

User-defined data structures can define their own iterators. As long +they conform with the Iter<A> type for some element +type A, these behave like the built-in ones and can be +consumed with ordinary for-loops.

+ + diff --git a/docs/html/cycles.html b/docs/html/cycles.html new file mode 100644 index 00000000000..3ef4552b2dd --- /dev/null +++ b/docs/html/cycles.html @@ -0,0 +1,376 @@ + + + + + + + md/canister-maintenance/cycles.md + + + + +
+

md/canister-maintenance/cycles.md

+
+ +

Cycles

+

Overview

+

Usage of a canister's resources on ICP is measured and paid for in cycles.

+

In Motoko programs deployed on ICP, each actor represents a canister +and has an associated balance of cycles. The ownership of cycles can be +transferred between actors. Cycles are selectively sent and received +through shared function calls. A caller can choose to transfer cycles +with a call, and a callee can choose to accept cycles that are made +available by the caller. Unless explicitly instructed, no cycles are +transferred by callers or accepted by callees.

+

Callees can accept all, some, or none of the available cycles up to +limit determined by their actor’s current balance. Any remaining cycles +are refunded to the caller. If a call traps, all its accompanying cycles +are automatically refunded to the caller without loss.

+

In future, we may see Motoko adopt dedicated syntax and types to +support safer programming with cycles. For now, we provide a temporary +way to manage cycles through a low-level imperative API provided by the +ExperimentalCycles library +in package base.

+

:::note

+

This library is subject to change and likely to be replaced by more +high-level support for cycles in later versions of Motoko.

+

:::

+

The ExperimentalCycles +Library

+

The ExperimentalCycles +library provides imperative operations for observing an actor’s current +balance of cycles, transferring cycles and observing refunds.

+

The library provides the following operations:

+
    +
  • func balance() : (amount : Nat): Returns the actor’s +current balance of cycles as amount. Function +balance() is stateful and may return different values after +calls to accept(n), calling a function after +adding cycles, or resuming from await which +reflects a refund.

  • +
  • func available() : (amount : Nat): Returns the +currently available amount of cycles. This is the amount +received from the current caller, minus the cumulative amount +accepted so far by this call. On exit from the current +shared function or async expression via return +or throw any remaining available amount is automatically +refunded to the caller.

  • +
  • func accept<system>(amount : Nat) : (accepted : Nat): +Transfers amount from available() to +balance(). It returns the amount actually transferred, +which may be less than requested, for example, if less is available, or +if canister balance limits are reached. Requires system +capability.

  • +
  • func add<system>(amount : Nat) : (): Indicates +the additional amount of cycles to be transferred in the next remote +call, i.e. evaluation of a shared function call or async +expression. Upon the call, but not before, the total amount of units +added since the last call is deducted from +balance(). If this total exceeds balance(), +the caller traps, aborting the call. Requires system +capability.

  • +
  • func refunded() : (amount : Nat): Reports the +amount of cycles refunded in the last await of +the current context, or zero if no await has occurred yet. Calling +refunded() is solely informational and does not affect +balance(). Instead, refunds are automatically added to the +current balance, whether or not refunded is used to observe +them.

  • +
+

:::danger

+

Since cycles measure computational resources spent, the value of +balance() generally decreases from one shared function call +to the next.

+

The implicit register of added amounts, incremented on each +add, is reset to zero on entry to a shared function, and +after each shared function call or on resume from an await.

+

:::

+

Example

+

To illustrate, we will now use the ExperimentalCycles +library to implement a simple piggy bank program for saving cycles.

+

Our piggy bank has an implicit owner, a benefit callback +and a fixed capacity, all supplied at time of construction. +The callback is used to transfer withdrawn amounts.

+
+

The owner of the bank is identified with the implicit caller of +constructor PiggyBank(), using the shared pattern, +shared(msg). Field msg.caller is a Principal and is stored in +private variable owner for future reference. See principals and caller +identification for more explanation of this syntax.

+

The piggy bank is initially empty, with zero current +savings.

+

Only calls from owner may:

+
    +
  • Query the current savings of the piggy bank +(function getSavings()), or

  • +
  • Withdraw amounts from the savings (function +withdraw(amount)).

  • +
+

The restriction on the caller is enforced by the statements +assert (msg.caller == owner), whose failure causes the +enclosing function to trap without revealing the balance or moving any +cycles.

+

Any caller may deposit an amount of cycles, provided the +savings will not exceed capacity, breaking the piggy bank. +Because the deposit function only accepts a portion of the available +amount, a caller whose deposit exceeds the limit will receive an +implicit refund of any unaccepted cycles. Refunds are automatic and +ensured by the ICP infrastructure.

+

Since the transfer of cycles is unidirectional from caller to callee, +retrieving cycles requires the use of an explicit callback using the +benefit function, taken by the constructor as an argument. +Here, benefit is called by the withdraw +function, but only after authenticating the caller as +owner. Invoking benefit in +withdraw inverts the caller/caller relationship, allowing +cycles to flow upstream.

+

Note that the owner of the PiggyBank could supply a +callback that rewards a beneficiary distinct from +owner.

+

Here’s how an owner, Alice, might use an instance of +PiggyBank:

+
+

Alice imports the PiggyBank actor class as +a library so she can create a new PiggyBank actor on +demand.

+

Most of the action occurs in Alice's test() +function:

+
    +
  • Alice dedicates 10_000_000_000_000 of her own cycles +for running the piggy bank by calling +Cycles.add(10_000_000_000_000) just before creating a new +instance, porky, of the PiggyBank, passing +callback Alice.credit and capacity +(1_000_000_000). Passing Alice.credit +nominates Alice as the beneficiary of withdrawals. The +10_000_000_000_000 cycles, minus a small installation fee, +are credited to porky's balance without any further action +by the program's initialization code. You can think of this as an +electric piggy bank that consumes its own resources as its used. Since +constructing a PiggyBank is asynchronous, +Alice needs to await the result.

  • +
  • After creating porky, she first verifies that the +porky.getSavings() is zero using an +assert.

  • +
  • Alice dedicates 1_000_000 of her cycles +(Cycles.add<system>(1_000_000)) to transfer to +porky with the next call to porky.deposit(). +The cycles are only consumed from Alice’s balance if the call to +porky.deposit() succeeds.

  • +
  • Alice now withdraws half the amount, +500_000, and verifies that porky's savings +have halved. Alice eventually receives the cycles via a +callback to Alice.credit(), initiated in +porky.withdraw(). Note the received cycles are precisely +the cycles added in porky.withdraw(), before +it invokes its benefit callback +Alice.credit.

  • +
  • Alice withdraws another 500_000 cycles +to wipe out her savings.

  • +
  • Alice tries to deposit 2_000_000_000 +cycles into porky but this exceeds porky's +capacity by half, so porky accepts +1_000_000_000 and refunds the remaining +1_000_000_000 to Alice. Alice +verifies the refund amount (Cycles.refunded()), which has +been automatically restored to her balance. She also verifies +porky's adjusted savings.

  • +
  • Alice's credit() function simply +accepts all available cycles by calling +Cycles.accept<system>(available), checking the +actually accepted amount with an assert.

  • +
+

:::note

+

For this example, Alice is using her readily available cycles that +she already owns.

+

:::

+

:::danger

+

Because porky consumes cycles in its operation, it is +possible for porky to spend some or even all of Alice’s +cycle savings before she has a chance to retrieve them.

+

:::

+ + diff --git a/docs/html/dev-env.html b/docs/html/dev-env.html new file mode 100644 index 00000000000..b8d636782f9 --- /dev/null +++ b/docs/html/dev-env.html @@ -0,0 +1,274 @@ + + + + + + + md/getting-started/dev-env.md + + + + +
+

md/getting-started/dev-env.md

+
+ +

Developer environment

+

Overview

+

To develop and deploy Motoko canister smart contracts, you will need +a developer environment that contains the Motoko compiler and base +library. It is recommended to use the IC SDK, which includes +Motoko, along with dfx, a command-line tool used to create, +build, and deploy canisters on ICP.

+

Developer environments come in several types and formats, making +developing flexible and accessible.

+

Cloud environments

+

Gitpod and GitHub Codespaces are +browser-based development environments that can be used to build, test, +and run Motoko smart contracts.

+

Here are some starter projects for online Motoko canister +development:

+ +

Learn more about Gitpod +and GitHub +Codespaces for Motoko development.

+

Container environments

+

Developers may want to setup a containerized environment for Motoko +and other ICP-related development. Container environments are especially +useful for Windows-based systems, since dfx is not natively +supported on Windows.

+

Learn more about developer +containers and Docker +containers for Motoko development.

+

Motoko playground

+

Motoko playground is a +browser-based developer environment that allows for temporary deployment +and testing of canister smart contracts. Motoko playground can also be +utilized through the dfx deploy --playground command via +the CLI.

+

Canisters deployed to the Motoko playground use borrowed resources +from a canister pool and are limited to a deployment length of 20 +minutes. Therefore, the playground is not recommended for long-term +development.

+

Learn more about the Motoko +playground.

+

Local developer environment

+

Before you start developing Motoko, verify the following:

+
    +
  • +
  • +
  • +
  • +
  • +
  • +
+ + diff --git a/docs/html/errors.html b/docs/html/errors.html new file mode 100644 index 00000000000..7b144aa884c --- /dev/null +++ b/docs/html/errors.html @@ -0,0 +1,352 @@ + + + + + + + md/writing-motoko/errors.md + + + + +
+

md/writing-motoko/errors.md

+
+ +

Errors and options

+

Overview

+

There are three primary ways to represent and handle errors values in +Motoko:

+
    +
  • Option values with a non-informative null value that +indicates some error.

  • +
  • Result variants with a descriptive +#err value providing more information about the +error.

  • +
  • Error values that, in +an asynchronous context, can be thrown and caught similar to exceptions +and contain a numeric code and message.

  • +
+

Example

+

Consider building an API for a to-do application that wants to expose +a function allowing users to mark one of their tasks’s as "Done". This +simple example will accept a TodoId object and return an Int that represents how many +seconds the to-do has been open. This example assumes that it is running +in an actor, which returns an async value:

+
func markDone(id : TodoId) : async Int
+

The full application example can be found below:

+
+
+

In this example, there are conditions under which marking a to-do as +"Done" fails:

+
    +
  • The id could reference a non-existing +to-do.

  • +
  • The to-do might already be marked as done.

  • +
+

Let's look at the different ways to communicate these errors in +Motoko and slowly improve the example API.

+

Option/result

+

Using Option or Result is the preferred way +of signaling errors in Motoko. They work in both synchronous and +asynchronous contexts and make your APIs safer to use by encouraging +clients to consider the error cases as well as the success cases. +Exceptions should only be used to signal unexpected error states.

+

Error reporting with +Option types

+

A function that wants to return a value of type A or +signal an error can return a value of option type ?A and +use the null value to designate the error. In the above +example this means the markDone function returns an +async ?Seconds:

+

Definition:

+
+

Callsite:

+
+

The main drawback of this approach is that it conflates all possible +errors with a single, non-informative null value. The +callsite might be interested in why marking a Todo as done +has failed, but that information is lost by then, which means we can +only tell the user that "Something went wrong.".

+

Returning option values to signal errors should only be used if there +just one possible reason for the failure and that reason can be easily +determined at the callsite. One example of a good use case for this is a +HashMap lookup failing.

+

Error reporting with +Result types

+

While options are a built-in type, the Result is defined +as a variant type like so:

+
type Result<Ok, Err> = { #ok : Ok; #err : Err }
+

Because of the second type parameter, Err, the +Result type lets you select the type used to describe +errors. Define a TodoError type that the +markDone function will use to signal errors:

+
+

The original example is now revised as:

+

Definition:

+
+

Callsite:

+
+

Pattern matching

+

The first and most common way of working with Option and +Result is to use pattern matching. If you have a value of +type ?Text, you can use the switch keyword to +access the potential Text +contents:

+
+

Motoko does not let you access the optional value without also +considering the case that it is missing.

+

In the case of a Result, you can also use pattern +matching with the difference that you also get an informative value, not +just null, in the #err case:

+
+

Higher-order functions

+

Pattern matching can become tedious and verbose, especially when +dealing with multiple optional values. The base library exposes a +collection of higher-order functions from the Option and +Result modules to improve the ergonomics of error +handling.

+

Sometimes you’ll want to move between Option and +Result. A Hashmap lookup returns null on +failure, but maybe the caller has more context and can turn that lookup +failure into a meaningful Result. Other times you don’t +need the additional information a Result provides and just +want to convert all #err cases into null. For +these situations base provides the +fromOption and toOption functions in the +Result module.

+

Asynchronous errors

+

The last way of dealing with errors in Motoko is to use asynchronous +Error handling, a restricted +form of the exception handling familiar from other languages. Motoko +error values can only be thrown and caught in asynchronous contexts, +typically the body of a shared function or +async expression. Non-shared functions cannot +employ structured error handling. This means you can exit a shared +function by throwing an Error value and +try some code calling a shared function on another actor. +In this workflow, you can catch the failure as a result of +type Error, but you can’t +use these error handling constructs outside of an asynchronous +context.

+

Asynchronous Errors +should generally only be used to signal unexpected failures that you +cannot recover from and that you don’t expect many consumers of your API +to handle. If a failure should be handled by your caller, you should +make it explicit in your signature by returning a Result +instead. For completeness, here is the markDone example +with exceptions:

+

Definition:

+
+

Callsite:

+
+

How not to handle errors

+

A generally poor way of reporting errors is through the use of a +sentinel value. For example, for your markDone function, +you might decide to use the value -1 to signal that +something failed. The callsite then has to check the return value +against this special value and report the error. It's easy to not check +for that error condition and continue to work with that value in the +code. This can lead to delayed or even missing error detection and is +strongly discouraged.

+

Definition:

+
+

Callsite:

+
+ + diff --git a/docs/html/extrastuff.html b/docs/html/extrastuff.html new file mode 100644 index 00000000000..e0b735d6cfc --- /dev/null +++ b/docs/html/extrastuff.html @@ -0,0 +1,238 @@ + + + + + + + md/attic/extrastuff.md + + + + +
+

md/attic/extrastuff.md

+
+ +

Why +develop applications to run on the internet computer?

+

Motoko provides:

+
    +
  • A high-level language for programming applications to run on the +Internet Computer blockchain network.

  • +
  • A simple design that uses familiar syntax that is easy for +programmers to learn.

  • +
  • An actor-based programming model optimized for +efficient message handling.

  • +
  • An interpreter and compiler that you can use to test and compile +the WebAssembly code for autonomous applications.

  • +
  • Support for features not-yet implemented that anticipate future +extensions and improvement to WebAssembly.

  • +
+

Why a new language?

+

The Internet Computer provides a blockchain network that can support +programs written in different languages. The only requirement is that +the program must support compilation to WebAssembly code. WebAssembly +(commonly-abbreviated as Wasm) is a low-level computer instruction +format for virtual machines. Because WebAssembly code is designed to +provide portable low-level instructions that enable applications to be +deployed on many platforms such as the web, it is a natural fit for +deploying applications that are intended to run on the Internet +Computer. However, most of the higher-level languages - like C, C, and +Rust - that support compiling to WebAssembly are either too unsafe (for +example, C or C) or too complex (for example, Rust) for developers who +want to deliver secure applications without a long learning curve.

+

To address the need for correctness without complexity, DFINITY has +designed its own Motoko programming language. +Motoko provides a simple and expressive alternative to +other programming languages that is easy to learn whether you are a new +or experienced programmer.

+

Support for other languages

+

WebAssembly is language-agnostic. It does not require a high-level +type system for language inter-operation. Although Motoko is +specifically designed to compile to WebAssembly and make it easy to +write programs to run on the internet computer, it is just one of many +languages you can eventually use to develop applications for the +Internet Computer blockchain network.

+

To support multiple languages and typed, cross-language +communication, DFINITY also provides an Interface Definition +Language (IDL). The Motoko compiler automates the production +and consumption of IDL files using the type signatures in Motoko +programs and the structure of imported IDL interfaces.

+

For information about the Interface Definition +Language interfaces, see XXX.

+ + diff --git a/docs/html/generating-docs.html b/docs/html/generating-docs.html new file mode 100644 index 00000000000..ca1ebcfa930 --- /dev/null +++ b/docs/html/generating-docs.html @@ -0,0 +1,328 @@ + + + + + + + md/reference/generating-docs.md + + + + +
+

md/reference/generating-docs.md

+
+ +

Generating Motoko +documentation

+

Overview

+

mo-doc is a command-line tool for generating +documentation for Motoko source code. It processes source files and +generates documentation in various formats.

+

Quickstart

+

Download mo-doc from Motoko's GitHub releases +page or simply use the binary included in your dfx +installation:

+
$(dfx cache show)/mo-doc [options]
+

Options

+
    +
  • --source <path>: Specifies the directory to +search for Motoko source files. Defaults to src.

  • +
  • --output <path>: Specifies the directory where +the documentation will be generated. Defaults to +docs.

  • +
  • --format <format>: Specifies the generated +format. Should be one of the following:

    +
      +
    • html: Generates HTML format documentation.
    • +
    • adoc: Generates AsciiDoc format documentation.
    • +
    • plain: Generates Markdown documentation.
    • +
    +

    Defaults to html.

  • +
  • --help: Shows usage information.

  • +
+

Examples

+
    +
  1. Generate HTML documentation from the default source directory +(src) and place it in the default output directory +(docs):

    +
    mo-doc
  2. +
  3. Generate AsciiDoc documentation from a specific source +directory:

    +
    mo-doc --format plain --source ./motoko-code
  4. +
  5. Generate Markdown documentation in a custom output directory:

    +
    mo-doc --format adoc --output ./public
  6. +
+

Writing doc comments

+

mo-doc supports documenting your Motoko code using +special block comments (/** */) and line comments +(///).

+

Doc comments can be used to provide explanations for functions, +classes, types, modules, variables, and more. They can span multiple +lines and may contain rich Markdown formatting:

+
/// Calculate the factorial of a given positive integer.
+/// 
+/// Example:
+/// ```motoko
+/// factorial(0); // => null
+/// factorial(3); // => ?6
+/// ```
+func factorial(n : Nat) : ?Nat {
+    // ...
+}
+

Resources

+

Check out Motoko's base +library source code for additional examples and best practices.

+

The source code for mo-doc is available in the dfinity/motoko +GitHub repository. Contributions are welcome!

+ + diff --git a/docs/html/heartbeats.html b/docs/html/heartbeats.html new file mode 100644 index 00000000000..9042deadac5 --- /dev/null +++ b/docs/html/heartbeats.html @@ -0,0 +1,213 @@ + + + + + + + md/writing-motoko/heartbeats.md + + + + +
+

md/writing-motoko/heartbeats.md

+
+ +

Heartbeats

+

Overview

+

ICP canisters can elect to receive regular heartbeat messages by +exposing a particular canister_heartbeat function (see heartbeat).

+

In Motoko, an actor can receive heartbeat messages by declaring a +system function, named heartbeat, with no +arguments returning a future of unit type (async ()).

+

Using heartbeats

+

A simple, contrived example is a recurrent alarm, that sends a +message to itself every n-th heartbeat:

+
+

The heartbeat function is called on every ICP subnet +heartbeat by scheduling an asynchronous call to the +heartbeat function. Due to its async return +type, a heartbeat function may send further messages and await results. +The result of a heartbeat call, including any trap or thrown error, is +ignored. The implicit context switch inherent to calling every Motoko +async function means that the time the heartbeat body is +executed may be later than the time the heartbeat was issued by the +subnet.

+

As an async function, Alarm's +heartbeat function is free to call other asynchronous +functions, as well as shared functions of other canisters.

+ + diff --git a/docs/html/incomplete-code.html b/docs/html/incomplete-code.html new file mode 100644 index 00000000000..d4cdb9dfe55 --- /dev/null +++ b/docs/html/incomplete-code.html @@ -0,0 +1,229 @@ + + + + + + + md/writing-motoko/incomplete-code.md + + + + +
+

md/writing-motoko/incomplete-code.md

+
+ +

Writing incomplete code

+

Overview

+

In the midst of writing a program, you may want to run an incomplete +version or a version where one or more execution paths are either +missing or simply invalid.

+

To accommodate these situations, Motoko provides the +xxx, nyi and unreachable +functions from the base Prelude library, explained below. +Each is a simple wrapper around a more general trap +mechanism.

+

Short-term holes

+

Assuming that one has imported the prelude as follows:

+
import P "mo:base/Prelude";
+

You can fill any missing expression with the following:

+
P.xxx()
+

The expression xxx() has type None, which +is a subtype of every other type. This means the expression can plug any +short-term gap in your code. xxx() will trap when +executed.

+

Long-term holes

+

By convention, longer-term holes can be considered "not yet +implemented" (nyi) features, and marked as such with a +similar function from the Prelude module:

+
P.nyi()
+

Like xxx(), nyi() has type +None, thus any other type, and will trap on execution.

+

Unreachable code

+

Sometimes you will be required to provide code that they know will +never be executed, due to the preceding program logic.

+

To document unreachable code, you can use the +unreachable function from the prelude:

+
P.unreachable()
+

Like unreachable() has type None and thus +any other type, and will trap on (unexpected!) execution.

+ + diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 00000000000..330ddc2838f --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,269 @@ + + + + + + + md/base/index.md + + + + +
+

md/base/index.md

+
+ +

Index

+
    +
  • Array Provides extended utility functions on +Arrays.
  • +
  • AssocList Map implemented as a +linked-list of key-value pairs ("Associations").
  • +
  • Blob Module for working with Blobs: immutable +sequence of bytes.
  • +
  • Bool Boolean type and operations.
  • +
  • Buffer Class Buffer<X> +provides a mutable list of elements of type X.
  • +
  • CertifiedData Certified data.
  • +
  • Char Characters
  • +
  • Debug Utility functions for debugging.
  • +
  • Deque Double-ended queue (deque) of a generic +element type T.
  • +
  • Error Error values and inspection.
  • +
  • ExperimentalCycles Managing +cycles within actors on the Internet Computer (IC).
  • +
  • ExperimentalInternetComputer +Low-level interface to the Internet Computer.
  • +
  • ExperimentalStableMemory +Byte-level access to (virtual) stable memory.
  • +
  • Float Double precision (64-bit) +floating-point numbers in IEEE 754 representation.
  • +
  • Func Functions on functions, creating +functions from simpler inputs.
  • +
  • Hash Hash values
  • +
  • HashMap Class +HashMap<K, V> provides a hashmap from keys of type +K to values of type V.
  • +
  • Heap Class Heap<X> provides +a priority queue of elements of type X.
  • +
  • Int Signed integer numbers with infinite +precision (also called big integers).
  • +
  • Int16 Provides utility functions on 16-bit +signed integers.
  • +
  • Int32 Provides utility functions on 32-bit +signed integers.
  • +
  • Int64 Provides utility functions on 64-bit +signed integers.
  • +
  • Int8 Provides utility functions on 8-bit +signed integers.
  • +
  • Iter Iterators
  • +
  • IterType The Iterator type
  • +
  • List Purely-functional, singly-linked +lists.
  • +
  • Nat Natural numbers with infinite +precision.
  • +
  • Nat16 Provides utility functions on 16-bit +unsigned integers.
  • +
  • Nat32 Provides utility functions on 32-bit +unsigned integers.
  • +
  • Nat64 Provides utility functions on 64-bit +unsigned integers.
  • +
  • Nat8 Provides utility functions on 8-bit +unsigned integers.
  • +
  • None The absent value
  • +
  • Option Typesafe nulls
  • +
  • Order Order
  • +
  • Prelude General utilities
  • +
  • Principal Module for interacting with +Principals (users and canisters).
  • +
  • RBTree Key-value map implemented as a +red-black tree (RBTree) with nodes storing key-value pairs.
  • +
  • Random A module for obtaining randomness on +the Internet Computer (IC).
  • +
  • Region Byte-level access to isolated, +(virtual) stable memory regions.
  • +
  • Result Error handling with the Result +type.
  • +
  • Stack Class Stack<X> +provides a Minimal LIFO stack of elements of type X.
  • +
  • Text Utility functions for Text +values.
  • +
  • Time System time
  • +
  • Timer Timers for one-off or periodic +tasks.
  • +
  • Trie Functional key-value hash maps.
  • +
  • TrieMap Class +TrieMap<K, V> provides a map from keys of type +K to values of type V.
  • +
  • TrieSet Functional set
  • +
+ + diff --git a/docs/html/integers.html b/docs/html/integers.html new file mode 100644 index 00000000000..80d985c8ff3 --- /dev/null +++ b/docs/html/integers.html @@ -0,0 +1,295 @@ + + + + + + + md/writing-motoko/integers.md + + + + +
+

md/writing-motoko/integers.md

+
+ +

Integers and numbers

+

Overview

+

Motoko offers a variety types to represent integers and natural +numbers, with the usual suite of arithmetic operators (+, +-, *, '/' etc.) and comparison operators +(==, !=, <, >, +<=, >=).

+

The types Int and Nat are unbounded, meaning their +values can grow to arbitrary size, limited only by memory.

+

The type Nat is a subtype +of Int, so you can always +supply a value of type Nat +where and Int is expected but +not vice versa.

+

Motoko also provides bounded, or fixed-size integers and naturals, +using a suffix to indicate the size of the type, in bits.

+

Thus Int8, Int16 and Int32 and [Int64](../base/Int64.md) are +8-, 16-, 32- and 64-bit integer types, while Nat8, Nat16, Nat32, and Nat64 are 8-, 16-, 32- and +64-bit natural types.

+

An arithmetic operation on a value of a fixed-size type will trap if +its result exceeds the bounds of the fixed-size type, either due to +overflow or underflow. For example, 255 : Nat8 + 3 traps, +because 258 is too large for a Nat8.

+

Wrapping, non-trapping, versions of the usual arithmetic operations, +performing modular arithmetic, are available by suffixing the usual +operator with a %. For example, +255 : Nat8 +% 3 evaluates to 2.

+

The type of an integer or natural constant is determined by the +textual context of the constant, defaulting to Int for negative constants and Nat for positive ones. Otherwise, +the type of a constant can be indicated using a type annotation, for +example 0 : Nat8.

+

One can force a nonnegative constant to be interpreted as an Int using an explicit sign, for +example +1 is the Int one.

+

For convenience, in-place updates of a variable or array element can +be written by using a compound assignment operator, combining an +arithmetic operation with the assignment operator := . E.g. +x += 1 is short-hand for x := x + 1 and +combines addition + with assignment.

+

Motoko does not provide any implicit conversions between numeric +types. Instead, base library functions like Nat8.toNat and +Nat8.fromNat should be used for explicit conversion.

+

To illustrate working with numbers, here is an example calculator +program that creates a single actor with several public entry-point +functions to perform basic arithmetic operations using integers.

+

Using integers

+
// This single-cell calculator defines one calculator instruction per
+// public entry point (add, sub, mul, div).
+
+// Create a simple Calc actor.
+actor Calc {
+  var cell : Int = 0;
+
+  // Define functions to add, subtract, multiply, and divide
+  public func add(n:Int) : async Int { cell += n; cell };
+  public func sub(n:Int) : async Int { cell -= n; cell };
+  public func mul(n:Int) : async Int { cell *= n; cell };
+  public func div(n:Int) : async ?Int {
+    if ( n == 0 ) {
+      return null // null indicates div-by-zero error
+    } else {
+      cell /= n; ?cell
+    }
+  };
+
+  // Clear the calculator and reset to zero
+  public func clearall() : async Int {
+    if (cell : Int != 0)
+      cell -= cell;
+    return cell
+  };
+ };
+

You might notice that this sample code uses integer (Int) data types, enabling you to +use positive or negative numbers. If you wanted to restrict the +functions in this calculator code to only use positive numbers, you +could change the data type to only allow natural (Nat) data.

+

This program supports the following function calls:

+
    +
  • The add function call accepts input and performs +addition.

  • +
  • The sub function call accepts input and performs +subtraction.

  • +
  • The mul function call accepts input and performs +multiplication.

  • +
  • The div function call accepts input and performs +division. It also includes code to prevent the program from attempting +to divide by zero.

  • +
  • The clearall function clears the cell +value stored as the result of previous operations, resetting the +cell value to zero.

  • +
+ + diff --git a/docs/html/intercanister-calls.html b/docs/html/intercanister-calls.html new file mode 100644 index 00000000000..8b53b91bf5d --- /dev/null +++ b/docs/html/intercanister-calls.html @@ -0,0 +1,249 @@ + + + + + + + md/writing-motoko/intercanister-calls.md + + + + +
+

md/writing-motoko/intercanister-calls.md

+
+ +

Inter-canister calls

+

Overview

+

One of the most important features of ICP for developers is the +ability to call functions in one canister from another canister. This +capability to make calls between canisters, also sometimes referred to +as inter-canister calls, enables you to reuse and share +functionality in multiple dapps.

+

For example, you might want to create a dapp for professional +networking, organizing community events, or hosting fundraising +activities. Each of these dapps might have a social component that +enables users to identify social relationships based on some criteria or +shared interest, such as friends and family or current and former +colleagues.

+

To address this social component, you might want to create a single +canister for storing user relationships then write your professional +networking, community organizing, or fundraising application to import +and call functions that are defined in the canister for social +connections. You could then build additional applications to use the +social connections canister or extend the features provided by the +social connections canister to make it useful to an even broader +community of other developers.

+

This example will showcase a simple way to configure inter-canister +calls that can be used as the foundation for more elaborate projects and +use-cases such as those mentioned above.

+

Example

+

Consider the following code for canister1:

+
import Canister2 "canister:canister2";
+
+actor {
+    public func main() : async Nat {
+        return await Canister2.getValue();
+    };
+};
+

Then, consider the following code for canister2:

+
import Debug "mo:base/Debug";
+
+actor {
+    public func getValue() : async Nat {
+        Debug.print("Hello from canister 2!");
+        return 10;
+    };
+};
+

To make an inter-canister call from canister1 to +canister2, you can use the dfx command:

+
dfx canister call canister1 main
+

The output should resemble the following:

+
2023-06-15 15:53:39.567801 UTC: [Canister ajuq4-ruaaa-aaaaa-qaaga-cai] Hello from canister 2!
+(10 : nat)
+

Alternatively, you can also use a canister id to access a previously +deployed canister by using the following piece of code in +canister1:

+
actor {
+    public func main(canisterId: Text) : async Nat {
+        let canister2 = actor(canisterId): actor { getValue: () -> async Nat };
+        return await canister2.getValue();
+    };
+};
+

Then, use the following call, replacing canisterID with +the principal ID of a previously deployed canister:

+
dfx canister call canister1 main "canisterID"
+ + diff --git a/docs/html/language-manual.html b/docs/html/language-manual.html new file mode 100644 index 00000000000..d067f4af7f7 --- /dev/null +++ b/docs/html/language-manual.html @@ -0,0 +1,4324 @@ + + + + + + + md/reference/language-manual.md + + + + +
+

md/reference/language-manual.md

+
+ +

Language reference

+ + +

Overview

+

This reference page provides technical details of interest to the +following audiences:

+
    +
  • Authors providing the higher-level documentation about the Motoko +programming language.

  • +
  • Compiler experts interested in the details of Motoko and its +compiler.

  • +
  • Advanced programmers who want to learn more about the lower-level +details of Motoko.

  • +
+

This page is intended to provide complete reference information about +Motoko, but this section does not provide explanatory text or usage +information. Therefore, this section is typically not suitable for +readers who are new to programming languages or who are looking for a +general introduction to using Motoko.

+

In this documentation, the term canister is used to refer to an +Internet Computer smart contract.

+

Basic language syntax

+

This section describes the basic language conventions of Motoko.

+

Whitespace

+

Space, newline, horizontal tab, carriage return, line feed and form +feed are considered as whitespace. Whitespace is ignored but used to +separate adjacent keywords, identifiers and operators.

+

In the definition of some lexemes, the quick reference uses the +symbol to denote a single whitespace character.

+

Comments

+

Single line comments are all characters following // +until the end of the same line.

+
// single line comment
+x = 1
+

Single or multi-line comments are any sequence of characters +delimited by /* and */:

+
/* multi-line comments
+   look like this, as in C and friends */
+

Comments delimited by /* and */ may be +nested, provided the nesting is well-bracketed.

+
/// I'm a documentation comment
+/// for a function
+

Documentation comments start with /// followed by a +space until the end of line, and get attached to the definition +immediately following them.

+

Deprecation comments start with /// @deprecated followed +by a space until the end of line, and get attached to the definition +immediately following them. They are only recognized in front of +public declarations.

+

All comments are treated as whitespace.

+

Keywords

+

The following keywords are reserved and may not be used as +identifiers:

+

+actor and assert async async* await await* break case catch class
+composite continue debug debug_show do else flexible false for
+from_candid func if ignore import in module not null object or label
+let loop private public query return shared stable switch system throw
+to_candid true try type var while with
+

Identifiers

+

Identifiers are alpha-numeric, start with a letter and may contain +underscores:

+
<id>   ::= Letter (Letter | Digit | _)*
+Letter ::= A..Z | a..z
+Digit  ::= 0..9
+

Integers

+

Integers are written as decimal or hexadecimal, +Ox-prefixed natural numbers. Subsequent digits may be +prefixed a single, semantically irrelevant, underscore.

+
digit ::= ['0'-'9']
+hexdigit ::= ['0'-'9''a'-'f''A'-'F']
+num ::= digit ('_'? digit)*
+hexnum ::= hexdigit ('_'? hexdigit)*
+nat ::= num | "0x" hexnum
+

Negative integers may be constructed by applying a prefix negation +- operation.

+

Floats

+

Floating point literals are written in decimal or +Ox-prefixed hexadecimal scientific notation.

+
let frac = num
+let hexfrac = hexnum
+let float =
+    num '.' frac?
+  | num ('.' frac?)? ('e' | 'E') sign? num
+  | "0x" hexnum '.' hexfrac?
+  | "0x" hexnum ('.' hexfrac?)? ('p' | 'P') sign? num
+

The 'e' (or 'E') prefixes a base 10, decimal exponent; 'p' (or 'P') +prefixes a base 2, binary exponent. In both cases, the exponent is in +decimal notation.

+

:::note

+

The use of decimal notation, even for the base 2 exponent, adheres to +the established hexadecimal floating point literal syntax of the +C language.

+

:::

+

Characters

+

A character is a single quote (') delimited:

+
    +
  • Unicode character in UTF-8.

  • +
  • \-escaped newline, carriage return, tab, single or +double quotation mark.

  • +
  • \-prefixed ASCII character (TBR).

  • +
  • or \u{ hexnum } enclosed valid, escaped +Unicode character in hexadecimal (TBR).

  • +
+
ascii ::= ['\x00'-'\x7f']
+ascii_no_nl ::= ['\x00'-'\x09''\x0b'-'\x7f']
+utf8cont ::= ['\x80'-'\xbf']
+utf8enc ::=
+    ['\xc2'-'\xdf'] utf8cont
+  | ['\xe0'] ['\xa0'-'\xbf'] utf8cont
+  | ['\xed'] ['\x80'-'\x9f'] utf8cont
+  | ['\xe1'-'\xec''\xee'-'\xef'] utf8cont utf8cont
+  | ['\xf0'] ['\x90'-'\xbf'] utf8cont utf8cont
+  | ['\xf4'] ['\x80'-'\x8f'] utf8cont utf8cont
+  | ['\xf1'-'\xf3'] utf8cont utf8cont utf8cont
+utf8 ::= ascii | utf8enc
+utf8_no_nl ::= ascii_no_nl | utf8enc
+
+escape ::= ['n''r''t''\\''\'''\"']
+
+character ::=
+  | [^'"''\\''\x00'-'\x1f''\x7f'-'\xff']
+  | utf8enc
+  | '\\'escape
+  | '\\'hexdigit hexdigit
+  | "\\u{" hexnum '}'
+  | '\n'        // literal newline
+
+char := '\'' character '\''
+

Text

+

A text literal is "-delimited sequence of +characters:

+
text ::= '"' character* '"'
+

Note that a text literal may span multiple lines.

+

Literals

+
<lit> ::=                                     literals
+  <nat>                                         natural
+  <float>                                       float
+  <char>                                        character
+  <text>                                        Unicode text
+

Literals are constant values. The syntactic validity of a literal +depends on the precision of the type at which it is used.

+

Operators and types

+

To simplify the presentation of available operators, operators and +primitive types are classified into basic categories:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AbbreviationCategorySupported operations
AArithmeticArithmetic operations
LLogicalLogical/Boolean operations
BBitwiseBitwise and wrapping operations
OOrderedComparison
TTextConcatenation
+

Some types have several categories. For example, type Int is both arithmetic (A) and +ordered (O) and supports both arithmetic addition (+) and +relational less than (<) amongst other operations.

+

Unary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + +
<unop>Category
-ANumeric negation
+ANumeric identity
^BBitwise negation
+

Relational operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<relop>Category
==Equals
!=Not equals
␣<␣OLess than (must be enclosed in whitespace)
␣>␣OGreater than (must be enclosed in whitespace)
<=OLess than or equal
>=OGreater than or equal
+

Note that equality (==) and inequality (!=) +do not have categories. Instead, equality and inequality are applicable +to arguments of all shared types, including non-primitive, compound +types such as immutable arrays, records, and variants.

+

Equality and inequality are structural and based on the observable +content of their operands as determined by their static type.

+

Numeric binary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<binop>Category
+AAddition
-ASubtraction
*AMultiplication
/ADivision
%AModulo
**AExponentiation
+

Bitwise and wrapping +binary operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<binop>Category
&BBitwise and
|BBitwise or
^BExclusive or
<<BShift left
␣>>BShift right (must be preceded by whitespace)
<<>BRotate left
<>>BRotate right
+%AAddition (wrap-on-overflow)
-%ASubtraction (wrap-on-overflow)
*%AMultiplication (wrap-on-overflow)
**%AExponentiation (wrap-on-overflow)
+

Text operators

+ + + + + + + + + + + + + + + +
<binop>Category
#TConcatenation
+

Assignment operators

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:=, <unop>=, +<binop>=Category
:=*Assignment (in place update)
+=AIn place add
-=AIn place subtract
*=AIn place multiply
/=AIn place divide
%=AIn place modulo
**=AIn place exponentiation
&=BIn place logical and
|=BIn place logical or
^=BIn place exclusive or
<<=BIn place shift left
>>=BIn place shift right
<<>=BIn place rotate left
<>>=BIn place rotate right
+%=BIn place add (wrap-on-overflow)
-%=BIn place subtract (wrap-on-overflow)
*%=BIn place multiply (wrap-on-overflow)
**%=BIn place exponentiation (wrap-on-overflow)
#=TIn place concatenation
+

The category of a compound assignment +<unop>=/<binop>= is given by the +category of the operator +<unop>/<binop>.

+

Operator and keyword +precedence

+

The following table defines the relative precedence and associativity +of operators and tokens, ordered from lowest to highest precedence. +Tokens on the same line have equal precedence with the indicated +associativity.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PrecedenceAssociativityToken
LOWESTnoneif _ _ (no else), loop _ (no +while)
(higher)noneelse, while
(higher)right:=, +=, -=, *=, +/=, %=, **=, #=, +&=, |=, ^=, +<<=, >>=, +<<>=, <>>=, ++%=, -%=, *%=, +**%=
(higher)left:
(higher)left`
(higher)leftor
(higher)leftand
(higher)none==, !=, <, +>, <=, >, +>=
(higher)left+, -, #, +%, +-%
(higher)left*, /, %, *%
(higher)left|
(higher)left&
(higher)left^
(higher)none<<, >>, +<<>, <>>
HIGHESTleft**, **%
+

Programs

+

The syntax of a program <prog> is +as follows:

+
<prog> ::=             programs
+  <imp>;* <dec>;*
+

A program is a sequence of imports <imp>;* +followed by a sequence of declarations <dec>;* that +ends with an optional actor or actor class declaration. The actor or +actor class declaration determines the main actor, if any, of the +program.

+

Compiled programs must obey the following additional +restrictions:

+
    +
  • A shared function can only appear as a public field +of an actor or actor class.

  • +
  • A program may contain at most one actor or actor class +declaration, i.e. the final main actor or actor class.

  • +
  • Any main actor class declaration should be anonymous. If named, +the class name should not be used as a value within the class and will +be reported as an unavailable identifier.

  • +
+

These restrictions are not imposed on interpreted programs.

+

The last two restrictions are designed to forbid programmatic actor +class recursion, pending compiler support.

+

Note that the parameters of an actor class must have shared type. The parameters of a program’s +final actor class provide access to the corresponding canister +installation argument(s). The Candid type of this argument is determined +by the Candid projection of the Motoko type of the class parameter.

+

Imports

+

The syntax of an import <imp> is +as follows:

+
<imp> ::=                           imports
+  import <pat> =? <url>
+
+<url> ::=
+  "<filepath>"                      Import module from relative <filepath>.mo
+  "mo:<package-name>/<filepath>"    Import module from package
+  "canister:<canisterid>"           Import external actor by <canisterid>
+  "canister:<name>"                 Import external actor by <name>
+

An import introduces a resource referring to a local source module, +module from a package of modules, or canister imported as an actor. The +contents of the resource are bound to <pat>.

+

Though typically a simple identifier, <id>, +<pat> can also be any composite pattern binding +selective components of the resource.

+

The pattern must be irrefutable.

+

Libraries

+

The syntax of a library that can be referenced in an +import is as follows:

+
<lib> ::=                                               Library
+  <imp>;* module <id>? (: <typ>)? =? <obj-body>           Module
+  <imp>;* <shared-pat>? actor class                       Actor class
+    <id> <typ-params>? <pat> (: <typ>)? <class-body>
+

A library <lib> is a sequence of imports +<imp>;* followed by:

+
    +
  • A named or anonymous module declaration, or

  • +
  • A named actor class declaration.

  • +
+

Libraries stored in .mo files may be referenced by +import declarations.

+

In a module library, the optional name <id>? is +only significant within the library and does not determine the name of +the library when imported. Instead, the imported name of a library is +determined by the import declaration, giving clients of the +library the freedom to choose library names e.g. to avoid clashes.

+

An actor class library, because it defines both a type constructor +and a function with name <id>, is imported as a +module defining both a type and a function named +<id>. The name <id> is mandatory +and cannot be omitted. An actor class constructor is always +asynchronous, with return type async T where T +is the inferred type of the class body. Because actor construction is +asynchronous, an instance of an imported actor class can only be created +in an asynchronous context i.e. in the body of a non-query +shared function, asynchronous function, async +expression or async* expression.

+

Declaration syntax

+

The syntax of a declaration is as follows:

+
<dec> ::=                                                               Declaration
+  <exp>                                                                 Expression
+  let <pat> = <exp>                                                      Immutable, trap on match failure
+  let <pat> = <exp> else <block-or-exp>                                  Immutable, handle match failure
+  var <id> (: <typ>)? = <exp>                                            Mutable
+  <sort> <id>? (: <typ>)? =? <obj-body>                                  Object
+  <shared-pat>? func <id>? <typ-params>? <pat> (: <typ>)? =? <exp>       Function
+  type <id> <type-typ-params>? = <typ>                                   Type
+  <shared-pat>? <sort>? class                                            Class
+    <id>? <typ-params>? <pat> (: <typ>)? <class-body>
+
+<obj-body> ::=           Object body
+  { <dec-field>;* }       Field declarations
+
+<class-body> ::=         Class body
+  = <id>? <obj-body>      Object body, optionally binding <id> to 'this' instance
+  <obj-body>              Object body
+

The syntax of a shared function qualifier with call-context pattern +is as follows:

+
<query> ::=
+ composite? query
+
+<shared-pat> ::=
+  shared <query>? <pat>?
+

For <shared-pat>, an absent +<pat>? is shorthand for the wildcard pattern +_.

+
<dec-field> ::=                                object declaration fields
+  <vis>? <stab>? <dec>                           field
+
+<vis> ::=                                      field visibility
+  public
+  private
+  system
+
+<stab> ::=                                     field stability (actor only)
+  stable
+  flexible
+

The visibility qualifier <vis>? +determines the accessibility of every field <id> +declared by <dec>:

+
    +
  • An absent <vis>? qualifier defaults to +private visibility.

  • +
  • Visibility private restricts access to +<id> to the enclosing object, module or +actor.

  • +
  • Visibility public extends private with +external access to <id> using the dot notation +<exp>.<id>.

  • +
  • Visibility system extends private with +access by the run-time system.

  • +
  • Visibility system may only appear on +func declarations that are actor fields, and must +not appear anywhere else.

  • +
+

The stability qualifier <stab> +determines the upgrade behavior of actor fields:

+
    +
  • A stability qualifier should appear on let and +var declarations that are actor fields. An absent stability +qualifier defaults to flexible.

  • +
  • <stab> qualifiers must not appear on fields of +objects or modules.

  • +
  • The pattern in a +stable let <pat> = <exp> declaration must be +simple where, a pattern pat is simple if it recursively +consists of any of the following:

    +
      +
    • A variable pattern <id>.

    • +
    • An annotated simple pattern +<pat> : <typ>.

    • +
    • A parenthesized simple pattern +( <pat> ).

    • +
  • +
+

Expression syntax

+

The syntax of an expression is as follows:

+
<exp> ::=                                      Expressions
+  <id>                                           Variable
+  <lit>                                          Literal
+  <unop> <exp>                                   Unary operator
+  <exp> <binop> <exp>                            Binary operator
+  <exp> <relop> <exp>                            Binary relational operator
+  _                                              Placeholder expression
+  <exp> |> <exp>                                 Pipe operator
+  ( <exp>,* )                                    Tuple
+  <exp> . <nat>                                  Tuple projection
+  ? <exp>                                        Option injection
+  { <exp-field>;* }                              Object
+  { <exp> (and <exp>)* (with <exp-field>;+)? }   Object combination/extension
+  # id <exp>?                                    Variant injection
+  <exp> . <id>                                   Object projection/member access
+  <exp> := <exp>                                 Assignment
+  <unop>= <exp>                                  Unary update
+  <exp> <binop>= <exp>                           Binary update
+  [ var? <exp>,* ]                               Array
+  <exp> [ <exp> ]                                Array indexing
+  <shared-pat>? func <func_exp>                  Function expression
+  <exp> <typ-args>? <exp>                        Function call
+  not <exp>                                      Negation
+  <exp> and <exp>                                Conjunction
+  <exp> or <exp>                                 Disjunction
+  if <exp> <block-or-exp> (else <block-or-exp>)? Conditional
+  switch <exp> { (case <pat> <block-or-exp>;)+ } Switch
+  while <exp> <block-or-exp>                     While loop
+  loop <block-or-exp> (while <exp>)?             Loop
+  for ( <pat> in <exp> ) <block-or-exp>          Iteration
+  label <id> (: <typ>)? <block-or-exp>           Label
+  break <id> <exp>?                              Break
+  continue <id>                                  Continue
+  return <exp>?                                  Return
+  async <block-or-exp>                           Async expression
+  await <block-or-exp>                           Await future (only in async)
+  async* <block-or-exp>                          Delay an asynchronous computation
+  await* <block-or-exp>                          Await a delayed computation (only in async)
+  throw <exp>                                    Raise an error (only in async)
+  try <block-or-exp> catch <pat> <block-or-exp>  Catch an error (only in async)
+  assert <block-or-exp>                          Assertion
+  <exp> : <typ>                                  Type annotation
+  <dec>                                          Declaration
+  ignore <block-or-exp>                          Ignore value
+  do <block>                                     Block as expression
+  do ? <block>                                   Option block
+  <exp> !                                        Null break
+  debug <block-or-exp>                           Debug expression
+  actor <exp>                                    Actor reference
+  to_candid ( <exp>,* )                          Candid serialization
+  from_candid <exp>                              Candid deserialization
+  (system <exp> . <id>)                          System actor class constructor
+  ( <exp> )                                      Parentheses
+
+<block-or-exp> ::=
+  <block>
+  <exp>
+
+<block> ::=
+  { <dec>;* }
+

Patterns

+

The syntax of a pattern is as follows:

+
<pat> ::=                                      Patterns
+  _                                              Wildcard
+  <id>                                           Variable
+  <unop>? <lit>                                  Literal
+  ( <pat>,* )                                    Tuple or brackets
+  { <pat-field>;* }                              Object pattern
+  # <id> <pat>?                                  Variant pattern
+  ? <pat>                                        Option
+  <pat> : <typ>                                  Type annotation
+  <pat> or <pat>                                 Disjunctive pattern
+
+<pat-field> ::=                                Object pattern fields
+  <id> (: <typ>) = <pat>                         Field
+  <id> (: <typ>)                                 Punned field
+

Type syntax

+

Type expressions are used to specify the types of arguments, +constraints on type parameters, definitions of type constructors, and +the types of sub-expressions in type annotations.

+
<typ> ::=                                     Type expressions
+  <path> <type-typ-args>?                       Constructor
+  <sort>? { <typ-field>;* }                     Object
+  { <typ-tag>;* }                               Variant
+  { # }                                         Empty variant
+  [ var? <typ> ]                                Array
+  Null                                          Null type
+  ? <typ>                                       Option
+  <shared>? <typ-params>? <typ> -> <typ>        Function
+  async <typ>                                   Future
+  async* <typ>                                  Delayed, asynchronous computation
+  ( ((<id> :)? <typ>),* )                       Tuple
+  Any                                           Top
+  None                                          Bottom
+  <typ> and <typ>                               Intersection
+  <typ> or <typ>                                Union
+  Error                                         Errors/exceptions
+  ( <typ> )                                      Parenthesized type
+
+<sort> ::= (actor | module | object)
+
+<shared> ::=                                 Shared function type qualifier
+  shared <query>?
+
+<path> ::=                                   Paths
+  <id>                                         Type identifier
+  <path> . <id>                                Projection
+

An absent <sort>? abbreviates +object.

+

Primitive types

+

Motoko provides the following primitive type identifiers, including +support for Booleans, signed and unsigned integers and machine words of +various sizes, characters and text.

+

The category of a type determines the operators (unary, binary, +relational and in-place update via assignment) applicable to values of +that type.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IdentifierCategoryDescription
BoolLBoolean values true and false and logical +operators
CharOUnicode characters
TextT, OUnicode strings of characters with concatenation _ # _ +and iteration
FloatA, O64-bit floating point values
IntA, OSigned integer values with arithmetic (unbounded)
Int8A, OSigned 8-bit integer values with checked arithmetic
Int16A, OSigned 16-bit integer values with checked arithmetic
Int32]A, OSigned 32-bit integer values with checked arithmetic
Int64A, OSigned 64-bit integer values with checked arithmetic
NatA, ONon-negative integer values with arithmetic (unbounded)
Nat8A, ONon-negative 8-bit integer values with checked arithmetic
Nat16A, ONon-negative 16-bit integer values with checked arithmetic
Nat32A, ONon-negative 32-bit integer values with checked arithmetic
Nat64A, ONon-negative 64-bit integer values with checked arithmetic
BlobOBinary blobs with iterators
PrincipalOPrincipals
Error(Opaque) error values
Region(Opaque) stable memory region objects
+

Although many of these types have linguistic support for literals and +operators, each primitive type also has an eponymous base library +providing related functions and values. +For example, the Text library +provides common functions on Text values.

+

Type Bool

+

The type Bool of category +L (Logical) has values true and false and is +supported by one and two branch +if _ <exp> (else <exp>)?, +not <exp>, _ and _ and +_ or _ expressions. Expressions if, +and and or are short-circuiting.

+ + +

Type Char

+

A Char of category O (Ordered) represents a character as +a code point in the unicode character set.

+

Base library function Char.toNat32(c) converts a +Char value, c to its Nat32 code point. Function +Char.fromNat32(n) converts a Nat32 value, n, in +the range 0x0..xD7FF or 0xE000..0x10FFFF of valid code +points to its Char value; this conversion traps on invalid +arguments. Function Char.toText(c) converts the +Char c into the corresponding, single +character Text value.

+

Type Text

+

The type Text of +categories T and O (Text, Ordered) represents sequences of unicode +characters i.e. strings. Function t.size returns the number +of characters in Text value +t. Operations on text values include concatenation +(_ # _) and sequential iteration over characters via +t.chars as in +for (c : Char in t.chars()) { …​ c …​ }.

+ + +

Type Float

+

The type Float represents 64-bit floating point values +of categories A (Arithmetic) and O (Ordered).

+

The semantics of Float and its operations is in +accordance with standard IEEE 754-2019 +(See References).

+

Common functions and values are defined in base library +"base/Float".

+

Types Int and Nat

+

The types Int and Nat are signed integral and +natural numbers of categories A (Arithmetic) and O (Ordered).

+

Both Int and Nat are arbitrary precision, with +only subtraction - on Nat trapping on underflow.

+

The subtype relation Nat <: Int holds, so every +expression of type Nat is also +an expression of type Int but +not vice versa. In particular, every value of type Nat is also a value of type Int, without change of +representation.

+

Bounded integers Int8, Int16, Int32 and Int64

+

The types Int8, Int16, Int32 and Int64 represent signed integers +with respectively 8, 16, 32 and 64 bit precision. All have categories A +(Arithmetic), B (Bitwise) and O (Ordered).

+

Operations that may under- or overflow the representation are checked +and trap on error.

+

The operations +%, -%, *% and +**% provide access to wrap-around, modular arithmetic.

+

As bitwise types, these types support bitwise operations and +(&), or (|) and exclusive-or +(^). Further, they can be rotated left +(<<>), right (<>>), and +shifted left (<<), right (>>). The +right-shift preserves the two’s-complement sign. All shift and rotate +amounts are considered modulo the numbers’s bit width +n.

+

Bounded integer types are not in subtype relationship with each other +or with other arithmetic types, and their literals need type annotation +if the type cannot be inferred from context, e.g. +(-42 : Int16).

+

The corresponding module in the base library provides conversion +functions:

+
    +
  • Conversion to Int.

  • +
  • Checked and wrapping conversions from Int.

  • +
  • Wrapping conversion to the bounded natural type of the same +size.

  • +
+

Bounded naturals Nat8, Nat16, Nat32 and Nat64

+

The types Nat8, Nat16, Nat32 and Nat64 represent unsigned +integers with respectively 8, 16, 32 and 64 bit precision. All have +categories A (Arithmetic), B (Bitwise) and O (Ordered).

+

Operations that may under- or overflow the representation are checked +and trap on error.

+

The operations +%, -%, *% and +**% provide access to the modular, wrap-on-overflow +operations.

+

As bitwise types, these types support bitwise operations and +(&), or (|) and exclusive-or +(^). Further, they can be rotated left +(<<>), right (<>>), and +shifted left (<<), right (>>). The +right-shift is logical. All shift and rotate amounts are considered +modulo the number’s bit width n.

+

The corresponding module in the base library provides conversion +functions:

+
    +
  • Conversion to Nat.

  • +
  • Checked and wrapping conversions from Nat.

  • +
  • Wrapping conversion to the bounded, signed integer type of the +same size.

  • +
+

Type Blob

+

The type Blob of category +O (Ordered) represents binary blobs or sequences of bytes. Function +b.size returns the number of characters in Blob value b. +Operations on blob values include sequential iteration over bytes via +function b.vals as in +for (v : Nat8 in b.vals()) { …​ v …​ }.

+

Type Principal

+

The type Principal of +category O (Ordered) represents opaque principals such as canisters and +users that can be used to identify callers of shared functions and used +for simple authentication. Although opaque, principals may be converted +to binary Blob values for +more efficient hashing and other applications.

+

Error type

+

Assuming base library import:

+
import E "mo:base/Error";
+

Errors are opaque values constructed and examined with +operations:

+
    +
  • E.reject : Text -> Error

  • +
  • E.code : Error -> E.ErrorCode

  • +
  • E.message : Error -> Text

  • +
+

Type E.ErrorCode is equivalent to variant type:

+
type ErrorCode = {
+  // Fatal error.
+  #system_fatal;
+  // Transient error.
+  #system_transient;
+  // Destination invalid.
+  #destination_invalid;
+  // Explicit reject by canister code.
+  #canister_reject;
+  // Canister trapped.
+  #canister_error;
+  // Future error code (with unrecognized numeric code).
+  #future : Nat32;
+  // Error issuing inter-canister call
+  // (indicating destination queue full or freezing threshold crossed).
+  #call_error : { err_code : Nat32 }
+};
+

A constructed error e = E.reject(t) has +E.code(e) = #canister_reject and +E.message(e) = t.

+

Error values can be +thrown and caught within an async expression or +shared function only. See throw and try.

+

Errors with codes other than #canister_reject, i.e. +system errors, may be caught and thrown but not user-constructed.

+

:::note

+

Exiting an async block or shared function with a +non-#canister-reject system error exits with a copy of the +error with revised code #canister_reject and the original +Text message. This prevents +programmatic forgery of system errors.

+

:::

+

:::note

+

On ICP, the act of issuing a call to a canister function can fail, so +that the call cannot (and will not be) performed. This can happen due to +a lack of canister resources, typically because the local message queue +for the destination canister is full, or because performing the call +would reduce the current cycle balance of the calling canister to a +level below its freezing threshold. Such call failures are reported by +throwing an Error with code +#call_error { err_code = n }, where n is the +non-zero err_code value returned by ICP. Like other errors, +call errors can be caught and handled using +try ... catch ... expressions, if desired.

+

:::

+

Type Region

+

The type Region represents opaque stable memory regions. +Region objects are dynamically allocated and independently growable. +They represent isolated partitions of IC stable memory.

+

The region type is stable but not shared and its objects, which are +stateful, may be stored in stable variables and data structures.

+

Objects of type Region are created and updated using the +functions provided by base library Region. See stable regions and library +Region for more information.

+

Constructed types

+

<path> <type-typ-args>? is the application +of a type identifier or path, either built-in (i.e. Int) or user defined, to zero or +more type arguments. The type arguments must satisfy the bounds, if any, +expected by the type constructor’s type parameters (see Well-formed types).

+

Though typically a type identifier, more generally, +<path> may be a .-separated sequence of +actor, object or module identifiers ending in an identifier accessing a +type component of a value (for example, +Acme.Collections.List).

+

Object types

+

<sort>? { <typ-field>;* } specifies an +object type by listing its zero or more named type +fields.

+

Within an object type, the names of fields must be distinct both by +name and hash value.

+

Object types that differ only in the ordering of the fields are +equivalent.

+

When <sort>? is actor, all fields +have shared function type for specifying messages.

+

Variant types

+

{ <typ-tag>;* } specifies a variant type by +listing its variant type fields as a sequence of +<typ-tag>s.

+

Within a variant type, the tags of its variants must be distinct both +by name and hash value.

+

Variant types that differ only in the ordering of their variant type +fields are equivalent.

+

{ # } specifies the empty variant type.

+

Array types

+

[ var? <typ> ] specifies the type of arrays with +elements of type <typ>.

+

Arrays are immutable unless specified with qualifier +var.

+

Null type

+

The Null type has a single value, the literal +null. Null is a subtype of the option +? T, for any type T.

+

Option types

+

? <typ> specifies the type of values that are +either null or a proper value of the form +? <v> where <v> has type +<typ>.

+

Function types

+

Type +<shared>? <typ-params>? <typ1> -> <typ2> +specifies the type of functions that consume optional type parameters +<typ-params>, consume a value parameter of type +<typ1> and produce a result of type +<typ2>.

+

Both <typ1> and <typ2> may +reference type parameters declared in +<typ-params>.

+

If <typ1> or <typ2> or both is +a tuple type, then the length of that tuple type determines the argument +or result arity of the function type. The arity is the number +of arguments or results a function returns.

+

The optional <shared> qualifier specifies whether +the function value is shared, which further constrains the form of +<typ-params>, <typ1> and +<typ2> (see sharability +below).

+

Note that a <shared> function may itself be +shared or shared query or +shared composite query, determining the persistence of its +state changes.

+

Async types

+

async <typ> specifies a future producing a value +of type <typ>.

+

Future types typically appear as the result type of a +shared function that produces an await-able +value.

+

Async* types

+

async* <typ> specifies a delayed, asynchronous +computation producing a value of type <typ>.

+

Computation types typically appear as the result type of a +local function that produces an await*-able +value.

+

They cannot be used as the return types of shared +functions.

+

Tuple types

+

( ((<id> :)? <typ>),* ) specifies the type +of a tuple with zero or more ordered components.

+

The optional identifier <id>, naming its +components, is for documentation purposes only and cannot be used for +component access. In particular, tuple types that differ only in the +names of components are equivalent.

+

The empty tuple type () is called the unit +type.

+

Any type

+

Type Any is the top type, i.e. the supertype of all +types. All values have type Any.

+

None type

+

Type None is the bottom type, the subtype of all other +types. No value has type None.

+

As an empty type, None can be used to specify the +impossible return value of an infinite loop or unconditional trap.

+

Intersection type

+

The type expression <typ1> and <typ2> +denotes the syntactic intersection between its two type +operands, that is, the greatest type that is a subtype of both. If both +types are incompatible, the intersection is None.

+

The intersection is syntactic, in that it does not consider possible +instantiations of type variables. The intersection of two type variables +is None, unless they are equal, or one is declared to be a +(direct or indirect) subtype of the other.

+

Union type

+

The type expression <typ1> or <typ2> denotes +the syntactic union between its two type operands, that +is, the smallest type that is a supertype of both. If both types are +incompatible, the union is Any.

+

The union is syntactic, in that it does not consider possible +instantiations of type variables. The union of two type variables is the +union of their bounds, unless the variables are equal, or one is +declared to be a direct or indirect subtype of the other.

+

Parenthesized type

+

A function that takes an immediate, syntactic tuple of length +n \>= 0 as its domain or range is a function that takes +and respectively returns n values.

+

When enclosing the argument or result type of a function, which is +itself a tuple type, ( <tuple-typ> ) declares that +the function takes or returns a single boxed value of type +<tuple-type>.

+

In all other positions, ( <typ> ) has the same +meaning as <typ>.

+

Type fields

+
<typ-field> ::=                               Object type fields
+  <id> : <typ>                                  Immutable value
+  var <id> : <typ>                              Mutable value
+  <id> <typ-params>? <typ1> : <typ2>            Function value (short-hand)
+  type <id> <type-typ-params>? = <typ>          Type component
+

A type field specifies the name and type of a value field of an +object, or the name and definition of a type component of an object. The +value field names within a single object type must be distinct and have +non-colliding hashes. The type component names within a single object +type must also be distinct and have non-colliding hashes. Value fields +and type components reside in separate name spaces and thus may have +names in common.

+

<id> : <typ> : Specifies an +immutable field, named <id> of type +<typ>.

+

var <id> : <typ> : Specifies a +mutable field, named <id> of type +<typ>.

+

type <id> <type-typ-params>? = <typ> : +Specifies a type component, with field name +<id>, abbreviating parameterized type +<typ>.

+

Unlike type declarations, a type component is not, in itself, +recursive though it may abbreviate an existing recursive type. In +particular, the name <id> is not bound in +<typ> nor in any other fields of the enclosing object +type. The name <id> only determines the label to use +when accessing the definition through a record of this type using the +dot notation.

+

Variant type fields

+
<typ-tag> ::=                                 Variant type fields
+  # <id> : <typ>                                Tag
+  # <id>                                        Unit tag (short-hand)
+

A variant type field specifies the tag and type of a single variant +of an enclosing variant type. The tags within a single variant type must +be distinct and have non-colliding hashes.

+

# <id> : <typ> specifies an immutable field, +named <id> of type <typ>. +# <id> is sugar for an immutable field, named +<id> of type ().

+

Sugar

+

When enclosed by an actor object type, +<id> <typ-params>? <typ1> : <typ2> +is syntactic sugar for an immutable field named <id> +of shared function type +shared <typ-params>? <typ1> → <typ2>.

+

When enclosed by a non-actor object type, +<id> <typ-params>? <typ1> : <typ2> +is syntactic sugar for an immutable field named <id> +of ordinary function type +<typ-params>? <typ1> → <typ2>.

+

Type parameters

+
<typ-params> ::=                              Type parameters
+  < typ-param,* >
+<typ-param>
+  <id> <: <typ>                               Constrained type parameter
+  <id>                                        Unconstrained type parameter
+
<type-typ-params> ::=                         Type parameters to type constructors
+  < typ-param,* >
+
+<typ-params> ::=                              Function type parameters
+  < typ-param,* >                             Type parameters
+  < system (, <typ-param>*)) >                System capability prefixed type parameters
+
+<typ-param>
+  <id> <: <typ>                               Constrained type parameter
+  <id>                                        Unconstrained type parameter
+
+

A type constructor may be parameterized by a vector of +comma-separated, optionally constrained, type parameters.

+

A function, class constructor or function type may be parameterized +by a vector of comma-separated, optionally constrained, type parameters. +The first of these may be the special, pseudo type parameter +system.

+

<id> <: <typ> declares a type parameter +with constraint <typ>. Any instantiation of +<id> must subtype <typ> at that +same instantiation.

+

Syntactic sugar <id> declares a type parameter +with implicit, trivial constraint Any.

+

The names of type parameters in a vector must be distinct.

+

All type parameters declared in a vector are in scope within its +bounds.

+

The system pseudo-type parameter on function types +indicates that a value of that type requires system +capability in order to be called and may itself call functions requiring +system capability during its execution.

+

Type arguments

+
<type-typ-args> ::=                           Type arguments to type constructors
+  < <typ>,* >
+
+
+<typ-args> ::=                                Type arguments to functions
+  < <typ>,* >                                   Plain type arguments
+  < system (, <typ>*) >                         System capability prefixed type arguments
+
+

Type constructors and functions may take type arguments.

+

The number of type arguments must agree with the number of declared +type parameters of the type constructor.

+

For a function, the number of type arguments, when provided, must +agree with the number of declared type parameters of the function’s +type. Note that type arguments in function applications can typically be +omitted and inferred by the compiler.

+

Given a vector of type arguments instantiating a vector of type +parameters, each type argument must satisfy the instantiated bounds of +the corresponding type parameter.

+

In function calls, supplying the system pseudo type +argument grants system capability to the function that requires it.

+

System capability is available only in the following syntactic +contexts:

+
    +
  • In the body of an actor expression or actor class.
  • +
  • In the body of a (non-query) shared +function, asynchronous function, async expression or +async* expression.
  • +
  • In the body of a function or class that is declared with +system pseudo type parameter.
  • +
  • In system functions preupgrade and +postupgrade.
  • +
+

No other context provides system capabilities, including +query and composite query methods.

+

The <system> type parameters of shared and +asynchronous functions need not be declared.

+

Well-formed types

+

A type T is well-formed only if recursively its +constituent types are well-formed, and:

+
    +
  • If T is async U or +async* U then U is shared, and

  • +
  • If T is +shared <query>? U -> V:

    +
      +
    • U is shared and,
    • +
    • V == () and <query>? is absent, +or
    • +
    • V == async W with W shared, and
    • +
  • +
  • If T is C<T0, …​, Tn> where:

    +
      +
    • A declaration +type C<X0 <: U0, Xn <: Un> = …​ is in scope, +and

    • +
    • Ti <: Ui[ T0/X0, …​, Tn/Xn ], for each +0 <= i <= n.

    • +
  • +
  • If T is actor { …​ } then all fields in +…​ are immutable and have shared function +type.

  • +
+

Subtyping

+

Two types T, U are related by subtyping, +written T <: U, whenever, one of the following +conditions is true:

+
    +
  • T equals U (subtyping is +reflexive).

  • +
  • U equals Any.

  • +
  • T equals None.

  • +
  • T is a type parameter X declared with +constraint U.

  • +
  • T is Nat +and U is Int.

  • +
  • T is a tuple (T0, …​, Tn), +U is a tuple (U0, …​, Un), and for each +0 <= i <= n, Ti <: Ui.

  • +
  • T is an immutable array type [ V ], +U is an immutable array type [ W ] and +V <: W.

  • +
  • T is a mutable array type [ var V ], +U is a mutable array type [ var W ] and +V == W.

  • +
  • T is Null and U is an +option type ? W for some W.

  • +
  • T is ? V, U is +? W and V <: W.

  • +
  • T is a future async V, U +is a future async W, and V <: W.

  • +
  • T is an object type +<sort0> { fts0 }, U is an object type +<sort1> { fts1 } and

    +
      +
    • <sort0> == <sort1>, and, +for all fields,

    • +
    • If field id : W is in fts1 then +id : V is in fts0 and V <: W, +and

    • +
    • If mutable field var id : W is in fts1 +then var id : V is in fts0 and +V == W.

      +

      That is, object type T is a subtype of object type +U if they have the same sort, every mutable field in +U super-types the same field in T and every +mutable field in U is mutable in T with an +equivalent type. In particular, T may specify more fields +than U. Note that this clause defines subtyping for all +sorts of object type, whether module, object +or actor.

    • +
  • +
  • T is a variant type { fts0 }, +U is a variant type { fts1 } and

    +
      +
    • If field # id : V is in fts0 then +# id : W is in fts1 and +V <: W.

      +

      That is, variant type T is a subtype of variant type +U if every field of T subtypes the same field +of U. In particular, T may specify fewer +variants than U.

    • +
  • +
  • T is a function type +<shared>? <X0 <: V0, ..., Xn <: Vn> T1 -> T2, +U is a function type +<shared>? <X0 <: W0, ..., Xn <: Wn> U1 -> U2 +and

    +
      +
    • T and U are either both equivalently +<shared>?, and

    • +
    • Assuming constraints X0 <: W0, …​, Xn <: Wn +then

      +
        +
      • for all i, Wi == Vi, and

      • +
      • U1 <: T1, and

      • +
      • T2 <: U2.

        +

        That is, function type T is a subtype of function type +U if they have same <shared>? +qualification, they have the same type parameters (modulo renaming) and +assuming the bounds in U, every bound in T +supertypes the corresponding parameter bound in U +(contra-variance), the domain of T supertypes the domain of +U (contra-variance) and the range of T +subtypes the range of U (co-variance).

      • +
    • +
  • +
  • T (respectively U) is a constructed +type C<V0, …​, Vn> that is equal, by definition of +type constructor C, to W, and +W <: U (respectively U <: W).

  • +
  • For some type V, T <: V and +V <: U (transitivity).

  • +
+

Shareability

+

A type T is shared if it is:

+
    +
  • Any or None, or

  • +
  • A primitive type other than Error, or

  • +
  • An option type ? V where V is shared, +or

  • +
  • A tuple type (T0, …​, Tn) where all Ti +are shared, or

  • +
  • An immutable array type [V] where V is +shared, or

  • +
  • An object type where all fields are immutable and +have shared type, or

  • +
  • A variant type where all tags have shared type, or

  • +
  • A shared function type, or

  • +
  • An actor type.

  • +
+

Stability

+

Stability extends shareability to include mutable types. More +precisely:

+

A type T is stable if it is:

+
    +
  • Any or None, or

  • +
  • A primitive type other than Error, or

  • +
  • An option type ? V where V is stable, +or

  • +
  • A tuple type (T0, …​, Tn) where all Ti +are stable, or

  • +
  • A (mutable or immutable) array type [var? V] where +V is stable, or

  • +
  • An object type where all fields have stable type, +or

  • +
  • A variant type where all tags have stable type, or

  • +
  • A shared function type, or

  • +
  • An actor type.

  • +
+

This definition implies that every shared type is a stable type. The +converse does not hold: there are types that are stable but not share, +notably types with mutable components.

+

The types of actor fields declared with the stable +qualifier must have stable type.

+

The current value of such a field is preserved upon upgrade, whereas +the values of other fields are reinitialized after an upgrade.

+

Note: the primitive Region type is stable.

+

Static and dynamic semantics

+

Below is a detailed account of the semantics of Motoko programs.

+

For each expression form and each declaration form, this page summarizes +its semantics, both in static terms based on typing and dynamic terms +based on program evaluation.

+

Programs

+

A program <imp>;* <dec>;* has type +T provided:

+
    +
  • <dec>;* has type T under the static +environment induced by the imports in <imp>;*.
  • +
+

All type and value declarations within <dec>;* are +mutually-recursive.

+

A program evaluates by transitively evaluating the imports, binding +their values to the identifiers in <imp>;* and then +evaluating the sequence of declarations in +<dec>;*.

+

Libraries

+

Restrictions on the syntactic form of modules means that libraries +can have no side-effects.

+

The imports of a library are local and not re-exported in its +interface.

+

Multiple imports of the same library can be safely deduplicated +without loss of side-effects.

+

Module libraries

+

A library +<imp>;* module <id>? (: <typ>)? =? <obj-body> +is a sequence of imports <import>;* followed by a +single module declaration.

+

A library has module type T provided:

+
    +
  • module <id>? (: <typ>)? =? <obj-body> +has (module) type T under the static environment induced by +the imports in <import>;*.
  • +
+

A module library evaluates by transitively evaluating its imports, +binding their values to the identifiers in <imp>;* +and then evaluating +module <id>? =? <obj-body>.

+

If (: <typ>)? is present, then T must +be a subtype of <typ>.

+

Actor class libraries

+

The actor class library <imp>;* <dec> where +<dec> is of the form +<shared-pat>? actor class <id> <typ-params>? <pat> (: <typ>)? <class-body> +has type:

+
module {
+  type <id> = T;
+  <id> : (U1,...,Un) -> async T
+}
+

Provided that the actor class declaration <dec> +has function type (U1, ...​, Un) -> async T under the +static environment induced by the imports in +<import>;*.

+

Notice that the imported type of the function <id> +must be asynchronous.

+

An actor class library evaluates by transitively evaluating its +imports, binding their values to the identifiers in +<imp>;*, and evaluating the derived module:

+
module {
+  <dec>
+}
+

On ICP, if this library is imported as identifier Lib, +then calling +await Lib.<id>(<exp1>, ..., <expn>), +installs a fresh instance of the actor class as an isolated IC canister, +passing the values of <exp1>, ...​, +<expn> as installation arguments, and returns a +reference to a remote actor of type Lib.<id>, that +is, T. Installation is necessarily asynchronous.

+

Actor class management

+

On ICP, the primary constructor of an imported actor class always +creates a new principal and installs a fresh instance of the class as +the code for that principal. While that is one way to install a canister +on ICP, it is not the only way.

+

To provide further control over the installation of actor classes, +Motoko endows each imported actor class with an extra, secondary +constructor, for use on ICP. This constructor takes an additional first +argument that tailors the installation. The constructor is only +available via special syntax that stresses its system +functionality.

+

Given some actor class constructor:

+
Lib.<id> : (U1, ...​, Un) -> async T
+

Its secondary constructor is accessed as +(system Lib.<id>) with typing:

+
(system Lib.<id>) :
+  { #new : CanisterSettings;
+    #install : Principal;
+    #reinstall : actor {} ;
+    #upgrade : actor {} }  ->
+    (U1, ...​, Un) -> async T
+

where:

+
  type CanisterSettings = {
+     settings : ?{
+        controllers : ?[Principal];
+        compute_allocation : ?Nat;
+        memory_allocation : ?Nat;
+        freezing_threshold : ?Nat;
+     }
+  }
+

Calling +(system Lib.<id>)(<exp>)(<exp1>, ...​, <expn>) +uses the first argument <exp>, a variant value, to +control the installation of the canister further. Arguments +(<exp1>, ..., <expn>) are just the +user-declared constructor arguments of types U1, ..., Un +that would also be passed to the primary constructor.

+

If <exp> is:

+
    +
  • #new s, where s has type +CanisterSettings:

    +
      +
    • The call creates a fresh ICP principal p, with settings +s, and installs the instance to principal +p.
    • +
  • +
  • #install p, where p has type Principal:

    +
      +
    • The call installs the actor to an already created ICP principal +p. The principal must be empty, having no previously +installed code, or the call will return an error.
    • +
  • +
  • #upgrade a, where a has type (or +supertype) actor {}:

    +
      +
    • The call installs the instance as an upgrade of actor +a, using its current stable storage to initialize stable +variables and stable memory of the new instance.
    • +
  • +
  • #reinstall a, where a has type (or +supertype) actor {}:

    +
      +
    • Reinstalls the instance over the existing actor a, +discarding its stable variables and stable memory.
    • +
  • +
+

:::note

+

On ICP, calling the primary constructor Lib.<id> +is equivalent to calling the secondary constructor +(system Lib.<id>) with argument +(#new {settings = null}) i.e. using default settings.

+

:::

+

:::note

+

On ICP, calls to Lib.<id> and +(system Lib.<id>)(#new ...) must be provisioned with +enough cycles for the creation of a new principal. Other call variants +will use the cycles of the already allocated principal or actor.

+

:::

+

:::danger

+

The use of #upgrade a may be unsafe. Motoko will +currently not verify that the upgrade is compatible with the code +currently installed at a. A future extension may verify +compatibility with a dynamic check.

+

The use of #reinstall a may be unsafe. Motoko cannot +verify that the reinstall is compatible with the code currently +installed in actor a even with a dynamic check. A change in +interface may break any existing clients of a. The current +state of a will be lost.

+

:::

+

Imports and URLs

+

An import import <pat> =? <url> declares a +pattern <pat> bound to the contents of the text +literal <url>.

+

<url> is a text literal that designates some +resource: a local library specified with a relative path, a named module +from a named package, or an external canister, referenced either by +numeric canister id or by a named alias, and imported as a Motoko +actor.

+

In detail, if <url> is of the form:

+
    +
  • "<filepath>" then <pat> is +bound to the library module defined in file +<filepath>.mo. <filepath> is +interpreted relative to the absolute location of the enclosing file. +Note the .mo extension is implicit and should not be +included in <url>. For example, +import U "lib/Util" defines U to reference the +module in local file ./lib/Util.

  • +
  • "mo:<package-name>/<path>" then +<pat> is bound to the library module defined in file +<package-path>/<path>.mo in directory +<package-path> referenced by package alias +<package-name>. The mapping from +<package-name> to <package-path> +is determined by a compiler command-line argument +--package <package-name> <package-path>. For +example, import L "mo:base/List" defines L to +reference the List library in package alias +base.

  • +
  • "ic:<canisterid>" then +<pat> is bound to a Motoko actor whose Motoko type is +determined by the canister’s IDL interface. The IDL interface of +canister <canisterid> must be found in file +<actorpath>/<canisterid>.did. The compiler +assumes that <actorpath> is specified by command line +argument --actor-idl <actorpath> and that file +<actorpath>/<canisterid>.did exists. For +example, import C "ic:lg264-qjkae" defines C +to reference the actor with canister id lg264-qjkae and IDL +file lg264-qjkae.did.

  • +
  • "canister:<name>" is a symbolic reference to +canister alias <name>. The compiler assumes that the +mapping of <name> to <canisterid> +is specified by command line argument +--actor-alias <name> ic:<canisterid>. If so, +"canister:<name>" is equivalent to +"ic:<cansterid>" (see above). For example, +import C "canister:counter" defines C to +reference the actor otherwise known as counter.

  • +
+

The case sensitivity of file references depends on the host operating +system so it is recommended not to distinguish resources by filename +casing alone.

+

When building multi-canister projects with the IC +SDK, Motoko programs can typically import canisters by alias (e.g. +import C "canister:counter"), without specifying low-level +canister ids (e.g. import C "ic:lg264-qjkae"). The SDK +tooling takes care of supplying the appropriate command-line arguments +to the Motoko compiler.)

+

Sensible choices for <pat> are identifiers, such +as Array, or object patterns +like { cons; nil = empty }, which allow selective importing +of individual fields, under original or other names.

+

Declaration fields

+

A declaration field +<vis>? <stab>? <dec> defines zero or more +fields of an actor or object, according to the set of variables defined +by <dec>.

+

Any identifier bound by a public declaration appears in +the type of enclosing object, module or actor and is accessible via the +dot notation.

+

An identifier bound by a private or system +declaration is excluded from the type of the enclosing object, module or +actor and thus inaccessible.

+

The declaration field has type T provided:

+
    +
  • <dec> has type T.

  • +
  • If <stab>? is stable then +T must be a stable type (see stability).

  • +
+

Actor fields declared flexible, implicitly or +explicitly, can have any type, but will not be preserved across +upgrades.

+

Sequences of declaration fields are evaluated in order by evaluating +their constituent declarations, with the following exception:

+
    +
  • During an upgrade only, the value of a stable +declaration is obtained as follows:

    +
      +
    • If the stable declaration was previously declared stable in the +retired actor, its initial value is inherited from the retired +actor.

    • +
    • If the stable declaration was not declared stable in the retired +actor, and is thus new, its value is obtained by evaluating +<dec>.

    • +
  • +
  • For an upgrade to be safe:

    +
      +
    • Every stable identifier declared with type T in the +retired actor and declared stable and of type U in the +replacement actor, must satisfy T <: U.
    • +
  • +
+

This condition ensures that every stable variable is either fresh, +requiring initialization, or its value can be safely inherited from the +retired actor. Note that stable variables may be removed across +upgrades, or may simply be deprecated by an upgrade to type +Any.

+

System fields

+

The declaration <dec> of a system +field must be a manifest func declaration with one of the +following names and types:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nametypedescription
heartbeat() -> async ()Heartbeat action
timer(Nat64 -> ()) -> async ()Timer action
inspect{ caller : Principal; msg : <Variant>; arg : Blob } -> BoolMessage predicate
preupgrade<system>() -> ()Pre upgrade action
postupgrade<system>() -> ()Post upgrade action
+
    +
  • heartbeat: When declared, is called on every +Internet Computer subnet heartbeat, scheduling an asynchronous call to +the heartbeat function. Due to its async +return type, a heartbeat function may send messages and await results. +The result of a heartbeat call, including any trap or thrown error, is +ignored. The implicit context switch means that the time the heartbeat +body is executed may be later than the time the heartbeat was issued by +the subnet.

  • +
  • timer: When declared, is called as a response of the +canister global timer's expiration. The canister's global timer can be +manipulated with the passed-in function argument of type +Nat64 -> () (taking an absolute time in nanoseconds) +upon which libraries can build their own abstractions. When not declared +(and in absence of the -no-timer flag), this system action +is provided with default implementation by the compiler (additionally +setTimer and cancelTimer are available as +primitives).

  • +
  • inspect: When declared, is called as a predicate on +every Internet Computer ingress message with the exception of HTTP query +calls. The return value, a Bool, indicates whether to +accept or decline the given message. The argument type depends on the +interface of the enclosing actor (see inspect).

  • +
  • preupgrade: When declared, is called during an +upgrade, immediately before the current values of the retired actor’s +stable variables are transferred to the replacement actor. Its +<system> type parameter is implicitly assumed and +need not be declared.

  • +
  • postupgrade: When declared, is called during an +upgrade, immediately after the replacement actor body has initialized +its fields, inheriting values of the retired actors' stable variables, +and before its first message is processed. Its +<system> type parameter is implicitly assumed and +need not be declared.

  • +
+

These preupgrade and postupgrade system +methods provide the opportunity to save and restore in-flight data +structures, e.g. caches, that are better represented using non-stable +types.

+

During an upgrade, a trap occurring in the implicit call to +preupgrade() or postupgrade() causes the +entire upgrade to trap, preserving the pre-upgrade actor.

+
inspect
+

Given a record of message attributes, this function produces a Bool that indicates whether to +accept or decline the message by returning true or +false. The function is invoked by the system on each +ingress message issue as an ICP update call, excluding non-replicated +query calls. Similar to a query, any side-effects of an invocation are +transient and discarded. A call that traps due to some fault has the +same result as returning false message denial.

+

The argument type of inspect depends on the interface of +the enclosing actor. In particular, the formal argument of +inspect is a record of fields of the following types:

+
    +
  • caller : Principal: The principal, possibly +anonymous, of the caller of the message.

  • +
  • arg : Blob: The raw, binary content of the message +argument.

  • +
  • msg : <variant>: A variant of decoding +functions, where +<variant> == {…​; #<id>: () → T; …​} contains one +variant per shared or shared query function, +<id>, of the actor. The variant’s tag identifies the +function to be called; The variant’s argument is a function that, when +applied, returns the (decoded) argument of the call as a value of type +T.

  • +
+

Using a variant, tagged with #<id>, allows the +return type, T, of the decoding function to vary with the +argument type (also T) of the shared function +<id>.

+

The variant’s argument is a function so that one can avoid the +expense of message decoding when appropriate.

+

:::danger

+

An actor that fails to declare system field inspect will +simply accept all ingress messages.

+

:::

+

:::note

+

Any shared composite query function in the interface is +not included in <variant> since, unlike a +shared query, it can only be invoked as a non-replicated +query call, never as an update call.

+

:::

+

Sequence of declarations

+

A sequence of declarations <dec>;* occurring in a +block, a program or embedded in the <dec-field>;* +sequence of an object body has type T provided:

+
    +
  • <dec>;* is empty and T == (), +or

  • +
  • <dec>;* is non-empty and:

    +
      +
    • All value identifiers bound by <dec>;* are +distinct.

    • +
    • All type identifiers bound by <dec>;* are +distinct.

    • +
    • Under the assumption that each value identifier +<id> in <dec>;* has type +var_id? Tid, and assuming the type definitions in +<dec>;*:

      +
        +
      • Each declaration in <dec>;* is +well-typed,.

      • +
      • Each value identifier <id> in bindings +produced by <dec>;* has type +var_id? Tid.

      • +
      • All but the last <dec> in +<dec>;* of the form <exp> has type +().

      • +
      • The last declaration in <dec>;* has type +T.

      • +
    • +
  • +
+

Declarations in <dec>;* are evaluated +sequentially. The first declaration that traps causes the entire +sequence to trap. Otherwise, the result of the declaration is the value +of the last declaration in <dec>;*. In addition, the +set of value bindings defined by <dec>;* is the union +of the bindings introduced by each declaration in +<dec>;*.

+

It is a compile-time error if any declaration in +<dec>;* might require the value of an identifier +declared in <dec>;* before that identifier’s +declaration has been evaluated. Such use-before-define errors are +detected by a simple, conservative static analysis not described +here.

+

Patterns

+

Patterns bind function parameters, declare identifiers and decompose +values into their constituent parts in the cases of a +switch expression.

+

Matching a pattern against a value may succeed, binding the +corresponding identifiers in the pattern to their matching values, or +fail. Thus the result of a match is either a successful binding, mapping +identifiers of the pattern to values, or failure.

+

The consequences of pattern match failure depends on the context of +the pattern.

+
    +
  • In a function application or let-binding, failure to +match the formal argument pattern or let-pattern causes a +trap.

  • +
  • In a case branch of a switch +expression, failure to match that case’s pattern continues with an +attempt to match the next case of the switch, trapping only when no such +case remains.

  • +
+

Wildcard pattern

+

The wildcard pattern _ matches a single value without +binding its contents to an identifier.

+

Identifier pattern

+

The identifier pattern <id> matches a single value +and binds it to the identifier <id>.

+

Literal pattern

+

The literal pattern <unop>? <lit> matches a +single value against the constant value of literal +<lit> and fails if they are not structurally equal +values.

+

For integer literals only, the optional <unop> +determines the sign of the value to match.

+

Tuple pattern

+

The tuple pattern ( <pat>,* ) matches a n-tuple +value against an n-tuple of patterns where both the tuple and pattern +must have the same number of items. The set of identifiers bound by each +component of the tuple pattern must be distinct.

+

The empty tuple pattern () is called the unit +pattern.

+

Pattern matching fails if one of the patterns fails to match the +corresponding item of the tuple value. Pattern matching succeeds if +every pattern matches the corresponding component of the tuple value. +The binding returned by a successful match is the disjoint union of the +bindings returned by the component matches.

+

Object pattern

+

The object pattern { <pat-field>;* } matches an +object value, a collection of named field values, against a sequence of +named pattern fields. The set of identifiers bound by each field of the +object pattern must be distinct. The names of the pattern fields in the +object pattern must be distinct.

+

Object patterns support punning for concision. A punned field +<id> is shorthand for +<id> = <id>. Similarly, a typed, punned field +<id> : <typ> is short-hand for +<id> = <id> : <typ>. Both bind the +matched value of the field named <id> to the +identifier <id>.

+

Pattern matching fails if one of the pattern fields fails to match +the corresponding field value of the object value. Pattern matching +succeeds if every pattern field matches the corresponding named field of +the object value. The binding returned by a successful match is the +union of the bindings returned by the field matches.

+

The <sort> of the matched object type must be +determined by an enclosing type annotation or other contextual type +information.

+

Variant pattern

+

The variant pattern # <id> <pat>? matches a +variant value (of the form # <id'> v) against a +variant pattern. An absent <pat>? is shorthand for +the unit pattern (()). Pattern matching fails if the tag +<id'> of the value is distinct from the tag +<id> of the pattern (i.e. <id> +<> <id'>); or the tags are equal but the value +v does not match the pattern <pat>?. +Pattern matching succeeds if the tag of the value is +<id> (i.e. <id'> = +<id>) and the value v matches the +pattern <pat>?. The binding returned by a successful +match is just the binding returned by the match of v +against <pat>?.

+

Annotated pattern

+

The annotated pattern <pat> : <typ> matches +value of v type <typ> against the +pattern <pat>.

+

<pat> : <typ> is not a dynamic type test, +but is used to constrain the types of identifiers bound in +<pat>, e.g. in the argument pattern to a +function.

+

Option pattern

+

The option ? <pat> matches a value of option type +? <typ>.

+

The match fails if the value is null. If the value is +? v, for some value v, then the result of +matching ? <pat> is the result of matching +v against <pat>.

+

Conversely, the null literal pattern may be used to test +whether a value of option type is the value null and not +? v for some v.

+

Or pattern

+

The or pattern <pat1> or <pat2> is a +disjunctive pattern.

+

The result of matching <pat1> or <pat2> +against a value is the result of matching <pat1>, if +it succeeds, or the result of matching <pat2>, if the +first match fails.

+

An or-pattern may contain identifier +(<id>) patterns with the restriction that both +alternatives must bind the same set of identifiers. Each identifier's +type is the least upper bound of its type in <pat1> +and <pat2>.

+

Expression declaration

+

The declaration <exp> has type T +provided the expression <exp> has type T +. It declares no bindings.

+

The declaration <exp> evaluates to the result of +evaluating <exp> typically for +<exp>'s side-effect.

+

Note that if <exp> appears within a sequence of +declarations, but not as the last declaration of that sequence, then +T must be ().

+

Let declaration

+

The let declaration +let <pat> = <exp> has type T and +declares the bindings in <pat> provided:

+
    +
  • <exp> has type T, and

  • +
  • <pat> has type T.

  • +
+

The declaration let <pat> = <exp> evaluates +<exp> to a result r. If r +is trap, the declaration evaluates to trap. If +r is a value v then evaluation proceeds by +matching the value v against <pat>. If +matching fails, then the result is trap. Otherwise, the +result is v and the binding of all identifiers in +<pat> to their matching values in v.

+

All bindings declared by a let if any are immutable.

+

Let-else declaration

+

The let-else declaration +let <pat> = <exp> else <block-or-exp> has +type T and declares the bindings in +<pat> provided:

+
    +
  • <exp> has type T,

  • +
  • <pat> has type T, and

  • +
  • <block-or-exp> has type +None.

  • +
+

The declaration +let <pat> = <exp> else <block-or-exp> +evaluates <exp> to a result r. If +r is trap, the declaration evaluates to +trap. If r is a value v then +evaluation proceeds by matching the value v against +<pat>. If matching succeeds, the result is +v and the binding of all identifiers in +<pat> to their matching values in v.

+

If matching fails, then evaluation continues with +<block-or-exp>, which, having type None, +cannot proceed to the end of the declaration but may still alter +control-flow to, for example return or throw +to exit an enclosing function, break from an enclosing +expression or simply diverge.

+

All bindings declared by a let-else if any are +immutable.

+

Handling pattern match +failures

+

In the presence of refutable patterns, the pattern in a +let declaration may fail to match the value of its +expression. In such cases, the let-declaration will +evaluate to a trap. The compiler emits a warning for any +let-declaration than can trap due to pattern match +failure.

+

Instead of trapping, a user may want to explicitly handle pattern +match failures. The let-else declaration, +let <pat> = <exp> else <block-or-exp>, +has mostly identical static and dynamic semantics to let, +but diverts the program's control flow to +<block-or-exp> when pattern matching fails, allowing +recovery from failure. The else expression, +<block-or-exp>, must have type None and +typically exits the declaration using imperative control flow constructs +such as throw, return, break or +non-returning functions such as Debug.trap(...) that all +produce a result of type None. Any compilation warning that +is produced for a let can be silenced by handling the +potential pattern-match failure using let-else.

+

Var declaration

+

The variable declaration +var <id> (: <typ>)? = <exp> declares a +mutable variable <id> with initial value +<exp>. The variable’s value can be updated by +assignment.

+

The declaration var <id> has type () +provided:

+
    +
  • <exp> has type T; and

  • +
  • If the annotation (:<typ>)? is present, then +T == <typ>.

  • +
+

Within the scope of the declaration, <id> has type +var T (see Assignment).

+

Evaluation of +var <id> (: <typ>)? = <exp> proceeds by +evaluating <exp> to a result r. If +r is trap, the declaration evaluates to +trap. Otherwise, the r is some value +v that determines the initial value of mutable variable +<id>. The result of the declaration is +() and <id> is bound to a fresh location +that contains v.

+

Type declaration

+

The declaration +type <id> <type-typ-params>? = <typ> +declares a new type constructor <id>, with optional +type parameters <type-typ-params> and definition +<typ>.

+

The declaration +type C< X0 <: T0, …​, Xn <: Tn > = U is +well-formed provided:

+
    +
  • Type parameters X0, …​, Xn are distinct, +and

  • +
  • Assuming the constraints X0 <: T0, …​, +Xn <: Tn:

    +
      +
    • Constraints T0, …​, Tn are +well-formed.

    • +
    • Definition U is well-formed.

    • +
    • It is productive (see Productivity).

    • +
    • It is non-expansive (see Expansiveness).

    • +
  • +
+

In scope of the declaration +type C< X0<:T0, …​, Xn <: Tn > = U, any +well-formed type C< U0, …​, Un > is equivalent to its +expansion U [ U0/X0, …​, Un/Xn ]. Distinct type expressions +that expand to identical types are inter-changeable, regardless of any +distinction between type constructor names. In short, the equivalence +between types is structural, not nominal.

+

Productivity

+

A type is productive if recursively expanding any +outermost type constructor in its definition eventually produces a type +other than the application of a type constructor.

+

Motoko requires all type declarations to be productive.

+

For example, the following type definitions are all productive and +legal:

+
  type Person = { first : Text; last : Text };
+
+  type List<T> = ?(T, List<T>);
+
+  type Fst<T, U> = T;
+
+  type Ok<T> = Fst<Any, Ok<T>>;
+

But in contrast, the following type definitions are all +non-productive, since each definition will enter a loop after one or +more expansions of its body:

+
  type C = C;
+
+  type D<T, U> = D<U, T>;
+
+  type E<T> = F<T>;
+  type F<T> = E<T>;
+
+  type G<T> = Fst<G<T>, Any>;
+

Expansiveness

+

A set of mutually recursive type or class declarations will be +rejected if the set is expansive.

+

Expansiveness is a syntactic criterion. To determine whether a set of +singly or mutually recursive type definitions is expansive, for +example:

+
  type C<...,Xi,...> = T;
+  ...
+  type D<...,Yj,...> = U;
+

Take these definitions and construct a directed graph whose vertices +are the formal type parameters identified by position, C#i, +with the following {0,1}-labeled edges:

+
    +
  • For each occurrence of parameter C#i as immediate, +j-th argument to type D<…​,C#i,…​>, add a +non-expansive, 0-labeled +edge,C#i -0-> D#j.

  • +
  • For each occurrence of parameter C#i as a proper +sub-expression of the j-th argument to type +D<…​,T[C#i],..> add an expansive +1-labeled edge, C#i -1-> D#j.

  • +
+

The graph is expansive if, and only if, it contains a cycle with at +least one expansive edge.

+

For example, the type definition that recursively instantiates +List at the same parameter T, is non-expansive +and accepted:

+
  type List<T> = ?(T, List<T>);
+

A similar looking definition that recursively instantiates +Seq with a larger type, [T], containing +T, is expansive and rejected:

+
  type Seq<T> = ?(T, Seq<[T]>);
+
    +
  • Type List<T> is non-expansive because its +graph, { List#0 -0-> List#0 }, though cyclic, has no +expansive edge.

  • +
  • Type Seq<T>, on the other hand, is expansive, +because its graph, { Seq#0 -1-> Seq#0 }, has a cycle +that includes an expansive edge.

  • +
+

Object declaration

+

Declaration +<sort> <id>? (: <typ>)? =? <obj-body>, +where <obj-body> is of the form +{ <dec-field>;* }, declares an object with optional +identifier <id> and zero or more fields +<dec-field>;*. Fields can be declared with +public or private visibility; if the +visibility is omitted, it defaults to private.

+

The qualifier <sort> (one of actor, +module or object) specifies the sort +of the object’s type. The sort imposes restrictions on the types of the +public object fields.

+

Let +T = <sort> { [var0] id0 : T0, …​ , [varn] idn : T0 } +denote the type of the object. Let <dec>;* be the +sequence of declarations embedded in <dec-field>;*. +The object declaration has type T provided that:

+
    +
  1. Type T is well-formed for sort sort, +and

  2. +
  3. Under the assumption that <id> : T,

    +
      +
    • The sequence of declarations <dec>;* has type +Any and declares the disjoint sets of private and public +identifiers, Id_private and Id_public +respectively, with types T(id) for id in +Id == Id_private union Id_public, and

    • +
    • { id0, …​, idn } == Id_public, and

    • +
    • For all i in 0 <= i <= n, +[vari] Ti == T(idi).

    • +
  4. +
  5. If <sort> is module, then the +declarations in <dec>;* must be static (see +static declarations).

  6. +
+

Note that the first requirement imposes further constraints on the +field types of T. In particular, if the sort is +actor then:

+
    +
  • All public fields must be non-var immutable +shared functions. The public interface of an actor can only +provide asynchronous messaging via shared functions.
  • +
+

Because actor construction is asynchronous, an actor declaration can +only occur in an asynchronous context, i.e. in the body of a +non-<query> shared function, +async expression or async* expression.

+

Evaluation of +<sort>? <id>? =? { <dec-field>;* } +proceeds by binding <id>, if present, to the eventual +value v, and evaluating the declarations in +<dec>;*. If the evaluation of +<dec>;* traps, so does the object declaration. +Otherwise, <dec>;* produces a set of bindings for +identifiers in Id. let v0, …​, vn +be the values or locations bound to identifiers +<id0>, …​, <idn>. The result of the +object declaration is the object +v == sort { <id0> = v1, …​, <idn> = vn}.

+

If <id>? is present, the declaration binds +<id> to v. Otherwise, it produces the +empty set of bindings.

+

If (: <typ>)? is present, then T must +be a subtype of <typ>.

+

:::danger

+

Actor declaration is implicitly asynchronous and the state of the +enclosing actor may change due to concurrent processing of other +incoming actor messages. It is the programmer’s responsibility to guard +against non-synchronized state changes.

+

:::

+

Static declarations

+

A declaration is static if it is:

+
    +
  • A type declaration.

  • +
  • A class declaration.

  • +
  • A let declaration with a static pattern and a static +expression.

  • +
  • A module, function or object declaration that de-sugars to a +static let declaration.

  • +
  • A static expression.

  • +
+

An expression is static if it is:

+
    +
  • A literal expression.

  • +
  • A tuple of static expressions.

  • +
  • An object of static expressions.

  • +
  • A variant or option with a static expression.

  • +
  • An immutable array.

  • +
  • Field access and projection from a static expression.

  • +
  • A module expression.

  • +
  • A function expression.

  • +
  • A static declaration.

  • +
  • An ignore of a static expression.

  • +
  • A block, all of whose declarations are static.

  • +
  • A type annotation with a static expression.

  • +
+

A pattern is static if it is:

+
    +
  • An identifier.

  • +
  • A wildcard.

  • +
  • A tuple of static patterns.

  • +
  • Type annotation with a static pattern.

  • +
+ + +

Static phrases are designed to be side-effect free, allowing the +coalescing of duplicate library imports.

+

Function declaration

+

The function declaration +<shared-pat>? func <id>? <typ-params>? <pat> (: <typ>)? =? <exp> +is syntactic sugar for a named let or anonymous declaration +of a function expression.

+

That is, when <id>? is present and the function is +named:

+
<shared-pat>? func <id> <typ-params>? <pat> (: <typ>)? =? <block-or-exp> :=
+  let <id> = <shared-pat>? func <typ-params>? <pat> (: <typ>)? =? <block-or-exp>
+

But when <id>? is absent and the function is +anonymous:

+
<shared-pat>? func <typ-params>? <pat> (: <typ>)? =? <block-or-exp> :=
+  <shared-pat>? func <typ-params>? <pat> (: <typ>)? =? <block-or-exp>
+

Named function definitions support recursion, i.e. a named function +can call itself.

+

:::note

+

In compiled code, shared functions can only appear as +public actor fields.

+

:::

+

Class declaration

+

The class declaration +<shared-pat>? <sort>? class <id>? <typ-params>? <pat> (: <typ>)? <class-body> +is sugar for pair of a type and function declaration:

+
<shared-pat>? <sort>? class <id> <typ-params>? <pat> (: <typ>)? <class-body> :=
+  type <id> <type-typ-params>? = <sort> { <typ-field>;* };
+  <shared-pat>? func <id> <typ-params>? <pat> : async? <id> <typ-args> =
+    async? <sort> <id_this>? <obj-body>
+

where:

+
    +
  • <shared-pat>?, when present, requires +<sort> == actor, and provides access to +the caller of an actor constructor, +and

  • +
  • <typ-args>? and +<type-typ-params>? is the sequence of type +identifiers bound by <typ-params>?, if any, +and

  • +
  • <typ-field>;* is the set of public field types +inferred from <dec-field>;*.

  • +
  • <obj-body> is the object body of +<class-body>.

  • +
  • <id_this>? is the optional +this or self parameter of +<class-body>.

  • +
  • async? is present, if only if, +<sort> == actor.

  • +
+

Note <shared-pat>? must not be of the form +shared <query> <pat>?: a constructor, unlike a +function, cannot be a query or +composite query.

+

An absent <shared-pat>? defaults to +shared when sort = actor.

+

If sort is actor, then:

+
    +
  • <typ-args>? must be absent or empty, such that +actor classes cannot have type parameters.

  • +
  • <pat>'s type must be shared (see shareability).

  • +
  • (: <typ>)?, if present, must be of the form +: async T for some actor type T. Actor +instantiation is asynchronous.

  • +
+

If (: <typ>) is present, then the type +<async?> <sort> { <typ_field>;* } must +be a subtype of the annotation <typ>. In particular, +the annotation is used only to check, but not affect, the inferred type +of function <id>.

+

The class declaration has the same type as function +<id> and evaluates to the function value +<id>.

+

Identifiers

+

The identifier expression <id> has type +T provided <id> is in scope, defined and +declared with explicit or inferred type T.

+

The expression <id> evaluates to the value bound +to <id> in the current evaluation environment.

+

Literals

+

A literal has type T only when its value is within the +prescribed range of values of type T.

+

The literal (or constant) expression <lit> +evaluates to itself.

+

Unary operators

+

The unary operator <unop> <exp> has type +T provided:

+
    +
  • <exp> has type T, and

  • +
  • The category of <unop> is a category of +T.

  • +
+

The unary operator expression <unop> <exp> +evaluates <exp> to a result. If the result is a value +v, it returns the result of <unop> v. If +the result is trap, the entire expression results in +trap.

+

Binary operators

+

The binary operator expression +<exp1> <binop> <exp2> has type +T provided:

+
    +
  • <exp1> has type T.

  • +
  • <exp2> has type T.

  • +
  • The category of <binop> is a category of +T.

  • +
+

The binary operator expression +<exp1> <binop> <exp2> evaluates +exp1 to a result r1. If r1 is +trap, the expression results in trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 and r2 are values +v1 and v2 and the expression returns the +result of v1 <binop> v2.

+

Relational operators

+

The relational expression +<exp1> <relop> <exp2> has type Bool provided:

+
    +
  • <exp1> has type T.

  • +
  • <exp2> has type T.

  • +
  • <relop> is equality == or +inequality !=, T is shared, and T +is the least type such that <exp1> and +<exp2> have type T.

  • +
  • Ihe category O (Ordered) is a category of T and +<relop>.

  • +
+

The binary operator expression +<exp1> <relop> <exp2> evaluates +<exp1> to a result r1. If +r1 is trap, the expression results in +trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 and r2 are values +v1 and v2 and the expression returns the +Boolean result of v1 <relop> v2.

+

For equality and inequality, the meaning of +v1 <relop> v2 depends on the compile-time, static +choice of T. This means that only the static types of +<exp1> and <exp2> are considered +for equality, and not the run-time types of v1 and +v2, which, due to subtyping, may be more precise than the +static types.

+

Pipe operators and +placeholder expressions

+

The pipe expression <exp1> |> <exp2> +binds the value of <exp1> to the special placeholder +expression _, that can be referenced in +<exp2> and recursively in <exp1>. +Referencing the placeholder expression outside of a pipe operation is a +compile-time error.

+

The pipe expression <exp1> |> <exp2> is +just syntactic sugar for a let binding to a placeholder +identifier, p:

+
do { let p = <exp1>; <exp2> }
+

The placeholder expression _ is just syntactic sugar for +the expression referencing the placeholder identifier:

+
p
+

The placeholder identifier, p, is a fixed, reserved +identifier that cannot be bound by any other expression or pattern other +than a pipe operation, and can only be referenced using the placeholder +expression _.

+

|> has lowest precedence amongst all operators except +: and associates to the left.

+

Judicious use of the pipe operator allows one to express a more +complicated nested expression by piping arguments of that expression +into their nested positions within that expression.

+

For example:

+
Iter.range(0, 10) |>
+  Iter.toList _ |>
+    List.filter<Nat>(_, func n { n % 3 == 0 }) |>
+      { multiples = _ };
+

This may be a more readable rendition of:

+
{ multiples =
+   List.filter<Nat>(
+     Iter.toList(Iter.range(0, 10)),
+     func n { n % 3 == 0 }) };
+

Above, each occurrence of _ refers to the value of the +left-hand-size of the nearest enclosing pipe operation, after +associating nested pipes to the left.

+

Note that the evaluation order of the two examples is different, but +consistently left-to-right.

+

:::note

+

Although syntactically identical, the placeholder expression is +semantically distinct from, and should not be confused with, the +wildcard pattern _.

+

Occurrences of the forms can be distinguished by their syntactic role +as pattern or expression.

+

:::

+

Tuples

+

Tuple expression (<exp1>, …​, <expn>) has +tuple type (T1, …​, Tn), provided <exp1>, +…​, <expn> have types T1, …​, +Tn.

+

The tuple expression (<exp1>, …​, <expn>) +evaluates the expressions exp1 …​ expn in +order, trapping as soon as some expression <expi> +traps. If no evaluation traps and exp1, …​, +<expn> evaluate to values +v1,…​,vn then the tuple expression returns the +tuple value (v1, …​ , vn).

+

The tuple projection <exp> . <nat> has type +Ti provided <exp> has tuple type +(T1, …​, Ti, …​, Tn), <nat> == +i and 1 <= i <= n.

+

The projection <exp> . <nat> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be a tuple (v1,…​,vi,…​,vn) and the +result of the projection is the value vi.

+

The empty tuple expression () is called the unit +value.

+

Option expressions

+

The option expression ? <exp> has type +? T provided <exp> has type +T.

+

The literal null has type Null. Since +Null <: ? T for any T, literal +null also has type ? T and signifies the +"missing" value at type ? T.

+

Variant injection

+

The variant injection # <id> <exp> has +variant type {# id T} provided:

+
    +
  • <exp> has type T.
  • +
+

The variant injection # <id> is just syntactic +sugar for # <id> ().

+

The variant injection # <id> <exp> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be a value v and the result of the +injection is the tagged value # <id> v.

+

The tag and contents of a variant value can be tested and accessed +using a variant pattern.

+

Objects

+

Objects can be written in literal form +{ <exp-field>;* }, consisting of a list of expression +fields:

+
<exp-field> ::=                                Object expression fields
+  var? <id> (: <typ>) = <exp>                    Field
+  var? <id> (: <typ>)                            Punned field
+

Such an object literal, sometimes called a record, is equivalent to +the object declaration object { <dec-field>;* } where +the declaration fields are obtained from the expression fields by +prefixing each of them with public let, or just +public in case of var fields. However, unlike +declarations, the field list does not bind each <id> +as a local name within the literal, i.e., the field names are not in +scope in the field expressions.

+

Object expressions support punning for concision. A +punned field <id> is shorthand for +<id> = <id>; Similarly, a typed, punned field +<id> : <typ> is short-hand for +<id> = <id> : <typ>. Both associate the +field named <id> with the value of the identifier +<id>.

+

Object combination/extension

+

Objects can be combined and/or extended using the and +and with keywords.

+

A record expression +{ <exp> (and <exp>)* (with <exp-field>;+)? } +merges the objects or module) specified as base expressions, and +augments the result to also contain the specified fields. The +with <exp-field>;+ clause can be omitted when at +least two bases appear and none have common field labels. Thus the field +list serves to:

+
    +
  • Disambiguate field labels occurring more than once in the +bases.
  • +
  • Define new fields.
  • +
  • Override existing fields and their types.
  • +
  • Add new var fields.
  • +
  • Redefine existing var fields from some base to prevent +aliasing.
  • +
+

The resulting type is determined by the bases' and explicitly given +fields' static type.

+

Any var field from some base must be overwritten in the +explicit field list. This prevents introducing aliases of +var fields.

+

The record expression +{ <exp1> and ... <expn> with <exp-field1>; ... <exp_fieldn>; } +has type T provided:

+
    +
  • The record +{ <exp-field1>; ... <exp_fieldm>; } has record +type +{ field_tys } == { var? <id1> : U1; ... var? <idm> : Um }.

  • +
  • Let newfields == { <id1> , ..., <idm> } +be the set of new field names.

  • +
  • Considering value fields:

    +
      +
    • Base expression <expi> has object or module type +sorti { field_tysi } == sorti { var? <idi1> : Ti1, …​, var? <idik> : Tik } +where sorti <> Actor.
    • +
    +

    Let fields(i) == { <idi1>, ..., <idik> } be +the set of static field names of base i. Then:

    +
      +
    • fields(i) is disjoint from newfields +(possibly by applying subtyping to the type of +<expi>).

    • +
    • No field in field_tysi is a var +field.

    • +
    • fields(i) is disjoint from fields(j) +for j < i.

    • +
  • +
  • Considering type fields:

    +
      +
    • Base expression <expi> has object or module +type +sorti { typ_fieldsi } == sorti { type <idj1> = … , …, type <idik> = … } +where sorti <> Actor.

    • +
    • typ_fieldsi agrees with +typ_fieldsj for j < i.

    • +
  • +
  • T is +{ typ_fieldsi fields_tys1 ... typ_fieldsm fields_tysm field_tys }.

  • +
+

Here, two sequences of type fields agree only when any two type +fields of the same name in each sequence have equivalent +definitions.

+ + +

The record expression +{ <exp1> and ... <expn> with <exp-field1>; ... <exp_fieldm>; } +evaluates records <exp1> through +<expn> and +{ exp-field1; ... <exp_fieldm } to results +r1 through rn and r, trapping on +the first result that is a trap. If none of the expressions produces a +trap, the results are objects sort1 { f1 }, +sortn { fn } and object { f }, where +f1 ... fn and f are maps from +identifiers to values or mutable locations.

+

The result of the entire expression is the value +object { g } where g is the partial map with +domain fields(1) union fields(n) union newfields mapping +identifiers to unique values or locations such that +g(<id>) = fi(<id>) if <id> +is in fields(i), for some i, or +f(<id>) if <id> is in +newfields.

+

Object projection (member +access)

+

The object projection <exp> . <id> has type +var? T provided <exp> has object type +sort { var1? <id1> : T1, …​, var? <id> : T, …​, var? <idn> : Tn } +for some sort sort.

+

The object projection <exp> . <id> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be an object value +{ <id1> = v1,…​, id = v, …​, <idm> = vm } and the +result of the projection is the value w obtained from value +or location v in field id.

+

If var is absent from var? T then the value +w is just the value v of immutable field +<id>, otherwise:

+
    +
  • If the projection occurs as the target of an assignment +expression then w is just v, the mutable +location in field <id>.

  • +
  • Otherwise, w (of type T) is the value +currently stored at the mutable location v in field +<id>.

  • +
+

Special member access

+

The iterator access <exp> . <id> has type +T provided <exp> has type +U, and U,<id> and +T are related by a row of the following table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
U<id>TDescription
TextsizeNatSize (or length) in characters
Textchars{ next: () -> Char? }Character iterator, first to last
BlobsizeNatSize in bytes
Blobvals{ next: () -> Nat8? }Byte iterator, first to last
[var? T]sizeNatNumber of elements
[var? T]getNat -> TIndexed read function
[var? T]keys{ next: () -> Nat? }Index iterator, by ascending index
[var? T]vals{ next: () -> T? }Value iterator, by ascending index
[var T]put(Nat, T) -> ()Indexed write function (mutable arrays only)
+

The projection <exp> . <id> evaluates +<exp> to a result r. If r +is trap, then the result is trap. Otherwise, +r must be a value of type U and the result of +the projection is a value of type T whose semantics is +given by the Description column of the previous table.

+

:::note

+

the chars, vals, keys and +vals members produce stateful iterator objects than can be +consumed by for expressions (see for).

+

:::

+

Assignment

+

The assignment <exp1> := <exp2> has type +() provided:

+
    +
  • <exp1> has type var T.

  • +
  • <exp2> has type T.

  • +
+

The assignment expression <exp1> := <exp2> +evaluates <exp1> to a result r1. If +r1 is trap, the expression results in +trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise r1 and r2 are respectively a +location v1, a mutable identifier, an item of a mutable +array or a mutable field of an object, and a value v2. The +expression updates the current value stored in v1 with the +new value v2 and returns the empty tuple +().

+

Unary compound assignment

+

The unary compound assignment <unop>= <exp> +has type () provided:

+
    +
  • <exp> has type var T.

  • +
  • <unop>'s category is a category of +T.

  • +
+

The unary compound assignment <unop>= <exp> +evaluates <exp> to a result r. If +r is trap the evaluation traps, otherwise +r is a location storing value v and +r is updated to contain the value +<unop> v.

+

Binary compound assignment

+

The binary compound assignment +<exp1> <binop>= <exp2> has type +() provided:

+
    +
  • <exp1> has type var T.

  • +
  • <exp2> has type T.

  • +
  • <binop>'s category is a category of +T.

  • +
+

For binary operator <binop>, the compound +assignment expression +<exp1> <binop>= <exp2> evaluates +<exp1> to a result r1. If +r1 is trap, the expression results in +trap. Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise r1 and r2 are respectively a +location v1, a mutable identifier, an item of a mutable +array or a mutable field of object, and a value v2. The +expression updates the current value, w stored in +v1 with the new value w <binop> v2 and +returns the empty tuple ().

+

Arrays

+

The expression [ var? <exp>,* ] has type +[var? T] provided each expression <exp> +in the sequence <exp>,* has type T.

+

The array expression +[ var <exp0>, …​, <expn> ] evaluates the +expressions exp0 …​ expn in order, trapping as +soon as some expression <expi> traps. If no +evaluation traps and exp0, …​, <expn> +evaluate to values v0,…​,vn then the array +expression returns the array value [var? v0, …​ , vn] of +size n+1.

+

Array indexing

+

The array indexing expression +<exp1> [ <exp2> ] has type var? T +provided:

+
    +
  • <exp> has mutable or immutable array type +[var? T1].
  • +
+

The expression <exp1> [ <exp2> ] evaluates +exp1 to a result r1. If r1 is +trap, then the result is trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 is an array value, +var? [v0, …​, vn], and r2 is a natural integer +i. If i > n the index expression returns +trap.

+

Otherwise, the index expression returns the value v, +obtained as follows:

+
    +
  • If var is absent from var? T then the +value v is the constant value vi.
  • +
+

Otherwise,

+
    +
  • If the indexing occurs as the target of an assignment expression +then v is the i-th mutable location in the +array.

  • +
  • Otherwise, v is vi, the value currently +stored in the i-th location of the array.

  • +
+

Function calls

+

The function call expression +<exp1> <T0,…​,Tn>? <exp2> has type +T provided:

+
    +
  • The function <exp1> has function type +<shared>? < X0 <: V0, ..., Xn <: Vn > U1-> U2.

  • +
  • If <T0,…​,Tn>? is absent but n > 0 then +there exists minimal T0, …​, Tn inferred by the compiler +such that:

  • +
  • Each type argument satisfies the corresponding type parameter’s +bounds: for each 1 <= i <= n, +Ti <: [T0/X0, …​, Tn/Xn]Vi.

  • +
  • The argument <exp2> has type +[T0/X0, …​, Tn/Xn]U1.

  • +
  • T == [T0/X0, …​, Tn/Xn]U2.

  • +
+

The call expression +<exp1> <T0,…​,Tn>? <exp2> evaluates +exp1 to a result r1. If r1 is +trap, then the result is trap.

+

Otherwise, exp2 is evaluated to a result +r2. If r2 is trap, the expression +results in trap.

+

Otherwise, r1 is a function value, +<shared-pat>? func <X0 <: V0, …​, n <: Vn> <pat1> { <exp> } +(for some implicit environment), and r2 is a value +v2. If <shared-pat> is present and of +the form shared <query>? <pat> then evaluation +continues by matching the record value {caller = p} against +<pat>, where p is the Principal invoking the +function, typically a user or canister. Matching continues by matching +v1 against <pat1>. If pattern matching +succeeds with some bindings, then evaluation returns the result of +<exp> in the environment of the function value not +shown extended with those bindings. Otherwise, some pattern match has +failed and the call results in trap.

+

:::note

+

The exhaustiveness side condition on shared function +expressions ensures that argument pattern matching cannot fail (see functions).

+

:::

+

:::note

+

Calls to local functions with async return type and +shared functions can fail due to a lack of canister +resources. Such failures will result in the call immediately throwing an +error with code #call_error { err_code = n }, +where n is the non-zero err_code value +returned by ICP.

+

Earlier versions of Motoko would trap in such situations, making it +difficult for the calling canister to mitigate such failures. Now, a +caller can handle these errors using enclosing +try ... catch ... expressions, if desired.

+

:::

+

Functions

+

The function expression +<shared-pat>? func < X0 <: T0, …​, Xn <: Tn > <pat1> (: U2)? =? <block-or-exp> +has type +<shared>? < X0 <: T0, ..., Xn <: Tn > U1-> U2 +if, under the assumption that +X0 <: T0, …​, Xn <: Tn:

+
    +
  • <shared-pat>? is of the form +shared <query>? <pat> if and only if +<shared>? is shared <query>? (the +<query> modifiers must agree, i.e. are either both +absent, both query, or both +composite query).

  • +
  • All the types in T0, …​, Tn and U2 are +well-formed and well-constrained.

  • +
  • Pattern <pat> has context type +{ caller : Principal }.

  • +
  • Pattern <pat1> has type +U1.

  • +
  • If the function is shared then +<pat> and <pat1> must be +exhaustive.

  • +
  • Expression <block-or-exp> has type return type +U2 under the assumption that <pat1> has +type U1.

  • +
+

<shared-pat>? func <typ-params>? <pat1> (: <typ>)? =? <block-or-exp> +evaluates to a function value denoted +<shared-pat>? func <typ-params>? <pat1> = <exp>, +that stores the code of the function together with the bindings from the +current evaluation environment needed to evaluate calls to the function +value.

+

Note that a <shared-pat> function may itself be +shared <pat> or shared query <pat> +or shared composite query <pat>.

+
    +
  • A shared <pat> function may be invoked from a +remote caller. Unless causing a trap, the effects on the callee persist +beyond completion of the call.

  • +
  • A shared query <pat> function may be also be +invoked from a remote caller, but the effects on the callee are +transient and discarded once the call has completed with a result +(whether a value or error).

  • +
  • A shared composite query <pat> function may +only be invoked as an ingress message, not from a remote caller. Like a +query, the effects on the callee are transient and discarded once the +call has completed with a result, whether a value or error. In addition, +intermediate state changes made by the call are not observable by any of +its own query or composite query +callees.

  • +
+

In either case, <pat> provides access to a context +value identifying the caller of the shared function.

+

:::note

+

The context type is a record to allow extension with further fields +in future releases.

+

:::

+

Shared functions have different capabilities dependent on their +qualification as shared, shared query or +shared composite query.

+

A shared function may call any shared or +shared query function, but no +shared composite query function. A +shared query function may not call any shared, +shared query or shared composite query +function. A shared composite query function may call any +shared query or shared composite query +function, but no shared function.

+

All varieties of shared functions may call unshared functions.

+

Composite queries, though composable, can only be called externally +such as from a frontend and cannot be initiated from an actor.

+

Blocks

+

The block expression { <dec>;* } has type +T provided the last declaration in the sequence +<dec>;* has type T. All identifiers +declared in block must be distinct type identifiers or distinct value +identifiers and are in scope in the definition of all other declarations +in the block.

+

The bindings of identifiers declared in { dec;* } are +local to the block.

+

The type system ensures that a value identifier cannot be evaluated +before its declaration has been evaluated, precluding run-time errors at +the cost of rejection some well-behaved programs.

+

Identifiers whose types cannot be inferred from their declaration, +but are used in a forward reference, may require an additional type +annotation (see annotated pattern) to +satisfy the type checker.

+

The block expression { <dec>;* } evaluates each +declaration in <dec>;* in sequence (program order). +The first declaration in <dec>;* that results in a +trap causes the block to result in trap, without evaluating +subsequent declarations.

+

Do

+

The do expression do <block> allows the use of a +block as an expression, in positions where the syntax would not directly +allow a block.

+

The expression do <block> has type T +provided <block> has type T.

+

The do expression evaluates by evaluating +<block> and returning its result.

+

Option block

+

The option block do ? <block> introduces scoped +handling of null values.

+

The expression do ? <block> has type +?T provided <block> has type +T.

+

The do ? <block> expression evaluates +<block> and returns its result as an optional +value.

+

Within <block> the null break expression +<exp1> ! exits the nearest enclosing +do ? block with value null whenever +<exp1> has value null, or continues +evaluation with the contents of <exp1>'s option +value. (See Null break.)

+

Option blocks nest with the target of a null break determined by the +nearest enclosing option block.

+

Null break

+

The null break expression <exp> ! invokes scoped +handling of null values and returns the contents of an option value or +changes control-flow when the value is null.

+

It has type T provided:

+
    +
  • The expression appears in the body, <block>, +of an enclosing option block of the form do ? <block> +(see option block).

  • +
  • <exp> has option type +? T.

  • +
+

The expression <exp> ! evaluates +<exp> to a result r. If r +is trap, then the result is trap; if +r is null, execution breaks with value +null from the nearest enclosing option block of form +do ? <block>; otherwise, r is +? v and execution continues with value v.

+

Not

+

The not expression not <exp> has type Bool provided +<exp> has type Bool.

+

If <exp> evaluates to trap, the +expression returns trap. Otherwise, +<exp> evaluates to a Boolean value v and +the expression returns not v, the Boolean negation of +v.

+

And

+

The and expression <exp1> and <exp2> has +type Bool provided +<exp1> and <exp2> have type Bool.

+

The expression <exp1> and <exp2> evaluates +exp1 to a result r1. If r1 is +trap, the expression results in trap. +Otherwise r1 is a Boolean value v. If +v == false the expression returns the value +false (without evaluating <exp2>). +Otherwise, the expression returns the result of evaluating +<exp2>.

+

Or

+

The or expression <exp1> or <exp2> has type +Bool provided +<exp1> and <exp2> have type Bool.

+

The expression <exp1> and <exp2> evaluates +exp1 to a result r1. If r1 is +trap, the expression results in trap. +Otherwise r1 is a Boolean value v. If +v == true the expression returns the value +true without evaluating <exp2>. +Otherwise, the expression returns the result of evaluating +<exp2>.

+

If

+

The expression +if <exp1> <exp2> (else <exp3>)? has type +T provided:

+
    +
  • <exp1> has type Bool.

  • +
  • <exp2> has type T.

  • +
  • <exp3> is absent and +() <: T.

  • +
  • <exp3> is present and has type +T.

  • +
+

The expression evaluates <exp1> to a result +r1. If r1 is trap, the result is +trap. Otherwise, r1 is the value +true or false. If r1 is +true, the result is the result of evaluating +<exp2>. Otherwise, r1 is +false and the result is () (if +<exp3> is absent) or the result of +<exp3> (if <exp3> is present).

+

Switch

+

The switch expression +switch <exp> { (case <pat> <block-or-exp>;)+ } +has type T provided:

+
    +
  • exp has type U.

  • +
  • For each case case <pat> <block-or-exp> +in the sequence +(case <pat> <block-or-exp>;)+.

  • +
  • Pattern <pat> has type +U.

  • +
  • Expression <block-or-exp> has type +T.

  • +
+

The expression evaluates <exp> to a result +r. If r is trap, the result is +trap. Otherwise, r is some value +v. Let case <pat> <block-or-exp>; +be the first case in +(case <pat> <block-or-exp>;)+ such that +<pat> matches v for some binding of +identifiers to values. Then result of the switch is the +result of evaluating <block-or-exp> under that +binding. If no case has a pattern that matches v, the +result of the switch is trap.

+

While

+

The expression while <exp1> <exp2> has type +() provided:

+
    +
  • <exp1> has type Bool.

  • +
  • <exp2> has type ().

  • +
+

The expression evaluates <exp1> to a result +r1. If r1 is trap, the result is +trap. Otherwise, r1 is the value +true or false. If r1 is +true, the result is the result of re-evaluating +while <exp1> <exp2>. Otherwise, the result is +().

+

Loop

+

The expression loop <block-or-exp> has type +None provided <block-or-exp> has type +().

+

The expression evaluates <block-or-exp> to a +result r1. If r1 is trap, the +result is trap. Otherwise, the result is the result of +re-evaluating loop <block-or-exp>.

+

Loop-while

+

The expression +loop <block-or-exp1> while <exp2> has type +() provided:

+
    +
  • <block-or-exp1> has type +().

  • +
  • <exp2> has type Bool.

  • +
+

The expression evaluates <block-or-exp1> to a +result r1. If r1 is trap, the +result is trap. Otherwise, evaluation continues with +<exp2>, producing result r2. If +r2 is trap the result is trap. +Otherwise, if r2 is true, the result is the +result of re-evaluating +loop <block-or-exp1> while <exp2>. Otherwise, +r2 is false and the result is ().

+

For

+

The iterator expression +for ( <pat> in <exp1> ) <block-or-exp2> +has type () provided:

+
    +
  • <exp1> has type +{ next : () → ?T }.

  • +
  • pattern <pat> has type +T.

  • +
  • expression <block-or-exp2> has type +() (in the environment extended with the bindings of +<pat>).

  • +
+

The for-expression is syntactic sugar for the following, +where x and l are fresh identifiers:

+
for ( <pat> in <exp1> ) <block-or-exp2> :=
+  {
+    let x = <exp1>;
+    label l loop {
+      switch (x.next()) {
+        case (? <pat>) <block-or-exp2>;
+        case (null) break l;
+      }
+    }
+  }
+

In particular, the for loop will trap if evaluation of +<exp1> traps; as soon as x.next() traps, +or the value of x.next() does not match pattern +<pat>, or when <block-or-exp2> +traps.

+

:::note

+

Although general purpose, for loops are commonly used to +consume iterators produced by special +member access to, for example, loop over the indices +(a.keys()) or values (a.vals()) of some array, +a.

+

:::

+

Label

+

The label-expression +label <id> (: <typ>)? <block-or-exp> has +type T provided:

+
    +
  • (: <typ>)? is absent and T is +unit; or (: <typ>)? is present and +T == <typ>.

  • +
  • <block-or-exp> has type T in the +static environment extended with label l : T.

  • +
+

The result of evaluating +label <id> (: <typ>)? <block-or-exp> is +the result of evaluating <block-or-exp>.

+

Labeled loops

+

If <exp> in +label <id> (: <typ>)? <exp> is a looping +construct:

+
    +
  • while (exp2) <block-or-exp1>.

  • +
  • loop <block-or-exp1> (while (<exp2>))?.

  • +
  • for (<pat> in <exp2>) <block-or-exp1>.

  • +
+

The body, <exp1>, of the loop is implicitly +enclosed in label <id_continue> (…​) allowing early +continuation of the loop by the evaluation of expression +continue <id>.

+

<id_continue> is a fresh identifier that can only +be referenced by continue <id>, through its implicit +expansion to break <id_continue>.

+

Break

+

The expression break <id> is equivalent to +break <id> ().

+

The expression break <id> <exp> has type +None provided:

+
    +
  • The label <id> is declared with type +label <id> : T.

  • +
  • <exp> has type T.

  • +
+

The evaluation of break <id> <exp> evaluates +<exp> to some result r. If +r is trap, the result is trap. If +r is a value v, the evaluation abandons the +current computation up to the dynamically enclosing declaration +label <id> …​ using the value v as the +result of that labelled expression.

+

Continue

+

The expression continue <id> is equivalent to +break <id_continue>, where +<id_continue> is implicitly declared around the +bodies of <id>-labelled looping constructs (see labeled loops).

+

Return

+

The expression return is equivalent to +return ().

+

The expression return <exp> has type +None provided:

+
    +
  • <exp> has type T.

  • +
  • and either one of:

    +
      +
    • T is the return type of the nearest enclosing +function with no intervening async expression.

    • +
    • async T is the type of the nearest enclosing, +perhaps implicit, async expression with no intervening +function declaration.

    • +
  • +
+

The return expression exits the corresponding dynamic +function invocation or completes the corresponding dynamic +async or async* expression with the result of +<exp>.

+

Async

+

The async expression async <block-or-exp> has type +async T provided:

+
    +
  • <block-or-exp> has type +T.

  • +
  • T is shared.

  • +
+

Any control-flow label in scope for +async <block-or-exp> is not in scope for +<block-or-exp>. However, +<block-or-exp> may declare and use its own, local, +labels.

+

The implicit return type in <block-or-exp> is +T. That is, the return expression, +<exp0>, implicit or explicit, to any enclosed +return <exp0>? expression, must have type +T.

+

Evaluation of async <block-or-exp> queues a +message to evaluate <block-or-exp> in the nearest +enclosing or top-level actor. It immediately returns a future of type +async T that can be used to await the result +of the pending evaluation of <exp>.

+

:::note

+

Because it involves messaging, evaluating an async +expression can fail due to a lack of canister resources.

+

Such failures will result in the call immediately throwing an error +with code #call_error { err_code = n }, where +n is the non-zero err_code value returned by +ICP.

+

Earlier version of Motoko would trap in such situations, making it +difficult for the producer of the async expression to mitigate such +failures. Now, the producer can handle these errors using an enclosing +try ... catch ... expression, if desired.

+

:::

+

Await

+

The await expression await <exp> has +type T provided:

+
    +
  • <exp> has type async T.

  • +
  • T is shared.

  • +
  • The await is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression await <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is a future. If the future is incomplete, +that is, its evaluation is still pending, await <exp> +suspends evaluation of the neared enclosing async or +shared-function, adding the suspension to the wait-queue of +the future. Execution of the suspension is resumed once the +future is completed, if ever. If the future is complete with value +v, then await <exp> suspends evaluation +and schedules resumption of execution with value v. If the +future is complete with thrown error value e, then +await <exp> suspends evaluation and schedules +resumption of execution by re-throwing the error e.

+

Suspending computation on await, regardless of the +dynamic status of the future, ensures that all tentative state changes +and message sends prior to the await are committed and +irrevocable.

+

:::danger

+

Between suspension and resumption of a computation, the state of the +enclosing actor may change due to concurrent processing of other +incoming actor messages. It is the programmer’s responsibility to guard +against non-synchronized state changes.

+

Using await signals that the computation will commit its +current state and suspend execution.

+

:::

+

:::note

+

Because it involves additional messaging, an await on a +completed future can, in rare circumstances, fail due to a lack of +canister resources. Such failures will result in the call immediately +throwing an error with code +#call_error { err_code = n }, where n is the +non-zero err_code value returned by ICP.

+

The error is produced eagerly, without suspending nor committing +state. Earlier versions of Motoko would trap in such situations, making +it difficult for the consumer of the await to mitigate such +failures. Now, the consumer can handle these errors by using an +enclosing try ... catch ... expression, if desired.

+

:::

+

Async*

+

The async expression async* <block-or-exp> has +type async* T provided:

+
    +
  • <block-or-exp> has type +T.

  • +
  • T is shared.

  • +
+

Any control-flow label in scope for +async* <block-or-exp> is not in scope for +<block-or-exp>. However, +<block-or-exp> may declare and use its own, local, +labels.

+

The implicit return type in <block-or-exp> is +T. That is, the return expression, +<exp0>, implicit or explicit, to any enclosed +return <exp0>? expression, must have type +T.

+

Evaluation of async* <block-or-exp> produces a +delayed computation to evaluate <block-or-exp>. It +immediately returns a value of type async* T. The delayed +computation can be executed using await*, producing one +evaluation of the computation <block-or-exp>.

+

:::danger

+

Note that async <block-or-exp> has the effect of +scheduling a single asynchronous computation of +<exp>, regardless of whether its result, a future, is +consumed with an await. Moreover, each additional +consumption by an await just returns the previous result, +without repeating the computation.

+

In comparison, async* <block-or_exp>, has no +effect until its value is consumed by an await*. Moreover, +each additional consumption by an await* will trigger a new +evaluation of <block-or-exp>, including repeated +effects.

+

Be careful of this distinction, and other differences, when +refactoring code.

+

:::

+

:::note

+

The async* and corresponding await* +constructs are useful for efficiently abstracting asynchronous code into +re-useable functions. In comparison, calling a local function that +returns a proper async type requires committing state and +suspending execution with each await of its result, which +can be undesirable.

+

:::

+

Await*

+

The await* expression await* <exp> +has type T provided:

+
    +
  • <exp> has type async* T.

  • +
  • T is shared.

  • +
  • the await* is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression await* <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is a delayed computation +<block-or-exp>. The evaluation of +await* <exp> proceeds with the evaluation of +<block-or-exp>, executing the delayed +computation.

+

:::danger

+

During the evaluation of <block-or-exp>, the state +of the enclosing actor may change due to concurrent processing of other +incoming actor messages. It is the programmer’s responsibility to guard +against non-synchronized state changes.

+

:::

+

:::note

+

Unlike await, which, regardless of the dynamic status of +the future, ensures that all tentative state changes and message sends +prior to the await are committed and irrevocable, +await* does not, in itself, commit any state changes, nor +does it suspend computation. Instead, evaluation proceeds immediately +according to <block-or-exp>, the value of +<exp>, committing state and suspending execution +whenever <block-or-exp> does, but not otherwise.

+

:::

+

:::note

+

Evaluation of a delayed async* block is synchronous +while possible, switching to asynchronous when necessary due to a proper +await.

+

Using await* signals that the computation may +commit state and suspend execution during the evaluation of +<block-or-exp>, that is, that evaluation of +<block-or-exp> may perform zero or more proper +awaits and may be interleaved with the execution of other, +concurrent messages.

+

:::

+

Throw

+

The throw expression throw <exp> has +type None provided:

+
    +
  • <exp> has type Error.

  • +
  • The throw is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression throw <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is an error value e. Execution proceeds from +the catch clause of the nearest enclosing +try <block-or-exp1> catch <pat> <block-or-exp2> +whose pattern <pat> matches value e. If +there is no such try expression, e is stored +as the erroneous result of the async value of the nearest +enclosing async, async* expression or +shared function invocation.

+

Try

+

The try expression +try <block-or-exp1> catch <pat> <block-or-exp2> +has type T provided:

+
    +
  • <block-or-exp1> has type +T.

  • +
  • <pat> has type Error and +<block-or-exp2> has type T in the +context extended with <pat>.

  • +
  • The try is explicitly enclosed by an +async-expression or appears in the body of a +shared function.

  • +
+

Expression +try <block-or-exp1> catch <pat> <block-or-exp2> +evaluates <block-or-exp1> to a result r. +If evaluation of <block-or-exp1> throws an uncaught +error value e, the result of the try is the +result of evaluating <block-or-exp2> under the +bindings determined by the match of e against +pat.

+

:::note

+

Because the Error type is +opaque, the pattern match cannot fail. Typing ensures that +<pat> is an irrefutable wildcard or identifier +pattern.

+

:::

+

See Error type.

+

Assert

+

The assert expression assert <exp> has type +() provided <exp> has type Bool.

+

Expression assert <exp> evaluates +<exp> to a result r. If r +is trap evaluation returns trap. Otherwise +r is a Boolean value v. The result of +assert <exp> is:

+
    +
  • The value (), when v is +true.

  • +
  • trap, when v is +false.

  • +
+

Type annotation

+

The type annotation expression <exp> : <typ> +has type T provided:

+
    +
  • <typ> is T.

  • +
  • <exp> has type U where +U <: T.

  • +
+

Type annotation may be used to aid the type-checker when it cannot +otherwise determine the type of <exp> or when one +wants to constrain the inferred type, U of +<exp> to a less-informative super-type T +provided U <: T.

+

The result of evaluating <exp> : <typ> is +the result of evaluating <exp>.

+

:::note

+

Type annotations have no-runtime cost and cannot be used to perform +the checked or unchecked down-casts available in other +object-oriented languages.

+

:::

+

Candid serialization

+

The Candid serialization expression +to_candid ( <exp>,*) has type Blob provided:

+
    +
  • (<exp>,*) has type (T1,…​,Tn), and +each Ti is shared.
  • +
+

Expression to_candid ( <exp>,* ) evaluates the +expression sequence ( <exp>,* ) to a result +r. If r is trap, evaluation +returns trap. Otherwise, r is a sequence of +Motoko values vs. The result of evaluating +to_candid ( <exp>,* ) is some Candid blob +b = encode((T1,...,Tn))(vs), encoding vs.

+

The Candid deserialization expression +from_candid <exp> has type ?(T1,…​,Tn) +provided:

+
    +
  • ?(T1,…​,Tn) is the expected type from the +context.

  • +
  • <exp> has type Blob.

  • +
  • ?(T1,…​,Tn) is shared.

  • +
+

Expression from_candid <exp> evaluates +<exp> to a result r. If r +is trap, evaluation returns trap. Otherwise +r is a binary blob b. If b +Candid-decodes to Candid value sequence Vs of type +ea((T1,...,Tn)) then the result of from_candid +is ?v where v = decode((T1,...,Tn))(Vs). If +b Candid-decodes to a Candid value sequence Vs +that is not of Candid type ea((T1,...,Tn)) (but well-formed +at some other type) then the result is null. If +b is not the encoding of any well-typed Candid value, but +some arbitrary binary blob, then the result of from_candid +is a trap.

+

Informally, here ea(_) is the Motoko-to-Candid type +sequence translation and encode/decode((T1,...,Tn))(_) are +type-directed Motoko-Candid value translations.

+ + +

:::note

+

Operation from_candid returns null when the +argument is a valid Candid encoding of the wrong type. It traps if the +blob is not a valid Candid encoding at all.

+

:::

+

:::note

+

Operations to_candid and from_candid are +syntactic operators, not first-class functions, and must be fully +applied in the syntax.

+

:::

+

:::danger

+

The Candid encoding of a value as a blob is not unique and the same +value may have many different Candid representations as a blob. For this +reason, blobs should never be used to, for instance, compute hashes of +values or determine equality, whether across compiler versions or even +just different programs.

+

:::

+

Declaration

+

The declaration expression <dec> has type +T provided the declaration <dec> has +type T.

+

Evaluating the expression <dec> proceeds by +evaluating <dec>, returning the result of +<dec> but discarding the bindings introduced by +<dec>, if any.

+

The expression <dec> is actually shorthand for the +block expression do { <dec> }.

+

Ignore

+

The expression ignore <exp> has type +() provided the expression <exp> has +type Any .

+

The expression ignore <exp> evaluates +<exp>, typically for some side-effect, but discards +its value.

+

The ignore declaration is useful for evaluating an +expression within a sequence of declarations when that expression has +non-unit type, and the simpler <exp> +declaration would be ill-typed. Then the semantics is equivalent to +let _ = <exp> : Any.

+

Debug

+

The debug expression debug <block-or-exp> has type +() provided the expression +<block-or-exp> has type ().

+

When the program is compiled or interpreted with (default) flag +--debug, evaluating the expression +debug <exp> proceeds by evaluating +<block-or-exp>, returning the result of +<block-or-exp>.

+

When the program is compiled or interpreted with flag +--release, evaluating the expression +debug <exp> immediately returns the unit value +(). The code for <block-or-exp> is never +executed, nor is its code included in the compiled binary.

+

Actor references

+

The actor reference actor <exp> has expected type +T provided:

+
    +
  • The expression is used in a context expecting an expression of +type T, typically as the subject of a type annotation, +typed declaration or function argument.

  • +
  • T is an some actor type +actor { …​ }.

  • +
  • <exp> has type Text.

  • +
+

The argument <exp> must be, or evaluate to, the +textual format of a canister identifier, specified elsewhere, otherwise +the expression traps. The result of the expression is an actor value +representing that canister.

+

The validity of the canister identifier and its asserted type +T are promises and taken on trust.

+

An invalid canister identifier or type may manifest itself, if at +all, as a later dynamic failure when calling a function on the actor’s +proclaimed interface, which will either fail or be rejected.

+

:::note

+

The argument to actor should not include the +ic: resource locator used to specify an +import. For example, use actor "lg264-qjkae", +not actor "ic:lg264-qjkae".

+

:::

+

:::danger

+

Although they do not compromise type safety, actor references can +easily introduce latent, dynamic errors. Accordingly, actor references +should be used sparingly and only when needed.

+

:::

+

Parentheses

+

The parenthesized expression ( <exp> ) has type +T provided <exp> has type +T.

+

The result of evaluating ( <exp> ) is the result +of evaluating <exp>.

+

Subsumption

+

Whenever <exp> has type T and +T <: U, with T subtypes U, +then by virtue of implicit subsumption, <exp> also +has type U without extra syntax.

+

In general, this means that an expression of a more specific type may +appear wherever an expression of a more general type is expected, +provided the specific and general types are related by subtyping. This +static change of type has no runtime cost.

+

References

+
    +
  • IEEE Standard for Floating-Point Arithmetic, in +IEEE Std 754-2019 (Revision of IEEE 754-2008), vol., no., pp.1-84, 22 +July 2019, doi: 10.1109/IEEESTD.2019.8766229.
  • +
+ + diff --git a/docs/html/local-objects-classes.html b/docs/html/local-objects-classes.html new file mode 100644 index 00000000000..3a63e9ea590 --- /dev/null +++ b/docs/html/local-objects-classes.html @@ -0,0 +1,465 @@ + + + + + + + md/writing-motoko/local-objects-classes.md + + + + +
+

md/writing-motoko/local-objects-classes.md

+
+ +

Objects and classes

+ + +

Overview

+

In Motoko, an object is just a collection of named fields, holding +values. These values can either be plain data, or function values. In +addition, each field can be mutable or immutable.

+

A simple object containing just fields of data is like a record in a +database. When the fields are immutable and have shared types, the +object itself is shareable and can be sent and received from shared +functions.

+

When fields contain function values, Motoko objects can represent +traditional objects with methods, familiar from object-oriented +programming (OOP). From an OOP perspective, an object is an abstraction, +defined by the behavior of its methods. Methods are typically used to +modify or observe some encapsulated (i.e. hidden) state of an object. +Motoko programs benefit from the ability to encapsulate state as objects +with abstract types. The mutable state +introduces declarations of mutable state in the form of +var-declared variables. Using such declarations privately +in its body, an object can encapsulate the state, declaring public +methods that access and update it.

+

By design, objects with mutable fields or methods cannot be sent to +remote actors. If that were allowed, a receiver would either have to +receive a remote reference to the local object, breaking the isolation +of the actor model by allowing remote updates to local state. Or, the +receiver would have to receive a copy of the local object. Then, the +effect of any changes to the copy would not be reflected in the +original, leading to confusion.

+

To compensate for this necessary limitation, actor +objects are shareable, but always execute remotely. They communicate +with shareable Motoko data only. Local objects interact in less +restricted ways with themselves, and can pass any Motoko data to each +other’s methods, including other objects. In most other ways, local +objects and classes are non-shareable counterparts to actor objects and +classes.

+

Example

+

The following example illustrates a general evolution path for Motoko +programs. Each object has the potential to be refactored into a service +by refactoring the local object into an actor object.

+

Consider the following object declaration of the object value +counter:

+
object counter {
+  var count = 0;
+  public func inc() { count += 1 };
+  public func read() : Nat { count };
+  public func bump() : Nat {
+    inc();
+    read()
+  };
+};
+

This declaration introduces a single object instance named +counter. The developer exposes three public functions +inc, read and bump using keyword +public to declare each in the object body. The body of the +object, like a block expression, consists of a list of declarations.

+

In addition to these three functions, the object has one private +mutable variable count, which holds the current count and +is initially zero.

+

Object types

+

This object counter has the following object type, +written as a list of field-type pairs, enclosed in braces { +and }:

+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+}
+

Each field type consists of an identifier, a colon :, +and a type for the field content. Here, each field is a function, and +thus has an arrow type form (_ → _).

+

In the declaration of object, the variable +count was explicitly declared neither as +public nor as private.

+

By default, all declarations in an object block are +private. Consequently, the type for count does +not appear in the type of the object. Its name and presence are both +inaccessible from the outside.

+

By not exposing this implementation detail, the object has a more +general type with fewer fields, and as a result, is interchangeable with +objects that have the same interface but a different implementation.

+

To illustrate the point just above, consider this variation of the +counter declaration above, of byteCounter:

+
import Nat8 "mo:base/Nat8";
+object byteCounter {
+  var count : Nat8 = 0;
+  public func inc() { count += 1 };
+  public func read() : Nat { Nat8.toNat(count) };
+  public func bump() : Nat { inc(); read() };
+};
+

This object has the same type as the previous one, and thus from the +standpoint of type checking, this object is interchangeable with the +prior one:

+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+}
+

This version does not use the same implementation of the counter +field. Rather than use an ordinary natural Nat, this version uses a +byte-sized natural number, type Nat8, whose size is always eight +bits.

+

As such, the inc operation may fail with an overflow for +this object but never the prior one, which may instead fill the +program’s memory.

+

Neither implementation of a counter comes without some complexity. In +this case, they share a common type.

+

The common type abstracts the differences in the implementations of +the objects, shielding the rest of the application from their +implementation details.

+

Objects types can also have subtypes, allowing an object with a more +specific type to pass as an object of a more general type, for example, +to pass as an object with fewer fields.

+

Object and actor classes

+

Object classes : A family of related objects to +perform a task with a customizable initial state. Motoko provides a +syntactical construct, called a class definition, which +simplifies building objects of the same type and implementation.

+

Actor classes : An object class that exposes a service using asynchronous behavior. The +corresponding Motoko construct is an actor +class, which follows a similar but distinct design.

+

Object classes

+

In Motoko, an object encapsulates state, and an object +class is a package of two entities that share a common +name.

+

Consider this example class for counters that start at +zero:

+
class Counter() {
+  var c = 0;
+  public func inc() : Nat {
+    c += 1;
+    return c;
+  }
+};
+

The value of this definition is that we can construct new counters, +each starting with their own unique state, initially at zero:

+
let c1 = Counter();
+let c2 = Counter();
+

Each is independent:

+
let x = c1.inc();
+let y = c2.inc();
+(x, y)
+

You could achieve the same results by writing a function that returns +an object:

+
func Counter() : { inc : () -> Nat } =
+  object {
+    var c = 0;
+    public func inc() : Nat { c += 1; c }
+  };
+

Notice the return type of this constructor function is an object +type:

+
{ inc : () -> Nat }
+

You may want to name this type such as Counter for use +in further type declarations:

+
type Counter = { inc : () -> Nat };
+

The class keyword syntax shown above is a shorthand for +these two definitions of Counter: a factory function +Counter that constructs objects, and the type +Counter of these objects. Classes do not provide any new +functionality beyond this convenience.

+

Class constructor

+

An object class defines a constructor function that may carry zero or +more data arguments and zero or more type arguments.

+

The Counter example above has zero of each.

+

The type arguments, if any, parameterize both the type and the +constructor function for the class.

+

The data arguments, if any, parameterize only the constructor +function for the class.

+

Data arguments

+

Suppose you want to initialize the counter with some non-zero value. +You can supply that value as a data argument to the class +constructor:

+
class Counter(init : Nat) {
+  var c = init;
+  public func inc() : Nat { c += 1; c };
+};
+

This parameter is available to all methods. For instance, you can +reset the Counter to its initial value, a +parameter:

+
class Counter(init : Nat) {
+  var c = init;
+  public func inc() : Nat { c += 1; c };
+  public func reset() { c := init };
+};
+

Type arguments

+

Suppose you want the counter to actually carry data that it counts, +like a specialized Buffer.

+

When classes use or contain data of arbitrary type, they carry a type +argument. This is equivalent to a type parameter for an unknown type, +just as with functions.

+

The scope of this type parameter covers the entire class +with data parameters. As such, the methods of the class can use these +type parameters without reintroducing them.

+
import Buffer "mo:base/Buffer";
+
+class Counter<X>(init : Buffer.Buffer<X>) {
+  var buffer = init.clone();
+  public func add(x : X) : Nat {
+    buffer.add(x);
+    buffer.size()
+  };
+
+  public func reset() {
+    buffer := init.clone()
+  };
+};
+

Type annotation

+

The class constructor may also carry a type annotation for its return +type. When supplied, Motoko checks that this type annotation is +compatible with the body of the class, which is an object definition. +This check ensures that each object produced by the constructor meets +the supplied specification.

+

For example, repeat the Counter as a buffer and annotate +it with a more general type Accum<X> that permits +adding, but not resetting, the counter. This annotation ensures that the +objects are compatible with the type Accum<X>.

+
import Buffer "mo:base/Buffer";
+
+type Accum<X> = { add : X -> Nat };
+
+class Counter<X>(init : Buffer.Buffer<X>) : Accum<X> {
+  var buffer = init.clone();
+  public func add(x : X) : Nat { buffer.add(x); buffer.size() };
+  public func reset() { buffer := init.clone() };
+};
+

Full syntax

+

Classes are defined by the keyword class, followed +by:

+
    +
  • A name for the constructor and type being defined. For example, +Counter.

  • +
  • Optional type arguments. For example, omitted, or +<X>, or <X, Y>.

  • +
  • An argument list. For example, (), or +(init : Nat), etc.

  • +
  • An optional type annotation for the constructed objects. For +example, omitted, or Accum<X>.

  • +
  • The class "body" is an object definition, parameterized by the +type and value arguments, if any.

  • +
+

The constituents of the body marked public contribute to +the resulting objects' type and these types compared against the +optional annotation, if given.

+

Consider the task of walking the bits of a natural Nat number. For this example, you +could define the following:

+
class Bits(n : Nat) {
+  var state = n;
+  public func next() : ?Bool {
+    if (state == 0) { return null };
+    let prev = state;
+    state /= 2;
+    ?(state * 2 != prev)
+  }
+}
+

The above class definition is equivalent to the simultaneous +definition of a structural type synonym and a factory function, both +named Bits:

+
type Bits = {next : () -> ?Bool};
+func Bits(n : Nat) : Bits = object {
+  // class body
+};
+ + diff --git a/docs/html/message-inspection.html b/docs/html/message-inspection.html new file mode 100644 index 00000000000..26bf8e6e6a8 --- /dev/null +++ b/docs/html/message-inspection.html @@ -0,0 +1,337 @@ + + + + + + + md/writing-motoko/message-inspection.md + + + + +
+

md/writing-motoko/message-inspection.md

+
+ +

Message inspection

+

Overview

+

On ICP, a canister can selectively inspect, then choose to accept or +decline ingress messages submitted through the HTTP interface.

+
+

A canister can inspect ingress messages before executing them. When +the IC receives an update call from a user, the IC will use the canister +method canister_inspect_message to determine whether the +message shall be accepted. If the canister is empty (i.e. does not have +a Wasm module), then the ingress message will be rejected. If the +canister is not empty and does not implement +canister_inspect_message, then the ingress message will be +accepted.

+

In canister_inspect_message, the canister can accept the +message by invoking ic0.accept_message : () → (). This +function traps if invoked twice. If the canister traps in +canister_inspect_message or does not call +ic0.accept_message, then the access is denied.

+

The canister_inspect_message is not invoked for HTTP +query calls, inter-canister calls or calls to the management +canister.

+

IC +Interface Specification

+
+

Message inspection mitigates some denial of service attacks that are +designed to drain canisters of cycles by placing unsolicited free +calls.

+

Message inspection in Motoko

+

In Motoko, actors can elect to inspect and accept or decline ingress +messages by declaring a particular system function called +inspect. Given a record of message attributes, this +function produces a Bool that +indicates whether to accept or decline the message by returning +true or false.

+

The function is invoked by the system on each ingress message. +Similar to a query, any side effects of an invocation are discarded and +transient. A call that traps due to some fault has the same result as +returning a message declination of false.

+

Unlike other system functions that have a fixed argument type, the +argument type of inspect depends on the interface of the +enclosing actor. In particular, the formal argument of +inspect is a record of fields with the following types:

+
    +
  • caller : Principal: The principal of the caller of +the message.

  • +
  • arg : Blob: The raw, binary content of the message +argument.

  • +
  • msg : <variant>: A variant of decoding +functions, where +<variant> == {…​; #<id>: () → T; …​} contains one +variant per shared function, <id>, of the actor. The +variant’s tag identifies the function to be called. The variant’s +argument is a function that returns the decoded argument of the call as +a value of type T.

  • +
+

Using a variant, tagged with #<id>, allows the +return type, T, of the decoding function to vary with the +argument type, also T, of the shared function +<id>.

+

The variant’s argument is a function so that one can avoid the +expense of message decoding.

+

By exploiting subtyping, the formal argument can omit record fields +it does not require, or selectively ignore the arguments of particular +shared functions. For example, to simply dispatch on the name of a +function without inspecting its actual argument.

+

:::note

+

A shared query function can be called using a regular +HTTP update call to obtain a certified response. This is why the variant +type also includes shared query functions.

+

A shared composite query function cannot be called as an +update call. It can only be called with the faster, but uncertified, +HTTP query call.

+

This is why the inspect variant type includes +shared query functions, but not +shared composite query functions.

+

:::

+

:::danger

+

An actor that fails to declare system field inspect will +simply accept all ingress messages.

+

:::

+

:::danger

+

System function inspect should not be +used for definitive access control. This is because inspect +is executed by a single replica, without going through full consensus. +Its result could be spoofed by a malicious boundary node. Also +inspect is not invoked for inter-canister calls. Reliable +access control checks can only be performed within the +shared functions guarded by inspect. See canister +development security best practices for more information.

+

:::

+

Example

+

A simple example of method inspection is a counter actor that +inspects some of its messages in detail, and others only +superficially:

+
+

Due to subtyping, all of the following variations in order of +increasing argument specificity, are legal definitions of +inspect.

+

Blanket denial of all ingress messages, ignoring further +information:

+
+

Declining anonymous calls:

+
+

Declining large messages, based on the raw size in bytes of +arg prior to any decoding from Candid binary blob to Motoko +value:

+
+

Declining messages by name only, ignoring message arguments. Note the +use of type Any as message argument variants:

+
+

A combination of the previous three, specifying the argument types of +some variants while ignoring others at type Any and using +pattern matching to conflate identical cases:

+
+

Tips on authoring +inspect

+

Implementing inspect after the fact once all shared +functions of an actor have already been implemented can be tedious. +You’ll need to declare a correctly typed variant for each shared +function. A simple trick is to first implement the function incorrectly +with a () argument, compile the code, then use the +compiler’s error message to obtain the required argument type.

+

For example, in the actor from the previous section, incorrectly +declaring forces the compiler to report the expected type below, which +you can then cut-and-paste into your code:

+
+
Inspect.mo:12.4-14.5: type error [M0127], system function inspect is declared with type
+  () -> Bool
+instead of expected type
+  {
+    arg : Blob;
+    caller : Principal;
+    msg :
+      {
+        #inc : () -> ();
+        #read : () -> ();
+        #reset : () -> ();
+        #set : () -> Nat
+      }
+  } -> Bool
+ + diff --git a/docs/html/message-restrictions.html b/docs/html/message-restrictions.html new file mode 100644 index 00000000000..89b26614f4b --- /dev/null +++ b/docs/html/message-restrictions.html @@ -0,0 +1,220 @@ + + + + + + + md/writing-motoko/message-restrictions.md + + + + +
+

md/writing-motoko/message-restrictions.md

+
+ +

Messaging restrictions

+

Overview

+

ICP places restrictions on when and how canisters are allowed to +communicate. These restrictions are enforced dynamically but prevented +statically in Motoko, ruling out a class of dynamic execution errors. +Two examples are:

+
    +
  • Canister installation can execute code, but not send +messages.

  • +
  • A canister query method cannot send messages.

  • +
+

These ICP restrictions are surfaced in Motoko as constraints on the +program context in which certain expressions can be appear. Violations +of these constraints are reported as errors by the type checker.

+

In Motoko, an expression occurs in an asynchronous context if it +appears in the body of an async expression, which may be +the body of a shared or local function or a stand-alone expression. The +only exception are query functions, whose body is not +considered to open an asynchronous context.

+

In Motoko calling a shared function is an error unless the function +is called in an asynchronous context. Calling a shared function from an +actor class constructor is also an error.

+

The await and async constructs are only +allowed in an asynchronous context.

+

It is only possible to throw or try/catch +errors in an asynchronous context. This is because structured error +handling is supported for messaging errors only and, like messaging +itself, confined to asynchronous contexts.

+

These rules also mean that local functions cannot directly call +shared functions or await futures.

+

(The same restrictions apply to await* and +async* expressions.)

+ + diff --git a/docs/html/modules-and-imports.html b/docs/html/modules-and-imports.html new file mode 100644 index 00000000000..11d318b19bc --- /dev/null +++ b/docs/html/modules-and-imports.html @@ -0,0 +1,462 @@ + + + + + + + md/writing-motoko/modules-and-imports.md + + + + +
+

md/writing-motoko/modules-and-imports.md

+
+ +

Modules and imports

+

Overview

+

The design of Motoko strives to minimize built-in types and +operations. Instead of built-in types, Motoko provides a base library of +modules to handle many kinds of common operations and make the language +feel complete. This base library is still evolving with modules that +support core features, and the base library APIs are subject to change +over time to varying degrees. You should note, in particular, that the +size and number of modules and functions included in the base library is +likely to increase dramatically. Updates to the base library modules +might introduce breaking changes that require you to update your +programs to remain compatible. Breaking changes are communicated through +the Motoko migration +guides.

+

This section provides examples of different scenarios for using the +module and import keywords.

+

Importing from the base +library

+

View the online documentation for the Motoko +base library.

+

You can find source code for the Motoko base modules in the open +source repository.

+

There are instructions in the repository for generating a local copy +of the current documentation for the Motoko base package.

+

To import from the base library, use the import keyword +followed by a local module name and a URL where the import +declaration can find the module. For example:

+
import Debug "mo:base/Debug";
+Debug.print("hello world");
+

This example illustrates how to import Motoko code—indicated by using +the mo: prefix to identify the module as a Motoko module. +The declaration does not include the .mo file type +extension. Then, it uses the base/ base library path and +the module name Debug.

+

You can also selectively import a subset of named values from a +module by using the object pattern syntax:

+
import { map; find; foldLeft = fold } = "mo:base/Array";
+

In this example, the functions map and find +are imported unaltered, while the foldLeft function is +renamed to fold.

+

Importing local files

+

Another common approach to writing programs in Motoko involves +splitting up the source code into different modules. For example, you +might design an application to use the following model:

+
    +
  • A main.mo file to contain the actor and functions +that change state.

  • +
  • A types.mo file for all of your custom type +definitions.

  • +
  • A utils.mo file for functions that do work outside +of the actor.

  • +
+

In this scenario, you might place all three files in the same +directory and use a local import to make the functions available where +they are needed.

+

For example, the main.mo contains the following lines to +reference the modules in the same directory:

+
import Types "types";
+import Utils "utils";
+

Because these lines import modules from the local project instead of +the Motoko library, these import declarations don’t use the +mo: prefix.

+

In this example, both the types.mo and +utils.mo files are in the same directory as the +main.mo file. Once again, import does not use the +.mo file suffix.

+

Importing from +another package or directory

+

You can also import modules from other packages or from directories +other than the local directory.

+

For example, the following lines import modules from a +redraw package that is defined as a dependency:

+
import Render "mo:redraw/Render";
+import Mono5x5 "mo:redraw/glyph/Mono5x5";
+

You can define dependencies for a project using a package manager or +in the project dfx.json configuration file.

+

In this example, the Render module is in the default +location for source code in the redraw package and the +Mono5x5 module is in a redraw package +subdirectory called glyph.

+

Importing packages +from a package manager

+

To download and install third-party packages, a package manager such +as Mops or Vessel can be used.

+

To use either package manager, edit your project's +dfx.json file to specify a packtool, such +as:

+
{
+  "defaults": {
+    "build": {
+      "packtool": "mops sources"
+    }
+  }
+}
+

For Vessel, use vessel sources.

+

Then, to download a package with the mops CLI tool, use +a command such as:

+
mops add vector
+

For Vessel, edit the vessel.dhall file to include what +packages your project will import.

+

Then, import the packages as you would import other packages in the +Motoko source file:

+
import Vec "mo:vector";
+import Vec "mo:vector/Class";
+

Importing actor classes

+

While module imports are typically used to import libraries of local +functions and values, they can also be used to import actor classes. +When an imported file consists of a named actor class, the client of the +imported field sees a module containing the actor class.

+

This module has two components, both named after the actor class:

+
    +
  • A type definition describing the interface of the class.

  • +
  • An asynchronous function that takes the class parameters as +arguments an asynchronously returns a fresh instance of the +class.

  • +
+

For example, a Motoko actor can import and instantiate the +Counter class described as follows:

+

Counters.mo:

+
+

CountToTen.mo:

+
+

The call to Counters.Counter(1) installs a fresh counter +on the network. Installation is asynchronous, so the caller must +await the result.

+

The type annotation : Counters.Counter is redundant +here. It’s included only to illustrate that the type of the actor class +is available when required.

+

Importing from +another canister smart contract

+

You can also import actors and their shared functions from another +canister by using the canister: prefix in place of the +mo: prefix.

+

:::note

+

Unlike a Motoko library, an imported canister can be implemented in +any other language, such as Rust or even a different Motoko version, +that emits Candid interfaces for its canister.

+

:::

+

For example, you might have a project that produces the following +three canisters:

+
    +
  • BigMap (implemented in Rust).

  • +
  • Connectd (implemented in Motoko).

  • +
  • LinkedUp (implemented in Motoko).

  • +
+

These three canisters are declared in the project’s +dfx.json configuration file and compiled by running +dfx build.

+

You can use the following lines to import the BigMap and +Connectd canisters as actors in the Motoko LinkedUp +actor:

+
import BigMap "canister:BigMap";
+import Connectd "canister:connectd";
+

When importing canisters, it is important to note that the type for +the imported canister corresponds to a Motoko actor +instead of a Motoko module. This distinction can affect +how some data structures are typed.

+

For the imported canister actor, types are derived from the Candid +project-name.did file for the canister, rather than from +Motoko itself.

+

The translation from Motoko actor type to Candid service type is +typically one-to-one, and there are some distinct Motoko types that map +to the same Candid type. For example, the Motoko Nat32 and Char +types are both exported as Candid type Nat32, but Nat32 is canonically imported +as Motoko Nat32, not +Char.

+

The type of an imported canister function might differ from the type +of the original Motoko code that implements it. For example, if the +Motoko function had type shared Nat32 -> async Char in +the implementation, its exported Candid type would be +(nat32) -> (nat32), but the Motoko type imported from +this Candid type will actually be the correct type +shared Nat32 -> async Nat32.

+

Naming imported modules

+

Although the most common convention is to identify imported modules +by the module name as illustrated in the examples above, there’s no +requirement for you to do so. For example, you might want to use +different names to avoid naming conflicts or to simplify the naming +scheme.

+

The following example illustrates different names you might use when +importing the List base library module, avoiding a clash +with another List library from a fictional +collections package:

+
import List "mo:base/List:";
+import Sequence "mo:collections/List";
+import L "mo:base/List";
+ + diff --git a/docs/html/motoko-grammar.html b/docs/html/motoko-grammar.html new file mode 100644 index 00000000000..d09f63fb162 --- /dev/null +++ b/docs/html/motoko-grammar.html @@ -0,0 +1,189 @@ + + + + + + + md/reference/motoko-grammar.md + + + + +
+

md/reference/motoko-grammar.md

+
+ +

Motoko grammar

+

This section describes the concrete syntax, or grammar, of Motoko. +The specification is auto-generated with a tool.

+
+ + diff --git a/docs/html/motoko-introduction.html b/docs/html/motoko-introduction.html new file mode 100644 index 00000000000..c8664c21e9c --- /dev/null +++ b/docs/html/motoko-introduction.html @@ -0,0 +1,388 @@ + + + + + + + md/getting-started/motoko-introduction.md + + + + +
+

md/getting-started/motoko-introduction.md

+
+ +

Introduction

+

Overview

+

Motoko is a modern, general-purpose programming language you can use +specifically to author ICP canister smart contracts. Although aimed +primarily at ICP canister development, its design is general enough to +support future compilation to other targets.

+

Motoko is designed to be approachable for programmers who have some +basic familiarity with object-oriented and/or functional programming +idioms in either JavaScript, or another modern programming language, +such as Rust, Swift, TypeScript, C#, or Java.

+

Motoko provides:

+
    +
  • A high-level language for programming applications to run on +ICP.

  • +
  • A simple design that uses familiar syntax that is easy for +programmers to learn.

  • +
  • An actor-based programming model optimized for +efficient message handling.

  • +
  • An interpreter and compiler that you can use to test and compile +the WebAssembly code for autonomous applications.

  • +
+

Why Motoko?

+

ICP supports programs written in different languages. The only +requirement is that the program must support compilation to WebAssembly +code. WebAssembly is a low-level computer instruction format for virtual +machines. Because WebAssembly code is designed to provide portable +low-level instructions that enable applications to be deployed on many +platforms such as the web, it is a natural fit for deploying +applications that are intended to run on ICP. However, most of the +higher-level languages that support compiling to WebAssembly are either +unsafe or complex for developers who want to deliver secure applications +without a long learning curve.

+

To address the need for correctness without complexity, DFINITY has +designed its own Motoko programming language. Motoko provides a simple +and expressive alternative to other programming languages that is easy +to learn whether you are a new or experienced programmer.

+

Motivation and goals

+

Motoko strives to be a simple and useful language for ICP smart +contracts that uses a familiar syntax that incorporates the actor model. +Motoko offers seamless integration for ICP features and makes the most +out of WebAssembly's present and future functionalities.

+

Motoko is not, and is not intended to be, the only language for +implementing canister smart contracts. Canister development kits exist +for Rust, TypeScript, Python, and soon Solidity. ICP's goal is to enable +any language to be able to produce canister smart contracts by compiling +the canister source code into WebAssembly.

+

However, its tailored design means Motoko should be the easiest and +safest language for coding on ICP.

+

Key design points

+

Motoko provides many other developer productivity features. It has +derived inspiration for its design from languages such as Java, +JavaScript, C#, Swift, Pony, ML, and Haskell.

+

Motoko syntax should be familiar to JavaScript programmers, but +without the quirks of JavaScript.

+

Motoko is a concurrent, actor-oriented language with convenient +support for concurrency control using async/await and futures. Its core +is a call-by-value, impure functional language with imperative and +object-oriented features.

+

Motoko is strongly typed and offers option types, records, variants, +generics and subtyping. The type system is structural so that types with +different names but equivalent definition are interchangeable; subtyping +allows values to be used at their precise type but also at any more +general supertype.

+
    +
  • Motoko is safety-oriented.
  • +
  • Memory management is automated using a garbage collector.
  • +
  • Implicit null values are avoided. Nulls must be handled explicitly +using option types.
  • +
  • The type system cannot be circumvented using unsafe casts.
  • +
  • Arithmetic either uses unbounded integers that cannot overflow, or, +when using bounded integers, employs checked arithmetic that faults on +overflow.
  • +
  • All coercions between unrelated types are explicit.
  • +
  • Implicit promotion of a value to another type can only be achieved +by subtyping, an operation with zero cost.
  • +
  • Motoko's support for concise, compiler-checked pattern matching +encourages good coding style and auditable code.
  • +
  • Error-prone, object-oriented inheritance is not supported.
  • +
+

Motoko canisters are compiled, not interpreted, producing small +binaries with good performance.

+

Native canister smart +contract support

+

Motoko has native support for canister smart contracts, which are +expressed as a Motoko actor. An actor is an autonomous object that fully +encapsulates its state and communicates with other actors only through +asynchronous messages.

+

Code sequentially in direct +style

+

On ICP, canisters can communicate with other canisters by sending +asynchronous messages.

+

Asynchronous programming is hard, so Motoko enables you to author +asynchronous code in much simpler, sequential style. Asynchronous +messages are function calls that return a future, and the +await construct allows you to suspend execution until a +future has completed.

+

Modern type system

+

Motoko has been designed to be intuitive to those familiar with +JavaScript and other popular languages, but offers modern features such +as sound structural types, generics, variant types, and statically +checked pattern matching.

+

Autogenerated IDL files

+

A Motoko actor always presents a typed interface to its clients as a +suite of named functions with argument and future result types.

+

The Motoko compiler and IC SDK can emit this interface in a language +neutral format called Candid, so other canisters, browser resident code +and smart phone apps that support Candid can use the actor’s services. +The Motoko compiler can consume and produce Candid files, allowing +Motoko to seamlessly interact with canisters implemented in other +programming languages, provided they also support Candid.

+

Orthogonal persistence

+

ICP persists the memory and other state information of a canister as +it is executed. Thus the state of a Motoko actor, including its +in-memory data structures, survive indefinitely. Actor state does not +need to be explicitly restored and saved to external storage.

+

Upgrades

+

Motoko provides numerous features to help you leverage orthogonal +persistence, including language features that allow you to retain a +canister’s data as you upgrade the code of the canister.

+

For example, Motoko lets you declare certain variables as +stable. The values of stable variables are +automatically preserved across canister upgrades.

+

Once upgraded, the new interface is compatible with the previous one, +meaning existing clients referencing the canister will continue to work, +but new clients will be able to exploit its upgraded functionality.

+

For scenarios that can’t be solved using stable variables alone, +Motoko provides user-definable upgrade hooks that run immediately before +and after upgrade, and allow you to migrate arbitrary state to stable +variables.

+

Getting started

+

Get started with Motoko by setting up your +developer environment and creating a simple Hello, world! program.

+

Sample apps

+

For projects that use the Motoko programming language, see Motoko +sample projects.

+ + + diff --git a/docs/html/mutable-state.html b/docs/html/mutable-state.html new file mode 100644 index 00000000000..7761429dc9e --- /dev/null +++ b/docs/html/mutable-state.html @@ -0,0 +1,462 @@ + + + + + + + md/writing-motoko/mutable-state.md + + + + +
+

md/writing-motoko/mutable-state.md

+
+ +

Mutable state

+

Overview

+

Each actor in Motoko may use, but may never directly share, internal +mutable state.

+

Immutable data can be shared among actors, +and also handled through each other's external entry points which serve +as shareable functions. Unlike shareable data, a key Motoko design +invariant is that mutable data is kept private to the actor that +allocates it and is never shared remotely.

+

Immutable vs mutable +variables

+

The var syntax declares mutable variables in a +declaration block:

+
let text  : Text = "abc";
+let num  : Nat = 30;
+
+var pair : (Text, Nat) = (text, num);
+var text2 : Text = text;
+

The declaration list above declares four variables. The first two +variables (text and num) are lexically-scoped, +immutable variables. The final two variables (pair and +text2) are lexically-scoped, mutable variables.

+

Assignment to mutable memory

+

Mutable variables permit assignment and immutable variables do +not.

+

If you try to assign new values to either Text or num above, +you will get static type errors because these variables are +immutable.

+

You may freely update the value of mutable variables +pair and text2 using the syntax for +assignment, written as :=, as follows:

+
text2 := text2 # "xyz";
+pair := (text2, pair.1);
+pair
+

In the example above, each variable is updated based on applying a +simple update rule to their current values. Likewise, an actor processes +some calls by performing updates on its private mutable variables, using +the same assignment syntax as above.

+

Special assignment +operations

+

The assignment operation := is general and works for all +types.

+

Motoko includes special assignment operations that combine assignment +with a binary operation. The assigned value uses the binary operation on +a given operand and the current contents of the assigned variable.

+

For example, numbers permit a combination of assignment and +addition:

+
var num2 = 2;
+num2 += 40;
+num2
+

After the second line, the variable num2 holds +42, as one would expect.

+

Motoko includes other combinations as well. For example, we can +rewrite the line above that updates text2 more concisely +as:

+
text2 #= "xyz";
+text2
+

As with +=, this combined form avoids repeating the +assigned variable’s name on the right hand side of the special +assignment operator #=.

+

The full table of assignment +operators lists numerical, logical, and textual operations over +appropriate types number, boolean and text values, respectively.

+

Reading from mutable memory

+

Once you have updated each variable, you must read from the mutable +contents. This does not require a special syntax.

+

Each use of a mutable variable looks like the use of an immutable +variable, but does not act like one. In fact, its meaning is more +complex. As in many other language, the syntax of each use hides the +memory effect that accesses the memory cell identified by that variable +and gets its current value. Other languages from functional traditions +generally expose these effects syntactically.

+

var vs let +bound variables

+

Consider the following two variable declarations, which look +similar:

+
let x : Nat = 0
+
var x : Nat = 0
+

The only difference in their syntax is the use of keyword +let versus var to define the variable +x, which in each case the program initializes to +0.

+

However, these programs carry different meanings, and in the context +of larger programs, the difference in meanings will impact the meaning +of each occurrence of x.

+

For the first program, which uses let, each such +occurrence means 0. Replacing each occurrence with +0 will not change the meaning of the program.

+

For the second program, which uses var, each occurrence +means “read and produce the current value of the mutable memory cell +named x.” In this case, each occurrence’s value is +determined by the dynamic state of the contents of the mutable memory +cell named x.

+

As one can see from the definitions above, there is a fundamental +contrast between the meanings of let-bound and +var-bound variables.

+

In large programs, both kinds of variables can be useful, and neither +kind serves as a good replacement for the other. However, +let-bound variables are more fundamental.

+

For instance, instead of declaring x as a mutable +variable initially holding 0, you could instead use +y, an immutable variable that denotes a mutable array with +one entry holding 0:

+
var x : Nat       = 0 ;
+let y : [var Nat] = [var 0] ;
+

The read and write syntax required for this encoding reuses that of +mutable arrays, which is not as readable as that of +var-bound variables. As such, the reads and writes of +variable x will be easier to read than those of variable +y.

+

For this practical reason and others, var-bound +variables are a core aspect of the language's design.

+

Immutable arrays

+

Before discussing mutable arrays, we +introduce immutable arrays, which share the same projection syntax but +do not permit mutable updates after allocation.

+

Allocate an immutable +array of constants

+
let a : [Nat] = [1, 2, 3] ;
+

The array a above holds three natural numbers, and has +type [Nat]. In general, the type of an immutable array is +[_], using square brackets around the type of the array’s +elements, which must share a single common type.

+

Read from an array index

+

You can read from an array using the usual bracket syntax of +[ and ] around the index you want to +access:

+
let x : Nat = a[2] + a[0] ;
+

Every array access in Motoko is safe. Accesses that are out of bounds +will not access memory unsafely, but instead will cause the program to +trap as with an assertion +failure.

+

The Array module

+

The Motoko standard library provides basic operations for immutable +and mutable arrays. It can be imported as follows:

+
import Array "mo:base/Array";
+

For more information about using arrays, see the array library descriptions.

+

Allocate an +immutable array with varying content

+

Each new array allocated by a program will contain a varying number +of elements. Without mutation, you need a way to specify this family of +elements all at once in the argument to allocation.

+

To accommodate this need, the Motoko language provides the +higher-order array allocation function Array.tabulate, +which allocates a new array by consulting a user-provided generation +function, gen,for each element.

+
func tabulate<T>(size : Nat,  gen : Nat -> T) : [T]
+

Function gen specifies the array as a function value of +arrow type Nat → T, where T is the final array +element type.

+

The function gen actually functions as the array during +its initialization. It receives the index of the array element and +produces the element of type T that should reside at that +index in the array. The allocated output array populates itself based on +this specification.

+

For instance, you can first allocate array1 consisting +of some initial constants, then functionally update some of the indices +by changing them in a pure, functional way, to produce +array2, a second array that does not destroy the first.

+
let array1 : [Nat] = [1, 2, 3, 4, 6, 7, 8] ;
+
+let array2 : [Nat] = Array.tabulate<Nat>(7, func(i:Nat) : Nat {
+    if ( i == 2 or i == 5 ) { array1[i] * i } // change 3rd and 6th entries
+    else { array1[i] } // no change to other entries
+  }) ;
+

Even though we changed array1 into array2 +in a functional sense, notice that both arrays and both variables are +immutable.

+

Mutable arrays

+

Each mutable array in Motoko introduces private mutable actor +state.

+

Because Motoko’s type system enforces that remote actors do not share +their mutable state, the Motoko type system introduces a firm +distinction between mutable and immutable arrays that impacts typing, +subtyping, and the language abstractions for asynchronous +communication.

+

Locally, the mutable arrays can not be used in places that expect +immutable ones, since Motoko’s definition of subtyping for arrays +correctly distinguishes those cases for the purposes of type soundness. +Additionally, in terms of actor communication, immutable arrays are safe +to send and share, while mutable arrays can not be shared or otherwise +sent in messages. Unlike immutable arrays, mutable arrays have +non-shareable types.

+

Allocate a mutable array +of constants

+

To indicate allocation of mutable arrays, the mutable array syntax +[var _] uses the var keyword in both the +expression and type forms:

+
let a : [var Nat] = [var 1, 2, 3] ;
+

As above, the array a above holds three natural numbers, +but has type [var Nat].

+

Allocate a mutable +array with dynamic size

+

To allocate mutable arrays of non-constant size, use the +Array.init base library function and supply an initial +value:

+
func init<T>(size : Nat,  x : T) : [var T]
+

For example:

+
var size : Nat = 42 ;
+let x : [var Nat] = Array.init<Nat>(size, 3);
+

The variable size does not need to be constant here. The +array will have size number of entries, each holding the +initial value 3.

+

Mutable updates

+

Mutable arrays, each with type form [var _], permit +mutable updates via assignment to an individual element. In this case, +element index 2 gets updated from holding 3 to +instead hold value 42:

+
let a : [var Nat] = [var 1, 2, 3];
+a[2] := 42;
+a
+

Subtyping +does not permit mutable to be used as immutable

+

Subtyping in Motoko does not permit us to use a mutable array of type +[var Nat] in places that expect an immutable one of type +[Nat].

+

There are two reasons for this. First, as with all mutable state, +mutable arrays require different rules for sound subtyping. In +particular, mutable arrays have a less flexible subtyping definition, +necessarily. Second, Motoko forbids uses of mutable arrays across asynchronous communication, where mutable +state is never shared.

+ + diff --git a/docs/html/object-subtyping.html b/docs/html/object-subtyping.html new file mode 100644 index 00000000000..8bdce398610 --- /dev/null +++ b/docs/html/object-subtyping.html @@ -0,0 +1,280 @@ + + + + + + + md/writing-motoko/object-subtyping.md + + + + +
+

md/writing-motoko/object-subtyping.md

+
+ +

Object subtyping

+

Overview

+

Object subtyping : In Motoko, objects have types +that may relate by subtyping. Types with more fields are less general +and are subtypes of types with fewer fields. Consider the following +general types and subtypes:

+
    +
  • Most general:
  • +
+
{ bump : () -> Nat }
+
    +
  • Middle generality:
  • +
+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+}
+
    +
  • Least generality:
  • +
+
{
+  inc  : () -> () ;
+  read : () -> Nat ;
+  bump : () -> Nat ;
+  write : Nat -> () ;
+}
+

If a function expects to receive an object of the first type +({ bump: () → Nat }), any of the types given above will +suffice since they are each equal to or a subtype of the most general +type.

+

However, if a function expects to receive an object of the last, +least general type, the other two will not suffice, since they +each lack the needed write operation, to which this +function rightfully expects to have access.

+

Example

+

To illustrate the role and use of object subtyping in Motoko, +consider implementing a simpler counter with a more general type that +has fewer public operations:

+
object bumpCounter {
+  var c = 0;
+  public func bump() : Nat {
+    c += 1;
+    c
+  };
+};
+

The object bumpCounter has the following object type, +exposing exactly one operation, bump:

+
{
+  bump : () -> Nat ;
+}
+

This type exposes the most common operation, and one that only +permits certain behavior. For instance, the counter can only ever +increase and can never decrease or be set to an arbitrary value.

+

In other parts of a system, you may implement and use a less general +version with more operations:

+
fullCounter : {
+  inc   : () -> () ;
+  read  : () -> Nat ;
+  bump  : () -> Nat ;
+  write : Nat -> () ;
+}
+

Consider a counter named fullCounter with a less general +type than any given above. In addition to inc, +read and bump, it additionally includes +write, which permits the caller to change the current count +value to an arbitrary one, such as back to 0.

+

Structural subtyping

+

Object subtyping in Motoko uses structural subtyping, not nominal +subtyping.

+

In nominal typing, the question of two types equality depends on +choosing consistent, globally-unique type names across projects and +time.

+

In Motoko, the question of two types' equality is based on their +structure, not their names. Due to structural typing, naming a class +type provides a convenient abbreviation.

+

For typing purposes, all that matters is the structure of the +corresponding object type. Two classes with different names but +equivalent definitions produce type-compatible objects.

+

When the optional type annotation is supplied in a class declaration, +conformance is checked. The object type must be a subtype of the +annotation. The annotation does not affect the type of the class, even +if it only describes a proper super-type of the object type.

+

Subtyping relationships in Motoko extend to all types, not just +object types.

+

Most cases are standard and follow conventional programming language +theory for structural subtyping.

+

Other notable cases in Motoko for new programmers include array, +options, variants and number type inter-relationships.

+ + diff --git a/docs/html/optimization.html b/docs/html/optimization.html new file mode 100644 index 00000000000..7196987305e --- /dev/null +++ b/docs/html/optimization.html @@ -0,0 +1,315 @@ + + + + + + + md/canister-maintenance/optimization.md + + + + +
+

md/canister-maintenance/optimization.md

+
+ +

Optimizing canisters

+

Overview

+

The Motoko compiler produces small binaries with reasonably efficient +code, but is not a highly optimized compiler. It is possible to further +optimize Motoko binaries, both for code size and cycle usage, using +additional tools such as wasm-opt.

+

Using wasm-opt

+

Wasm-opt is a general purpose Wasm optimizer that is now +available in dfx, versions 0.14.0 and newer.

+

Wasm-opt can be used to enable canister optimizations +through a configuration option in the project's dfx.json +file, such as:

+
{
+  "canisters": {
+    "my_canister": {
+      "optimize": "cycles"
+    }
+  }
+}
+

Optimization levels for +cycle usage

+

Using the "optimize": "cycles" option, you can expect a +rough estimate of decreased cycles usage for Motoko canisters by around +10%.

+

The "optimize": "cycles" option is the recommended +default, as it maps to optimization level 3 in the wasm-opt +package.

+

The optimization levels for cycles usage are as follows:

+
O4
+O3 (equivalent to “cycles”)
+O2
+O1
+O0 (performs no optimizations)
+

Optimization levels for +binary size

+

To optimize the binary size instead, you can use the +"optimize": "size" option. By using the size option, binary +sizes can be reduced by roughly 16%.

+

The optimization levels for binary size are as follows:

+
Oz (equivalent to “size”)
+Os
+

Each optimization preserves the Internet Computer specific metadata +sections of each canister.

+

:::info Note that in certain cases the optimizations can increase the +complexity of certain functions in your Wasm module such that they are +rejected by the replica. If you run into this issue, it is recommended +to use a less aggressive optimization level such that you do not exceed +the complexity limit. :::

+

More information on canister optimization and information on +wasm-opt benchmark testing can be found on +this forum post.

+ + diff --git a/docs/html/overview.html b/docs/html/overview.html new file mode 100644 index 00000000000..2e1ee2a1592 --- /dev/null +++ b/docs/html/overview.html @@ -0,0 +1,197 @@ + + + + + + + md/migration-guides/overview.md + + + + +
+

md/migration-guides/overview.md

+
+ +

Overview

+

New versions of Motoko may introduce breaking changes that are not +backwards compatible with older versions. In these scenarios, there are +migration guides created to explain how to update your code to migrate +to the new version properly.

+

Migration guides

+ + + diff --git a/docs/html/pattern-matching.html b/docs/html/pattern-matching.html new file mode 100644 index 00000000000..c970cc47f6b --- /dev/null +++ b/docs/html/pattern-matching.html @@ -0,0 +1,429 @@ + + + + + + + md/writing-motoko/pattern-matching.md + + + + +
+

md/writing-motoko/pattern-matching.md

+
+ +

Pattern matching

+

Overview

+

Pattern matching is a language feature that makes it easy to both +test and decompose structured data into its constituent parts. While +most programming languages provide familiar ways to build structured +data, pattern matching enables you to take apart structured data and +bring its fragments into scope by binding them to the names you specify. +Syntactically, the patterns resemble the construction of structured +data, but generally appear in input-direction positions, such as in +function argument positions, after the case keyword in +switch expressions, and after let or +var declarations.

+

Types of patterns

+

The following table summarizes the different ways of pattern +matching.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pattern kindExample(s)ContextCan failRemarks
Literalnull, 42, (), +"Hi"EverywhereWhen the type has more than one value
Namedage, xEverywhereNoIntroduces identifiers into a new scope
Wildcard_EverywhereNo
Typedage : NatEverywhereConditional
Option?0, ?valEverywhereYes
Tuple( component0, component1, …​ )EverywhereConditionalMust have at least two components
Object{ fieldA; fieldB; …​ }EverywhereConditionalAllowed to mention a subset of fields
Fieldage, count = 0ObjectConditionalage is short for age = age
Variant#celsius deg, #sundayEverywhereYes#sunday is short form for #sunday ()
Alternative (or-pattern)0 or 1EverywhereDependsNo alternative may bind an identifier
+

Using pattern matching

+

Consider the following function call:

+
let name : Text = fullName({ first = "Jane"; mid = "M"; last = "Doe" });
+

This code constructs a record with three fields and passes it to the +function fullName. The result of the call is named and +brought into scope by binding it to the identifier name. +The last, binding step is called pattern matching, and +name : Text is one of the simplest forms of a pattern. For +instance, in the following implementation of the callee:

+
func fullName({ first : Text; mid : Text; last : Text }) : Text {
+  first # " " # mid # " " # last
+};
+

The input is an anonymous object which is destructured into its three +Text fields, whose values are +bound to the identifiers first, mid and +last. They can be freely used in the block that forms the +body of the function. Above we have resorted to name punning, a form of +aliasing for object field patterns, using the name of a field to also +name its contents. A more general form of field patterns allows the +content to be named separately from the field, as in +…​; mid = m : Text; …​. Here mid determines +which field to match, and m names the content of that field +within the scope of the pattern.

+

Literal patterns

+

You can also use pattern matching to declare literal patterns, which +look just like literal constants. Literal patterns are especially useful +in switch expressions because they can cause the current +pattern match to fail, and thus start to match the next pattern. For +example:

+
switch ("Adrienne", #female) {
+  case (name, #female) { name # " is a girl!" };
+  case (name, #male) { name # " is a boy!" };
+  case (name, _) { name # ", is a human!" };
+}
+

This program will match the first case clause because +binding to the identifier name cannot fail and the +shorthand variant literal #female compares as equal. Then +it evaluates to "Adrienne is a girl!". The last clause +showcases the wildcard pattern _. It cannot fail, but won’t +bind any identifier.

+

or patterns

+

The last kind of pattern is the or pattern. As its name +suggests, these are two or more patterns that are separated by the +keyword or. Each of the sub-patterns must bind to the same +set of identifiers, and is matched from left-to-right. An +or pattern fails when its rightmost sub-pattern fails.

+

More on patterns

+

Since pattern matching has a rich history and interesting mechanics, +a few additional comments are justified.

+

Terminology

+

The expression whose value is being matched is frequently called the +scrutinee. The patterns appearing behind the keyword +case are the alternatives. When every +possible value of the scrutinee is matched by at least one alternative, +then the scrutinee is covered. The alternatives are +tried in order. In case of overlapping patterns, the earlier one is +selected. An alternative is considered dead or redundant if for every +value that it matches there is already some earlier alternative that +also matches the value.

+

Booleans

+

The data type Bool can be +regarded as two disjointed alternatives (true and +false) and Motoko’s built-in if construct will +eliminate the data and turn it into control flow. if +expressions are a form of pattern matching that abbreviates the general +switch expression for the special case of boolean +scrutinees.

+

Variant patterns

+

Motoko’s variant types are a form of disjoint union, sometimes also +called a sum type. A value of variant type always has exactly one +discriminator and a payload which can vary from discriminator to +discriminator. When matching a variant pattern with a variant value, the +discriminators must be the same in order to select the alternative, and +if so, the payload gets exposed for further matching.

+

Enumerated types

+

Other programming languages often use a keyword enum to +define discrete enumerations. These are poor relations of Motoko’s more +general variant types, as the alternatives of an enumeration are not +allowed to carry any payload. Correspondingly, in those languages the +switch-like statements used to analyse enum values lack the +full power of pattern matching. Motoko provides the short-hand syntax, +as in type Weekday = { #mon; #tue; …​ }, to define basic +enumerations for which no payloads are required.

+

Error handling

+

Error handling can be considered a use-case for pattern matching. +When a function returns a value that has an alternative for success and +one for failure, pattern matching can be used to distinguish between the +two as discussed in error handling.

+

Irrefutable patterns

+

A pattern is refutable if matching some value of the expected type +against it can fail. Literal and variant patterns are generally +refutable, since they require an equal value or variant tag and these +could fail to match.

+

A pattern that cannot fail to match every value is irrefutable. +Examples of irrefutable patterns are the wildcard pattern +_, identifier patterns x and tuple or record +patterns built from irrefutable sub-patterns.

+

Singleton types

+

Some types contain just a single value. We call these singleton +types. Examples of these are the unit type, also known as an empty +tuple, or tuples of singleton types. Variants with a single tag and with +no or a singleton type payload are singleton types too. Pattern matching +on singleton types is particularly straightforward, as it only has one +possible outcome of a successful match.

+

Exhaustiveness (coverage) +checking

+

At runtime, a switch expression may wind up scrutinizing a value to +which none of its alternative patterns apply, generating an undesired +trap. To detect the possibility of such runtime failures, the Motoko +compiler checks for the exhaustiveness of pattern matching by keeping +track of the covered shape of the scrutinee. The compiler issues a +warning for any non-covered scrutinees. Motoko even constructs a helpful +example of a scrutinee that is not matched. A useful by-product of the +exhaustiveness check is that it identifies and warns about dead or +redundant alternatives that can never be matched.

+ + diff --git a/docs/html/pipes.html b/docs/html/pipes.html new file mode 100644 index 00000000000..a65613c0811 --- /dev/null +++ b/docs/html/pipes.html @@ -0,0 +1,226 @@ + + + + + + + md/writing-motoko/pipes.md + + + + +
+

md/writing-motoko/pipes.md

+
+ +

Piping values into +expressions

+

Overview

+

It can sometimes be hard to read deeply nested expressions involving +several function applications.

+
+

This expression takes the range of numbers +0..10, converts it to a list, filters the list +for multiples of three, then returns a record containing the result.

+

To make such expressions more readable, you can use Motoko's pipe +operator <exp1> |> <exp2>. The operator +evaluates the first argument <exp1>, and lets you +refer to its value in <exp2> using the special +placeholder expression _.

+

Using this, you can write the former expression as:

+
+

Now, the textual order of operations corresponds to the explanation +above. The pipe expression <exp1> |> <exp2> +is just syntactic sugar for the following block binding +<exp1> to a reserved placeholder identifier, +p, before returning <exp2>:

+
do { let p = <exp1>; <exp2> }
+

The otherwise inaccessible placeholder identifier p can +only referenced by the placeholder expression _. Multiple +references to _ are allowed and refer to the same value +within the same pipe operation.

+

Note that using _ as an expression outside of a pipe +operation, where it is undefined, is an error.

+

For example, the following example produces the compile-time error +"type error [M0057], unbound variable _":

+
let x = _;
+

Internally, the compiler uses the reserved identifier _ +as the name for the placeholder called p above, so this +let is just referencing an undefined variable.

+

See the +language manual page on pipes for more details.

+ + diff --git a/docs/html/query-functions.html b/docs/html/query-functions.html new file mode 100644 index 00000000000..54c763ae5a2 --- /dev/null +++ b/docs/html/query-functions.html @@ -0,0 +1,289 @@ + + + + + + + md/writing-motoko/query-functions.md + + + + +
+

md/writing-motoko/query-functions.md

+
+ +

Query functions

+

Overview

+

In ICP terminology, update messages, also referred +to as calls, can alter the state of the canister when called. Effecting +a state change requires agreement amongst the distributed replicas +before the network can commit the change and return a result. Reaching +consensus is an expensive process with relatively high latency.

+

For the parts of applications that don’t require the guarantees of +consensus, the ICP supports more efficient query operations. These are +able to read the state of a canister from a single replica, modify a +snapshot during their execution and return a result, but cannot +permanently alter the state or send further messages.

+

Query functions

+

Motoko supports the implementation of queries using +query functions. The query keyword modifies +the declaration of a shared actor function so that it executes with +non-committing and faster query semantics.

+

For example, consider the following Counter actor with a +read function called peek:

+
+

The peek() function might be used by a +Counter frontend offering a quick, but less trustworthy, +display of the current counter value.

+

Query functions can be called from non-query functions. Because those +nested calls require consensus, the efficiency gains of nested query +calls will be modest at best.

+

The query modifier is reflected in the type of a query +function:

+
  peek : shared query () -> async Nat
+

As before, in query declarations and actor types the +shared keyword can be omitted.

+

:::info

+

A query method cannot call an actor function and will result in an +error when the code is compiled. Calls to ordinary functions are +permitted.

+

:::

+

Composite query functions

+

Queries are limited in what they can do. In particular, they cannot +themselves issue further messages, including queries.

+

To address this limitation, the ICP supports another type of query +function called a composite query.

+

Like plain queries, the state changes made by a composite query are +transient, isolated and never committed. Moreover, composite queries +cannot call update functions, including those implicit in +async expressions, which require update calls under the +hood.

+

Unlike plain queries, composite queries can call query functions and +composite query functions on the same and other actors, but only +provided those actors reside on the same subnet.

+

As a contrived example, consider generalizing the previous +Counter actor to a class of counters. Each instance of the +class provides an additional composite query to sum the +values of a given array of counters:

+
+

Declaring sum as a composite query enables +it call the peek queries of its argument counters.

+

While update messages can call plain query functions, they cannot +call composite query functions. This distinction, which is dictated by +the current capabilities of ICP, explains why query functions and +composite query functions are regarded as distinct types of shared +functions.

+

Note that the composite query modifier is reflected in +the type of a composite query function:

+
  sum : shared composite query ([Counter]) -> async Nat
+

Since only a composite query can call another composite query, you +may be wondering how any composite query gets called at all?

+

Composite queries are initiated outside ICP, typically by an +application (such as a browser frontend) sending an ingress message +invoking a composite query on a backend actor.

+

:::danger

+

The Internet Computer's semantics of composite queries ensures that +state changes made by a composite query are isolated from other +inter-canister calls, including recursive queries, to the same +actor.

+

In particular, a composite query call rolls back its state on +function exit, but is also does not pass state changes to sub-query or +sub-composite-query calls. Repeated calls, which include recursive +calls, have different semantics from calls that accumulate state +changes.

+

In sequential calls, the internal state changes of preceding queries +will have no effect on subsequent queries, nor will the queries observe +any local state changes made by the enclosing composite query. Local +states changes made by the composite query are preserved across the +calls until finally being rolled-back on exit from the composite +query.

+

This semantics can lead to surprising behavior for users accustomed +to ordinary imperative programming.

+

Consider this example containing the composite query +test that calls query q and composite query +cq.

+
+

When state is 0, a call to +test returns

+
{s0 = 0; s1 = 0; s2 = 0; s3 = 3_000}
+

This is because none of the local updates to state are +visible to any of the callers or callees.

+

:::

+ + diff --git a/docs/html/quickstart.html b/docs/html/quickstart.html new file mode 100644 index 00000000000..881469290c8 --- /dev/null +++ b/docs/html/quickstart.html @@ -0,0 +1,286 @@ + + + + + + + md/getting-started/quickstart.md + + + + +
+

md/getting-started/quickstart.md

+
+ +

Motoko quickstart

+

Overview

+

This quickstart guide showcases how to deploy a simple 'Hello, +world!' Motoko smart contract.

+

Prerequisites

+

Before getting started, assure you have set up your developer +environment according to the instructions in the developer environment guide.

+

Creating a new project

+

Open a terminal window on your local computer, if you don’t already +have one open.

+

Create a new project and change to the project directory.

+

Use dfx new [project_name] to create a new project:

+
dfx new hello_world
+

You will be prompted to select the language that your backend +canister will use:

+
? Select a backend language: ›
+❯ Motoko
+Rust
+TypeScript (Azle)
+Python (Kybra)
+

Then, select a frontend framework for your frontend canister. In this +example, select:

+
? Select a frontend framework: ›
+SvelteKit
+React
+Vue
+Vanilla JS
+No JS template
+❯ No frontend canister
+

Lastly, you can include extra features to be added to your +project:

+
? Add extra features (space to select, enter to confirm) ›
+⬚ Internet Identity
+⬚ Bitcoin (Regtest)
+⬚ Frontend tests
+

Smart contract code

+

This hello world actor has a single function called +greet. It is marked as query because it +doesn't modify the state of the actor. The function accepts a name as +input in type Text and +returns a greeting of type Text.

+
//src/hello_backend/main.mo
+
+actor {
+  public query func greet(name : Text) : async Text {
+    return "Hello, " # name # "!";
+  };
+};
+

Starting the deployment +environment

+

Start the Internet Computer for local development or check your +connection to the Internet Computer for network deployment:

+ +

Register, +build, and deploy locally or on the mainnet

+

To deploy locally, use the command:

+
dfx deploy
+

For deploying to the mainnet, use: --network ic.

+
dfx deploy --network <network>
+

View +your service or application in a browser, using the URLS in the output +of the dfx deploy command:

+
...
+Committing batch.
+Committing batch with 18 operations.
+Deployed canisters.
+URLs:
+Frontend canister via browser
+        access_hello_frontend: http://127.0.0.1:4943/?canisterId=cuj6u-c4aaa-aaaaa-qaajq-cai
+Backend canister via Candid interface:
+        access_hello_backend: http://127.0.0.1:4943/?canisterId=cbopz-duaaa-aaaaa-qaaka-cai&id=ctiya-peaaa-aaaaa-qaaja-cai
+ + diff --git a/docs/html/sharing.html b/docs/html/sharing.html new file mode 100644 index 00000000000..5c0eed554e1 --- /dev/null +++ b/docs/html/sharing.html @@ -0,0 +1,390 @@ + + + + + + + md/writing-motoko/sharing.md + + + + +
+

md/writing-motoko/sharing.md

+
+ +

Sharing data and behavior

+

Overview

+

In Motoko, mutable state is always private to an actor. However, two +actors can share message data, and those messages can refer to actors, +including themselves and one another. Additionally, messages can refer +to individual functions, if those functions are shared.

+

Through these mechanisms, two actors can coordinate their behavior +through asynchronous message passing.

+

Publisher-subscriber +pattern with actors

+

The examples in this section illustrate how actors share their +functions by focusing on variations of the publish-subscribe +pattern. In the publish-subscribe pattern, a +publishing actor records a list of +subscriber actors to notify when something notable +occurs in the publisher’s state. For example, if the publisher actor +publishes a new article, the subscriber actors are notified that a new +article is available.

+

The example below uses two actors in Motoko to build variations of +the publisher-subscriber relationship.

+

To see the complete code for a working project that uses this +pattern, see the pubsub +example in the examples +repository.

+

Subscriber actor

+

The following Subscriber actor type provides a possible +interface for the subscriber actor to expose and the publisher actor to +call:

+
type Subscriber = actor {
+  notify : () -> ()
+};
+
    +
  • The Publisher uses this type to define a data +structure to store its subscribers as data.

  • +
  • Each Subscriber actor exposes a notify +update function as described in the Subscriber actor type +signature above.

  • +
+

Note that sub-typing enables the Subscriber actor to +include additional methods that are not listed in this type +definition.

+

For simplicity, assume that the notify function accepts +relevant notification data and returns some new status message about the +subscriber to the publisher. For example, the subscriber might return a +change to its subscription settings based on the notification data.

+

Publisher actor

+

The publisher side of the code stores an array of subscribers. For +simplicity, assume that each subscriber only subscribes itself once +using a subscribe function:

+
import Array "mo:base/Array";
+
+actor Publisher {
+    var subs: [Subscriber] = [];
+
+    public func subscribe(sub: Subscriber) {
+        subs := Array.append<Subscriber>(subs, [sub]);
+    };
+
+    public func publish() {
+        for (sub in subs.vals()) {
+          sub.notify();
+        };
+    };
+};
+

Later, when some unspecified external agent invokes the +publish function, all of the subscribers receive the +notify message as defined in the Subscriber +type given above.

+

Subscriber methods

+

In the simplest case, the subscriber actor has the following +methods:

+
    +
  • Subscribe to notifications from the publisher using the +init method.

  • +
  • Receive notification as one of the subscribed actors, as +specified by the notify function in the +Subscriber type given above.

  • +
  • Permit queries to the accumulated state, which in this sample +code is simply a get method for the number of notifications +received and stored in the count variable.

  • +
+

The following code illustrates implementing these methods:

+
actor Subscriber {
+  var count: Nat = 0;
+  public func init() {
+    Publisher.subscribe(Subscriber);
+  };
+  public func notify() {
+    count += 1;
+  };
+  public func get() : async Nat {
+    count
+  };
+}
+

The actor assumes, but does not enforce, that its init +function is only ever called once. In the init function, +the Subscriber actor passes a reference to itself of type +actor { notify : () → () };.

+

If called more than once, the actor will subscribe itself multiple +times and will receive multiple duplicate notifications from the +publisher. This fragility is the consequence of the basic +publisher-subscriber design shown above. A more advanced publisher actor +could check for duplicate subscriber actors and ignore them.

+

Sharing functions among +actors

+

In Motoko, a shared actor function can be sent in a +message to another actor and then later called by that actor or by +another actor.

+

The code shown above has been simplified for illustrative purposes. +The full version offers additional features to the publisher-subscriber +relationship, and uses shared functions to make this relationship more +flexible.

+

For instance, the notification function is always designated as +notify. A more flexible design would only fix the type of +notify, and permit the subscriber to choose any of its +shared functions.

+

See the the +full example for details.

+

In particular, suppose that the subscriber wants to avoid being +locked into a certain naming scheme for its interface. What really +matters is that the publisher can call some function that the subscriber +chooses.

+

The shared keyword

+

To permit this flexibility, an actor needs to share a single function +that permits remote invocation from another actor, not merely a +reference to itself.

+

The ability to share a function requires that it be pre-designated as +shared and the type system enforces that these functions +follow certain rules around the types of data that these functions +accept as arguments and return as result. In particular, the data that +can be transmitted across shared functions must have a shared type +consisting of immutable plain data, actor references or references to +shared functions. Local functions, proper objects with methods and +mutable arrays are excluded.

+

Motoko lets you omit this keyword for public actor methods since +implicitly, any public function of an actor must be shared, +whether marked explicitly or not.

+

Using the shared function type, we can extend the +example above to be more flexible. For example:

+
type SubscribeMessage = { callback: shared () -> (); };
+

This type differs from the original in that it describes a message +record type with a single field called callback. The +original type first shown above describes an actor type with a single +method called notify:

+
type Subscriber = actor { notify : () -> () };
+

Notably, the actor keyword means that this latter type +is not an ordinary record with fields but rather an actor with at least +one method, which must be called notify.

+

By using the SubscribeMessage type instead, the +Subscriber actor can choose another name for their +notify method:

+
actor Subscriber {
+  var count: Nat = 0;
+  public func init() {
+    Publisher.subscribe({callback = incr;});
+  };
+  public func incr() {
+    count += 1;
+  };
+  public query func get(): async Nat {
+    count
+  };
+};
+

Compared to the original version, the only lines that change are +those that rename notify to incr, and form the +new subscribe message payload using the expression +{callback = incr}.

+

Likewise, we can update the publisher to have a matching +interface:

+
import Array "mo:base/Array";
+actor Publisher {
+  var subs: [SubscribeMessage] = [];
+  public func subscribe(sub: SubscribeMessage) {
+    subs := Array.append<SubscribeMessage>(subs, [sub]);
+  };
+  public func publish() {
+    for (sub in subs.vals()) {
+      sub.callback();
+    };
+  };
+};
+ + diff --git a/docs/html/stable-regions.html b/docs/html/stable-regions.html new file mode 100644 index 00000000000..65e77179e87 --- /dev/null +++ b/docs/html/stable-regions.html @@ -0,0 +1,315 @@ + + + + + + + md/stable-memory/stable-regions.md + + + + +
+

md/stable-memory/stable-regions.md

+
+ +

Stable regions

+

Overview

+

The Region library provides low-level access to ICP +stable memory feature.

+ + +

Motoko stable variables require serialization and deserialization on +upgrade. During an +upgrade, the current values of stable variables are first saved to the +ICP stable memory, then restored from stable memory after the new code +is installed. This mechanism, however, does not scale to canisters that +maintain large amounts of data in stable variables. There may not be +enough cycle budget to store then restore all stable variables within an +upgrade, resulting in failed upgrades.

+

Due to the current 32-bit address space of Motoko, stable variables +cannot store more than 4GiB of data.

+

Additionally, some stable variables use a representation that is not +itself stable, requiring a non-trivial pre-upgrade routine +to pre-process the data into a stable form. These +pre-upgrade steps are critical, and if they trap for any reason, the +Motoko canister may be stuck in an evolutionary dead-end, unable to +upgrade.

+

The Region library

+

To avoid these upgrade hazards, actors can elect to use the ExperimentalStableMemory or Region libraries in package +base. The Region library allows the programmer +to incrementally allocate pages of 64-bit stable memory and use those +pages to incrementally read and write data in a user-defined binary +format.

+

Several pages may be allocated at once, with each page containing +64KiB. Allocation may fail due to resource limits imposed by ICP. Pages +are zero-initialized.

+

While the user allocates at the granularity of 64KiB pages, the +implementation will allocate at the coarser granularity of a block, +currently 128 of physical stable memory pages.

+

The Motoko runtime system ensures there is no interference between +the abstraction presented by the Region library and an +actor’s stable variables, even though the two abstractions ultimately +use the same underlying stable memory facilities available to all ICP +canisters. This runtime support means that is safe for a Motoko program +to exploit both stable variables and Region, within the +same application.

+

Further, distinct Regions use distinct pages of stable +memory, ensuring that two distinct Regions can not +interfere with each other's data representations during normal +operation, or during an upgrade.

+

Using Regions

+

The interface to the Region library consists of +functions for querying and growing the currently allocated set of stable +memory pages, plus matching pairs of load, +store operations for most of Motoko’s fixed-size scalar +types.

+

More general loadBlob and storeBlob +operations are also available for reading and writing binary blobs and +other types that can be encoded as Blobs of arbitrary sizes, using +Motoko supplied or user-provided encoders and decoders.

+
module {
+
+  // A stateful handle to an isolated region of IC stable memory.
+  //  `Region` is a stable type and regions can be stored in stable variables.
+  type Region = Prim.Types.Region;
+
+  // Allocate a new, isolated `Region` of size 0.
+  new : () -> Region;
+
+  // Current size of the region `r` in pages.
+  // Each page is 64KiB (65536 bytes).
+  // Initially `0`.
+  size : (r : Region) -> (pages : Nat64);
+
+  // Grow current `size` of region `r` by `pagecount` pages.
+  // Each page is 64KiB (65536 bytes).
+  // Returns previous `size` when able to grow.
+  // Returns `0xFFFF_FFFF_FFFF_FFFF` if remaining pages of physical stable memory insufficient.
+  // Please note that there is no way to shrink the size of a region.
+  grow : (r : Region, new_pages : Nat64) -> (oldpages : Nat64);
+
+  // read ("load") a byte from a region, by offset.
+  loadNat8 : (r : Region, offset : Nat64) -> Nat8;
+
+  // write ("store") a byte into a region, by offset.
+  storeNat8 : (r : Region, offset : Nat64, value: Nat8) -> ();
+
+  // ... and similar for Nat16, Nat32, Nat64,
+  // Int8, Int16, Int32 and Int64 ...
+
+  loadFloat : (r : Region, offset : Nat64) -> Float;
+  storeFloat : (r : Region, offset : Nat64, value : Float) -> ();
+
+  // Load `size` bytes starting from `offset` in region `r` as a [`Blob`](../base/Blob.md).
+  // Traps on out-of-bounds access.
+  loadBlob : (r : Region, offset : Nat64, size : Nat) -> Blob;
+
+  // Write all bytes of [`Blob`](../base/Blob.md) to region `r` beginning at `offset`.
+  // Traps on out-of-bounds access.
+  storeBlob : (r : Region, offset : Nat64, value : Blob) -> ()
+
+}
+

Example

+

To demonstrate the Region library, the following is a +simple implementation of a logging actor that records text messages in a +scalable, persistent log.

+

The example illustrates the simultaneous use of stable variables and +stable memory. It uses a single stable variable, state, to +keep track of the two regions and their size in bytes, but stores the +contents of the log directly in stable memory.

+
+

The shared add(blob) function allocates enough stable +memory to store the given blob and writes the blob contents, its size, +and its position into the pre-allocated regions. One region is dedicated +to storing the blobs of varying sizes, and the other is dedicated to +storing their fixed-sized metadata.

+

The shared get(index) query reads anywhere from the log +without traversing any unrelated memory.

+

StableLog allocates and maintains its potentially large +log data directly in stable memory and uses a small and fixed amount of +storage for actual stable variables. Upgrading StableLog to +a new implementation should not consume many cycles, regardless of the +current size of the log.

+ + diff --git a/docs/html/stablememory.html b/docs/html/stablememory.html new file mode 100644 index 00000000000..ee0274ced0a --- /dev/null +++ b/docs/html/stablememory.html @@ -0,0 +1,316 @@ + + + + + + + md/stable-memory/stablememory.md + + + + +
+

md/stable-memory/stablememory.md

+
+ +

Stable memory

+

Overview

+

The ExperimentalStableMemory library provides low-level +access to Internet Computer stable memory.

+

:::danger This library has been superseded by the similar, but safer, +Region library.

+

New applications should use the Region library: it +offers additional isolation between different libraries using stable +memory.

+

The documentation here is provided for legacy reasons. :::

+ + +

The current implementation of Motoko stable variables is not able to +maintain very large amounts of data.

+

The ICP upgrade process currently requires stable variables to be +copied from 32-bit main memory to 64-bit stable memory and then back +again - for copious data, this can exceed the cycle limits allowed for +upgrade, causing an upgrade to fail.

+

Moreover, a 32-bit Motoko canister and its stable variables can +fundamentally store at most 4GB of data, while ICP stable memory is +64-bit and currently supports up to 400GB of data.

+

The +ExperimentalStableMemory library

+

To avoid the current limitations of stable variables, developers can +use the recommended Region +library or the older ExperimentalStableMemory +library described here. The ExperimentalStableMemory +library allows the programmer to incrementally allocate pages of 64-bit +ICP stable memory and use those pages to incrementally read and write +data in a user-defined binary format.

+

The main difference between the two libraries is that +ExperimentalStableMemory provides a single memory, a global +resource, that must be shared by all clients, using, requiring +coordination and trust. The Region library instead provides +multiple, isolated memories that can only be accessed by the owner(s) of +a particular memory.

+

Similar to the Regions library, Motoko runtime system +ensures there is no interference between the abstraction presented by +the ExperimentalStableMemory library and an actor’s stable +variables, even though the two abstractions ultimately use the same +underlying stable memory facilities available to all IC canisters. This +runtime support means that is safe for a Motoko program to exploit both +stable variables and ExperimentalStableMemory, within the +same application.

+

Using +ExperimentalStableMemory

+

The interface to the ExperimentalStableMemory library +consists of functions for querying and growing the currently allocated +set of stable memory pages, plus matching pairs of load, +store operations for most of Motoko’s fixed-size scalar +types.

+

More general loadBlob and storeBlob +operations are also available for reading and writing binary blobs and +other types that can be encoded as Blobs of arbitrary sizes, using +Motoko supplied or user-provided encoders and decoders.

+
module {
+
+  // Current size of the stable memory, in pages.
+  // Each page is 64KiB (65536 bytes).
+  // Initially `0`.
+  size : () -> (pages : Nat64);
+
+  // Grow current `size` of stable memory by `pagecount` pages.
+  // Each page is 64KiB (65536 bytes).
+  // Returns previous `size` when able to grow.
+  // Returns `0xFFFF_FFFF_FFFF_FFFF` if remaining pages insufficient.
+  grow : (new_pages : Nat64) -> (oldpages : Nat64);
+
+  loadNat8 : (offset : Nat64) -> Nat8;
+  storeNat8 : (offset : Nat64, value: Nat8) -> ();
+
+  // ... and similar for Nat16, Nat32, Nat64,
+  // Int8, Int16, Int32 and Int64 ...
+
+  loadFloat : (offset : Nat64) -> Float;
+  storeFloat : (offset : Nat64, value : Float) -> ();
+
+  // Load `size` bytes starting from `offset` as a [`Blob`](../base/Blob.md).
+  // Traps on out-of-bounds access.
+  loadBlob : (offset : Nat64, size : Nat) -> Blob;
+
+  // Write bytes of [`Blob`](../base/Blob.md) beginning at `offset`.
+  // Traps on out-of-bounds access.
+  storeBlob : (offset : Nat64, value : Blob) -> ()
+
+  // Returns a query that, when called, returns the number of bytes of
+  // (real) IC stable memory that would be occupied by persisting its
+  // current stable variables before an upgrade.
+  stableVarQuery : () -> (shared query () -> async {size : Nat64})
+}
+

Example

+

To demonstrate the ExperimentalStableMemory library, we +present a dead simple implementation of a logging actor that records +text messages in a scalable, persistent log.

+

The example illustrates the simultaneous use of stable variables and +stable memory. It uses a single stable variable to keep track of the +next available offset, but stores the contents of the log directly in +stable memory.

+
+

The auxiliary function ensure(offset) is used to grow +ExerimentalStableMemory as necessary to accommodate more +data. It computes the 64KiB page of a given offset and ensures enough +pages have been allocated to guarantee that offset is within bounds.

+

The shared log(t) function encodes its Text argument as a Blob, allocates enough stable +memory to store it, and writes both the blob contents and its size at +the next available offset in ExperimentalStableMemory, +updating base.

+

The shared readLast(count) query reads up to +count messages from the log, traversing the log in reverse +from base.

+

Because StableLog allocates and maintains its +(potentially large) log data directly in stable memory and uses just a +small and fixed amount of storage for actual stable variables (here +base), upgrading StableLog to a new +implementation (perhaps to provide more functionality) should not +consume too many cycles, regardless of the current size of the log.

+ + diff --git a/docs/html/static-types.html b/docs/html/static-types.html new file mode 100644 index 00000000000..3ce6bdcd9ce --- /dev/null +++ b/docs/html/static-types.html @@ -0,0 +1,218 @@ + + + + + + + md/writing-motoko/static-types.md + + + + +
+

md/writing-motoko/static-types.md

+
+ +

Static types

+

Overview

+

Like other modern programming languages, Motoko permits each variable +to carry the value of a function, object, or a primitive datum such as a +string, word, or integer. Other types of +values exist as well, including records, tuples, and tagged data are +called variants.

+

Motoko uses the formal property of type safety, also known as type +soundness. Each variable in a Motoko program carries an associated type, +and this type is known statically before the program executes. Each use +of every variable is checked by the compiler to prevent runtime type +errors, including null reference errors, invalid field +access, and the like. In this sense, Motoko types provide a form of +trustworthy, compiler-verified documentation in the +program source code.

+

To execute, Motoko statically compiles to WebAssembly, a portable +binary format that abstracts cleanly over modern computer hardware, and +thus permits its execution broadly on the Internet and ICP.

+

This is often summarized with the phrase "well-typed +Motoko programs don’t go wrong", meaning that the only operations +that will be performed on data are those permitted by its static +type.

+

Dynamic testing can check properties that are beyond the reach of the +Motoko type system. The Motoko type system is intentionally not +advanced. Rather, the type system of Motoko integrates standard concepts +from modern, but well-understood, type systems to +provide an approachable, expressive, yet safe language for programming +general-purpose, distributed applications.

+ + diff --git a/docs/html/structural-equality.html b/docs/html/structural-equality.html new file mode 100644 index 00000000000..a974f8edaae --- /dev/null +++ b/docs/html/structural-equality.html @@ -0,0 +1,269 @@ + + + + + + + md/writing-motoko/structural-equality.md + + + + +
+

md/writing-motoko/structural-equality.md

+
+ +

Structural equality

+

Overview

+

Equality (==) — and by extension inequality +(!=) — is structural. Two values, +a and b, are equal, a == b. They +have equal contents regardless of the physical representation or +identity of those values in memory.

+

For example, the strings "hello world" and +"hello " # "world" are equal, even though they are most +likely represented by different objects in memory.

+

Equality is defined only on shared types or on types +that don’t contain:

+
    +
  • Mutable fields.

  • +
  • Mutable arrays.

  • +
  • Non-shared functions.

  • +
  • Components of generic type.

  • +
+

For example, we can compare arrays of objects:

+
let a = [ { x = 10 }, { x = 20 } ];
+let b = [ { x = 10 }, { x = 20 } ];
+a == b;
+

Importantly, this does not compare by reference, but by value.

+

Subtyping

+

Equality respects subtyping, so +{ x = 10 } == { x = 10; y = 20 } returns +true.

+

To accommodate subtyping, two values of different types are equal if +they are equal at their most specific, common supertype, meaning they +agree on their common structure. The compiler will warn in cases where +this might lead to subtle unwanted behavior.

+

For example: { x = 10 } == { y = 20 } will return +true because the two values get compared at the empty +record type. That’s unlikely the intention, so the compiler will emit a +warning here.

+
{ x = 10 } == { y = 20 };
+

Generic types

+

It is not possible to declare that a generic type variable is +shared, so equality can only be used on non-generic types. +For example, the following expression generates a warning:

+
func eq<A>(a : A, b : A) : Bool = a == b;
+

Comparing these two at the Any type means this +comparison will return true no matter its arguments, so +this doesn’t work as one might hope.

+

If you run into this limitation in your code, you should accept a +comparison function of type (A, A) -> Bool as an +argument and use that to compare the values instead.

+

Let’s look at a list membership test for example. This first +implementation does not work:

+
import List "mo:base/List";
+
+func contains<A>(element : A, list : List.List<A>) : Bool {
+  switch list {
+    case (?(head, tail))
+      element == head or contains(element, tail);
+    case null false;
+  }
+};
+
+assert(not contains(1, ?(0, null)));
+

This assertion will trap because the compiler compares the type +A at Any which is always true. As +long as the list has at least one element, this version of +contains will always return true.

+

This second implementation shows how to accept the comparison +function explicitly instead:

+
import List "mo:base/List";
+import Nat "mo:base/Nat";
+
+func contains<A>(eqA : (A, A) -> Bool, element : A, list : List.List<A>) : Bool {
+  switch list {
+    case (?(head, tail))
+      eqA(element, head) or contains(eqA, element, tail);
+    case null false;
+  }
+};
+
+assert(not contains(Nat.equal, 1, ?(0, null)));
+ + diff --git a/docs/html/style.html b/docs/html/style.html new file mode 100644 index 00000000000..b05b98b3418 --- /dev/null +++ b/docs/html/style.html @@ -0,0 +1,994 @@ + + + + + + + md/reference/style.md + + + + +
+

md/reference/style.md

+
+ +

Motoko style guidelines

+

Overview

+

To increase readability and uniformity of Motoko source code, the +style guide provides suggestions for formatting Motoko sources and other +basic conventions.

+

Layout

+

Spacing

+
    +
  • Put spaces around arithmetic operators, except to visually group +sub-expressions of more tightly binding operators.

    +
    let z = - 2*x + 3*y + 4*(x*x + y*y);
  • +
  • Put spaces around comparison operators, Boolean operators, and +assignment operators.

    +
    4 + 5 <= 5 + 4;
    +not (a or b and not c);
    +v := 0;
    +v += 1;
  • +
  • Put spaces around '='.

    +
    var v = 0;
    +let r = { a = 1; b = 2 };
  • +
  • Analogously, put spaces around :.

    +
    var v : Nat = 0;
    +func foo(x : Nat, y : Nat) : Nat { x + y }
    +func bar((x, y) : (Nat, Nat)) : Nat { x + y }
    +let w = 1 ^ 0xff : Nat16;
    +

    Rationale: ':' is to declarations what '=' is to definitions. +Moreover, the left-hand of a type annotation may generally be an +arbitrary complex expression or pattern.

  • +
  • Put a space after a comma or semicolon, but not before.

    +
    let tuple = (1, 2, 3);
    +let record = { a = 1; b = 2; c = 3 };
  • +
  • Put spaces inside braces, unless they are a simple variant or +record.

    +
    func f() { 0 };
    +f({ a = 1; b = 2; c = 3 });
    +f({a = 1; b = 2});  // okay as well
    +
    +type Vec3D = { x : Float; y : Float; y : Float };
    +type Order = { #less; #equal; #more };
    +
    +type Order = {#less; #equal; #more};  // okay as well
    +type Proc = {h : Nat; w : Nat} -> {#ok; #fail};
  • +
  • Put spaces inside brackets if they stretch multiple lines.

    +
    foo(
    +  firstArgument,
    +  ( longTupleComponent, anotherLongExpression,
    +    moreLongExpression
    +  ),
    +  [ 1, 2, 3,
    +    4, 5, 6,
    +  ],
    +  { field1 = 4; field2 = 5;
    +    field3 = 6;
    +  }
    +);
  • +
  • Put a space between statement keywords and their operands.

    +
    if (f()) A else B;
    +for (x in xs.vals()) { ... };
    +switch (compare(x, y)) {
    +  case (#less) { A };
    +  case (_) { B };
    +}
    +
    +assert (x < 100);
    +await (async (0));
  • +
  • Do not put a space between a function or variant tag and its +argument tuple or around a generic type parameter list.

    +
    type Pair<X> = (X, X);
    +type Id = <X>(X) -> X;
    +
    +let ok = #ok(5);
    +
    +func id<X>(x : X) : X { x };
    +id<Nat>(5);
  • +
  • Put a space between a function and its argument if it is not a +tuple or parenthesized expression (see parentheses) or a record used as a named +parameter list (see picking types).

    +
    sin 0.0;
    +g [1, 2, 3];
    +f{arg1 = 0; arg2 = 0};
  • +
+

Rationale: g[1] in particular will be misparsed as an +indexing operation.

+
    +
  • Do not put a space around access operators like ., +?, !, or index brackets.

    +
    foo(bar).baz[5]().boo;
    +foom(?(bam()! + 1));
  • +
+

Line breaks

+
    +
  • Pick a fixed right margin for lines and break definitions or +expressions. 80 still is considered a good limit by many.

    +
    let sum = a + b + 2*c + d +
    +  e + f + g + h + i + k +
    +  l + m + n + o + p;
    +
    +// Or:
    +let sum =
    +  a + b + 2*c + d + e +
    +  f + g + h + i + k + l +
    +  m + n + o + p;
    +

    Rationale: Among other reasons, this style of formatting:

    +
      +
    1. Avoids code being hidden to the right in a window.

    2. +
    3. Avoids random line breaks in side-by-side diffs. For example, as +shown by GitHub or similar code review tools.

    4. +
    5. Allows prettier display on paper, web sites, or other +media.

    6. +
  • +
  • Break lines after an operator.

    +
    a + b + c +
    +  d + f;
    +
    +foo(bar, baz).
    +  boo();
  • +
  • When breaking function definitions or calls with long argument +lists, put each argument on a separate line.

    +

    Also, consider using records for long parameter lists, see picking types.

    +
    func someFunction(
    +  arg1 : FirstType,
    +  arg2 : SecondType,
    +  anotherArg : Nat,
    +  yetAnother : [Type],
    +  func : Nat -> Nat,
    +) : Nat {
    +  ...
    +};
    +
    +someFunction(
    +  veryLongArgumentExpression,
    +  anotherVeryLongArgumentExpression,
    +  3,
    +  aNestedFunctionCall(
    +    alsoWithLongArguments,
    +    andMoreSuchArguments,
    +  ),
    +  moreLongishArgument,
    +);
    +

    Rationale: This prevents overlooking an argument when reading code +and avoids re-breaking lines when changing one of the +expressions.

  • +
+

Indentation

+
    +
  • Each level of indentation should be 2 spaces.

    +
    actor A {
    +  public func f() {
    +    return;
    +  }
    +}
    +

    Rationale: There may be a lot of nesting. Using only 2 spaces avoids +wasting screen estate.

  • +
  • Indentation should not depend on the lexical contents of previous +lines.

    +

    In particular, do not vertically align indentation with inner +characters from previous lines.

    +
    let x = someFunction(
    +  arg1, arg2, arg3, arg4, arg5);               // Do this.
    +
    +let x = someFunction(arg1, arg2, arg3,
    +  arg4, arg5);                                 // Or this.
    +
    +let x =
    +  someFunction(arg1, arg2, arg3, arg4, arg5);  // Or this.
    +
    +let x = someFunction(                          // Or this.
    +  longArg1,
    +  longArg2,
    +  longArg3,
    +  longArg4,
    +  longArg5,
    +);
    +
    +// COUNTER EXAMPLE!
    +let x = someFunction(arg1, arg2, arg3,
    +                     arg4, arg5);              // DO NOT DO THIS!
    +

    Rationale: There are many problems with vertical alignment, for +example:

    +
      +
    1. It wastes a lot of horizontal space.

    2. +
    3. It creates wildly inconsistent indentation levels that obfuscate +the structure of the code.

    4. +
    5. It can produce realignment churn when changing a line, which, +even when automated by editors, inflates and obfuscates diffs.

    6. +
    7. It completely breaks with variable-width fonts.

    8. +
    +

    Rule of thumb: there should be no indentation that is not a multiple +of 2.

  • +
  • Do not use tabs.

    +

    Rationale: The interpretation of tabs varies wildly across tools and +they get lost or are displayed incorrectly in many contexts, such as web +pages, diffs, etc.

  • +
+

Grouping

+
    +
  • Separate complex multi-line definitions with empty lines. +One-liners can be put on consecutive lines.

    +
    func foo() {
    +  // This function does a lot of interesting stuff.
    +  // It's definition takes multiple lines.
    +}
    +
    +func boo() {
    +  // This is another complicated function.
    +  // It's definition also takes multiple lines.
    +}
    +
    +func add(x : Nat, y : Nat) { return x + y };
    +func mul(x : Nat, y : Nat) { return x * y };
  • +
  • Separate logic groups of definitions with two empty lines. Add a +one-line comment as a "section header" for each group.

    +
    // A very large class
    +class MuffleMiff(n : Nat) {
    +
    +  // Accessors
    +
    +  public func miffMuff() : Text {
    +    ...
    +  }
    +
    +  public func sniffMiff() : Nat {
    +    ...
    +  }
    +
    +  // Mutators
    +
    +  public func clearMurk() {
    +    ...
    +  }
    +
    +  public func addMuff(name : Text) {
    +    ...
    +  }
    +
    +  // Processing
    +
    +  public func murkMuffle(param : List<Gnobble>) {
    +    ...
    +  }
    +
    +  public func transformSneezler() {
    +    ...
    +  }
    +
    +  // Internal State
    +
    +  var miffCount = 0;
    +  var mabbleMap = Map<Nat, Text>();
    +
    +}
  • +
+

Comments

+
    +
  • Use line comments (//…​). Use block comments +(/* …​ */) only when commenting in the middle of a line or +for commenting out pieces of code during development.

    +
    // The following function runs the current
    +// pallaboom on a given snibble. It returns
    +// suitable plexus if it can.
    +func paBoom(s : Snibble) : Handle<Plexus> {
    +  let puglet = initPugs(s.crick, 0 /* size */, #local);
    +/* Don't do the odd stuff yet...
    +  ...
    +  ...
    +*/
    +  return polyfillNexus(puglet);  // for now
    +}
    +

    Rationale: Line comments make it easier to insert, remove or swap +individual lines.

  • +
  • Put short comments explaining a single line at the end of the +line, separated by at least 2 spaces.

    +
    paBoom(getSnibble()));  // create new snibble
  • +
  • Put multi-line comments before a line of code, with the same +indentation as the code it is describing.

    +
    func f() {
    +  // Try to invoke the current pallaboom with
    +  // the previous snibble. If that succeeds,
    +  // we have the new plexus; if not, complain.
    +  let plexusHandle = paBoom(getSnibble()));
    +}
  • +
  • Capitalize comments that are on separate lines. Use a proper full +stop for sentences.

  • +
+

Punctuation

+

Semicolons

+
    +
  • Motoko uniformly requires a semicolon to separate expressions or +local declarations in a block, regardless of whether the preceding +declaration ends in a closing '}'.

    +

    Rationale: This is unlike other C-style languages, which tend to have +rather ad-hoc rules.

  • +
  • Put a semicolon after the last expression in a block, unless the +whole block is written on a single line.

    +

    Similarly for types.

    +
    // No ; needed before closing } on same line
    +
    +type Vec3D = {x : Float; y : Float; z : Float};
    +type Result<A> = {#ok : A; #error : Text};
    +
    +func add(x : Nat, y : Nat) : Nat { return x + y };
    +
    +// End last case with ;
    +
    +type Address = {
    +  first : Text;
    +  last : Text;
    +  street : Text;
    +  nr : Nat;
    +  zip : Nat;
    +  city : Text;
    +};
    +
    +type Expr = {
    +  #const : Float;
    +  #add : (Expr, Expr);
    +  #mul : (Expr, Expr);
    +};
    +
    +func eval(e : Expr) : Float {
    +  switch (e) {
    +    case (#const(x)) { x };
    +    case (#add(e1, e2)) { eval(e1) + eval(e2) };
    +    case (#mul(e1, e2)) { eval(e1) * eval(e2) };
    +  };
    +}
    +

    Rationale: Consistently ending lines with semicolon simplifies +adding, removing, or swapping lines.

  • +
+

Braces

+
    +
  • Put braces around function bodies, if or +case branches, and loop bodies, unless they appear nested +as an expression and only contain a single expression.

    +
    func f(x) { f1(x); f2(x) };
    +
    +let abs = if (v >= 0) v else -v;
    +let val = switch (f()) { case (#ok(x)) x; case (_) 0 };
    +func succ(x : Nat) : Nat = x + 1;
  • +
  • Use "C-style" layout for braced sub-expressions stretching +multiple lines.

    +
    func f() {
    +  return;
    +};
    +
    +if (cond) {
    +  foo();
    +} else {
    +  bar();
    +};
    +
    +switch (opt) {
    +  case (?x) {
    +    f(x);
    +  };
    +  case (null) {};
    +};
  • +
+

Parentheses

+
    +
  • Motoko supports "parenless" style, meaning that parentheses are +optional in most places, such as function parameter lists, or statement +operands, when they enclose an expression that either is bracketed +already. For example, a tuple, object, or array, or a simple constant or +identifier.

    +
    type Op = Nat -> Nat;
    +let a2 = Array.map<Nat, Nat>(func x { x + 1 }, a);
    +
    +let y = f x;
    +let z = f {};
    +let choice = if flag { f1() } else { f2() };
    +
    +switch opt {
    +  case null { tryAgain() };
    +  case _ { proceed() };
    +};
  • +
  • Avoid overuse of parenless style.

    +

    In particular, do not omit parentheses and braces on statements at +the same time.

    +
    // COUNTER EXAMPLES!
    +let choice = if flag x + y else z;  // DO NOT DO THIS!
    +
    +switch val {
    +  case 0 f();    // DO NOT DO THIS!
    +  case n n + 1;  // OR THIS!
    +};
    +

    Rationale: Omitting both at the same time makes the code harder to +read, since there is less visual clue how it groups.

  • +
  • Similarly, do not omit parentheses around function parameters if +the function also has type parameters.

    +
    // COUNTER EXAMPLE!
    +foo<Nat> 0;   // DO NOT DO THIS!
  • +
  • Omit parentheses around argument types of a function type with a +single argument and no type parameters.

    +

    But do not omit them around when functions or classes also have type +parameters.

    +
    type Inv = Nat -> Nat;
    +type Id = <T>(T) -> T;
    +type Get = <X>(C<X>) -> X;
    +
    +// COUNTER EXAMPLE!
    +type Get = <X>C<X> -> X;   // DO NOT DO THIS!
  • +
+

Miscellaneous

+
    +
  • Use _ to group digits in numbers.

    +

    Group by 3 digits in decimal numbers and by 4 in hexadecimal +notation.

    +
    let billion = 1_000_000_000;
    +let pi = 3.141_592_653_589_793_12;
    +let mask : Nat32 = 0xff00_ff0f;
  • +
+

Naming

+

Style

+
    +
  • Use UpperCamelCase for type names (including classes +or type parameters), module names, and actor names.

  • +
  • Use lowerCamelCase for all other names, including +constants and variant fields.

    +
    module MoreMuff {
    +  type FileSize = Nat;
    +  type Weekday = {#monday; #tuesday; #wednesday};
    +  type Pair<X> = (X, X);
    +
    +  class Container<X, Y>() { ... };
    +
    +  func getValue<Name>(name : Name) : Pair<Name> { ... };
    +
    +  let zero = 0;
    +  let pair = getValue<Text>("opus");
    +  var nifty : Nat = 0;
    +
    +  object obj { ... };
    +
    +  actor ServerProxy { ... };
    +};
    +

    Rationale: The general convention is upper case for "static" entities +like types and lower case for "dynamic" values. Modules and actors are +fairly static and can export types. Objects usually don’t export types +and tend to be used mostly as dynamic values.

  • +
  • Spell acronyms as regular words.

    +
    type HttpHeader = ...;
    +func getUrl() { ... };
    +let urlDigest = ...;
  • +
  • Do not use identifier names that start with an underscore +_, except to document that a variable in a pattern is +intentionally unused.

    +
    let (width, _color, name) = rumpler();
    +...  // _color is not used here
    +
    +func foo(x : Nat, _futureFlag : Bool) { ... };
    +

    Rationale: A type checker can warn about unused identifiers, which +can be suppressed by explicitly prepending _ to its name to +document intention.

    +

    This aligns with the use of the keyword _ for pattern +wildcards.

  • +
+

Conventions

+
    +
  • The name of functions returning a value should describe that +value.

    +

    Avoid redundant get prefixes.

    +
    dict.size();
    +list.first();
    +sum(array);
  • +
  • The name of functions performing side effects or complex +operations should describe that operation.

    +
    dict.clear();
    +dict.set(key, value);
    +let result = traverse(graph);
  • +
  • The name of predicate functions returning Bool should use an +is or has prefix or a similar description of +the tested property.

    +
    class Set<X>() {
    +  public func size() : Nat { ... };
    +
    +  public func add(x : X) { ... };
    +  public func remove(x : X) { ... };
    +
    +  public func isEmpty() : Bool { ... };
    +  public func contains(x : X) : Bool { ... };
    +};
  • +
  • Functions converting to or from a type X are named +toX and fromX, respectively, if the source, +resp. target, is either the object the function is a method of, or the +primary type of the module this function appears in.

  • +
  • In classes or objects, use a name ending with _ to +distinguish private variables from getters.

    +
    class Cart(length_ : Nat) {
    +  var width_ = 0;
    +
    +  public func length() : Nat { return length_ };
    +  public func width() : Nat { return width_ };
    +}
    +

    Rationale: In Motoko, functions are first-class values, so functions +and other value identifiers share the same name space.

    +

    Identifiers with a leading _ should not be used +for private state, since that indicates an unused name (see style).

  • +
  • Use longer, more descriptive names for global or public +identifier or ones with large scope, and short names for local ones with +small scope.

    +

    It is fine to use single character identifiers when there is nothing +interesting to say, especially when using the same naming scheme +consistently.

    +
    func map(x : Nat, y : Nat) : Nat { x + y };
    +
    +func eval(e : Expr) : Nat {
    +  let n =
    +    switch (e) {
    +      case (#neg(e1)) { - eval(e1) };
    +      case (#add(e1, e2)) { eval(e1) + eval(e2) };
    +      case (#mul(e1, e2)) { eval(e1) * eval(e2) };
    +    };
    +  Debug.print(n);
    +  return n;
    +};
    +

    Rationale: Contrary to popular belief, overly chatty local names can +decrease readability instead of increasing it, by increasing the noise +level.

  • +
  • In suitable cases, use plural form for describing a collection of +items, such as a list or array.

    +

    This also works for short names.

    +
    func foreach<X>(xs : [X], f : X -> ()) {
    +  for (x in xs.vals()) { f(x) }
    +}
  • +
+

Types

+

Type annotations

+
    +
  • Put type annotations on definitions that involve fixed-width +numeric types, to disambiguate the type of overloaded arithmetic +operators and constants.

    +
    let mask : Nat32 = 0xfc03_ff00;
    +let pivot : Nat32 = (size + 1)/2;
    +let vec : [Int16] = [1, 3, -4, 0];
    +

    :::note

    +

    Use floating point constants to enforce type Float +without an extra annotation. Similarly, use an explicit + +sign to produce a positive value of type Int instead of Nat, if desired.

    +

    :::

    +
    let zero = 1.0;    // type Float
    +let offset = +1;   // type Int
  • +
  • Similarly, put inline type annotations on arithmetic expressions +with types other than Nat or +Int.

    +
    if (x & mask == (1 : Nat32)) { ... };
    +

    :::note

    +

    The need to annotate constants in cases like this is a short-coming +of Motoko’s type system that we hope to address soon.

    +

    :::

    +

    An annotation is not needed on function arguments, since their type +is usually inferred from the function. The only exception is when that +argument has generic type and the type arguments have been omitted.

    +
    func foo(len : Nat32, vec : [Nat16]) { ... };
    +func bar<X>(x : X) { ... };
    +
    +foo(3, [0, 1, 2]);
    +bar<Nat16>(0);
    +bar(0 : Nat16);
  • +
  • Put type annotations on mutable variables, unless their type is +obvious.

    +
    var name = "Motoko";
    +var balance = 0;
    +
    +func f(i : Int) {
    +  var j = i;
    +};
    +
    +var balance : Int = 0;
    +var obj : Class = foo();
    +

    Rationale: Due to subtyping, inferring the type from the +initialization would not necessarily deduce the intended type. For +example, balance would have type Nat without the annotation, +ruling out assignments of integers.

  • +
  • Put type annotations on all public fields in a class.

    +
    class C(init_ : Nat) {
    +  public let init : Nat = init_;
    +  public var count : Nat = 0;
    +}
  • +
  • Omit return type annotations of functions when the type is +().

    +
    func twiceF() { f(); f() };  // no need to write ": ()"
  • +
  • Omit type annotations on functions when they are passed as +arguments.

    +
    Array.map<Nat, Nat>(func n {n + 1}, a);
  • +
  • Put type annotations on definitions that involve numeric types +other than Nat or Int, to resolve the overloading +between arithmetic operators and constants.

    +
    let mask : Nat32 = 0xfc03_ff00;
    +let offset : Nat32 = size + 1;
  • +
+

Picking types

+
    +
  • Use Nat for any +integral value that cannot be negative.

  • +
  • Use fixed-width NatN or IntN only when +storing many values and space usage matters, when bit-fiddling requires +the low-level interpretation of a number as a vector of bits or when +matching types imposed by external requirements, such as other +canisters.

  • +
  • Avoid proliferation of option types, and therefore +null.

    +

    Limit their use to as small a scope as possible. Rule out the +null case and use non-option types wherever +possible.

  • +
  • Consider using records instead of tuples when there are more than +2 or 3 components. Records are just simple objects with named +fields.

    +

    Note that record types need not be declared but can be used in +place.

    +
      func nodeInfo(node : Node) : {parent : Node; left : Node; right : Node} { ... }
  • +
  • Consider using variants instead of Bool to represent binary +choices.

    +

    Note that variant types need not be declared but can be used in +place.

    +
    func capitalization(word : Text) : {#upper; #lower} { ... }
  • +
  • Where possible, use return type () for functions +whose primary purpose is to mutate state or cause other side +effects.

    +
    class Set<X>() {
    +  public func add(x : X) { ... };
    +  public func remove(x : X) { ... };
    +  ...
    +};
  • +
  • Consider using a record (an object with just data) as argument +for long parameter lists.

    +
    func process({seed : Float; delta : Float; data : [Record]; config : Config}) : Thing {
    +  ...
    +};
    +
    +process{config = Config(); data = read(); delta = 0.01; seed = 1.0};
    +

    Rationale: This expresses named parameters. This way, arguments can +be freely reordered at the call site and callers are prevented from +accidentally passing them in the wrong order.

  • +
  • Higher-order functions, such as functions that take a callback +argument, should put the function parameter last.

    +

    Rationale: Makes call sites more readable, and in the absence of +currying, there is no point in putting the function first, like you +often would in functional languages.

  • +
  • Do not use sentinel values, such as -1, to represent +invalid values.

    +

    Use the option type instead.

    +
    func lookup(x : key) : ?Nat { ... }
  • +
  • Data is immutable in Motoko unless explicitly stated +otherwise.

    +

    Use mutability types and definitions (var) with care and +only where needed.

    +

    Rationale: Mutable data cannot be communicated or share across +actors. It is more error-prone and much more difficult to formally +reason about, especially when concurrency is involved.

  • +
+

Features

+

Statements

+
    +
  • Use for loops instead of while loops +for iterating over a numeric range or a container.

    +
    for (i in Iter.range(1, 10)) { ... };
    +for (x in array.vals()) { ... };
    +

    Rationale: For loops are less error-prone and easier to +read.

  • +
  • Use if or switch as expressions where +appropriate.

    +
    func abs(i : Int) : Int { if (i < 0) -i else i };
    +
    +let delta = switch mode { case (#up) +1; case (#dn) -1 };
  • +
  • Motoko requires that all expressions in a block have type +(), in order to prevent accidentally dropped results.

    +

    Use ignore to explicitly drop results. Do not +use ignore when it’s not needed.

    +
    ignore async f();  // fire of a computation
  • +
  • Motoko allows to omit the return at the end of a +function, because a block evaluates to its last expression.

    +

    Use this when a function is short and in "functional" style, that is, +the function does not contain complex control flow or side effects.

    +

    Use explicit return at the end when the function +contains other return statements or imperative control +flow.

    +
    func add(i : Nat, j : Nat) : Nat { i + j };
    +
    +func foo(a : Float, b : Float) : Float {
    +  let c = a*a + b*b;
    +  c + 2*c*c;
    +};
    +
    +func gcd(i : Nat, j : Nat) : Nat {
    +  if (j == 0) i else gcd(j, i % j);
    +};
    +
    +func gcd2(i : Nat, j : Nat) : Nat {
    +  var a = i;
    +  var b = j;
    +  while (b > 0) {
    +    let c = a;
    +    a := b;
    +    b := c % b;
    +  };
    +  return a;
    +};
  • +
+

Objects and records

+
    +
  • Use the short-hand object syntax +{x1 = e1; …​ ; xN = eN} when using objects as simple +records, i.e., data structures with no private state and no +methods.

  • +
  • Use object when creating singleton objects.

  • +
  • Limit the use of objects to records where possible.

    +

    Rationale: Only records can be sent as message parameters or results +and can be stored in stable variables. Objects with methods are also +more expensive to create and represent in memory.

  • +
  • Use full objects only as a means for encapsulating state or +behavior.

  • +
+

Classes

+
    +
  • Use class to create multiple objects of the same +shape.

  • +
  • Name classes after their conceptual functionality, not their +implementation, except when having to distinguish multiple different +implementations of the same concept. For example, +OrderedMap vs HashMap).

  • +
  • Classes are both type definitions and factory functions for +objects.

    +

    Do not use classes unless both these roles are intended; use plain +type aliases or functions returning an object in other cases.

  • +
  • Do not overuse classes.

    +

    Use a module defining a plain type and functions on it where +appropriate. Use classes only as a means for encapsulating state or +behavior.

    +

    Rationale: Objects with methods have disadvantages over simple record +types with separate functions (see above).

  • +
  • If values of a class are meant to be sendable (shared), the class +needs to provide a pair of share/unshare +methods that convert to/from a sharable representation, for example, as +a record.

    +

    :::note

    +

    For immutable classes it may seem more natural to make +unshare a kind of static function. However, even for +immutable ones it may depend on constructor arguments (such as an +ordering function), so that the a pattern like +Map(compareInt).unshare(x) seems appropriate.

    +

    :::

  • +
  • For the time being, avoid overloading classes with too many +methods, since that is currently expensive.

    +

    Restrict to a sufficiently small set of canonical methods and make +less essential ones that can be implemented on top of those into +functions in the enclosing module.

  • +
  • Use modules for "static" classes or methods.

  • +
+

Modules

+
    +
  • Use module to group definitions, including types, +and create a name spae for them.

  • +
  • Where applicable, name modules after the main type or class they +implement or provide functions for.

  • +
  • Limit each module to a single main concept/type/class or closely +entangled family of concepts/types/classes.

  • +
+ + + diff --git a/docs/html/timers.html b/docs/html/timers.html new file mode 100644 index 00000000000..8a6999a234d --- /dev/null +++ b/docs/html/timers.html @@ -0,0 +1,223 @@ + + + + + + + md/writing-motoko/timers.md + + + + +
+

md/writing-motoko/timers.md

+
+ +

Timers

+

Overview

+

ICP canisters can set an arbitrary number of single-expiration or +recurring timers. See the Timer.mo module in the base +library.

+

Example

+

A simple example is a periodic reminder that logs a new year's +message:

+
+

The underlying mechanism is a canister +global timer that by default is issued with appropriate callbacks +from a priority queue maintained by the Motoko runtime.

+

The timer mechanism can be disabled completely by passing the +-no-timer flag to moc.

+

Low-level access

+

When lower-level access to the canister global timer is desired, an +actor can elect to receive timer expiry messages by declaring a +system function named timer. The function +takes one argument used to reset the global timer and returns a future +of unit type async ().

+

If the timer system method is declared, the Timer.mo base library module may +not function correctly and should not be used.

+

The following example of a global timer expiration callback gets +called immediately after the canister starts, i.e. after install, and +periodically every twenty seconds thereafter:

+
system func timer(setGlobalTimer : Nat64 -> ()) : async () {
+  let next = Nat64.fromIntWrap(Time.now()) + 20_000_000_000;
+  setGlobalTimer(next); // absolute time in nanoseconds
+  print("Tick!");
+}
+ + diff --git a/docs/html/upgrades.html b/docs/html/upgrades.html new file mode 100644 index 00000000000..33a7f5adfe2 --- /dev/null +++ b/docs/html/upgrades.html @@ -0,0 +1,422 @@ + + + + + + + md/canister-maintenance/upgrades.md + + + + +
+

md/canister-maintenance/upgrades.md

+
+ +

Stable variables and +upgrade methods

+

Overview

+

One key feature of ICP is its ability to persist canister state using +WebAssembly memory and globals rather than a traditional database. This +means that the entire state of a canister is restored before and saved +after each message, without explicit user instruction. This automatic +and user-transparent preservation of state between messages is called +orthogonal persistence.

+

Though convenient, orthogonal persistence poses a challenge when it +comes to upgrading the code of a canister. Without an explicit +representation of the canister’s state, how does one transfer any +application data from the retired canister to its replacement? For +example, if you want to deploy a new version of a user registration +canister to fix an issue or add functionality, you need to ensure that +existing registrations survive the upgrade process.

+

Accommodating upgrades without data loss requires some new facility +to migrate a canister’s crucial data to the upgraded +canister. ICP's persistence model allows a canister to save and restore +long-lived data to dedicated stable memory that, unlike +ordinary canister memory, is not cleared but retained across an upgrade. +This facility allows a canister to transfer data in bulk to its +replacement canister, provided that data is placed in stable memory, +either throughout its lifetime, or just before an upgrade.

+

Motoko provides high-level support for preserving state that +leverages stable memory. This feature, called stable +storage, is designed to accommodate changes to both the +application data and the Motoko compiler used to produce the application +code.

+

Utilizing stable storage depends on the developer anticipating and +indicating the data to retain after an upgrade. Depending on the +application, the data you decide to persist might be some, all, or none +of a given actor’s state.

+

Declaring stable variables

+

In an actor, you can configure a variable to use stable storage +through the stable keyword modifier in the variable’s +declaration.

+

More precisely, every let and var variable +declaration in an actor can specify whether the variable is +stable or flexible. If you don’t provide a +modifier, the variable is declared as flexible by +default.

+

The following is a simple example of how to declare a stable counter +that can be upgraded while preserving the counter’s value:

+
+

:::note

+

You can only use the stable or flexible +modifier on let and var declarations that are +actor fields. You cannot use these modifiers anywhere +else in your program.

+

:::

+

When you first compile and deploy a canister, all flexible and stable +variables in the actor are initialized in sequence. When you deploy a +canister using the upgrade mode, all stable variables that +existed in the previous version of the actor are pre-initialized with +their old values. After the stable variables are initialized with their +previous values, the remaining flexible and newly-added stable variables +are initialized in sequence.

+

Preupgrade and +postupgrade system methods

+

Declaring a variable to be stable requires its type to +be stable too. Since not all types are stable, some variables cannot be +declared stable.

+

As a simple example, consider the following Registry +actor:

+
+

This actor assigns sequential identifiers to Text values, using the size of +the underlying map object to determine the next identifier. +Like other actors, it relies on orthogonal persistence to maintain the +state of the hashmap between calls.

+

This example would like to make the Register upgradable +without the upgrade losing any existing registrations, but its state, +map, has a proper object type that contains member +functions, so the map variable cannot be declared +stable.

+

For scenarios like this that can’t be solved using stable variables +alone, Motoko supports user-defined upgrade hooks that run immediately +before and after an upgrade. These upgrade hooks allow you to migrate +state between unrestricted flexible variables to more restricted stable +variables. These hooks are declared as system functions +with special names, preugrade and postupgrade. +Both functions must have type : () → ().

+

The preupgrade method lets you make a final update to +stable variables before the runtime commits their values to stable +memory and performs an upgrade. The postupgrade method is +run after an upgrade has initialized the replacement actor, including +its stable variables, but before executing any shared function call or +message on that actor.

+

The following example introduces a new stable variable, +entries, to save and restore the entries of the unstable +hash table:

+
+

Note that the type of entries, being an array of Text and Nat pairs, is indeed a stable +type.

+

In this example, the preupgrade system method writes the +current map entries to entries before +entries is saved to stable memory. The +postupgrade system method resets entries to +the empty array after map has been populated from +entries.

+

Typing

+

Because the compiler must ensure that stable variables are both +compatible with and meaningful in the replacement program after an +upgrade, every stable variable must have a stable type. A +type is stable if the type obtained by ignoring any var +modifiers within it is shared.

+

The only difference between stable types and shared types is the +former’s support for mutation. Like shared types, stable types are +restricted to first-order data, excluding local functions and structures +built from local functions, such as objects. This exclusion of functions +is required because the meaning of a function value, consisting of both +data and code, cannot easily be preserved across an upgrade. The meaning +of plain data, mutable or not, can be.

+

:::note

+

In general, object types are not stable because they can contain +local functions. However, a plain record of stable data is a special +case of object types that are stable. Moreover, references to actors and +shared functions are also stable, allowing you to preserve their values +across upgrades. For example, you can preserve the state record of a set +of actors or shared function callbacks subscribing to a service.

+

:::

+

Stable type signatures

+

The collection of stable variable declarations in an actor can be +summarized in a stable signature.

+

The textual representation of an actor’s stable signature resembles +the internals of a Motoko actor type:

+
actor {
+  stable x : Nat;
+  stable var y : Int;
+  stable z : [var Nat];
+};
+

It specifies the names, types and mutability of the actor’s stable +fields, possibly preceded by relevant Motoko type declarations.

+

:::tip

+

You can emit the stable signature of the main actor or actor class to +a .most file using moc compiler option +--stable-types. You should never need to author your own +.most file.

+

:::

+

A stable signature <stab-sig1> is +stable-compatible with signature <stab-sig2>, if:

+
    +
  • Every immutable field stable <id> : T in +<stab-sig1> has a matching field +stable <id> : U in <stab-sig2> +with T <: U.

  • +
  • Every mutable field stable var <id> : T in +<stab-sig1> has a matching field +stable var <id> : U in <stab-sig2> +with T <: U.

  • +
+

Note that <stab-sig2> may contain additional +fields. Typically, <stab-sig1> is the signature of an +older version while <stab-sig2> is the signature of a +newer version.

+

The subtyping condition on stable fields ensures that the final value +of some field can be consumed as the initial value of that field in the +upgraded code.

+

:::tip

+

You can check the stable-compatibility of two .most +files containing stable signatures, using moc compiler +option --stable-compatible file1.most file2.most.

+

:::

+

:::note

+

The stable-compatible relation is quite conservative. In the future, +it may be relaxed to accommodate a change in field mutability and/or +abandoning fields from <stab-sig1> but with a +warning.

+

:::

+

Upgrade safety

+

Before upgrading a deployed canister, you should ensure that the +upgrade is safe and will not:

+
    +
  • Break existing clients due to a Candid interface change.

  • +
  • Discard Motoko stable state due to an incompatible change in +stable declarations.

  • +
+

A Motoko canister upgrade is safe provided:

+
    +
  • The canister’s Candid interface evolves to a Candid +subtype.

  • +
  • The canister’s Motoko stable signature evolves to a +stable-compatible one.

  • +
+

Upgrade safety does not guarantee that the upgrade process will +succeed, as it can still fail due to resource constraints. However, it +should at least ensure that a successful upgrade will not break Candid +type compatibility with existing clients or unexpectedly lose data that +was marked stable.

+

:::tip

+

You can check valid Candid subtyping between two services described +in .did files using the didc tool with +argument check file1.did file2.did.

+

:::

+

Metadata sections

+

The Motoko compiler embeds the Candid interface and stable signature +of a canister as canister metadata, recorded in additional Wasm custom +sections of a compiled binary.

+

This metadata can be selectively exposed by ICP and used by tools +such as dfx to verify upgrade compatibility.

+

Upgrading a deployed +actor or canister

+

After you have deployed a Motoko actor with the appropriate +stable variables or preupgrade and +postupgrade system methods, you can use the +dfx canister install command with the +--mode=upgrade option to upgrade an already deployed +version. For information about upgrading a deployed canister, see upgrade +a canister smart contract.

+

dfx canister install --mode=upgrade checks that the +interface is compatible, and if not, show this message and ask if you +want to continue:

+
let msg = format!("Candid interface compatibility check failed for canister '{}'.\nYou are making a BREAKING change. Other canisters or frontend clients relying on your canister may stop working.\n\n", canister_info.get_name()) + &err;
+ + diff --git a/docs/html/writing-intro.html b/docs/html/writing-intro.html new file mode 100644 index 00000000000..2f3a820f4a4 --- /dev/null +++ b/docs/html/writing-intro.html @@ -0,0 +1,300 @@ + + + + + + + md/writing-motoko/writing-intro.md + + + + +
+

md/writing-motoko/writing-intro.md

+
+ +

Overview

+

The Motoko programming language is a new, modern and type safe +language for developers who want to build the next generation of +distributed applications on ICP, as it is specifically designed to +support the unique features of ICP while providing a familiar, yet +robust, programming environment. As a new language, Motoko is constantly +evolving with support for new features and other improvements.

+

The Motoko compiler, documentation and other tooling is open source and released +under the Apache 2.0 license. Contributions are welcome.

+

Actors

+

A canister +smart contract is expressed as a Motoko actor. An actor is an autonomous object that +fully encapsulates its state and communicates with other actors only +through asynchronous messages.

+

For example, this code defines a stateful Counter +actor.

+
+

Its single public function, inc(), can be invoked by +this and other actors, to both update and read the current state of its +private field value.

+

Async messages

+

On ICP, canisters +can communicate with other canisters by sending asynchronous messages. Asynchronous messages +are function calls that return a future, and use an +await construct that allows you to suspend execution until +a future has completed. This simple feature avoids creating a loop of +explicit asynchronous callbacks in other languages.

+
+

Modern type system

+

Motoko has been designed to be intuitive to those familiar with +JavaScript and other popular languages, but offers modern features such +as sound structural types, generics, variant types, and statically +checked pattern matching.

+
+

Autogenerated IDL files

+

A Motoko actor always presents a typed interface to its clients as a +suite of named functions with argument and result types.

+

The Motoko compiler and the IC SDK can emit this interface in a +language neutral format called Candid. Other +canisters, browser resident code, and mobile apps that support Candid +can use the actor’s services. The Motoko compiler can consume and +produce Candid files, allowing Motoko to seamlessly interact with +canisters implemented in other programming languages (provided they +support Candid).

+

For example, the previous Motoko Counter actor has the +following Candid interface:

+
service Counter : {
+  inc : () -> (nat);
+}
+

Orthogonal persistence

+

ICP persists the memory and other state of your canister as it +executes. The state of a Motoko actor, including its in-memory data +structures, survive indefinitely. Actor state does not need to be +explicitly restored and saved to external storage.

+

For example, in the following Registry actor that +assigns sequential IDs to textual names, the state of the hash table is +preserved across calls, even though the state of the actor is replicated +across many ICP node machines and typically not resident in memory:

+
+

Upgrades

+

Motoko provides numerous features to help you leverage orthogonal +persistence, including the ability to retain a canister’s data as you upgrade the code of the +canister.

+

For example, Motoko lets you declare certain variables as +stable. These variables are automatically preserved across +canister upgrades.

+

Consider a stable counter:

+
+

It can be installed, incremented n times, and then upgraded +without interruption:

+
+

The value was declared stable, meaning the +current state, n, of the service is retained after the upgrade. +Counting will continue from n, not restart from +0.

+

The new interface is compatible with the previous one, allowing +existing clients referencing the canister to continue to work. New +clients will be able to exploit its upgraded functionality, in this +example the additional reset function.

+

For scenarios that can’t be solved using stable variables alone, +Motoko provides user-definable upgrade hooks that run immediately before +and after an upgrade, allowing you to migrate arbitrary state to stable +variables.

+

Next steps

+

To start writing Motoko code, start by reading the in-depth +documentation for some of the concepts described above:

+ +

The Motoko programming language continues to evolve with each release +of the IC +SDK and with ongoing updates to the Motoko compiler. Check back +regularly to try new features and see what’s changed.

+ + diff --git a/docs/nix-support/hydra-build-products b/docs/nix-support/hydra-build-products new file mode 100644 index 00000000000..7039f7709c2 --- /dev/null +++ b/docs/nix-support/hydra-build-products @@ -0,0 +1,2 @@ +report guide /nix/store/zv6pszva3kjp9qkp5zvh71knprd8nssm-docs html/motoko.html +report slides /nix/store/zv6pszva3kjp9qkp5zvh71knprd8nssm-docs overview-slides.html diff --git a/docs/overview-slides.html b/docs/overview-slides.html new file mode 100644 index 00000000000..40a30912d28 --- /dev/null +++ b/docs/overview-slides.html @@ -0,0 +1,746 @@ + + + + + + + Motoko + + + + + + + + + +
+
+ +
+

Motoko

+

A comprehensive overview

+
+ +
+
+

Overview

+ +
+

Motivation and Goals

+

A simple, useful language for the Internet Computer (IC)

+
    +
  • Familiar syntax
  • +
  • Safe by default
  • +
  • Incorporating actor canister model
  • +
  • Seamless integration of IC features
  • +
  • Making most of present and future WebAssembly
  • +
+

Key Design Points

+
    +
  • Object-oriented, functional & imperative
  • +
  • Objects as records of members
  • +
  • async/await for sequential programming of +asynchronous messaging
  • +
  • Structural typing with simple generics and subtyping
  • +
  • Safe arithmetic (unbounded and checked)
  • +
  • Non-nullable types by default
  • +
  • JavaScript-like syntax but statically typed & sane
  • +
+

Inspirations: Java(Script), C#, Swift, Pony, ML, Haskell

+

Semantics

+
    +
  • call-by-value (like Java, C, JS, ML; unlike Haskell, Nix)
  • +
  • declarations are locally mutually recursive
  • +
  • parametric, bounded polymorphism
  • +
  • subtyping as subsumption, not coercion.
  • +
  • no dynamic casts
  • +
  • no inheritance
  • +
+

Implementation(s)

+
    +
  • implemented in OCaml (leverages wasm libary)
  • +
  • simple reference interpreter
  • +
  • less simple compiler to WebAssembly +
      +
    • multipass with typed IR in each pass.
    • +
    • uniform representation, unboxed arithmetic
    • +
    • two-space gc (for now), gc between messages
    • +
  • +
  • polymorphism by erasure
  • +
+
+
+

The language

+ +
+
+

Expressions

+
    +
  • Identifiers:
    +x, foo_bar, test', +List, Map

  • +
  • Parentheses for grouping

  • +
  • Type annotations (to help type inference):
    +(42 : Int)

  • +
+
+
+

Blocks and declarations

+
  type Delta = Nat;
+  func print() {
+    Debug.print(Int.toText(counter));
+  };
+  let d : Delta = 42;
+  var counter = 1;
+  counter := counter + tmp;
+  print();
+
    +
  • Semicolon after each declaration!
  • +
  • Mutually recursive
  • +
  • Mutable variables marked explicitly
  • +
+
+
+

Control flow

+
    +
  • if (b) …
  • +
  • if (b) … else …
  • +
  • switch x { case (pat1) e1; …; case _ en }
  • +
  • while (b) …
  • +
  • loop …
  • +
  • loop … while (b)
  • +
  • for (pat in e) …
  • +
+
+
+
+

Primitive types

+ +
+
+

Unbounded integers

+

Int

+

Inferred by default for negative literals.

+

Literals: 13, 0xf4, -20, ++1, 1_000_000

+
+
+

Unbounded naturals

+

Nat

+

Non-negative, trap upon underflow.

+

Inferred by default for non-negative literals

+

Literals: 13, 0xf4, +1_000_000

+
+
+

Bounded numbers (trapping)

+

Nat8, Nat16, Nat32, +Nat64, Int8, Int16, +Int32, Int64

+

Trap on over- and underflow. Wrap-on-trap and bit-manipulating +operations available.

+

Needs type annotations (somewhere)

+

Literals: 13, 0xf4, -20, +1_000_000

+
+
+

Floating point numbers

+

Float

+

IEEE 754 double precision (64 bit) semantics, normalized NaN

+

Inferred for fractional literals

+

Literals: 0, -10, 2.71, -0.3e+15, +3.141_592_653_589_793_12

+
+
+

Numeric operations

+

No surprises here

+

- x
+a + b
+a & b
+…

+
+
+

Characters and text

+

Char, Text

+

Unicode! No random access.

+
    +
  • 'x', '\u{6a}', '☃',
  • +
  • "boo", "foo \u{62}ar ☃"
  • +
  • "Concat" # "enation"
  • +
+
+
+

Booleans

+

Bool

+

Literals: true, false

+

a or b
+a and b
+not b
+if (b) e1 else e2

+
+
+
+

Functions

+ +
+
+

Function types

+
    +
  • Simple functions:

    +
    Int.toText : Int -> Text
  • +
  • multiple arguments and return values

    +
    divRem : (Int, Int) -> (Int, Int)
  • +
  • can be generic/polymorphic

    +
    Option.unwrapOr : <T>(?T, default : T) -> T
  • +
  • first-class (can be passed around, stored)

    +
    map : <A, B>(f : A -> B, xs : [A]) -> [B]
    +let funcs : [<T>(T) -> T] = …
  • +
+
+
+

Function Declarations & Use

+
func add(x : Int, y : Int) : Int = x + y;
+
+func applyNTimes<T>(n : Nat, x : T, f : T -> ()) {
+  if (n == 0) return;
+  f(x);
+  applyNTimes(n-1, x, f);
+}
+
+applyNTimes<Text>(10, "Hello!", func(x) = { Debug.print(x) } );
+
    +
  • func() { … } short for +func() : () = { … }
  • +
  • Parametric functions
  • +
  • Type instantiations may sometimes be omitted
  • +
  • Anonymous functions (a.k.a. lambdas)
  • +
+
+
+
+

Composite types

+ +
+
+

Tuples

+

(Bool, Float, Text)

+

immutable, heterogeneous, fixed size

+
let tuple = (true, 1.2, "foo");
+tuple.1 > 0.0;
+let (_,_,t) = tuple;
+
+
+

Options

+

?Text

+

is either a value of that type, or null

+
func foo(x : ?Text) : Text {
+  switch x {
+    case (null) { "No value" };
+    case (?y) { "Value: " # y };
+  };
+};
+foo(null);
+foo(?"Test");
+
+
+

Arrays (immutable)

+

[Text]

+
let days = ["Monday", "Tuesday", … ];
+assert(days.len() == 7);
+assert(days[1] == "Tuesday");
+// days[7] will trap (fixed size)
+for (d in days.vals()) { Debug.print(d) };
+
+
+

Arrays (mutable)

+

[var Nat]

+
let counters = [var 1, 2, 3];
+assert(counters.len() == 3);
+counters[1] := counters[1] + 1;
+// counters[3] will trap (fixed size)
+
+
+

Records

+

{name : Text; points : var Int}

+
let player = { name = "Joachim";  var points = 0 };
+Debug.print(
+  player.name # " has " #
+  Int.toText(player.points) # " points."
+);
+player.points += 1;
+
+
+

Objects

+

{ get : () -> Int; add : Int -> () }

+
object self {
+  var points = 0; // private by default
+  public func get() = points;
+  public func add(p : Int) { points += p };
+}
+

Different syntax, same type as records

+
+
+

Variants

+

{ #invincible; #alive : Int; #dead }

+
type Health = { #invincible; #alive : Nat; #dead };
+func takeDamage(h : Health, p : Nat) : Health {
+  switch (h) {
+    case (#invincible) #invincible;
+    case (#alive hp) {
+      if (hp > p) (#alive (hp-p)) else #dead
+    };
+    case (#dead) #dead;
+  }
+}
+
+
+
+

Packages and modules

+ +
+
+

Modules

+
// the type of base/Int.mo
+module {
+  toText : Int -> Text;
+  abs : Int -> Nat;
+  …
+}
+

types and values like objects

+

but restricted to static content (pure, no state, …)

+
+
+

Module imports

+
import Debug "mo:base/Debug";
+import Int "mo:base/Int";
+

base package provides basic features.

+

More libraries popping up!

+
+
+
+

Platform features

+ +
+
+

Actor types

+

Like object types, but marked as actor:

+
type Receiver = actor { recv : Text -> async Nat };
+type Broadcast = actor {
+  register : Receiver -> ();
+  send : Text -> async Nat;
+}
+

sharable arguments and no or async result +type.

+

“canister” ≈ “actor”

+
+
+

sharable ≈ serializable

+
    +
  • all primitive types
  • +
  • records, tuples, arrays, variants, options
    +with immutable sharable components
  • +
  • actor types
  • +
  • shared function type

    Not +sharable:
  • +
  • mutable things
  • +
  • local functions
  • +
  • objects (with methods)
  • +
+
+
+

A complete actor

+
import Array "mo:base/Array";
+actor {
+  var r : [Receiver] = [];
+  public func register(a : Receiver) {
+    r := Array.append(r, [a]);
+  };
+  public func send(t : Text) : async Nat {
+    var sum := 0;
+    for (a in r.values()) {
+      sum += await a.recv(t);
+    };
+    return sum;
+  };
+}
+

a typical canister main file

+
+
+

Async/await

+

async T

+

asychronous future or promise

+

introduced by async { … }
+(implicit in async function declaration)

+

await e
+suspends computation pending e’s result

+
+
+

Actor import

+
import Broadcast "ic:ABCDEF23";
+actor Self {
+  public func go() {
+    Broadcast.register(Self);
+  };
+  public func recv(msg : Text) : async Nat {
+    …
+  }
+}
+
+
+

Principal and caller

+
actor Self {
+  let myself : Principal = Principal.fromActor(Self);
+  public shared(context) func hello() : async Text {
+    if (context.caller == myself) {
+      "Talking to yourself is the first sign of madness";
+    } else {
+      "Hello, nice to see you";
+    };
+  };
+}
+

Principal: identity of a user or canister/actor

+
+
+
+

Type system

+ +
+
+

Structural

+
type Health1 = { #invincible; #alive : Nat; #dead };
+type Health2 = { #invincible; #alive : Nat; #dead };
+
+let takeDamage : (Health1, Nat) -> Health1 = …;
+let h : Health2 = #invincible;
+let h' = takeDamage(h, 100); // works
+

Type definitions
+do not create types,
+but name existing types

+
+
+

Subtyping

+

Mortal <: Health

+
type Health = { #invincible; #alive : Nat; #dead };
+type Mortal = { #alive : Nat; #dead };
+
+let takeDamage : (Health, Nat) -> Health = …;
+let h : Mortal = #alive 1000;
+let h' = takeDamage(h, 100); // also works
+

t1 <: t2: t1 can be used wherever +t2 is expected

+
+
+

Generic types

+
type List<T> = ?{head : T; tail : List<T>};
+
+…
+let l : List<Nat> = ?{head = 0; tail = ?{head = 1 ; tail = null }};
+
+
+
+

Fin

+ +
+
+

Not covered

+
    +
  • Polymorphic functions with type bounds
  • +
  • Classes
  • +
  • Error handling (try … catch … & +throw …)
  • +
+
+
+
+

Old slides

+ +
+

Classes

+

Classes as functions returning objects:

+
 class Counter(init : Int) {
+    private var state : Int = init;
+    public func inc() { state += 1; };
+    public func get() : Int { state; };
+  }
+

Class instantiation as function call (no new):

+
let c = Counter(666);
+c.inc();
+let 667 = c.get();
+

Generic Classes

+
class Dict< K, V > (cmp : (K,K)-> Int ) {
+  add(k: K, v: V) { ... };
+  find(k: K) : ? V { ... };
+};
+
let d = Dict<Int,Text> (func (i:Int, j:Int) : Int = i - j);
+d.add(1,"Alice");
+let ? name = d.find(1);
+

Language prelude

+
    +
  • connects internal primitives with surface syntax (types, +operations)
  • +
  • conversions like intToNat32
  • +
  • side-effecting operations debugPrintInt (tie into +execution environment)
  • +
  • utilities like hashInt, clzNat32
  • +
+
+
+

Sample App

+ +
+

Implementing Chat

+
    +
  • type example
  • +
  • one server actor
  • +
  • multiple clients, each an instance of (actor) class Client.
  • +
+

Chat Server

+
actor Server {
+  private var clients : List<Client> = null;
+
+  private shared broadcast(message : Text) {
+    var next = clients;
+    loop {
+      switch next {
+        case null { return; }
+        case (?l) { l.head.send(message); next := l.tail; };
+      };
+    };
+  };
+
  public func subscribe(client : Client) : async Post {
+    let cs = {head = client; var tail = clients};
+    clients := ?cs;
+    return broadcast;
+  };
+};
+

Example: The client class

+
type Server = actor { subscribe : Client -> async Post; };
+
+actor class Client() = this {
+  private var name : Text = "";
+  public func start(n : Text , s : Server) {
+    name := n;
+    let _ = async {
+       let post = await s.subscribe(this);
+       post("hello from " # name);
+       post("goodbye from " # name);
+    }
+  };
+
  public func send(msg : Text) {
+    debugPrint(name # " received " # msg # "\n");
+  };
+};
+

Example: test

+

test

+
let bob = Client();
+let alice = Client();
+let charlie = Client();
+
+bob.start("Bob", Server);
+alice.start("Alice", Server);
+charlie.start("Charlie", Server);
+

output

+
[nix-shell:~/motoko/guide]$ ../src/moc -r chat.mo
+charlie received hello from bob
+alice received hello from bob
+bob received hello from bob
+charlie received goodbye from bob
+alice received goodbye from bob
+bob received goodbye from bob
+charlie received hello from alice
+alice received hello from alice
+bob received hello from alice
+charlie received goodbye from alice
+alice received goodbye from alice
+bob received goodbye from alice
+charlie received hello from charlie
+alice received hello from charlie
+bob received hello from charlie
+charlie received goodbye from charlie
+alice received goodbye from charlie
+bob received goodbye from charlie
+
+
+ + + + + + + + + + + diff --git a/flamegraphs/assetstorage-reverse.svg b/flamegraphs/assetstorage-reverse.svg new file mode 100644 index 00000000000..7f0fa969a15 --- /dev/null +++ b/flamegraphs/assetstorage-reverse.svg @@ -0,0 +1,3413 @@ + + + + + + + + + + + + + + +assetstorage.mo (reverse) + +Reset Zoom +Search + + + +@deserialize<tB> (13 samples, 0.03%) + + + +map (126 samples, 0.28%) + + + +toArray (115 samples, 0.26%) + + + +$lambda (51 samples, 0.11%) + + + +$lambda (188 samples, 0.42%) + + + +compare (186 samples, 0.41%) + + + +canister_init (2,748 samples, 6.10%) +canister.. + + +retrieve (85 samples, 0.19%) + + + +toArray (115 samples, 0.26%) + + + +canister_init (6 samples, 0.01%) + + + +$lambda (5 samples, 0.01%) + + + +iterate (197 samples, 0.44%) + + + +canister_init (6 samples, 0.01%) + + + +$lambda (188 samples, 0.42%) + + + +@anon-func-165.17 (27 samples, 0.06%) + + + +@deserialize<> (186 samples, 0.41%) + + + +compacting_gc (783 samples, 1.74%) + + + +$lambda (47 samples, 0.10%) + + + +toArray (174 samples, 0.39%) + + + +retrieve (12 samples, 0.03%) + + + +@anon-func-165.17 (66 samples, 0.15%) + + + +$lambda (124 samples, 0.28%) + + + +Array_tabulate (8 samples, 0.02%) + + + +@serialize<B> (65 samples, 0.14%) + + + +@deserialize<t> (20 samples, 0.04%) + + + +motoko_rts::text::text_get_range::h11e3b738bd44e775 (64 samples, 0.14%) + + + +text_compare (204 samples, 0.45%) + + + +store (7 samples, 0.02%) + + + +@anon-func-165.17 (12 samples, 0.03%) + + + +put (155 samples, 0.34%) + + + +@deserialize<tB> (62 samples, 0.14%) + + + +$lambda (155 samples, 0.34%) + + + +blob_of_principal (124 samples, 0.28%) + + + +@deserialize<tB> (97 samples, 0.22%) + + + +store (234 samples, 0.52%) + + + +$lambda (14 samples, 0.03%) + + + +@serialize<vt> (15 samples, 0.03%) + + + +retrieve (62 samples, 0.14%) + + + +$lambda (17 samples, 0.04%) + + + +$lambda (8 samples, 0.02%) + + + +list (27 samples, 0.06%) + + + +trans_state6 (36 samples, 0.08%) + + + +link_start (9 samples, 0.02%) + + + +@serialize_go<vt> (65 samples, 0.14%) + + + +@deserialize<t> (4 samples, 0.01%) + + + +@serialize_go<vt> (116 samples, 0.26%) + + + +memcmp (398 samples, 0.88%) + + + +link_start (23 samples, 0.05%) + + + +compacting_gc (24 samples, 0.05%) + + + +$lambda (6 samples, 0.01%) + + + +$lambda (15 samples, 0.03%) + + + +@deserialize_go<t> (26 samples, 0.06%) + + + +store (1,549 samples, 3.44%) +store + + +retrieve (19 samples, 0.04%) + + + +list (26 samples, 0.06%) + + + +Array_init (7 samples, 0.02%) + + + +@deserialize<t> (69 samples, 0.15%) + + + +$lambda (7 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (6 samples, 0.01%) + + + +@anon-func-165.17 (149 samples, 0.33%) + + + +$lambda (1,118 samples, 2.48%) +$l.. + + +B_gt (12 samples, 0.03%) + + + +$lambda (116 samples, 0.26%) + + + +@serialize<B> (51 samples, 0.11%) + + + +B_add (54 samples, 0.12%) + + + +compacting_gc (12 samples, 0.03%) + + + +store (413 samples, 0.92%) + + + +toArray (14 samples, 0.03%) + + + +next (16 samples, 0.04%) + + + +retrieve (60 samples, 0.13%) + + + +list (104 samples, 0.23%) + + + +list (197 samples, 0.44%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (783 samples, 1.74%) + + + +parse_idl_header (532 samples, 1.18%) + + + +@deserialize_go<B> (7 samples, 0.02%) + + + +obj_idx<6> (36 samples, 0.08%) + + + +list (124 samples, 0.28%) + + + +@deserialize<t> (52 samples, 0.12%) + + + +@serialize<vt> (51 samples, 0.11%) + + + +$lambda (18 samples, 0.04%) + + + +$lambda (124 samples, 0.28%) + + + +toArray (132 samples, 0.29%) + + + +parse_idl_header (16 samples, 0.04%) + + + +canister_init (988 samples, 2.19%) +c.. + + +canister_init (558 samples, 1.24%) + + + +$lambda (174 samples, 0.39%) + + + +$lambda (27 samples, 0.06%) + + + +@serialize<B> (15 samples, 0.03%) + + + +store (4 samples, 0.01%) + + + +@anon-func-165.17 (7 samples, 0.02%) + + + +list (15 samples, 0.03%) + + + +@deserialize<t> (19 samples, 0.04%) + + + +$lambda (51 samples, 0.11%) + + + +canister_init (801 samples, 1.78%) + + + +@serialize_go<vt> (5 samples, 0.01%) + + + +@deserialize<t> (112 samples, 0.25%) + + + +list (2,130 samples, 4.73%) +list + + +$lambda (4,141 samples, 9.20%) +$lambda + + +utf8_validate (52 samples, 0.12%) + + + +insertRoot (155 samples, 0.34%) + + + +retrieve (12 samples, 0.03%) + + + +motoko_rts::text::blob_of_text::h3830d2568303b855 (11 samples, 0.02%) + + + +iterate (66 samples, 0.15%) + + + +canister_init (6 samples, 0.01%) + + + +memset (246 samples, 0.55%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (12 samples, 0.03%) + + + +retrieve (124 samples, 0.28%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (419 samples, 0.93%) + + + +$lambda (66 samples, 0.15%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (6 samples, 0.01%) + + + +@deserialize<tB> (62 samples, 0.14%) + + + +store (7 samples, 0.02%) + + + +toArray (66 samples, 0.15%) + + + +@serialize<vt> (124 samples, 0.28%) + + + +store (52 samples, 0.12%) + + + +@deserialize_go<t> (52 samples, 0.12%) + + + +retrieve (81 samples, 0.18%) + + + +$lambda (248 samples, 0.55%) + + + +insertRec (135 samples, 0.30%) + + + +canister_init (4 samples, 0.01%) + + + +add (66 samples, 0.15%) + + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (9 samples, 0.02%) + + + +store (14 samples, 0.03%) + + + +@serialize_go<t> (65 samples, 0.14%) + + + +init (386 samples, 0.86%) + + + +canister_init (8 samples, 0.02%) + + + +@serialize_go<u> (7 samples, 0.02%) + + + +@deserialize<tB> (60 samples, 0.13%) + + + +toArray (12 samples, 0.03%) + + + +getRec (186 samples, 0.41%) + + + +retrieve (62 samples, 0.14%) + + + +$lambda (15 samples, 0.03%) + + + +@anon-func-116.7 (34 samples, 0.08%) + + + +list (188 samples, 0.42%) + + + +@serialize<B> (8 samples, 0.02%) + + + +store (62 samples, 0.14%) + + + +$lambda (52 samples, 0.12%) + + + +$lambda (94 samples, 0.21%) + + + +list (149 samples, 0.33%) + + + +compare (28 samples, 0.06%) + + + +$lambda (94 samples, 0.21%) + + + +store (758 samples, 1.68%) + + + +store (12 samples, 0.03%) + + + +init (337 samples, 0.75%) + + + +sleb128_decode (759 samples, 1.69%) + + + +list (27 samples, 0.06%) + + + +@deserialize<t> (60 samples, 0.13%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,553 samples, 3.45%) +mot.. + + +$lambda (133 samples, 0.30%) + + + +store (4 samples, 0.01%) + + + +link_start (11 samples, 0.02%) + + + +getRec (28 samples, 0.06%) + + + +obj_idx<11> (36 samples, 0.08%) + + + +@deserialize<tB> (104 samples, 0.23%) + + + +toArray (27 samples, 0.06%) + + + +compacting_gc (4 samples, 0.01%) + + + +list (28 samples, 0.06%) + + + +blob_of_principal (6 samples, 0.01%) + + + +iterate (149 samples, 0.33%) + + + +get (81 samples, 0.18%) + + + +@serialize_go<vt> (52 samples, 0.12%) + + + +list (6 samples, 0.01%) + + + +Array_init (149 samples, 0.33%) + + + +__wasm_apply_data_relocs (981 samples, 2.18%) +_.. + + +retrieve (12 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::h1f99226b92d7e984 (783 samples, 1.74%) + + + +$lambda (54 samples, 0.12%) + + + +link_start (22 samples, 0.05%) + + + +@serialize<vt> (31 samples, 0.07%) + + + +@deserialize<> (6 samples, 0.01%) + + + +list (51 samples, 0.11%) + + + +@serialize<B> (14 samples, 0.03%) + + + +@anon-func-165.17 (4 samples, 0.01%) + + + +@anon-func-31.67 (16 samples, 0.04%) + + + +get (17 samples, 0.04%) + + + +motoko_rts::types::block_size::haa6e1a3c5243bd1b (419 samples, 0.93%) + + + +init (18 samples, 0.04%) + + + +$lambda (16 samples, 0.04%) + + + +@deserialize_go<B> (4 samples, 0.01%) + + + +list (16 samples, 0.04%) + + + +$lambda (332 samples, 0.74%) + + + +$lambda (62 samples, 0.14%) + + + +@serialize<vt> (248 samples, 0.55%) + + + +list (124 samples, 0.28%) + + + +retrieve (5 samples, 0.01%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (8 samples, 0.02%) + + + +$lambda (124 samples, 0.28%) + + + +store (6 samples, 0.01%) + + + +canister_init (172 samples, 0.38%) + + + +toArray (8 samples, 0.02%) + + + +@deserialize<tB> (61 samples, 0.14%) + + + +store (879 samples, 1.95%) +s.. + + +@deserialize_go<t> (157 samples, 0.35%) + + + +canister_init (17 samples, 0.04%) + + + +list (104 samples, 0.23%) + + + +canister_init (12 samples, 0.03%) + + + +store (18 samples, 0.04%) + + + +@deserialize<t> (61 samples, 0.14%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (1,316 samples, 2.92%) +mo.. + + +$lambda (65 samples, 0.14%) + + + +iterate (1,118 samples, 2.48%) +it.. + + +canister_init (337 samples, 0.75%) + + + +store (4 samples, 0.01%) + + + +store (1,030 samples, 2.29%) +s.. + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (8 samples, 0.02%) + + + +__wasm_call_ctors (6 samples, 0.01%) + + + +@deserialize<> (436 samples, 0.97%) + + + +Array_init (4 samples, 0.01%) + + + +store (72 samples, 0.16%) + + + +@serialize_go<vt> (31 samples, 0.07%) + + + +@deserialize<tB> (7 samples, 0.02%) + + + +@deserialize<t> (4 samples, 0.01%) + + + +text_of_ptr_size (157 samples, 0.35%) + + + +retrieve (6 samples, 0.01%) + + + +@deserialize<tB> (52 samples, 0.12%) + + + +$lambda (18 samples, 0.04%) + + + +init (11 samples, 0.02%) + + + +@serialize<vt> (133 samples, 0.30%) + + + +list (16 samples, 0.04%) + + + +compacting_gc (222 samples, 0.49%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (124 samples, 0.28%) + + + +trans_state5 (12 samples, 0.03%) + + + +list (6 samples, 0.01%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (26 samples, 0.06%) + + + +add (12 samples, 0.03%) + + + +store (156 samples, 0.35%) + + + +list (5 samples, 0.01%) + + + +@serialize<B> (6 samples, 0.01%) + + + +list (116 samples, 0.26%) + + + +list (52 samples, 0.12%) + + + +compute_crc32 (17 samples, 0.04%) + + + +store (5 samples, 0.01%) + + + +@serialize<> (72 samples, 0.16%) + + + +$lambda (26 samples, 0.06%) + + + +store (4 samples, 0.01%) + + + +store (4 samples, 0.01%) + + + +alloc_array (9 samples, 0.02%) + + + +@serialize_go<t> (31 samples, 0.07%) + + + +@serialize_go<vt> (30 samples, 0.07%) + + + +text_of_ptr_size (26 samples, 0.06%) + + + +text_compare (64 samples, 0.14%) + + + +$lambda (4 samples, 0.01%) + + + +@deserialize<> (12 samples, 0.03%) + + + +toArray (14 samples, 0.03%) + + + +@deserialize_go<t> (38 samples, 0.08%) + + + +add (12 samples, 0.03%) + + + +$lambda (126 samples, 0.28%) + + + +link_start (23 samples, 0.05%) + + + +compacting_gc (1,553 samples, 3.45%) +com.. + + +store (155 samples, 0.34%) + + + +store (20 samples, 0.04%) + + + +store (52 samples, 0.12%) + + + +$lambda (64 samples, 0.14%) + + + +$lambda (8 samples, 0.02%) + + + +getRec (84 samples, 0.19%) + + + +canister_init (599 samples, 1.33%) + + + +$lambda (62 samples, 0.14%) + + + +canister_init (386 samples, 0.86%) + + + +canister_init (8 samples, 0.02%) + + + +retrieve (4 samples, 0.01%) + + + +@deserialize<t> (13 samples, 0.03%) + + + +store (12 samples, 0.03%) + + + +iterate (12 samples, 0.03%) + + + +$lambda (25 samples, 0.06%) + + + +$lambda (132 samples, 0.29%) + + + +list (12 samples, 0.03%) + + + +$lambda (15 samples, 0.03%) + + + +add (149 samples, 0.33%) + + + +$lambda (30 samples, 0.07%) + + + +list (1,068 samples, 2.37%) +l.. + + +retrieve (65 samples, 0.14%) + + + +$lambda (14 samples, 0.03%) + + + +list (126 samples, 0.28%) + + + +$lambda (6 samples, 0.01%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (124 samples, 0.28%) + + + +$lambda (5 samples, 0.01%) + + + +initialize_compacting_gc (4 samples, 0.01%) + + + +text_size (10 samples, 0.02%) + + + +retrieve (14 samples, 0.03%) + + + +@anon-func-165.17 (124 samples, 0.28%) + + + +__set_hp (144 samples, 0.32%) + + + +$lambda (5,562 samples, 12.35%) +$lambda + + +blob_of_principal (801 samples, 1.78%) + + + +retrieve (17 samples, 0.04%) + + + +list (54 samples, 0.12%) + + + +list (436 samples, 0.97%) + + + +@serialize<vt> (5 samples, 0.01%) + + + +iterate (124 samples, 0.28%) + + + +B_ge (12 samples, 0.03%) + + + +Array_tabulate (132 samples, 0.29%) + + + +$lambda (54 samples, 0.12%) + + + +list (12 samples, 0.03%) + + + +store (26 samples, 0.06%) + + + +store (124 samples, 0.28%) + + + +retrieve (1,108 samples, 2.46%) +re.. + + +getRec (64 samples, 0.14%) + + + +list (36 samples, 0.08%) + + + +list (8 samples, 0.02%) + + + +store (123 samples, 0.27%) + + + +init (8 samples, 0.02%) + + + +leb128_decode (780 samples, 1.73%) + + + +Array_tabulate (6 samples, 0.01%) + + + +retrieve (8 samples, 0.02%) + + + +insertRoot (135 samples, 0.30%) + + + +toArray (8 samples, 0.02%) + + + +retrieve (61 samples, 0.14%) + + + +$lambda (12 samples, 0.03%) + + + +$lambda (204 samples, 0.45%) + + + +init (8 samples, 0.02%) + + + +$lambda (16 samples, 0.04%) + + + +$lambda (72 samples, 0.16%) + + + +@deserialize_go<t> (104 samples, 0.23%) + + + +toArray (197 samples, 0.44%) + + + +@deserialize<t> (10 samples, 0.02%) + + + +$lambda (28 samples, 0.06%) + + + +@deserialize<tB> (36 samples, 0.08%) + + + +retrieve (313 samples, 0.70%) + + + +blob_of_principal (11 samples, 0.02%) + + + +@buffer_size<t> (51 samples, 0.11%) + + + +@serialize<vt> (188 samples, 0.42%) + + + +list (248 samples, 0.55%) + + + +Array_tabulate (34 samples, 0.08%) + + + +list (65 samples, 0.14%) + + + +text_compare (84 samples, 0.19%) + + + +Array_tabulate (14 samples, 0.03%) + + + +__wasm_apply_global_relocs (31 samples, 0.07%) + + + +list (40 samples, 0.09%) + + + +@serialize<> (14 samples, 0.03%) + + + +iterate (18 samples, 0.04%) + + + +store (53 samples, 0.12%) + + + +$lambda (28 samples, 0.06%) + + + +canister_init (18 samples, 0.04%) + + + +toArray (16 samples, 0.04%) + + + +@serialize<B> (94 samples, 0.21%) + + + +compacting_gc (1,316 samples, 2.92%) +co.. + + +$lambda (135 samples, 0.30%) + + + +toArray (34 samples, 0.08%) + + + +@deserialize<t> (313 samples, 0.70%) + + + +@serialize_go<t> (5 samples, 0.01%) + + + +blob_of_principal (386 samples, 0.86%) + + + +$lambda (14 samples, 0.03%) + + + +$lambda (94 samples, 0.21%) + + + +store (94 samples, 0.21%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (17 samples, 0.04%) + + + +$lambda (94 samples, 0.21%) + + + +list (10 samples, 0.02%) + + + +entries (332 samples, 0.74%) + + + +$lambda (124 samples, 0.28%) + + + +iterate (54 samples, 0.12%) + + + +retrieve (1,038 samples, 2.31%) +r.. + + +@deserialize<t> (62 samples, 0.14%) + + + +$lambda (186 samples, 0.41%) + + + +retrieve (47 samples, 0.10%) + + + +idl_sub_buf_words (40 samples, 0.09%) + + + +$lambda (27 samples, 0.06%) + + + +init (8 samples, 0.02%) + + + +list (14 samples, 0.03%) + + + +store (5 samples, 0.01%) + + + +list (6 samples, 0.01%) + + + +retrieve (26 samples, 0.06%) + + + +compacting_gc (248 samples, 0.55%) + + + +$lambda (8 samples, 0.02%) + + + +get (28 samples, 0.06%) + + + +toArray (222 samples, 0.49%) + + + +canister_init (10 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (4 samples, 0.01%) + + + +parse_idl_header (414 samples, 0.92%) + + + +motoko_rts::text::text_compare_range::h44562c24c3fce02f (64 samples, 0.14%) + + + +list (133 samples, 0.30%) + + + +@serialize<vt> (5 samples, 0.01%) + + + +rts_start (23 samples, 0.05%) + + + +init (48 samples, 0.11%) + + + +retrieve (15 samples, 0.03%) + + + +@deserialize<tB> (10 samples, 0.02%) + + + +link_start (31 samples, 0.07%) + + + +@deserialize<tB> (62 samples, 0.14%) + + + +blob_of_principal (124 samples, 0.28%) + + + +list (25 samples, 0.06%) + + + +canister_init (3,890 samples, 8.64%) +canister_init + + +canister_init (12 samples, 0.03%) + + + +@deserialize<tB> (19 samples, 0.04%) + + + +retrieve (18 samples, 0.04%) + + + +@deserialize<tB> (138 samples, 0.31%) + + + +store (104 samples, 0.23%) + + + +$lambda (149 samples, 0.33%) + + + +alloc_blob (112 samples, 0.25%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (24 samples, 0.05%) + + + +@deserialize<t> (62 samples, 0.14%) + + + +store (1,232 samples, 2.74%) +st.. + + +@serialize<> (124 samples, 0.28%) + + + +@deserialize<tB> (4 samples, 0.01%) + + + +toArray (132 samples, 0.29%) + + + +$lambda (124 samples, 0.28%) + + + +alloc_array (21 samples, 0.05%) + + + +@serialize<B> (47 samples, 0.10%) + + + +$lambda (4 samples, 0.01%) + + + +@serialize_go<t> (15 samples, 0.03%) + + + +list (31 samples, 0.07%) + + + +@serialize_go<t> (52 samples, 0.12%) + + + +trans_state3 (10 samples, 0.02%) + + + +region_init (34 samples, 0.08%) + + + +@anon-func-165.17 (18 samples, 0.04%) + + + +@deserialize_go<B> (123 samples, 0.27%) + + + +@serialize<vt> (65 samples, 0.14%) + + + +utf8_validate (296 samples, 0.66%) + + + +$lambda (7 samples, 0.02%) + + + +toArray (14 samples, 0.03%) + + + +store (62 samples, 0.14%) + + + +retrieve (28 samples, 0.06%) + + + +toArray (88 samples, 0.20%) + + + +list (174 samples, 0.39%) + + + +toArray (25 samples, 0.06%) + + + +retrieve (140 samples, 0.31%) + + + +__wasm_call_ctors (981 samples, 2.18%) +_.. + + +text_to_buf (31 samples, 0.07%) + + + +compacting_gc (8,910 samples, 19.79%) +compacting_gc + + +@buffer_size<u> (18 samples, 0.04%) + + + +iterate (54 samples, 0.12%) + + + +@deserialize<t> (12 samples, 0.03%) + + + +store (61 samples, 0.14%) + + + +list (10 samples, 0.02%) + + + +toArray (1,068 samples, 2.37%) +t.. + + +retrieve (20 samples, 0.04%) + + + +compare (204 samples, 0.45%) + + + +getRec (81 samples, 0.18%) + + + +motoko_rts::text::text_compare_range::h44562c24c3fce02f (186 samples, 0.41%) + + + +list (24 samples, 0.05%) + + + +list (8 samples, 0.02%) + + + +list (124 samples, 0.28%) + + + +store (36 samples, 0.08%) + + + +@deserialize<tB> (4 samples, 0.01%) + + + +$lambda (124 samples, 0.28%) + + + +iterate (7 samples, 0.02%) + + + +RBTree (337 samples, 0.75%) + + + +$lambda (1,068 samples, 2.37%) +$.. + + +init (17 samples, 0.04%) + + + +@serialize_go<B> (51 samples, 0.11%) + + + +list (12 samples, 0.03%) + + + +list (115 samples, 0.26%) + + + +@buffer_size<vt> (5 samples, 0.01%) + + + +compacting_gc (1,368 samples, 3.04%) +com.. + + +iterate (174 samples, 0.39%) + + + +all (45,022 samples, 100%) + + + +$lambda (51 samples, 0.11%) + + + +canister_init (8 samples, 0.02%) + + + +retrieve (204 samples, 0.45%) + + + +$lambda (88 samples, 0.20%) + + + +retrieve (4 samples, 0.01%) + + + +@serialize<> (94 samples, 0.21%) + + + +@buffer_size<vt> (51 samples, 0.11%) + + + +$lambda (62 samples, 0.14%) + + + +list (124 samples, 0.28%) + + + +link_start (31 samples, 0.07%) + + + +$lambda (84 samples, 0.19%) + + + +canister_init (48 samples, 0.11%) + + + +add (27 samples, 0.06%) + + + +list (20 samples, 0.04%) + + + +canister_init (34 samples, 0.08%) + + + +toArray (1,118 samples, 2.48%) +to.. + + +canister_init (674 samples, 1.50%) + + + +list (1,118 samples, 2.48%) +list + + +motoko_rts::text::text_compare_range::h44562c24c3fce02f (204 samples, 0.45%) + + + +store (380 samples, 0.84%) + + + +Array_tabulate (115 samples, 0.26%) + + + +next (54 samples, 0.12%) + + + +canister_init (194 samples, 0.43%) + + + +text_to_buf (65 samples, 0.14%) + + + +$lambda (134 samples, 0.30%) + + + +@deserialize_go<t> (124 samples, 0.28%) + + + +$lambda (36 samples, 0.08%) + + + +$lambda (65 samples, 0.14%) + + + +toArray (4 samples, 0.01%) + + + +alloc_blob (992 samples, 2.20%) +a.. + + +rts_start (4 samples, 0.01%) + + + +iterate (27 samples, 0.06%) + + + +@serialize<B> (124 samples, 0.28%) + + + +store (62 samples, 0.14%) + + + +store (345 samples, 0.77%) + + + +idl_sub_buf_init (80 samples, 0.18%) + + + +retrieve (62 samples, 0.14%) + + + +canister_init (124 samples, 0.28%) + + + +parse_idl_header (48 samples, 0.11%) + + + +toArray (12 samples, 0.03%) + + + +@reset_refund (20 samples, 0.04%) + + + +list (30 samples, 0.07%) + + + +list (14 samples, 0.03%) + + + +$lambda (8 samples, 0.02%) + + + +$lambda (72 samples, 0.16%) + + + +leb128_encode (60 samples, 0.13%) + + + +init (124 samples, 0.28%) + + + +store (60 samples, 0.13%) + + + +@serialize<vt> (116 samples, 0.26%) + + + +$lambda (36 samples, 0.08%) + + + +$lambda (14 samples, 0.03%) + + + +toArray (7 samples, 0.02%) + + + +$lambda (5 samples, 0.01%) + + + +@serialize<> (8 samples, 0.02%) + + + +canister_init (124 samples, 0.28%) + + + +@deserialize<tB> (6 samples, 0.01%) + + + +toArray (34 samples, 0.08%) + + + +motoko_rts::principal_id::enc_stash::hade07e1e4d51be16 (386 samples, 0.86%) + + + +rts_start (9 samples, 0.02%) + + + +store (6 samples, 0.01%) + + + +retrieve (64 samples, 0.14%) + + + +@deserialize_go<B> (62 samples, 0.14%) + + + +$lambda (65 samples, 0.14%) + + + +store (62 samples, 0.14%) + + + +init (124 samples, 0.28%) + + + +list (34 samples, 0.08%) + + + +iter (332 samples, 0.74%) + + + +canister_init (440 samples, 0.98%) + + + +$lambda (28 samples, 0.06%) + + + +get (64 samples, 0.14%) + + + +text_compare (186 samples, 0.41%) + + + +@deserialize<t> (6 samples, 0.01%) + + + +@deserialize_go<t> (296 samples, 0.66%) + + + +alloc_blob (48 samples, 0.11%) + + + +canister_init (11 samples, 0.02%) + + + +retrieve (6 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (120 samples, 0.27%) + + + +canister_init (6 samples, 0.01%) + + + +alloc_array (12 samples, 0.03%) + + + +list (66 samples, 0.15%) + + + +text_of_ptr_size (124 samples, 0.28%) + + + +@serialize<B> (62 samples, 0.14%) + + + +@serialize<vt> (12 samples, 0.03%) + + + +canister_init (6 samples, 0.01%) + + + +$lambda (15 samples, 0.03%) + + + +text_of_ptr_size (6 samples, 0.01%) + + + +toArray (6 samples, 0.01%) + + + +store (7 samples, 0.02%) + + + +@deserialize<tB> (234 samples, 0.52%) + + + +store (7 samples, 0.02%) + + + +motoko_rts::idl::check_typearg::h7a69986705540d34 (48 samples, 0.11%) + + + +list (54 samples, 0.12%) + + + +canister_init (324 samples, 0.72%) + + + +store (247 samples, 0.55%) + + + +compare (84 samples, 0.19%) + + + +compacting_gc (8 samples, 0.02%) + + + +$lambda (248 samples, 0.55%) + + + +store (6 samples, 0.01%) + + + +next (1,118 samples, 2.48%) +next + + +compacting_gc (6 samples, 0.01%) + + + +@deserialize<t> (140 samples, 0.31%) + + + +retrieve (112 samples, 0.25%) + + + +list (8 samples, 0.02%) + + + +$lambda (12 samples, 0.03%) + + + +@deserialize_go<t> (6 samples, 0.01%) + + + +idl_sub_buf_init (24 samples, 0.05%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (6 samples, 0.01%) + + + +add (7 samples, 0.02%) + + + +$lambda (6 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,316 samples, 2.92%) +mo.. + + +@deserialize<tB> (345 samples, 0.77%) + + + +list (332 samples, 0.74%) + + + +$lambda (197 samples, 0.44%) + + + +canister_init (8 samples, 0.02%) + + + +next (1,315 samples, 2.92%) +next + + +@anon-func-165.17 (14 samples, 0.03%) + + + +@deserialize<t> (69 samples, 0.15%) + + + +compare (64 samples, 0.14%) + + + +$lambda (52 samples, 0.12%) + + + +$lambda (53 samples, 0.12%) + + + +retrieve (69 samples, 0.15%) + + + +store (97 samples, 0.22%) + + + +$lambda (31 samples, 0.07%) + + + +Array_init (66 samples, 0.15%) + + + +retrieve (4 samples, 0.01%) + + + +blob_of_principal (8 samples, 0.02%) + + + +list (132 samples, 0.29%) + + + +store (10 samples, 0.02%) + + + +list (4 samples, 0.01%) + + + +toArray (27 samples, 0.06%) + + + +list (2,073 samples, 4.60%) +list + + +store (18 samples, 0.04%) + + + +retrieve (13 samples, 0.03%) + + + +$lambda (30 samples, 0.07%) + + + +store (52 samples, 0.12%) + + + +init (6 samples, 0.01%) + + + +$lambda (14 samples, 0.03%) + + + +init (124 samples, 0.28%) + + + +blob_of_principal (8 samples, 0.02%) + + + +iterate (27 samples, 0.06%) + + + +toArray (149 samples, 0.33%) + + + +$lambda (47 samples, 0.10%) + + + +add (124 samples, 0.28%) + + + +trans_state4 (30 samples, 0.07%) + + + +get (204 samples, 0.45%) + + + +@deserialize<tB> (413 samples, 0.92%) + + + +list (14 samples, 0.03%) + + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (198 samples, 0.44%) + + + +@deserialize<tB> (4 samples, 0.01%) + + + +init (6 samples, 0.01%) + + + +retrieve (7 samples, 0.02%) + + + +toArray (36 samples, 0.08%) + + + +parse_idl_header (248 samples, 0.55%) + + + +$lambda (7 samples, 0.02%) + + + +canister_init (111 samples, 0.25%) + + + +blob_of_principal (48 samples, 0.11%) + + + +B_eq (14 samples, 0.03%) + + + +@deserialize<> (104 samples, 0.23%) + + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (12 samples, 0.03%) + + + +retrieve (52 samples, 0.12%) + + + +link_start (4 samples, 0.01%) + + + +list (88 samples, 0.20%) + + + +$lambda (14 samples, 0.03%) + + + +list (24 samples, 0.05%) + + + +alloc_blob (64 samples, 0.14%) + + + +store (18 samples, 0.04%) + + + +@deserialize<> (8 samples, 0.02%) + + + +init (14 samples, 0.03%) + + + +iterate (16 samples, 0.04%) + + + +get_heap_base (9 samples, 0.02%) + + + +toArray (18 samples, 0.04%) + + + +iterate (12 samples, 0.03%) + + + +$lambda (18 samples, 0.04%) + + + +Buffer (1,068 samples, 2.37%) +B.. + + +canister_init (14 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (16 samples, 0.04%) + + + +@deserialize<tB> (52 samples, 0.12%) + + + +@deserialize<tB> (20 samples, 0.04%) + + + +list (208 samples, 0.46%) + + + +$lambda (18 samples, 0.04%) + + + +store (19 samples, 0.04%) + + + +core::str::converts::from_utf8::hcecad2a92968d2cb (296 samples, 0.66%) + + + +$lambda (36 samples, 0.08%) + + + +store (124 samples, 0.28%) + + + +@deserialize_go<t> (122 samples, 0.27%) + + + +@deserialize_go<B> (52 samples, 0.12%) + + + +text_of_ptr_size (8 samples, 0.02%) + + + +init (2,748 samples, 6.10%) +init + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (90 samples, 0.20%) + + + +trans_state7 (36 samples, 0.08%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (248 samples, 0.55%) + + + +store (8 samples, 0.02%) + + + +init (599 samples, 1.33%) + + + +@serialize_go<B> (15 samples, 0.03%) + + + +get (84 samples, 0.19%) + + + +list (134 samples, 0.30%) + + + +alloc_array (198 samples, 0.44%) + + + +$lambda (116 samples, 0.26%) + + + +toArray (54 samples, 0.12%) + + + +retrieve (62 samples, 0.14%) + + + +$lambda (115 samples, 0.26%) + + + +@deserialize<tB> (26 samples, 0.06%) + + + +@deserialize<> (208 samples, 0.46%) + + + +blob_of_principal (599 samples, 1.33%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,368 samples, 3.04%) +mot.. + + +list (12 samples, 0.03%) + + + +@deserialize_go<B> (60 samples, 0.13%) + + + +put (135 samples, 0.30%) + + + +retrieve (5 samples, 0.01%) + + + +store (18 samples, 0.04%) + + + +Blob.compare_eq (53 samples, 0.12%) + + + +store (8 samples, 0.02%) + + + +iterate (4 samples, 0.01%) + + + +$lambda (51 samples, 0.11%) + + + +retrieve (104 samples, 0.23%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (222 samples, 0.49%) + + + +store (459 samples, 1.02%) + + + +init (194 samples, 0.43%) + + + +@serialize<vt> (52 samples, 0.12%) + + + +$lambda (6 samples, 0.01%) + + + +$lambda (16 samples, 0.04%) + + + +$lambda (12 samples, 0.03%) + + + +blob_of_principal (6 samples, 0.01%) + + + +$lambda (12 samples, 0.03%) + + + +put (28 samples, 0.06%) + + + +add (4 samples, 0.01%) + + + +@deserialize_go<B> (138 samples, 0.31%) + + + +store (5,020 samples, 11.15%) +store + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (8,910 samples, 19.79%) +motoko_rts::gc::mark_compact::.. + + +@serialize<> (6 samples, 0.01%) + + + +getRec (204 samples, 0.45%) + + + +@deserialize<tB> (52 samples, 0.12%) + + + +iterate (14 samples, 0.03%) + + + +store (28 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (8 samples, 0.02%) + + + +@deserialize<t> (104 samples, 0.23%) + + + +@deserialize<t> (26 samples, 0.06%) + + + +$lambda (34 samples, 0.08%) + + + +store (6 samples, 0.01%) + + + +retrieve (52 samples, 0.12%) + + + +$lambda (31 samples, 0.07%) + + + +link_start (6 samples, 0.01%) + + + +@serialize<vt> (30 samples, 0.07%) + + + +canister_init (124 samples, 0.28%) + + + +retrieve (94 samples, 0.21%) + + + +parse_idl_header (12 samples, 0.03%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (386 samples, 0.86%) + + + +toArray (6 samples, 0.01%) + + + +$lambda (133 samples, 0.30%) + + + +link_start (9 samples, 0.02%) + + + +@deserialize<t> (52 samples, 0.12%) + + + +retrieve (186 samples, 0.41%) + + + +$lambda (7 samples, 0.02%) + + + +list (36 samples, 0.08%) + + + +@deserialize<tB> (123 samples, 0.27%) + + + +iterate (25 samples, 0.06%) + + + +init (801 samples, 1.78%) + + + +@serialize<vt> (16 samples, 0.04%) + + + +compacting_gc (16 samples, 0.04%) + + + +retrieve (84 samples, 0.19%) + + + +obj_idx<0> (180 samples, 0.40%) + + + +toArray (54 samples, 0.12%) + + + +store (135 samples, 0.30%) + + + +blob_of_principal (17 samples, 0.04%) + + + +@serialize_go<B> (65 samples, 0.14%) + + + +canister_init (124 samples, 0.28%) + + + +@buffer_size<t> (5 samples, 0.01%) + + + +list (7 samples, 0.02%) + + + +@serialize<vt> (28 samples, 0.06%) + + + +link_start (4 samples, 0.01%) + + + +store (13 samples, 0.03%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (599 samples, 1.33%) + + + +link_start (981 samples, 2.18%) +l.. + + +get (186 samples, 0.41%) + + + +$lambda (6 samples, 0.01%) + + + +entries (26 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (783 samples, 1.74%) + + + +add (14 samples, 0.03%) + + + +store (4 samples, 0.01%) + + + +@buffer_size<B> (47 samples, 0.10%) + + + +@deserialize<> (20 samples, 0.04%) + + + +@serialize_go<vt> (15 samples, 0.03%) + + + +parse_idl_header (416 samples, 0.92%) + + + +@anon-func-165.17 (12 samples, 0.03%) + + + +$lambda (5 samples, 0.01%) + + + +@serialize<> (7 samples, 0.02%) + + + +init (34 samples, 0.08%) + + + +@deserialize<> (124 samples, 0.28%) + + + +@deserialize<> (40 samples, 0.09%) + + + +@deserialize<tB> (156 samples, 0.35%) + + + +__get_hp (123 samples, 0.27%) + + + +retrieve (51 samples, 0.11%) + + + +retrieve (69 samples, 0.15%) + + + +obj_idx<1> (18 samples, 0.04%) + + + +compacting_gc (12 samples, 0.03%) + + + +@anon-func-165.17 (25 samples, 0.06%) + + + +list (186 samples, 0.41%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (1,860 samples, 4.13%) +moto.. + + +toArray (124 samples, 0.28%) + + + +list (5 samples, 0.01%) + + + +@serialize<> (18 samples, 0.04%) + + + +store (62 samples, 0.14%) + + + +store (138 samples, 0.31%) + + + +$lambda (81 samples, 0.18%) + + + +initialize_compacting_gc (23 samples, 0.05%) + + + +init (6 samples, 0.01%) + + + +retrieve (10 samples, 0.02%) + + + +blob_of_principal (194 samples, 0.43%) + + + +text_of_ptr_size (38 samples, 0.08%) + + + +$lambda (124 samples, 0.28%) + + + +$lambda (65 samples, 0.14%) + + + +store (111 samples, 0.25%) + + + +$lambda (28 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (1,553 samples, 3.45%) +mot.. + + +@deserialize<tB> (138 samples, 0.31%) + + + +@buffer_size<vt> (133 samples, 0.30%) + + + +compacting_gc (419 samples, 0.93%) + + + +@deserialize_go<t> (8 samples, 0.02%) + + + +get_static_roots (4 samples, 0.01%) + + + +list (18 samples, 0.04%) + + + +$lambda (8 samples, 0.02%) + + + +@reset_cycles (20 samples, 0.04%) + + + +memcpy (2,021 samples, 4.49%) +memcpy + + +store (138 samples, 0.31%) + + + + diff --git a/flamegraphs/assetstorage.svg b/flamegraphs/assetstorage.svg new file mode 100644 index 00000000000..06020cb10b4 --- /dev/null +++ b/flamegraphs/assetstorage.svg @@ -0,0 +1,1273 @@ + + + + + + + + + + + + + + +assetstorage.mo + +Reset Zoom +Search + + + +rts_start (39 samples, 0.09%) + + + +obj_idx<0> (18 samples, 0.04%) + + + +toArray (3,736 samples, 8.30%) +toArray + + +memcmp (194 samples, 0.43%) + + + +memset (6 samples, 0.01%) + + + +@serialize_go<B> (131 samples, 0.29%) + + + +next (1,385 samples, 3.08%) +next + + +obj_idx<0> (18 samples, 0.04%) + + + +parse_idl_header (532 samples, 1.18%) + + + +__set_hp (8 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +leb128_decode (52 samples, 0.12%) + + + +leb128_decode (52 samples, 0.12%) + + + +add (418 samples, 0.93%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (1,338 samples, 2.97%) +mo.. + + +canister_init (12,971 samples, 28.81%) +canister_init + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::h1f99226b92d7e984 (324 samples, 0.72%) + + + +__set_hp (4 samples, 0.01%) + + + +leb128_decode (208 samples, 0.46%) + + + +memcpy (60 samples, 0.13%) + + + +memcpy (65 samples, 0.14%) + + + +__get_hp (6 samples, 0.01%) + + + +alloc_blob (76 samples, 0.17%) + + + +sleb128_decode (69 samples, 0.15%) + + + +text_of_ptr_size (198 samples, 0.44%) + + + +__wasm_apply_global_relocs (31 samples, 0.07%) + + + +trans_state4 (18 samples, 0.04%) + + + +@deserialize_go<t> (493 samples, 1.10%) + + + +__set_hp (4 samples, 0.01%) + + + +leb128_encode (30 samples, 0.07%) + + + +leb128_decode (52 samples, 0.12%) + + + +text_size (5 samples, 0.01%) + + + +$lambda (3,088 samples, 6.86%) +$lambda + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (73 samples, 0.16%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +@buffer_size<vt> (189 samples, 0.42%) + + + +memcpy (124 samples, 0.28%) + + + +idl_sub_buf_words (10 samples, 0.02%) + + + +memcpy (380 samples, 0.84%) + + + +B_eq (14 samples, 0.03%) + + + +__set_hp (4 samples, 0.01%) + + + +alloc_array (80 samples, 0.18%) + + + +memcmp (204 samples, 0.45%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +memcpy (97 samples, 0.22%) + + + +trans_state7 (24 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +trans_state3 (10 samples, 0.02%) + + + +memcpy (988 samples, 2.19%) +m.. + + +utf8_validate (182 samples, 0.40%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (1,140 samples, 2.53%) +mo.. + + +memcpy (65 samples, 0.14%) + + + +memcpy (60 samples, 0.13%) + + + +@reset_refund (5 samples, 0.01%) + + + +sleb128_decode (345 samples, 0.77%) + + + +motoko_rts::types::block_size::haa6e1a3c5243bd1b (247 samples, 0.55%) + + + +__get_hp (6 samples, 0.01%) + + + +obj_idx<6> (36 samples, 0.08%) + + + +alloc_blob (76 samples, 0.17%) + + + +obj_idx<0> (18 samples, 0.04%) + + + +obj_idx<0> (54 samples, 0.12%) + + + +sleb128_decode (138 samples, 0.31%) + + + +compacting_gc (8,019 samples, 17.81%) +compacting_gc + + +__set_hp (8 samples, 0.02%) + + + +text_of_ptr_size (161 samples, 0.36%) + + + +leb128_decode (52 samples, 0.12%) + + + +B_add (27 samples, 0.06%) + + + +core::str::converts::from_utf8::hcecad2a92968d2cb (140 samples, 0.31%) + + + +idl_sub_buf_init (26 samples, 0.06%) + + + +leb128_decode (52 samples, 0.12%) + + + +obj_idx<0> (18 samples, 0.04%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (82 samples, 0.18%) + + + +$lambda (1,373 samples, 3.05%) +$la.. + + +memset (111 samples, 0.25%) + + + +@anon-func-31.67 (16 samples, 0.04%) + + + +__get_hp (12 samples, 0.03%) + + + +$lambda (2,291 samples, 5.09%) +$lambda + + +__set_hp (8 samples, 0.02%) + + + +insertRec (135 samples, 0.30%) + + + +__set_hp (4 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +parse_idl_header (366 samples, 0.81%) + + + +__get_hp (6 samples, 0.01%) + + + +Buffer (1,068 samples, 2.37%) +B.. + + +@reset_refund (10 samples, 0.02%) + + + +Array_init (229 samples, 0.51%) + + + +link_start (1,079 samples, 2.40%) +l.. + + +Blob.compare_eq (53 samples, 0.12%) + + + +list (11,046 samples, 24.53%) +list + + +motoko_rts::types::block_size::haa6e1a3c5243bd1b (172 samples, 0.38%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (998 samples, 2.22%) +m.. + + +idl_sub_buf_words (20 samples, 0.04%) + + + +compare (566 samples, 1.26%) + + + +@deserialize_go<B> (449 samples, 1.00%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (558 samples, 1.24%) + + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (146 samples, 0.32%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +trans_state4 (12 samples, 0.03%) + + + +B_add (27 samples, 0.06%) + + + +memcpy (62 samples, 0.14%) + + + +parse_idl_header (788 samples, 1.75%) + + + +@anon-func-116.7 (34 samples, 0.08%) + + + +trans_state6 (24 samples, 0.05%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +$lambda (7,552 samples, 16.77%) +$lambda + + +put (318 samples, 0.71%) + + + +sleb128_decode (138 samples, 0.31%) + + + +__set_hp (8 samples, 0.02%) + + + +iterate (2,101 samples, 4.67%) +iterate + + +@serialize_go<vt> (314 samples, 0.70%) + + + +alloc_blob (152 samples, 0.34%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +__set_hp (16 samples, 0.04%) + + + +$lambda (3,192 samples, 7.09%) +$lambda + + +__set_hp (8 samples, 0.02%) + + + +iter (332 samples, 0.74%) + + + +region_init (40 samples, 0.09%) + + + +memset (6 samples, 0.01%) + + + +@deserialize<tB> (2,369 samples, 5.26%) +@deser.. + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::h1f99226b92d7e984 (459 samples, 1.02%) + + + +__get_hp (6 samples, 0.01%) + + + +__set_hp (4 samples, 0.01%) + + + +__set_hp (4 samples, 0.01%) + + + +@reset_cycles (10 samples, 0.02%) + + + +@reset_refund (5 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +@serialize<> (343 samples, 0.76%) + + + +alloc_array (160 samples, 0.36%) + + + +@anon-func-165.17 (461 samples, 1.02%) + + + +alloc_blob (152 samples, 0.34%) + + + +alloc_blob (152 samples, 0.34%) + + + +alloc_blob (76 samples, 0.17%) + + + +__set_hp (4 samples, 0.01%) + + + +motoko_rts::text::text_get_range::h11e3b738bd44e775 (64 samples, 0.14%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (6,876 samples, 15.27%) +motoko_rts::gc::mark_co.. + + +idl_sub_buf_words (10 samples, 0.02%) + + + +text_compare (538 samples, 1.19%) + + + +__get_hp (6 samples, 0.01%) + + + +leb128_encode (15 samples, 0.03%) + + + +@deserialize_go<t> (440 samples, 0.98%) + + + +getRec (647 samples, 1.44%) + + + +obj_idx<11> (36 samples, 0.08%) + + + +leb128_encode (15 samples, 0.03%) + + + +__get_hp (6 samples, 0.01%) + + + +__get_hp (6 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +memcpy (48 samples, 0.11%) + + + +__set_hp (8 samples, 0.02%) + + + +@buffer_size<B> (47 samples, 0.10%) + + + +__wasm_apply_data_relocs (981 samples, 2.18%) +_.. + + +@deserialize<t> (1,276 samples, 2.83%) +@d.. + + +@buffer_size<u> (18 samples, 0.04%) + + + +@buffer_size<t> (56 samples, 0.12%) + + + +entries (358 samples, 0.80%) + + + +idl_sub_buf_init (26 samples, 0.06%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (82 samples, 0.18%) + + + +text_size (5 samples, 0.01%) + + + +__set_hp (8 samples, 0.02%) + + + +compacting_gc (6,882 samples, 15.29%) +compacting_gc + + +__get_hp (12 samples, 0.03%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +motoko_rts::text::blob_of_text::h3830d2568303b855 (11 samples, 0.02%) + + + +__set_hp (4 samples, 0.01%) + + + +__set_hp (8 samples, 0.02%) + + + +@serialize<vt> (1,119 samples, 2.49%) +@s.. + + +text_to_buf (96 samples, 0.21%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.31%) + + + +trans_state5 (12 samples, 0.03%) + + + +get (664 samples, 1.47%) + + + +@serialize_go<t> (168 samples, 0.37%) + + + +leb128_decode (104 samples, 0.23%) + + + +__get_hp (12 samples, 0.03%) + + + +memset (12 samples, 0.03%) + + + +@reset_cycles (5 samples, 0.01%) + + + +sleb128_decode (69 samples, 0.15%) + + + +utf8_validate (166 samples, 0.37%) + + + +$lambda (1,524 samples, 3.39%) +$la.. + + +@serialize<B> (486 samples, 1.08%) + + + +motoko_rts::principal_id::enc_stash::hade07e1e4d51be16 (386 samples, 0.86%) + + + +idl_sub_buf_init (52 samples, 0.12%) + + + +Array_tabulate (309 samples, 0.69%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +@deserialize<> (1,144 samples, 2.54%) +@d.. + + +toArray (397 samples, 0.88%) + + + +__set_hp (4 samples, 0.01%) + + + +RBTree (337 samples, 0.75%) + + + +__set_hp (8 samples, 0.02%) + + + +leb128_decode (104 samples, 0.23%) + + + +core::str::converts::from_utf8::hcecad2a92968d2cb (156 samples, 0.35%) + + + +alloc_blob (152 samples, 0.34%) + + + +map (126 samples, 0.28%) + + + +init (5,627 samples, 12.50%) +init + + +B_ge (12 samples, 0.03%) + + + +trans_state7 (12 samples, 0.03%) + + + +@serialize_go<u> (7 samples, 0.02%) + + + +__get_hp (6 samples, 0.01%) + + + +alloc_blob (76 samples, 0.17%) + + + +compute_crc32 (17 samples, 0.04%) + + + +initialize_compacting_gc (30 samples, 0.07%) + + + +B_gt (12 samples, 0.03%) + + + +obj_idx<1> (18 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (8,013 samples, 17.80%) +motoko_rts::gc::mark_compac.. + + +obj_idx<0> (54 samples, 0.12%) + + + +next (1,118 samples, 2.48%) +next + + +memset (111 samples, 0.25%) + + + +blob_of_principal (2,332 samples, 5.18%) +blob_o.. + + +__get_hp (6 samples, 0.01%) + + + +store (15,141 samples, 33.63%) +store + + +retrieve (4,785 samples, 10.63%) +retrieve + + +__wasm_call_ctors (987 samples, 2.19%) +_.. + + +alloc_blob (304 samples, 0.68%) + + + +motoko_rts::idl::check_typearg::h7a69986705540d34 (36 samples, 0.08%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (69 samples, 0.15%) + + + +insertRoot (290 samples, 0.64%) + + + +__set_hp (4 samples, 0.01%) + + + +__set_hp (4 samples, 0.01%) + + + +motoko_rts::text::text_compare_range::h44562c24c3fce02f (454 samples, 1.01%) + + + +all (45,022 samples, 100%) + + + +__get_hp (6 samples, 0.01%) + + + +motoko_rts::idl::check_typearg::h7a69986705540d34 (12 samples, 0.03%) + + + +@reset_cycles (5 samples, 0.01%) + + + +memcpy (72 samples, 0.16%) + + + +__set_hp (4 samples, 0.01%) + + + +trans_state6 (12 samples, 0.03%) + + + +__set_hp (8 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (758 samples, 1.68%) + + + +link_start (81 samples, 0.18%) + + + +leb128_decode (104 samples, 0.23%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (276 samples, 0.61%) + + + + diff --git a/flamegraphs/dao-reverse.svg b/flamegraphs/dao-reverse.svg new file mode 100644 index 00000000000..e2a6b1bf018 --- /dev/null +++ b/flamegraphs/dao-reverse.svg @@ -0,0 +1,509 @@ + + + + + + + + + + + + + + +dao.mo (reverse) + +Reset Zoom +Search + + + +list_proposals (18,446,744,073,709,510,656 samples, 7.14%) +list_prop.. + + +$lambda (36,893,488,147,419,299,840 samples, 14.29%) +$lambda + + +$lambda (18,446,744,073,709,555,712 samples, 7.14%) +$lambda + + +anon_async (18,446,744,073,709,555,712 samples, 7.14%) +anon_async + + +__motoko_async_helper (18,446,744,073,710,551,040 samples, 7.14%) +__motoko_.. + + +__get_hp (18,446,744,073,709,404,160 samples, 7.14%) +__get_hp + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (18,446,744,073,709,404,160 samples, 7.14%) +motoko_rt.. + + +get_proposal (18,446,744,073,709,471,744 samples, 7.14%) +get_propo.. + + +peek_future_continuation (18,446,744,073,709,223,936 samples, 7.14%) +peek_futu.. + + +alloc_blob (18,446,744,073,709,223,936 samples, 7.14%) +alloc_blob + + +compacting_gc (18,446,744,073,709,780,992 samples, 7.14%) +compactin.. + + +list_accounts (18,446,744,073,709,471,744 samples, 7.14%) +list_acco.. + + +trans_state5 (18,446,744,073,709,256,704 samples, 7.14%) +trans_sta.. + + +@buffer_size<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,494,272 samples, 7.14%) +@buffer_s.. + + +trans_state5 (55,340,232,221,128,753,152 samples, 21.43%) +trans_state5 + + +@deserialize<> (18,446,744,073,709,748,224 samples, 7.14%) +@deserial.. + + +__motoko_async_helper (18,446,744,073,709,256,704 samples, 7.14%) +__motoko_.. + + +__motoko_async_helper (18,446,744,073,709,510,656 samples, 7.14%) +__motoko_.. + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (18,446,744,073,710,239,744 samples, 7.14%) +motoko_rt.. + + +alloc_blob (18,446,744,073,709,387,776 samples, 7.14%) +alloc_blob + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (18,446,744,073,709,477,888 samples, 7.14%) +motoko_rt.. + + +@deserialize<> (18,446,744,073,709,355,008 samples, 7.14%) +@deserial.. + + +list_accounts (18,446,744,073,709,846,528 samples, 7.14%) +list_acco.. + + +all (258,254,417,031,948,959,744 samples, 100%) + + + +list_proposals (18,446,744,073,709,256,704 samples, 7.14%) +list_prop.. + + +get_proposal (18,446,744,073,709,780,992 samples, 7.14%) +get_propo.. + + +sample_vote (18,446,744,073,709,477,888 samples, 7.14%) +sample_vote + + +alloc_blob (18,446,744,073,709,477,888 samples, 7.14%) +alloc_blob + + +list_accounts (18,446,744,073,709,355,008 samples, 7.14%) +list_acco.. + + +alloc_blob (18,446,744,073,709,748,224 samples, 7.14%) +alloc_blob + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (18,446,744,073,719,316,480 samples, 7.14%) +motoko_rt.. + + +@callback<u> (18,446,744,073,709,731,840 samples, 7.14%) +@callback.. + + +list_accounts (18,446,744,073,709,780,992 samples, 7.14%) +list_acco.. + + +compacting_gc (18,446,744,073,719,316,480 samples, 7.14%) +compactin.. + + +sample_vote (18,446,744,073,709,748,224 samples, 7.14%) +sample_vote + + +compacting_gc (18,446,744,073,709,404,160 samples, 7.14%) +compactin.. + + +list_proposals (18,446,744,073,709,879,296 samples, 7.14%) +list_prop.. + + +__get_hp (18,446,744,073,709,780,992 samples, 7.14%) +__get_hp + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (18,446,744,073,709,780,992 samples, 7.14%) +motoko_rt.. + + +$loop/1 (18,446,744,073,709,559,808 samples, 7.14%) +$loop/1 + + +peek_future_continuation (18,446,744,073,709,471,744 samples, 7.14%) +peek_futu.. + + + diff --git a/flamegraphs/dao.svg b/flamegraphs/dao.svg new file mode 100644 index 00000000000..a69b0d1ff67 --- /dev/null +++ b/flamegraphs/dao.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + +dao.mo + +Reset Zoom +Search + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (73,786,976,294,838,403,072 samples, 28.57%) +motoko_rts::gc::mark_compact::compacting_gc::.. + + +sample_vote (36,893,488,147,418,972,160 samples, 14.29%) +sample_vote + + +$lambda (18,446,744,073,709,764,608 samples, 7.14%) +$lambda + + +anon_async (18,446,744,073,709,846,528 samples, 7.14%) +anon_async + + +list_accounts (129,127,208,515,967,156,224 samples, 50.00%) +list_accounts + + +$loop/1 (18,446,744,073,709,764,608 samples, 7.14%) +$loop/1 + + +__get_hp (55,340,232,221,128,982,528 samples, 21.43%) +__get_hp + + +get_proposal (18,446,744,073,709,539,328 samples, 7.14%) +get_propo.. + + +get_proposal (18,446,744,073,709,846,528 samples, 7.14%) +get_propo.. + + +$lambda (18,446,744,073,709,617,152 samples, 7.14%) +$lambda + + +@buffer_size<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,537,280 samples, 7.14%) +@buffer_s.. + + +__motoko_async_helper (18,446,744,073,709,461,504 samples, 7.14%) +__motoko_.. + + +all (258,254,417,031,949,385,728 samples, 100%) + + + +alloc_blob (18,446,744,073,709,518,848 samples, 7.14%) +alloc_blob + + +trans_state5 (18,446,744,073,709,715,456 samples, 7.14%) +trans_sta.. + + +trans_state5 (36,893,488,147,419,037,696 samples, 14.29%) +trans_state5 + + +peek_future_continuation (36,893,488,147,419,299,840 samples, 14.29%) +peek_future_continuat.. + + +compacting_gc (73,786,976,294,838,403,072 samples, 28.57%) +compacting_gc + + +__motoko_async_helper (73,786,976,294,838,140,928 samples, 28.57%) +__motoko_async_helper + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (18,446,744,073,711,714,304 samples, 7.14%) +motoko_rt.. + + +@deserialize<> (18,446,744,073,709,846,528 samples, 7.14%) +@deserial.. + + +canister_heartbeat (18,446,744,073,712,648,192 samples, 7.14%) +canister_.. + + +get_proposal (18,446,744,073,709,977,600 samples, 7.14%) +get_propo.. + + +@deserialize<> (18,446,744,073,709,629,440 samples, 7.14%) +@deserial.. + + +trans_state5 (18,446,744,073,709,461,504 samples, 7.14%) +trans_sta.. + + +@callback<u> (18,446,744,073,709,158,400 samples, 7.14%) +@callback.. + + +@serialize<?r(id:N,payload:r(canister_id:P,message:B,method:t),proposer:P,state:v(accepted:u,executing:u,failed:t,open:u,rejected:u,succeeded:u),timestamp:I,voters:10=?(P!10),votes_no:12=r(amount_e8s:N),votes_yes:!12)> (18,446,744,073,709,537,280 samples, 7.14%) +@serializ.. + + +list_proposals (73,786,976,294,838,173,696 samples, 28.57%) +list_proposals + + +compacting_gc (18,446,744,073,711,714,304 samples, 7.14%) +compactin.. + + +$lambda (18,446,744,073,709,846,528 samples, 7.14%) +$lambda + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (18,446,744,073,709,518,848 samples, 7.14%) +motoko_rt.. + + + diff --git a/flamegraphs/index.html b/flamegraphs/index.html new file mode 100644 index 00000000000..500c73e3d69 --- /dev/null +++ b/flamegraphs/index.html @@ -0,0 +1,26 @@ + + + + + + Motoko prof flamegraphs + + +

Motoko prof flamegraphs

+

assetstorage.mo

+ + +

dao.mo

+ + +

qr.mo

+ + +

reversi.mo

+ + +

sha256.mo

+ + + + diff --git a/flamegraphs/nix-support/hydra-build-products b/flamegraphs/nix-support/hydra-build-products new file mode 100644 index 00000000000..20c28905120 --- /dev/null +++ b/flamegraphs/nix-support/hydra-build-products @@ -0,0 +1 @@ +report flamegraphs /nix/store/zsyvjlqkhkr75r6g2pq9h6gxpd7fs0p7-test-profiling-graphs index.html diff --git a/flamegraphs/qr-reverse.svg b/flamegraphs/qr-reverse.svg new file mode 100644 index 00000000000..c47bb1abc47 --- /dev/null +++ b/flamegraphs/qr-reverse.svg @@ -0,0 +1,103505 @@ + + + + + + + + + + + + + + +qr.mo (reverse) + +Reset Zoom +Search + + + +rec (18,267 samples, 0.18%) + + + +@anon-func-412.5 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (1,115 samples, 0.01%) + + + +@anon-func-435.5 (38,706 samples, 0.38%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (2,028 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (32,087 samples, 0.32%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +rec (1,405 samples, 0.01%) + + + +@anon-func-435.5 (5,445 samples, 0.05%) + + + +@anon-func-481.5 (2,671 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-173.5 (40,186 samples, 0.40%) + + + +interleave (864 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-435.5 (8,389 samples, 0.08%) + + + +map (880 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,261 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyAdd (6,848 samples, 0.07%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (17,073 samples, 0.17%) + + + +@anon-func-51.11 (1,014 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (54,025 samples, 0.53%) + + + +@anon-func-30.36 (936 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (41,472 samples, 0.41%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-435.5 (8,855 samples, 0.09%) + + + +@anon-func-412.5 (1,026 samples, 0.01%) + + + +@anon-func-435.5 (54,254 samples, 0.53%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +rec (13,017 samples, 0.13%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-173.5 (522,461 samples, 5.15%) +@anon-.. + + +$lambda (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-54.15 (1,230 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +encode (1,642 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-32.65 (2,614,330 samples, 25.77%) +@anon-func-32.65 + + +@anon-func-173.5 (815,513 samples, 8.04%) +@anon-func-.. + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (7,480 samples, 0.07%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (37,486 samples, 0.37%) + + + +map (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,875 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (9,880 samples, 0.10%) + + + +polyAdd (1,664 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (16,610 samples, 0.16%) + + + +@anon-func-48.7 (13,768 samples, 0.14%) + + + +@anon-func-173.5 (26,515 samples, 0.26%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (7,592 samples, 0.07%) + + + +$lambda (1,184 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +encode (1,170 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyPadLeft (1,218 samples, 0.01%) + + + +rec (5,697 samples, 0.06%) + + + +@anon-func-265.5 (12,258 samples, 0.12%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +correction (1,440 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (11,456 samples, 0.11%) + + + +@anon-func-173.5 (4,897 samples, 0.05%) + + + +@anon-func-435.5 (26,750 samples, 0.26%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +rec (65,421 samples, 0.64%) + + + +@anon-func-48.7 (2,112 samples, 0.02%) + + + +@anon-func-173.5 (4,129 samples, 0.04%) + + + +@anon-func-435.5 (7,260 samples, 0.07%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +@anon-func-48.7 (9,320 samples, 0.09%) + + + +@anon-func-79.3 (1,642 samples, 0.02%) + + + +polyAddTerm (931 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (871,685 samples, 8.59%) +@anon-func-1.. + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyPadLeft (2,852 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (8,086 samples, 0.08%) + + + +@anon-func-435.5 (3,520 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-161.5 (39,492 samples, 0.39%) + + + +@anon-func-173.5 (3,921 samples, 0.04%) + + + +@anon-func-48.7 (972 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (1,391 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-435.5 (1,232 samples, 0.01%) + + + +polyDivMod (1,248 samples, 0.01%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (1,821 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (53,856 samples, 0.53%) + + + +polyAdd (1,664 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +polySub (1,104 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-481.5 (960 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +rec (138,375 samples, 1.36%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,826 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (9,216 samples, 0.09%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (1,767 samples, 0.02%) + + + +rec (14,985 samples, 0.15%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-173.5 (2,305 samples, 0.02%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (11,872 samples, 0.12%) + + + +interleave (1,152 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-173.5 (109,879 samples, 1.08%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-481.5 (2,619 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (4,734 samples, 0.05%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +encode (1,299 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +interleave (14,612 samples, 0.14%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,092 samples, 0.01%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +rec (1,327 samples, 0.01%) + + + +@anon-func-173.5 (3,406 samples, 0.03%) + + + +@anon-func-173.5 (3,699 samples, 0.04%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyPadLeft (2,409 samples, 0.02%) + + + +@anon-func-173.5 (82,576 samples, 0.81%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (954 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (1,980 samples, 0.02%) + + + +@anon-func-161.5 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (13,920 samples, 0.14%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (6,270 samples, 0.06%) + + + +@anon-func-173.5 (925 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (118,864 samples, 1.17%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (23,106 samples, 0.23%) + + + +interleave (2,000 samples, 0.02%) + + + +flatten (1,950 samples, 0.02%) + + + +correction (1,886 samples, 0.02%) + + + +correction (1,267 samples, 0.01%) + + + +@anon-func-173.5 (9,440 samples, 0.09%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-173.5 (75,325 samples, 0.74%) + + + +@anon-func-79.3 (1,704 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-161.5 (3,432 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-54.15 (1,232 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (899 samples, 0.01%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,288 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-481.5 (3,575 samples, 0.04%) + + + +@anon-func-173.5 (76,351 samples, 0.75%) + + + +@anon-func-435.5 (37,334 samples, 0.37%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +rec (14,767 samples, 0.15%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,207 samples, 0.01%) + + + +@anon-func-435.5 (24,427 samples, 0.24%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (1,299 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,299 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,122 samples, 0.01%) + + + +encode (1,261 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (67,463 samples, 0.67%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +@anon-func-173.5 (292,539 samples, 2.88%) +@a.. + + +@anon-func-51.11 (1,719 samples, 0.02%) + + + +@anon-func-79.3 (2,884 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +polyNew (999 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-435.5 (36,266 samples, 0.36%) + + + +@anon-func-435.5 (60,734 samples, 0.60%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-412.5 (3,540 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,261 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-435.5 (41,952 samples, 0.41%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-48.7 (960 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (102,064 samples, 1.01%) + + + +@anon-func-173.5 (190,806 samples, 1.88%) +@.. + + +@anon-func-435.5 (28,288 samples, 0.28%) + + + +polyZipWith (1,147 samples, 0.01%) + + + +@anon-func-173.5 (130,636 samples, 1.29%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (16,303 samples, 0.16%) + + + +@anon-func-79.3 (1,511 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (6,336 samples, 0.06%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +flatten (3,004 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (2,000 samples, 0.02%) + + + +polyAdd (2,368 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-481.5 (1,890 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-173.5 (44,827 samples, 0.44%) + + + +@anon-func-79.3 (1,527 samples, 0.02%) + + + +@anon-func-435.5 (5,155 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +encode (26,582 samples, 0.26%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,120 samples, 0.01%) + + + +polyScale (2,384 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +scale (6,336 samples, 0.06%) + + + +map (864 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,250 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (77,719 samples, 0.77%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyZipWith (928 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (31,214 samples, 0.31%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-32.65 (76,220 samples, 0.75%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +@anon-func-435.5 (5,115 samples, 0.05%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (25,327 samples, 0.25%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (23,772 samples, 0.23%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyPadLeft (2,159 samples, 0.02%) + + + +@anon-func-289.5 (882 samples, 0.01%) + + + +generate (4,808 samples, 0.05%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +rec (1,053 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (2,211 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,230 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-161.5 (1,650 samples, 0.02%) + + + +elemMul (6,976 samples, 0.07%) + + + +@anon-func-79.3 (24,704 samples, 0.24%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (8,525 samples, 0.08%) + + + +@anon-func-173.5 (4,654 samples, 0.05%) + + + +@anon-func-300.5 (9,140 samples, 0.09%) + + + +@anon-func-435.5 (4,015 samples, 0.04%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +rec (8,208 samples, 0.08%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,982 samples, 0.03%) + + + +@anon-func-435.5 (8,653 samples, 0.09%) + + + +@anon-func-79.3 (1,767 samples, 0.02%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-161.5 (1,288 samples, 0.01%) + + + +@anon-func-435.5 (36,960 samples, 0.36%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (6,418 samples, 0.06%) + + + +@anon-func-435.5 (6,343 samples, 0.06%) + + + +@anon-func-173.5 (468,209 samples, 4.62%) +@anon.. + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-435.5 (2,496 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-435.5 (16,791 samples, 0.17%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +natZipWith (32,928 samples, 0.32%) + + + +go (2,688 samples, 0.03%) + + + +rec (10,767 samples, 0.11%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-435.5 (12,096 samples, 0.12%) + + + +@anon-func-173.5 (145,222 samples, 1.43%) + + + +encode (8,262 samples, 0.08%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (886 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +polySub (46,208 samples, 0.46%) + + + +@anon-func-435.5 (51,072 samples, 0.50%) + + + +@anon-func-161.5 (1,287 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +@anon-func-435.5 (44,806 samples, 0.44%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,964 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (2,266 samples, 0.02%) + + + +polyGrow (2,659 samples, 0.03%) + + + +@anon-func-289.5 (5,202 samples, 0.05%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +padLeftTo (6,488 samples, 0.06%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (2,620 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (85,239 samples, 0.84%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,375 samples, 0.03%) + + + +@anon-func-300.5 (1,892 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,887 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,619,743 samples, 25.82%) +@anon-func-32.65 + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-435.5 (44,534 samples, 0.44%) + + + +natZipWith (73,927 samples, 0.73%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-435.5 (12,100 samples, 0.12%) + + + +pathCoords (1,730 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (19,224 samples, 0.19%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (8,262 samples, 0.08%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-435.5 (8,191 samples, 0.08%) + + + +@anon-func-173.5 (585,918 samples, 5.78%) +@anon-f.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +encode (1,216 samples, 0.01%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-173.5 (519,447 samples, 5.12%) +@anon-.. + + +@anon-func-435.5 (4,224 samples, 0.04%) + + + +@anon-func-173.5 (216,854 samples, 2.14%) +@.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,848 samples, 0.04%) + + + +@anon-func-173.5 (5,070 samples, 0.05%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,440 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-173.5 (5,460 samples, 0.05%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +polyMulTerm (1,115 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,950 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,207 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (24,704 samples, 0.24%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,448 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +natToBits (2,124 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (22,464 samples, 0.22%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (24,604 samples, 0.24%) + + + +@anon-func-38.11 (931 samples, 0.01%) + + + +toListWithLength (2,695 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +polyDivMod (1,391 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-435.5 (26,047 samples, 0.26%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-161.5 (3,276 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-435.5 (13,568 samples, 0.13%) + + + +$lambda (2,880 samples, 0.03%) + + + +generate (2,955 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-481.5 (1,190 samples, 0.01%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-173.5 (16,687 samples, 0.16%) + + + +rec (4,392 samples, 0.04%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +rec (1,197 samples, 0.01%) + + + +@anon-func-435.5 (4,561 samples, 0.04%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (778,013 samples, 7.67%) +@anon-func.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (93,533 samples, 0.92%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (756,229 samples, 7.45%) +@anon-func.. + + +go (1,152 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (261,734 samples, 2.58%) +@a.. + + +@anon-func-79.3 (1,821 samples, 0.02%) + + + +polySub (2,880 samples, 0.03%) + + + +rec (3,087 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-30.36 (24,704 samples, 0.24%) + + + +go (2,887 samples, 0.03%) + + + +@anon-func-48.7 (1,390 samples, 0.01%) + + + +@anon-func-38.11 (1,299 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +natFromBytes (5,376 samples, 0.05%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-435.5 (109,614 samples, 1.08%) + + + +@anon-func-173.5 (82,093 samples, 0.81%) + + + +polySub (1,584 samples, 0.02%) + + + +$lambda (1,253 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +natFromBits (1,184 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-161.5 (12,672 samples, 0.12%) + + + +@anon-func-481.5 (3,704 samples, 0.04%) + + + +forIn (3,463 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +interleave (1,023 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-481.5 (1,190 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,620 samples, 0.05%) + + + +map (1,184 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (3,241 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-229.5 (875 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +rec (3,245 samples, 0.03%) + + + +polyTrim (24,024 samples, 0.24%) + + + +polyAdd (3,424 samples, 0.03%) + + + +@anon-func-173.5 (74,708 samples, 0.74%) + + + +@anon-func-435.5 (6,655 samples, 0.07%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +correction (1,048 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +rec (8,892 samples, 0.09%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (35,136 samples, 0.35%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +go (1,125 samples, 0.01%) + + + +@anon-func-229.5 (11,595 samples, 0.11%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (58,883 samples, 0.58%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-481.5 (4,531 samples, 0.04%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (7,519 samples, 0.07%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (20,274 samples, 0.20%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,800 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-435.5 (11,491 samples, 0.11%) + + + +map (1,216 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,282 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,115 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +pathCoords (2,884 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (6,022 samples, 0.06%) + + + +map (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-435.5 (9,105 samples, 0.09%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +@anon-func-481.5 (4,058 samples, 0.04%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +patternCoords (972 samples, 0.01%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-435.5 (3,274 samples, 0.03%) + + + +@anon-func-51.11 (1,173 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-173.5 (7,566 samples, 0.07%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +correction (2,754 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (192,214 samples, 1.89%) +@.. + + +map (2,384 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +polyZipWith (1,085 samples, 0.01%) + + + +@anon-func-435.5 (7,040 samples, 0.07%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +finderBLCoords (3,520 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (33,152 samples, 0.33%) + + + +encode (2,877 samples, 0.03%) + + + +natXor (8,064 samples, 0.08%) + + + +generate (2,877 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-435.5 (17,523 samples, 0.17%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-435.5 (19,927 samples, 0.20%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +rec (32,288 samples, 0.32%) + + + +@anon-func-435.5 (29,434 samples, 0.29%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-435.5 (82,944 samples, 0.82%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +rec (4,360 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +polyAdd (5,760 samples, 0.06%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-173.5 (266,662 samples, 2.63%) +@a.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (3,865 samples, 0.04%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-30.36 (9,320 samples, 0.09%) + + + +@anon-func-161.5 (6,720 samples, 0.07%) + + + +elemNew (1,548 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,840 samples, 0.12%) + + + +B_lt (8,292 samples, 0.08%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,767 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-435.5 (26,400 samples, 0.26%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +rec (999 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (7,392 samples, 0.07%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (325,849 samples, 3.21%) +@an.. + + +@anon-func-173.5 (5,018 samples, 0.05%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-393.5 (5,196 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (2,754 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +rec (5,642 samples, 0.06%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-173.5 (30,164 samples, 0.30%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (2,128 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +natXor (36,960 samples, 0.36%) + + + +encode (3,004 samples, 0.03%) + + + +@anon-func-161.5 (1,330 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +encode (972 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,255 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +rec (15,517 samples, 0.15%) + + + +rec (21,875 samples, 0.22%) + + + +go (864 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,347 samples, 0.04%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (1,017,949 samples, 10.03%) +@anon-func-173.5 + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (12,415 samples, 0.12%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (5,610 samples, 0.06%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-173.5 (57,167 samples, 0.56%) + + + +@anon-func-51.11 (2,887 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +rec (33,786 samples, 0.33%) + + + +polyDivMod (936 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,267 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-173.5 (2,422 samples, 0.02%) + + + +rec (74,770 samples, 0.74%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (9,728 samples, 0.10%) + + + +@anon-func-173.5 (21,601 samples, 0.21%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (23,752 samples, 0.23%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (9,230 samples, 0.09%) + + + +@anon-func-173.5 (591,946 samples, 5.84%) +@anon-f.. + + +rec (12,267 samples, 0.12%) + + + +polyDivMod (880 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +polyDivMod (1,392 samples, 0.01%) + + + +@anon-func-30.36 (1,391 samples, 0.01%) + + + +@anon-func-161.5 (1,760 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (2,314 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (19,800 samples, 0.20%) + + + +@anon-func-173.5 (2,418 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (4,320 samples, 0.04%) + + + +natXor (5,376 samples, 0.05%) + + + +$lambda (3,424 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (619,301 samples, 6.10%) +@anon-fu.. + + +encode (880 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-32.65 (4,808 samples, 0.05%) + + + +@anon-func-51.11 (23,732 samples, 0.23%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-161.5 (1,089 samples, 0.01%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-435.5 (56,774 samples, 0.56%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (212,630 samples, 2.10%) +@.. + + +map (864 samples, 0.01%) + + + +@anon-func-481.5 (1,750 samples, 0.02%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +polyDivMod (1,207 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyPadLeft (2,909 samples, 0.03%) + + + +@anon-func-481.5 (1,651 samples, 0.02%) + + + +patternCoords (2,826 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (18,944 samples, 0.19%) + + + +@anon-func-435.5 (22,846 samples, 0.23%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (13,253 samples, 0.13%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,079 samples, 0.06%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,360 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (249,062 samples, 2.46%) +@a.. + + +map (864 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +polyDivMod (10,152 samples, 0.10%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +__wasm_apply_data_relocs (981 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,955 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (886 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyPadRight (2,397 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-173.5 (5,028 samples, 0.05%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +polyAdd (1,664 samples, 0.02%) + + + +interleave (1,248 samples, 0.01%) + + + +@anon-func-435.5 (2,614 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,064 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,142 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (4,785 samples, 0.05%) + + + +@anon-func-173.5 (441,083 samples, 4.35%) +@anon.. + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +natXor (73,927 samples, 0.73%) + + + +@anon-func-38.11 (2,887 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (672,205 samples, 6.63%) +@anon-fun.. + + +@anon-func-79.3 (4,266 samples, 0.04%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (13,375 samples, 0.13%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (110,737 samples, 1.09%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-481.5 (1,651 samples, 0.02%) + + + +@anon-func-173.5 (77,092 samples, 0.76%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-435.5 (13,312 samples, 0.13%) + + + +@anon-func-173.5 (251,174 samples, 2.48%) +@a.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-435.5 (5,632 samples, 0.06%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +rec (1,892 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +rec (2,142 samples, 0.02%) + + + +@anon-func-435.5 (48,384 samples, 0.48%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-435.5 (33,094 samples, 0.33%) + + + +@anon-func-51.11 (1,944 samples, 0.02%) + + + +@anon-func-38.11 (1,386 samples, 0.01%) + + + +map (1,517 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (125,614 samples, 1.24%) + + + +interleave (1,048 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (61,094 samples, 0.60%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (2,672 samples, 0.03%) + + + +@anon-func-173.5 (241,301 samples, 2.38%) +@.. + + +$lambda (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +encode (926 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (1,527 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-38.11 (24,704 samples, 0.24%) + + + +alog (9,947 samples, 0.10%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (4,402 samples, 0.04%) + + + +generate (1,107 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polySub (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,561 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,586 samples, 0.02%) + + + +@anon-func-435.5 (1,320 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (16,507 samples, 0.16%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +go (1,267 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (979 samples, 0.01%) + + + +pathCoords (2,826 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +interleave (1,472 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-161.5 (1,944 samples, 0.02%) + + + +map (1,120 samples, 0.01%) + + + +@anon-func-173.5 (576,876 samples, 5.69%) +@anon-f.. + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (31,616 samples, 0.31%) + + + +correction (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,392 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +rec (3,105 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (24,704 samples, 0.24%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (3,175 samples, 0.03%) + + + +polyScale (2,000 samples, 0.02%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyDivMod (892 samples, 0.01%) + + + +@anon-func-173.5 (22,147 samples, 0.22%) + + + +@anon-func-435.5 (7,632 samples, 0.08%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,391 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (1,568 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-173.5 (4,532 samples, 0.04%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +@anon-func-300.5 (1,808 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,207 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-435.5 (2,680 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,460 samples, 0.09%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (99,847 samples, 0.98%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polySub (1,216 samples, 0.01%) + + + +elemAdd (6,720 samples, 0.07%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,305 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-173.5 (88,671 samples, 0.87%) + + + +@anon-func-173.5 (1,326 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (1,719 samples, 0.02%) + + + +@anon-func-38.11 (46,208 samples, 0.46%) + + + +polyAdd (928 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (2,384 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +correction (1,200 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,112 samples, 0.02%) + + + +@anon-func-435.5 (13,824 samples, 0.14%) + + + +rec (3,422,166 samples, 33.73%) +rec + + +@anon-func-173.5 (1,089,681 samples, 10.74%) +@anon-func-173.5 + + +$lambda (1,944 samples, 0.02%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-173.5 (4,337 samples, 0.04%) + + + +rec (7,533 samples, 0.07%) + + + +@anon-func-435.5 (9,973 samples, 0.10%) + + + +@anon-func-173.5 (23,416 samples, 0.23%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-38.11 (936 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +natZipWith (36,288 samples, 0.36%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-435.5 (14,347 samples, 0.14%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,200 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,486 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (4,064 samples, 0.04%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,615 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-435.5 (7,861 samples, 0.08%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +generate (2,955 samples, 0.03%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-435.5 (6,656 samples, 0.07%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (13,957 samples, 0.14%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-51.11 (1,304 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +rec (1,379 samples, 0.01%) + + + +@anon-func-435.5 (29,190 samples, 0.29%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +rec (2,767 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (1,760 samples, 0.02%) + + + +correction (1,216 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (60,313 samples, 0.59%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (3,520 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +$lambda (2,826 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-435.5 (17,587 samples, 0.17%) + + + +correction (1,952 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +toBlocks (14,912 samples, 0.15%) + + + +go (880 samples, 0.01%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-38.11 (13,768 samples, 0.14%) + + + +polySub (1,760 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +$lambda (2,955 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,173 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-173.5 (69,465 samples, 0.68%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-173.5 (5,538 samples, 0.05%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +toList (954 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (6,967 samples, 0.07%) + + + +@anon-func-393.5 (3,908 samples, 0.04%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,136 samples, 0.01%) + + + +@anon-func-173.5 (1,118 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,527 samples, 0.02%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-435.5 (14,208 samples, 0.14%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +patternCoords (972 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-481.5 (3,658 samples, 0.04%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,016 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (119,536 samples, 1.18%) + + + +@anon-func-435.5 (2,647 samples, 0.03%) + + + +@anon-func-173.5 (274,455 samples, 2.71%) +@a.. + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (4,565 samples, 0.05%) + + + +polyAdd (2,304 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +go (19,224 samples, 0.19%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (111,472 samples, 1.10%) + + + +interleave (1,584 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +map (1,120 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,023 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-173.5 (806,177 samples, 7.95%) +@anon-func-.. + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-453.5 (2,065 samples, 0.02%) + + + +all (10,144,278 samples, 100%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +$lambda (1,326 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-494.5 (1,375 samples, 0.01%) + + + +polyGrow (70,912 samples, 0.70%) + + + +@anon-func-51.11 (9,320 samples, 0.09%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-173.5 (5,054 samples, 0.05%) + + + +generate (2,975 samples, 0.03%) + + + +polyGrow (3,875 samples, 0.04%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,092 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-435.5 (21,138 samples, 0.21%) + + + +@anon-func-481.5 (2,891 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-173.5 (2,782 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +polyAdd (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +rec (1,483 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (7,150 samples, 0.07%) + + + +correction (1,642 samples, 0.02%) + + + +@anon-func-435.5 (43,830 samples, 0.43%) + + + +@anon-func-173.5 (790,617 samples, 7.79%) +@anon-func.. + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (29,287 samples, 0.29%) + + + +go (880 samples, 0.01%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (3,934 samples, 0.04%) + + + +map (864 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-79.3 (10,152 samples, 0.10%) + + + +@anon-func-173.5 (1,052,337 samples, 10.37%) +@anon-func-173.5 + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-161.5 (1,980 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (1,470 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-161.5 (1,932 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (3,276 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (6,348 samples, 0.06%) + + + +@anon-func-173.5 (22,966 samples, 0.23%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +rec (64,362 samples, 0.63%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (6,110 samples, 0.06%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +go (1,216 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,680 samples, 0.05%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,406 samples, 0.01%) + + + +@anon-func-481.5 (3,165 samples, 0.03%) + + + +polyAdd (1,104 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +rec (44,750 samples, 0.44%) + + + +@anon-func-435.5 (3,615 samples, 0.04%) + + + +go (1,184 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,316 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,007 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,912 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,014 samples, 0.01%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +polySub (1,125 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (4,832 samples, 0.05%) + + + +@anon-func-173.5 (9,412 samples, 0.09%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-173.5 (12,800 samples, 0.13%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +encode (2,457 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (910 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (931 samples, 0.01%) + + + +map (1,767 samples, 0.02%) + + + +map (936 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (926 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (21,908 samples, 0.22%) + + + +@anon-func-161.5 (2,349 samples, 0.02%) + + + +@anon-func-51.11 (2,212 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (1,261 samples, 0.01%) + + + +@anon-func-48.7 (1,944 samples, 0.02%) + + + +polyMulTerm (926 samples, 0.01%) + + + +@anon-func-435.5 (45,254 samples, 0.45%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +toBlocks (2,880 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-54.15 (4,734 samples, 0.05%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,144 samples, 0.01%) + + + +@anon-func-54.15 (1,116 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (931 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,299 samples, 0.06%) + + + +@anon-func-265.5 (969 samples, 0.01%) + + + +$lambda (2,955 samples, 0.03%) + + + +@anon-func-173.5 (48,308 samples, 0.48%) + + + +@anon-func-481.5 (1,750 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (6,968 samples, 0.07%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,330 samples, 0.05%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (19,924 samples, 0.20%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-79.3 (23,732 samples, 0.23%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +$lambda (1,391 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (6,786 samples, 0.07%) + + + +correction (3,424 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (17,632 samples, 0.17%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +rec (49,107 samples, 0.48%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (1,705 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (47,774 samples, 0.47%) + + + +@anon-func-453.5 (8,361 samples, 0.08%) + + + +@anon-func-300.5 (1,023 samples, 0.01%) + + + +@anon-func-161.5 (1,253 samples, 0.01%) + + + +@anon-func-173.5 (824,849 samples, 8.13%) +@anon-func-.. + + +@anon-func-173.5 (350,507 samples, 3.46%) +@an.. + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +go (1,115 samples, 0.01%) + + + +@anon-func-435.5 (28,747 samples, 0.28%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (26,624 samples, 0.26%) + + + +correction (864 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-48.7 (21,948 samples, 0.22%) + + + +$lambda (2,000 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,212 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-161.5 (7,200 samples, 0.07%) + + + +encode (1,392 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +rec (42,580 samples, 0.42%) + + + +encode (1,719 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-393.5 (2,344 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (69,751 samples, 0.69%) + + + +@anon-func-173.5 (109,021 samples, 1.07%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +@anon-func-173.5 (706,437 samples, 6.96%) +@anon-fun.. + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyDivMod (1,200 samples, 0.01%) + + + +rec (924 samples, 0.01%) + + + +@anon-func-38.11 (8,262 samples, 0.08%) + + + +@anon-func-161.5 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +@anon-func-173.5 (28,972 samples, 0.29%) + + + +polyZipWith (2,138 samples, 0.02%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (765,565 samples, 7.55%) +@anon-func.. + + +correction (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (14,887 samples, 0.15%) + + + +encode (864 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +$lambda (2,982 samples, 0.03%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +generate (2,212 samples, 0.02%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (28,416 samples, 0.28%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (56,335 samples, 0.56%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (92,675 samples, 0.91%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-161.5 (3,456 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-173.5 (874,797 samples, 8.62%) +@anon-func-1.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +rec (2,345 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (20,107 samples, 0.20%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +correction (1,875 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,094 samples, 0.03%) + + + +@anon-func-173.5 (1,003 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,048 samples, 0.01%) + + + +polySub (3,424 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-32.65 (21,948 samples, 0.22%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,372 samples, 0.08%) + + + +@anon-func-435.5 (14,527 samples, 0.14%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyAdd (5,760 samples, 0.06%) + + + +map (880 samples, 0.01%) + + + +@anon-func-173.5 (264,550 samples, 2.61%) +@a.. + + +@anon-func-79.3 (2,448 samples, 0.02%) + + + +B_mul (19,894 samples, 0.20%) + + + +polySub (1,952 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +map (1,207 samples, 0.01%) + + + +@anon-func-435.5 (39,438 samples, 0.39%) + + + +@anon-func-435.5 (17,664 samples, 0.17%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (20,352 samples, 0.20%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (32,294 samples, 0.32%) + + + +@anon-func-173.5 (6,006 samples, 0.06%) + + + +rec (1,873 samples, 0.02%) + + + +@anon-func-435.5 (22,358 samples, 0.22%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-161.5 (1,188 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (4,531 samples, 0.04%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (753,117 samples, 7.42%) +@anon-func.. + + +elemAdd (7,392 samples, 0.07%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,887 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +rec (1,593 samples, 0.02%) + + + +@anon-func-435.5 (1,782 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-412.5 (4,666 samples, 0.05%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +rec (3,483 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-435.5 (1,785 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +go (1,170 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,640 samples, 0.09%) + + + +@anon-func-435.5 (31,386 samples, 0.31%) + + + +@anon-func-173.5 (126,316 samples, 1.25%) + + + +@anon-func-435.5 (11,647 samples, 0.11%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (10,752 samples, 0.11%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (94,677 samples, 0.93%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (10,152 samples, 0.10%) + + + +@anon-func-161.5 (76,220 samples, 0.75%) + + + +@anon-func-54.15 (1,760 samples, 0.02%) + + + +polyAdd (5,376 samples, 0.05%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-453.5 (3,410 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +rec (32,550 samples, 0.32%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (9,672 samples, 0.10%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (9,504 samples, 0.09%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +rec (9,517 samples, 0.09%) + + + +@anon-func-173.5 (37,183 samples, 0.37%) + + + +generate (2,975 samples, 0.03%) + + + +interleave (1,517 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (728,221 samples, 7.18%) +@anon-fun.. + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +rec (69,924 samples, 0.69%) + + + +@anon-func-435.5 (46,368 samples, 0.46%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +$lambda (2,880 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-161.5 (10,656 samples, 0.11%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,880 samples, 0.12%) + + + +encode (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (555,778 samples, 5.48%) +@anon-f.. + + +correction (1,104 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-361.7 (979 samples, 0.01%) + + + +@anon-func-435.5 (20,736 samples, 0.20%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,673 samples, 0.07%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (10,368 samples, 0.10%) + + + +finderCoords (21,908 samples, 0.22%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +forIn (1,323 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +generate (2,623 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (10,608 samples, 0.10%) + + + +@anon-func-173.5 (7,657 samples, 0.08%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +natZipWith (19,488 samples, 0.19%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +polyScale (1,152 samples, 0.01%) + + + +@anon-func-393.5 (1,026 samples, 0.01%) + + + +@anon-func-173.5 (1,114,733 samples, 10.99%) +@anon-func-173.5 + + +@anon-func-435.5 (56,414 samples, 0.56%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-38.11 (1,472 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-161.5 (4,808 samples, 0.05%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-173.5 (6,084 samples, 0.06%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (46,738 samples, 0.46%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-173.5 (122,224 samples, 1.20%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-435.5 (26,018 samples, 0.26%) + + + +rec (1,392 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (56,266 samples, 0.55%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyGrow (960 samples, 0.01%) + + + +@anon-func-300.5 (936 samples, 0.01%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +@anon-func-173.5 (4,976 samples, 0.05%) + + + +interleave (2,000 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +natToBytes (2,688 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-435.5 (5,445 samples, 0.05%) + + + +@anon-func-481.5 (4,929 samples, 0.05%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-300.5 (2,198 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (4,320 samples, 0.04%) + + + +map (864 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (49,652 samples, 0.49%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +$lambda (1,821 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +map (46,208 samples, 0.46%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,767 samples, 0.02%) + + + +@anon-func-30.36 (1,142 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (194,326 samples, 1.92%) +@.. + + +encode (2,000 samples, 0.02%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-173.5 (4,264 samples, 0.04%) + + + +go (1,584 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (2,812 samples, 0.03%) + + + +polyAdd (4,272 samples, 0.04%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,184 samples, 0.05%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,184 samples, 0.05%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-173.5 (9,360 samples, 0.09%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (9,140 samples, 0.09%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +polyZipWith (928 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-173.5 (6,500 samples, 0.06%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-435.5 (1,980 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-54.15 (1,980 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (7,867 samples, 0.08%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (5,928 samples, 0.06%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +pathCoords (26,582 samples, 0.26%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (8,257 samples, 0.08%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-435.5 (3,981 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-435.5 (13,863 samples, 0.14%) + + + +@anon-func-289.5 (2,950 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (1,664 samples, 0.02%) + + + +@anon-func-435.5 (34,560 samples, 0.34%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-173.5 (818,625 samples, 8.07%) +@anon-func-.. + + +@anon-func-435.5 (42,014 samples, 0.41%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (56,355 samples, 0.56%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (11,161 samples, 0.11%) + + + +polyAdd (1,216 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,704 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +rec (5,142 samples, 0.05%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (6,144 samples, 0.06%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +$lambda (1,115 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-435.5 (14,595 samples, 0.14%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,390 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (483,279 samples, 4.76%) +@anon.. + + +@anon-func-435.5 (5,856 samples, 0.06%) + + + +generate (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,142 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (9,204 samples, 0.09%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +rec (31,932 samples, 0.31%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-435.5 (12,033 samples, 0.12%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (1,875 samples, 0.02%) + + + +rec (67,556 samples, 0.67%) + + + +generate (2,955 samples, 0.03%) + + + +pathCoords (17,696 samples, 0.17%) + + + +pathCoords (1,390 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +elemAdd (2,688 samples, 0.03%) + + + +@anon-func-435.5 (24,554 samples, 0.24%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (888 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +$lambda (2,880 samples, 0.03%) + + + +pathCoords (4,808 samples, 0.05%) + + + +@anon-func-435.5 (11,770 samples, 0.12%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,517 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (1,142 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-435.5 (1,663 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (1,419 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +@anon-func-30.36 (1,136 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (15,552 samples, 0.15%) + + + +interleave (1,216 samples, 0.01%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (28,092 samples, 0.28%) + + + +go (1,391 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +pathCoords (2,614,330 samples, 25.77%) +pathCoords + + +@anon-func-48.7 (864 samples, 0.01%) + + + +elemAdd (34,944 samples, 0.34%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAdd (3,904 samples, 0.04%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (972 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-435.5 (2,376 samples, 0.02%) + + + +rec (45,618 samples, 0.45%) + + + +encode (2,955 samples, 0.03%) + + + +polyAdd (880 samples, 0.01%) + + + +polyDivMod (1,017 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (60,404 samples, 0.60%) + + + +@anon-func-435.5 (21,312 samples, 0.21%) + + + +@anon-func-161.5 (1,568 samples, 0.02%) + + + +correction (1,120 samples, 0.01%) + + + +generate (2,884 samples, 0.03%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +map (11,934 samples, 0.12%) + + + +go (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-51.11 (19,224 samples, 0.19%) + + + +@anon-func-161.5 (1,728 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +elemAdd (81,984 samples, 0.81%) + + + +interleave (1,760 samples, 0.02%) + + + +encode (2,000 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (3,630 samples, 0.04%) + + + +@anon-func-435.5 (4,087 samples, 0.04%) + + + +interleave (2,592 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +@anon-func-173.5 (230,230 samples, 2.27%) +@.. + + +go (2,880 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +rec (3,892 samples, 0.04%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (29,376 samples, 0.29%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-173.5 (42,916 samples, 0.42%) + + + +@anon-func-79.3 (2,480 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,895 samples, 0.05%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (149,446 samples, 1.47%) + + + +@anon-func-435.5 (3,552 samples, 0.04%) + + + +@anon-func-173.5 (1,185 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +go (1,136 samples, 0.01%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +@anon-func-481.5 (2,200 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (2,480 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-173.5 (862,349 samples, 8.50%) +@anon-func-1.. + + +polyDivMod (1,170 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (59,006 samples, 0.58%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (9,392 samples, 0.09%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-173.5 (197,142 samples, 1.94%) +@.. + + +@anon-func-79.3 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,394 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,472 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (13,824 samples, 0.14%) + + + +$lambda (880 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +polyAdd (1,770 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,048 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,840 samples, 0.02%) + + + +@anon-func-51.11 (5,208 samples, 0.05%) + + + +@anon-func-435.5 (18,133 samples, 0.18%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (57,044 samples, 0.56%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-173.5 (2,084 samples, 0.02%) + + + +@anon-func-38.11 (1,023 samples, 0.01%) + + + +@anon-func-481.5 (2,125 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (85,525 samples, 0.84%) + + + +@anon-func-51.11 (1,767 samples, 0.02%) + + + +@anon-func-79.3 (19,224 samples, 0.19%) + + + +@anon-func-30.36 (892 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +rec (71,108 samples, 0.70%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,200 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (1,364 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (8,424 samples, 0.08%) + + + +go (1,152 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +polyMulTerm (886 samples, 0.01%) + + + +rec (32,859 samples, 0.32%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +$lambda (11,934 samples, 0.12%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,528 samples, 0.06%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-173.5 (9,646 samples, 0.10%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (53,526 samples, 0.53%) + + + +@anon-func-435.5 (8,512 samples, 0.08%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (1,189,428 samples, 11.73%) +@anon-func-173.5 + + +polySub (864 samples, 0.01%) + + + +encode (4,808 samples, 0.05%) + + + +@anon-func-481.5 (1,490 samples, 0.01%) + + + +@anon-func-173.5 (2,132 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,712 samples, 0.04%) + + + +@anon-func-173.5 (1,086,569 samples, 10.71%) +@anon-func-173.5 + + +generate (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +polyZipWith (880 samples, 0.01%) + + + +polyOrder (8,559 samples, 0.08%) + + + +map (1,023 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-32.65 (1,704 samples, 0.02%) + + + +@anon-func-173.5 (98,821 samples, 0.97%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (9,906 samples, 0.10%) + + + +@anon-func-161.5 (1,620 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (9,185 samples, 0.09%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-173.5 (24,544 samples, 0.24%) + + + +@anon-func-51.11 (931 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +rec (2,392 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,660 samples, 0.05%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,380 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-32.65 (71,900 samples, 0.71%) + + + +rec (2,517 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-435.5 (17,024 samples, 0.17%) + + + +correction (880 samples, 0.01%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +polyLen (67,311 samples, 0.66%) + + + +polyDivMod (10,608 samples, 0.10%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (123,443 samples, 1.22%) + + + +interleave (864 samples, 0.01%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +map (1,014 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +rec (50,225 samples, 0.50%) + + + +@anon-func-435.5 (26,624 samples, 0.26%) + + + +@anon-func-173.5 (8,190 samples, 0.08%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (10,501 samples, 0.10%) + + + +@anon-func-481.5 (1,143 samples, 0.01%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-435.5 (12,277 samples, 0.12%) + + + +interleave (4,400 samples, 0.04%) + + + +@anon-func-435.5 (18,487 samples, 0.18%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (1,518 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (2,318 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (35,174 samples, 0.35%) + + + +interleave (1,584 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,680 samples, 0.10%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (1,375 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (4,160 samples, 0.04%) + + + +@anon-func-161.5 (2,352 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-173.5 (958,821 samples, 9.45%) +@anon-func-17.. + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-30.36 (9,140 samples, 0.09%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,353 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyDivMod (24,704 samples, 0.24%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,142 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +go (1,636 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyAdd (29,376 samples, 0.29%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-435.5 (36,288 samples, 0.36%) + + + +encode (23,732 samples, 0.23%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (18,150 samples, 0.18%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-453.5 (3,646 samples, 0.04%) + + + +@anon-func-393.5 (1,134 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +encode (2,950 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,340 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +map (1,267 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-412.5 (1,422 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-54.15 (1,404 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +$lambda (3,111 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +encode (1,299 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-173.5 (5,148 samples, 0.05%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,011 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +go (8,262 samples, 0.08%) + + + +@anon-func-79.3 (1,664 samples, 0.02%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (2,471 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (8,145 samples, 0.08%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +$lambda (3,946 samples, 0.04%) + + + +map (1,952 samples, 0.02%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyPadRight (1,402 samples, 0.01%) + + + +@anon-func-300.5 (2,480 samples, 0.02%) + + + +@anon-func-173.5 (136,168 samples, 1.34%) + + + +polyAdd (2,432 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +map (1,886 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,152 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (1,821 samples, 0.02%) + + + +@anon-func-30.36 (1,386 samples, 0.01%) + + + +@anon-func-173.5 (132,076 samples, 1.30%) + + + +@anon-func-173.5 (68,607 samples, 0.68%) + + + +@anon-func-173.5 (8,294 samples, 0.08%) + + + +rec (3,159 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +motoko_rts::idl::parse_fields::h7550309913b4db63 (1,439 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-173.5 (3,451 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +rec (1,821 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,504 samples, 0.01%) + + + +correction (1,517 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +formatCoords (1,404 samples, 0.01%) + + + +@anon-func-79.3 (1,017 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +go (28,290 samples, 0.28%) + + + +rec (36,567 samples, 0.36%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (250,470 samples, 2.47%) +@a.. + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-435.5 (14,707 samples, 0.14%) + + + +interleave (1,584 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +go (1,642 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +compacting_gc (1,104 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,154 samples, 0.02%) + + + +polyAddTerm (1,892 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-435.5 (10,325 samples, 0.10%) + + + +@anon-func-79.3 (2,623 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +traceCoords (1,230 samples, 0.01%) + + + +@anon-func-173.5 (386,831 samples, 3.81%) +@ano.. + + +@anon-func-173.5 (410,943 samples, 4.05%) +@ano.. + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +correction (1,642 samples, 0.02%) + + + +@anon-func-38.11 (46,208 samples, 0.46%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-32.65 (3,520 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-173.5 (221,078 samples, 2.18%) +@.. + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-173.5 (4,428 samples, 0.04%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (6,994 samples, 0.07%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-435.5 (45,614 samples, 0.45%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (57,854 samples, 0.57%) + + + +@anon-func-435.5 (8,360 samples, 0.08%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (7,826 samples, 0.08%) + + + +polySub (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,720 samples, 0.06%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,928 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (4,259 samples, 0.04%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-435.5 (6,050 samples, 0.06%) + + + +@anon-func-173.5 (4,394 samples, 0.04%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (89,529 samples, 0.88%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,212 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,616 samples, 0.15%) + + + +go (1,104 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,430 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (18,743 samples, 0.18%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-161.5 (71,900 samples, 0.71%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-435.5 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (1,650 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,184 samples, 0.05%) + + + +@anon-func-161.5 (1,704 samples, 0.02%) + + + +encode (2,384 samples, 0.02%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +go (2,880 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-173.5 (10,112 samples, 0.10%) + + + +@anon-func-173.5 (1,367 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +encode (1,584 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +polyDivMod (1,207 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-173.5 (740,669 samples, 7.30%) +@anon-func.. + + +go (1,184 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,111,621 samples, 10.96%) +@anon-func-173.5 + + +@anon-func-173.5 (837,297 samples, 8.25%) +@anon-func-.. + + +polyDivMod (1,184 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (8,320 samples, 0.08%) + + + +encode (2,592 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +pathCoords (1,107 samples, 0.01%) + + + +@anon-func-481.5 (1,470 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (771,789 samples, 7.61%) +@anon-func.. + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-481.5 (3,080 samples, 0.03%) + + + +@anon-func-435.5 (12,870 samples, 0.13%) + + + +$lambda (880 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-173.5 (796,841 samples, 7.86%) +@anon-func-.. + + +generate (1,253 samples, 0.01%) + + + +@anon-func-481.5 (6,936 samples, 0.07%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +interleave (2,592 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-435.5 (4,528 samples, 0.04%) + + + +polyAddTerm (24,704 samples, 0.24%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,512 samples, 0.05%) + + + +@anon-func-173.5 (81,904 samples, 0.81%) + + + +@anon-func-48.7 (1,207 samples, 0.01%) + + + +@anon-func-79.3 (13,768 samples, 0.14%) + + + +@anon-func-435.5 (5,527 samples, 0.05%) + + + +@anon-func-393.5 (1,316 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +parse_idl_header (1,439 samples, 0.01%) + + + +$lambda (8,262 samples, 0.08%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +correction (1,392 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (187,870 samples, 1.85%) +@.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (444,097 samples, 4.38%) +@anon.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (29,184 samples, 0.29%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,299 samples, 0.01%) + + + +@anon-func-54.15 (2,619,743 samples, 25.82%) +@anon-func-54.15 + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAdd (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (53,174 samples, 0.52%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,992 samples, 0.05%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +encode (1,048 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +rec (2,211 samples, 0.02%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (986,829 samples, 9.73%) +@anon-func-173.5 + + +@anon-func-54.15 (26,582 samples, 0.26%) + + + +rec (5,157 samples, 0.05%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +@anon-func-435.5 (14,473 samples, 0.14%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +rec (1,269 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-161.5 (1,196 samples, 0.01%) + + + +@anon-func-173.5 (377,789 samples, 3.72%) +@ano.. + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +rec (3,874 samples, 0.04%) + + + +@anon-func-435.5 (10,944 samples, 0.11%) + + + +encode (2,075 samples, 0.02%) + + + +rec (9,642 samples, 0.10%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,099 samples, 0.04%) + + + +@anon-func-435.5 (48,640 samples, 0.48%) + + + +@anon-func-30.36 (1,299 samples, 0.01%) + + + +@anon-func-435.5 (8,415 samples, 0.08%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-173.5 (1,341 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-173.5 (25,272 samples, 0.25%) + + + +polyAdd (6,848 samples, 0.07%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,811 samples, 0.02%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (103,873 samples, 1.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (55,689 samples, 0.55%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-161.5 (882 samples, 0.01%) + + + +encode (13,768 samples, 0.14%) + + + +rec (1,215 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +rec (1,647 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-79.3 (1,253 samples, 0.01%) + + + +@anon-func-435.5 (9,307 samples, 0.09%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +rec (11,267 samples, 0.11%) + + + +@anon-func-54.15 (2,457 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,263 samples, 0.01%) + + + +@anon-func-173.5 (962 samples, 0.01%) + + + +@anon-func-48.7 (46,208 samples, 0.46%) + + + +polyAdd (928 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-32.65 (3,520 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-161.5 (2,816 samples, 0.03%) + + + +rec (11,142 samples, 0.11%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (41,146 samples, 0.41%) + + + +polyZipWith (1,034 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (57,494 samples, 0.57%) + + + +polyAdd (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-173.5 (2,162 samples, 0.02%) + + + +@anon-func-173.5 (955,709 samples, 9.42%) +@anon-func-17.. + + +@anon-func-173.5 (203,478 samples, 2.01%) +@.. + + +@anon-func-173.5 (90,640 samples, 0.89%) + + + +@anon-func-435.5 (1,696 samples, 0.02%) + + + +@anon-func-435.5 (6,784 samples, 0.07%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,391 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-435.5 (9,181 samples, 0.09%) + + + +@anon-func-435.5 (7,810 samples, 0.08%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (4,808 samples, 0.05%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (28,207 samples, 0.28%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (5,386 samples, 0.05%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,349 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +encode (2,688 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-173.5 (37,456 samples, 0.37%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +generate (2,112 samples, 0.02%) + + + +@anon-func-481.5 (6,013 samples, 0.06%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-173.5 (4,550 samples, 0.04%) + + + +map (1,760 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,634 samples, 0.04%) + + + +@anon-func-48.7 (1,207 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,142 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,472 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +generate (1,730 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-173.5 (902 samples, 0.01%) + + + +flatten (4,266 samples, 0.04%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (43,586 samples, 0.43%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,584 samples, 0.04%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAdd (2,322 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (19,224 samples, 0.19%) + + + +@anon-func-173.5 (413,957 samples, 4.08%) +@ano.. + + +@anon-func-435.5 (3,010 samples, 0.03%) + + + +@anon-func-173.5 (108,735 samples, 1.07%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-173.5 (247,329 samples, 2.44%) +@a.. + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +polyScale (2,000 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (4,808 samples, 0.05%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-161.5 (888 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-265.5 (2,800 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +padLeftTo (1,050 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (10,608 samples, 0.10%) + + + +rec (4,142 samples, 0.04%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (187,118 samples, 1.84%) +@.. + + +interleave (2,880 samples, 0.03%) + + + +polyAdd (864 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +rec (27,915 samples, 0.28%) + + + +correction (931 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,764 samples, 0.02%) + + + +$lambda (1,950 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (5,280 samples, 0.05%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-161.5 (6,144 samples, 0.06%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,392 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,326 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +rec (4,654 samples, 0.05%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,212 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-481.5 (1,407 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +$lambda (1,892 samples, 0.02%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,980 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +rec (4,131 samples, 0.04%) + + + +@anon-func-32.65 (1,107 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (19,910 samples, 0.20%) + + + +@anon-func-173.5 (465,195 samples, 4.59%) +@anon.. + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (25,423 samples, 0.25%) + + + +natFromBytes (66,528 samples, 0.66%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +map (1,767 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,486 samples, 0.02%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +interleave (1,636 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (10,752 samples, 0.11%) + + + +go (880 samples, 0.01%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (19,360 samples, 0.19%) + + + +@anon-func-173.5 (9,568 samples, 0.09%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-300.5 (13,768 samples, 0.14%) + + + +@anon-func-173.5 (232,342 samples, 2.29%) +@.. + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +toList (1,107 samples, 0.01%) + + + +@anon-func-435.5 (13,200 samples, 0.13%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (4,734 samples, 0.05%) + + + +@anon-func-161.5 (7,840 samples, 0.08%) + + + +@anon-func-435.5 (1,749 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (211,926 samples, 2.09%) +@.. + + +interleave (1,152 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (6,336 samples, 0.06%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (22,220 samples, 0.22%) + + + +@anon-func-173.5 (3,037 samples, 0.03%) + + + +rec (48,656 samples, 0.48%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +rec (10,175 samples, 0.10%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (1,080,345 samples, 10.65%) +@anon-func-173.5 + + +encode (1,952 samples, 0.02%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (238,287 samples, 2.35%) +@.. + + +rec (4,617 samples, 0.05%) + + + +correction (2,688 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (10,152 samples, 0.10%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +pathCoords (76,220 samples, 0.75%) + + + +@anon-func-435.5 (2,352 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (40,244 samples, 0.40%) + + + +@anon-func-435.5 (27,648 samples, 0.27%) + + + +@anon-func-244.5 (5,202 samples, 0.05%) + + + +@anon-func-32.65 (1,764 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyScale (1,760 samples, 0.02%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +pathCoords (1,107 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +@anon-func-79.3 (3,033 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (1,567 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (18,307 samples, 0.18%) + + + +@anon-func-48.7 (2,623 samples, 0.03%) + + + +encode (2,349 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (2,175 samples, 0.02%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-435.5 (8,030 samples, 0.08%) + + + +polyGrow (2,138 samples, 0.02%) + + + +@anon-func-161.5 (2,976 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,892 samples, 0.02%) + + + +map (1,504 samples, 0.01%) + + + +@anon-func-48.7 (10,152 samples, 0.10%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +$lambda (1,120 samples, 0.01%) + + + +@anon-func-435.5 (2,911 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +pathCoords (1,527 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (1,014 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-435.5 (17,407 samples, 0.17%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +$lambda (2,457 samples, 0.02%) + + + +@anon-func-51.11 (15,487 samples, 0.15%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +rec (2,884 samples, 0.03%) + + + +@anon-func-435.5 (35,290 samples, 0.35%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (193,622 samples, 1.91%) +@.. + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (42,097 samples, 0.41%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-173.5 (44,276 samples, 0.44%) + + + +interleave (880 samples, 0.01%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-173.5 (3,042 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +go (1,472 samples, 0.01%) + + + +rec (18,837 samples, 0.19%) + + + +@anon-func-435.5 (6,607 samples, 0.07%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,105 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +correction (1,017 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +go (2,496 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-481.5 (2,403 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (18,700 samples, 0.18%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-173.5 (18,052 samples, 0.18%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (20,160 samples, 0.20%) + + + +interleave (1,152 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +finderBLCoords (6,016 samples, 0.06%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +rec (9,541 samples, 0.09%) + + + +@anon-func-173.5 (316,807 samples, 3.12%) +@an.. + + +rec (19,054 samples, 0.19%) + + + +map (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-435.5 (7,488 samples, 0.07%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-173.5 (12,865 samples, 0.13%) + + + +@anon-func-435.5 (14,717 samples, 0.15%) + + + +@anon-func-173.5 (787,505 samples, 7.76%) +@anon-func.. + + +@anon-func-173.5 (5,249 samples, 0.05%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (3,202 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (3,245 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (3,126 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-435.5 (43,342 samples, 0.43%) + + + +@anon-func-435.5 (6,080 samples, 0.06%) + + + +@anon-func-38.11 (931 samples, 0.01%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (513,419 samples, 5.06%) +@anon-.. + + +@anon-func-161.5 (12,320 samples, 0.12%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (39,490 samples, 0.39%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-412.5 (2,808 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,262 samples, 0.05%) + + + +@anon-func-173.5 (10,583 samples, 0.10%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (12,064 samples, 0.12%) + + + +@anon-func-435.5 (26,227 samples, 0.26%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,033,509 samples, 10.19%) +@anon-func-173.5 + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +$lambda (21,908 samples, 0.22%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +encode (2,448 samples, 0.02%) + + + +@anon-func-173.5 (27,370 samples, 0.27%) + + + +@anon-func-173.5 (9,178 samples, 0.09%) + + + +@anon-func-173.5 (8,060 samples, 0.08%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-435.5 (15,950 samples, 0.16%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-173.5 (34,196 samples, 0.34%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +map (1,761 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,330 samples, 0.01%) + + + +@anon-func-481.5 (3,107 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-173.5 (3,347 samples, 0.03%) + + + +@anon-func-51.11 (2,623 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +interleave (4,266 samples, 0.04%) + + + +@anon-func-481.5 (4,461 samples, 0.04%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (18,432 samples, 0.18%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (251,878 samples, 2.48%) +@a.. + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +rec (39,966 samples, 0.39%) + + + +rec (10,267 samples, 0.10%) + + + +@anon-func-32.65 (972 samples, 0.01%) + + + +@anon-func-173.5 (11,465 samples, 0.11%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +natFromBits (1,184 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,504 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,075 samples, 0.02%) + + + +@anon-func-161.5 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (4,858 samples, 0.05%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-265.5 (2,275 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +generate (2,826 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (8,373 samples, 0.08%) + + + +encode (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +rec (1,917 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (718,885 samples, 7.09%) +@anon-fun.. + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (1,456 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +@anon-func-161.5 (7,776 samples, 0.08%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (19,924 samples, 0.20%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-435.5 (192,533 samples, 1.90%) +@.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (945 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +go (936 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-51.11 (931 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyScale (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,048 samples, 0.06%) + + + +$lambda (1,980 samples, 0.02%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (16,547 samples, 0.16%) + + + +polyAdd (2,688 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +rec (11,772 samples, 0.12%) + + + +@anon-func-30.36 (15,487 samples, 0.15%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +interleave (1,760 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (3,703 samples, 0.04%) + + + +@anon-func-481.5 (1,143 samples, 0.01%) + + + +polyDivMod (19,224 samples, 0.19%) + + + +$lambda (9,320 samples, 0.09%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +polyAdd (5,760 samples, 0.06%) + + + +generate (2,975 samples, 0.03%) + + + +rec (1,716 samples, 0.02%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,527 samples, 0.02%) + + + +@anon-func-173.5 (4,758 samples, 0.05%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (7,776 samples, 0.08%) + + + +map (1,216 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (1,392 samples, 0.01%) + + + +@anon-func-161.5 (11,040 samples, 0.11%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-481.5 (2,930 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,999 samples, 0.04%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (28,288 samples, 0.28%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +generate (2,955 samples, 0.03%) + + + +polySub (1,216 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,170 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-79.3 (21,948 samples, 0.22%) + + + +@anon-func-79.3 (1,642 samples, 0.02%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +map (1,115 samples, 0.01%) + + + +@anon-func-435.5 (1,914 samples, 0.02%) + + + +@anon-func-79.3 (1,440 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,330 samples, 0.01%) + + + +@anon-func-435.5 (36,288 samples, 0.36%) + + + +@anon-func-435.5 (6,985 samples, 0.07%) + + + +interleave (1,207 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +rec (2,781 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (1,472 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,768 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +polyAdd (1,909 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyAdd (5,184 samples, 0.05%) + + + +interleave (864 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +elemToBits (3,432 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (43,098 samples, 0.42%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +go (1,216 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-173.5 (10,712 samples, 0.11%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,517 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-173.5 (912 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +padLeft (994 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (3,536 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (102,729 samples, 1.01%) + + + +map (1,760 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (88,957 samples, 0.88%) + + + +@anon-func-173.5 (1,889 samples, 0.02%) + + + +@anon-func-435.5 (2,145 samples, 0.02%) + + + +map (1,216 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,391 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,232 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +elemMul (8,624 samples, 0.09%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +polyLeadCoeff (13,871 samples, 0.14%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +@anon-func-173.5 (5,288 samples, 0.05%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-481.5 (1,434 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (92,103 samples, 0.91%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +$lambda (1,125 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,470 samples, 0.08%) + + + +@anon-func-435.5 (3,505 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (224,598 samples, 2.21%) +@.. + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (60,885 samples, 0.60%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-435.5 (35,750 samples, 0.35%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (2,544 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (103,015 samples, 1.02%) + + + +@anon-func-173.5 (1,976 samples, 0.02%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (2,754 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +rec (1,717 samples, 0.02%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-481.5 (3,638 samples, 0.04%) + + + +finderCoords (6,022 samples, 0.06%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (972 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-435.5 (63,360 samples, 0.62%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (616,214 samples, 6.07%) +@anon-fu.. + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (92,656 samples, 0.91%) + + + +@anon-func-435.5 (103,680 samples, 1.02%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (1,120 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-435.5 (7,920 samples, 0.08%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,386 samples, 0.01%) + + + +@anon-func-173.5 (49,195 samples, 0.48%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (3,905 samples, 0.04%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-51.11 (1,504 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-173.5 (21,724 samples, 0.21%) + + + +rec (26,061 samples, 0.26%) + + + +interleave (10,152 samples, 0.10%) + + + +rec (3,245 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (14,592 samples, 0.14%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (27,880 samples, 0.27%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +go (40,620 samples, 0.40%) + + + +@anon-func-30.36 (1,115 samples, 0.01%) + + + +@anon-func-435.5 (36,974 samples, 0.36%) + + + +polyDivMod (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-161.5 (14,937 samples, 0.15%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +pathCoords (1,944 samples, 0.02%) + + + +interleave (2,384 samples, 0.02%) + + + +map (1,170 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (5,940 samples, 0.06%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (143,110 samples, 1.41%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-435.5 (59,294 samples, 0.58%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (10,478 samples, 0.10%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (48,922 samples, 0.48%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +$lambda (2,614,330 samples, 25.77%) +$lambda + + +generate (2,877 samples, 0.03%) + + + +map (1,267 samples, 0.01%) + + + +@anon-func-435.5 (8,719 samples, 0.09%) + + + +natZipWith (12,096 samples, 0.12%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +polyAddTerm (2,000 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (2,931 samples, 0.03%) + + + +@anon-func-435.5 (27,970 samples, 0.28%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,850 samples, 0.02%) + + + +@anon-func-453.5 (2,520 samples, 0.02%) + + + +polyGrow (3,659 samples, 0.04%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-173.5 (110,451 samples, 1.09%) + + + +@anon-func-435.5 (19,030 samples, 0.19%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +encode (24,704 samples, 0.24%) + + + +$lambda (2,128 samples, 0.02%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-412.5 (1,608 samples, 0.02%) + + + +@anon-func-173.5 (1,967 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (24,084 samples, 0.24%) + + + +@anon-func-435.5 (26,048 samples, 0.26%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (4,704 samples, 0.05%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (8,216 samples, 0.08%) + + + +map (2,880 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +correction (1,120 samples, 0.01%) + + + +encode (1,207 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +correction (1,391 samples, 0.01%) + + + +natXor (46,368 samples, 0.46%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (3,004 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,642 samples, 0.02%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-79.3 (3,630 samples, 0.04%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +pathCoords (3,520 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +encode (2,384 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,320 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyDivMod (1,207 samples, 0.01%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,253 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (24,232 samples, 0.24%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +polyAdd (5,376 samples, 0.05%) + + + +polyAdd (3,424 samples, 0.03%) + + + +@anon-func-435.5 (8,305 samples, 0.08%) + + + +@anon-func-173.5 (2,652 samples, 0.03%) + + + +@anon-func-173.5 (4,676 samples, 0.05%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,125 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-173.5 (734,445 samples, 7.24%) +@anon-func.. + + +@anon-func-173.5 (4,519 samples, 0.04%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-173.5 (126,535 samples, 1.25%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-435.5 (6,656 samples, 0.07%) + + + +@anon-func-173.5 (22,396 samples, 0.22%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (5,347 samples, 0.05%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (931 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-435.5 (12,288 samples, 0.12%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (1,120 samples, 0.01%) + + + +@anon-func-161.5 (1,925 samples, 0.02%) + + + +encode (1,326 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (106,733 samples, 1.05%) + + + +$lambda (1,267 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-51.11 (3,033 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,886 samples, 0.02%) + + + +@anon-func-173.5 (10,270 samples, 0.10%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (6,734 samples, 0.07%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (2,444 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-173.5 (7,358 samples, 0.07%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-481.5 (900 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,068 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-435.5 (7,507 samples, 0.07%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +patternCoords (26,582 samples, 0.26%) + + + +polyDivMod (1,887 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +generate (2,826 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +encode (21,888 samples, 0.22%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (7,663 samples, 0.08%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (4,090 samples, 0.04%) + + + +polyScale (2,000 samples, 0.02%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-265.5 (3,708 samples, 0.04%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,196 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (6,890 samples, 0.07%) + + + +@anon-func-173.5 (112,144 samples, 1.11%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-435.5 (36,480 samples, 0.36%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-435.5 (31,630 samples, 0.31%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (2,030 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (154,374 samples, 1.52%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (30,106 samples, 0.30%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,355 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (2,480 samples, 0.02%) + + + +correction (1,326 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (41,344 samples, 0.41%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (91,531 samples, 0.90%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (1,890 samples, 0.02%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +elemMul (2,288 samples, 0.02%) + + + +@anon-func-435.5 (2,816 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +polySub (1,152 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-481.5 (2,151 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +interleave (1,952 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,205 samples, 0.15%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-161.5 (1,104 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-173.5 (9,828 samples, 0.10%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (13,339 samples, 0.13%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +polyDivMod (886 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-435.5 (6,543 samples, 0.06%) + + + +@anon-func-173.5 (432,041 samples, 4.26%) +@anon.. + + +encode (2,975 samples, 0.03%) + + + +rec (891 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (1,980 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-435.5 (15,730 samples, 0.16%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-435.5 (10,569 samples, 0.10%) + + + +$lambda (1,664 samples, 0.02%) + + + +@anon-func-79.3 (26,689 samples, 0.26%) + + + +$lambda (2,975 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,614,330 samples, 25.77%) +@anon-func-51.11 + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-481.5 (2,151 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +rec (5,392 samples, 0.05%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (41,184 samples, 0.41%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (12,399 samples, 0.12%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,142 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,884 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,761 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +rec (22,309 samples, 0.22%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-481.5 (5,688 samples, 0.06%) + + + +@anon-func-173.5 (5,340 samples, 0.05%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-435.5 (63,360 samples, 0.62%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-300.5 (32,928 samples, 0.32%) + + + +@anon-func-173.5 (120,880 samples, 1.19%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (1,430 samples, 0.01%) + + + +@anon-func-435.5 (9,247 samples, 0.09%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +encode (1,115 samples, 0.01%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +interleave (8,120 samples, 0.08%) + + + +rec (4,340 samples, 0.04%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (319,821 samples, 3.15%) +@an.. + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (1,392 samples, 0.01%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-435.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (2,343 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-404.5 (5,390 samples, 0.05%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-453.5 (3,960 samples, 0.04%) + + + +@anon-func-173.5 (3,016 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-173.5 (83,920 samples, 0.83%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +go (46,208 samples, 0.46%) + + + +@anon-func-48.7 (3,375 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (16,425 samples, 0.16%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (16,500 samples, 0.16%) + + + +@anon-func-161.5 (1,755 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (19,690 samples, 0.19%) + + + +encode (3,375 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-435.5 (5,567 samples, 0.05%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,024 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-435.5 (17,820 samples, 0.18%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,280 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-435.5 (10,780 samples, 0.11%) + + + +polySub (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (206,294 samples, 2.03%) +@.. + + +encode (2,880 samples, 0.03%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-173.5 (51,414 samples, 0.51%) + + + +@anon-func-173.5 (1,470 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +finderTRCoords (5,974 samples, 0.06%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyAdd (928 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +traceCoords (1,107 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (5,668 samples, 0.06%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (6,016 samples, 0.06%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-51.11 (2,826 samples, 0.03%) + + + +@anon-func-51.11 (9,140 samples, 0.09%) + + + +@anon-func-30.36 (1,430 samples, 0.01%) + + + +@anon-func-54.15 (3,520 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (2,035 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,635 samples, 0.09%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,517 samples, 0.01%) + + + +go (1,207 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (10,152 samples, 0.10%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-173.5 (87,241 samples, 0.86%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +go (24,704 samples, 0.24%) + + + +@anon-func-173.5 (91,312 samples, 0.90%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,826 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,610 samples, 0.02%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-435.5 (6,427 samples, 0.06%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-435.5 (4,713 samples, 0.05%) + + + +@anon-func-435.5 (9,728 samples, 0.10%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyScale (2,384 samples, 0.02%) + + + +@anon-func-481.5 (3,439 samples, 0.03%) + + + +@anon-func-161.5 (1,560 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-435.5 (2,880 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-51.11 (21,908 samples, 0.22%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (253,990 samples, 2.50%) +@a.. + + +@anon-func-173.5 (8,238 samples, 0.08%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-54.15 (71,900 samples, 0.71%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (60,027 samples, 0.59%) + + + +map (880 samples, 0.01%) + + + +encode (21,948 samples, 0.22%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (926 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +rec (17,847 samples, 0.18%) + + + +polyAdd (909 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,875 samples, 0.02%) + + + +@anon-func-173.5 (215,446 samples, 2.12%) +@.. + + +rec (1,642 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-481.5 (2,619 samples, 0.03%) + + + +@anon-func-173.5 (87,952 samples, 0.87%) + + + +@anon-func-435.5 (8,521 samples, 0.08%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +polyScale (2,000 samples, 0.02%) + + + +@anon-func-435.5 (7,776 samples, 0.08%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +toListWithLength (1,775 samples, 0.02%) + + + +polyAdd (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +polyDivMod (46,208 samples, 0.46%) + + + +@anon-func-435.5 (7,315 samples, 0.07%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-435.5 (11,623 samples, 0.11%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (13,447 samples, 0.13%) + + + +@anon-func-173.5 (2,262 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +interleave (46,208 samples, 0.46%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyDivMod (1,472 samples, 0.01%) + + + +polyPadLeft (1,586 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (2,970 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +correction (1,207 samples, 0.01%) + + + +rec (12,609 samples, 0.12%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (3,072 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-133.5 (2,112 samples, 0.02%) + + + +encode (1,391 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,485 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,486 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-173.5 (13,684 samples, 0.13%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +rec (149,583 samples, 1.47%) + + + +@anon-func-412.5 (1,512 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (4,363 samples, 0.04%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,670 samples, 0.04%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +rec (2,673 samples, 0.03%) + + + +@anon-func-435.5 (8,965 samples, 0.09%) + + + +map (3,424 samples, 0.03%) + + + +polyAdd (2,208 samples, 0.02%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,299 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyDivMod (931 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +$lambda (4,734 samples, 0.05%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (46,208 samples, 0.46%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (49,574 samples, 0.49%) + + + +go (880 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-412.5 (1,316 samples, 0.01%) + + + +rec (2,055 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (960 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +correction (1,392 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,125 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (208,406 samples, 2.05%) +@.. + + +map (3,424 samples, 0.03%) + + + +rec (1,809 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-481.5 (2,154 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-161.5 (3,744 samples, 0.04%) + + + +rec (10,892 samples, 0.11%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +rec (989 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +polyScale (1,760 samples, 0.02%) + + + +$lambda (1,115 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (8,800 samples, 0.09%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-435.5 (23,707 samples, 0.23%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +encode (2,496 samples, 0.02%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-481.5 (2,970 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-51.11 (26,689 samples, 0.26%) + + + +@anon-func-435.5 (6,080 samples, 0.06%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +rec (54,755 samples, 0.54%) + + + +@anon-func-38.11 (1,115 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (11,000 samples, 0.11%) + + + +@anon-func-435.5 (30,654 samples, 0.30%) + + + +rec (1,755 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +rec (3,807 samples, 0.04%) + + + +rec (1,107 samples, 0.01%) + + + +@anon-func-173.5 (35,545 samples, 0.35%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-92.40 (2,303 samples, 0.02%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (9,313 samples, 0.09%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-30.36 (8,262 samples, 0.08%) + + + +interleave (1,011 samples, 0.01%) + + + +@anon-func-435.5 (8,580 samples, 0.08%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +rec (10,017 samples, 0.10%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-161.5 (21,709 samples, 0.21%) + + + +@anon-func-173.5 (486,293 samples, 4.79%) +@anon.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (3,431 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (1,440 samples, 0.01%) + + + +rec (9,892 samples, 0.10%) + + + +map (880 samples, 0.01%) + + + +@anon-func-173.5 (4,602 samples, 0.05%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-300.5 (946 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +$lambda (19,924 samples, 0.20%) + + + +go (1,152 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +go (3,424 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (1,207 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,887 samples, 0.03%) + + + +@anon-func-424.37 (13,867 samples, 0.14%) + + + +natToBits (8,206 samples, 0.08%) + + + +go (2,688 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-173.5 (106,768 samples, 1.05%) + + + +@anon-func-173.5 (855,969 samples, 8.44%) +@anon-func-1.. + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (18,176 samples, 0.18%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-32.65 (1,107 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +toBlocks (1,304 samples, 0.01%) + + + +@anon-func-435.5 (5,254 samples, 0.05%) + + + +generate (979 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,384 samples, 0.02%) + + + +@anon-func-173.5 (36,884 samples, 0.36%) + + + +correction (864 samples, 0.01%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,295 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,325 samples, 0.06%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (1,200 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (269,478 samples, 2.66%) +@a.. + + +@anon-func-435.5 (12,811 samples, 0.13%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,822 samples, 0.04%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-61.36 (1,304 samples, 0.01%) + + + +@anon-func-435.5 (10,897 samples, 0.11%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-173.5 (29,518 samples, 0.29%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-412.5 (5,196 samples, 0.05%) + + + +polyLen (2,190 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-435.5 (2,046 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +correction (892 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-435.5 (32,832 samples, 0.32%) + + + +rec (19,488 samples, 0.19%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (12,980 samples, 0.13%) + + + +@anon-func-435.5 (38,016 samples, 0.37%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-161.5 (9,216 samples, 0.09%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-54.15 (1,390 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-173.5 (8,840 samples, 0.09%) + + + +pathCoords (3,111 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,380 samples, 0.01%) + + + +@anon-func-435.5 (7,069 samples, 0.07%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-173.5 (715,773 samples, 7.06%) +@anon-fun.. + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,255 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-435.5 (47,414 samples, 0.47%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +rec (31,005 samples, 0.31%) + + + +interleave (1,950 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +rec (5,915 samples, 0.06%) + + + +@anon-func-173.5 (8,918 samples, 0.09%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,423 samples, 0.11%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (1,186,316 samples, 11.69%) +@anon-func-173.5 + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polySub (3,424 samples, 0.03%) + + + +interleave (1,014 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-173.5 (61,743 samples, 0.61%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (3,155 samples, 0.03%) + + + +@anon-func-51.11 (1,767 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +patternCoords (972 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-481.5 (1,750 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (3,816 samples, 0.04%) + + + +@anon-func-229.5 (875 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (10,831 samples, 0.11%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-161.5 (18,896 samples, 0.19%) + + + +go (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-30.36 (1,767 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (127,036 samples, 1.25%) + + + +@anon-func-173.5 (9,407 samples, 0.09%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +pathCoords (4,734 samples, 0.05%) + + + +@anon-func-51.11 (1,048 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-173.5 (1,030,397 samples, 10.16%) +@anon-func-173.5 + + +encode (2,975 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-38.11 (1,518 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-435.5 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (9,984 samples, 0.10%) + + + +interleave (1,120 samples, 0.01%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-435.5 (12,320 samples, 0.12%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +rec (3,969 samples, 0.04%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (2,240 samples, 0.02%) + + + +@anon-func-453.5 (3,736 samples, 0.04%) + + + +@anon-func-173.5 (99,376 samples, 0.98%) + + + +rec (21,441 samples, 0.21%) + + + +polyDivMod (2,448 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +elemToBits (2,628 samples, 0.03%) + + + +@anon-func-435.5 (20,827 samples, 0.21%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-54.15 (1,107 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,392 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (7,728 samples, 0.08%) + + + +@anon-func-435.5 (45,974 samples, 0.45%) + + + +elemToBits (4,015 samples, 0.04%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (46,208 samples, 0.46%) + + + +$lambda (2,496 samples, 0.02%) + + + +rec (48,222 samples, 0.48%) + + + +@anon-func-173.5 (202,070 samples, 1.99%) +@.. + + +go (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (21,504 samples, 0.21%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (18,499 samples, 0.18%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (1,142 samples, 0.01%) + + + +$lambda (23,772 samples, 0.23%) + + + +correction (46,208 samples, 0.46%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-173.5 (2,201 samples, 0.02%) + + + +@anon-func-435.5 (6,400 samples, 0.06%) + + + +@anon-func-412.5 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +pathCoords (1,116 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +$lambda (1,207 samples, 0.01%) + + + +@anon-func-435.5 (4,125 samples, 0.04%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (1,092 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-435.5 (2,310 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,882 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (101,871 samples, 1.00%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-435.5 (13,471 samples, 0.13%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-481.5 (2,667 samples, 0.03%) + + + +@anon-func-173.5 (45,100 samples, 0.44%) + + + +polyGrow (1,218 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +interleave (2,592 samples, 0.03%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +$lambda (979 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (435,055 samples, 4.29%) +@anon.. + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,744 samples, 0.04%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (2,592 samples, 0.03%) + + + +@anon-func-300.5 (4,131 samples, 0.04%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (10,152 samples, 0.10%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +rec (56,623 samples, 0.56%) + + + +interleave (24,704 samples, 0.24%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +@anon-func-435.5 (16,940 samples, 0.17%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (19,224 samples, 0.19%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-173.5 (90,101 samples, 0.89%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (1,742 samples, 0.02%) + + + +@anon-func-435.5 (2,977 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyScale (1,636 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (14,080 samples, 0.14%) + + + +alloc_words (972 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,112 samples, 0.02%) + + + +map (1,173 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +go (2,000 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,840 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +polyAdd (5,760 samples, 0.06%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-393.5 (4,276 samples, 0.04%) + + + +rec (1,164 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +go (14,912 samples, 0.15%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyScale (936 samples, 0.01%) + + + +@anon-func-173.5 (78,514 samples, 0.77%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +map (1,517 samples, 0.01%) + + + +@anon-func-173.5 (4,038 samples, 0.04%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (2,304 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-435.5 (37,730 samples, 0.37%) + + + +@anon-func-435.5 (41,390 samples, 0.41%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (7,755 samples, 0.08%) + + + +@anon-func-79.3 (4,808 samples, 0.05%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (3,520 samples, 0.03%) + + + +@anon-func-173.5 (66,891 samples, 0.66%) + + + +@anon-func-435.5 (4,070 samples, 0.04%) + + + +@anon-func-435.5 (4,924 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +encode (1,304 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-435.5 (11,440 samples, 0.11%) + + + +@anon-func-38.11 (1,504 samples, 0.01%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyDivMod (1,023 samples, 0.01%) + + + +@anon-func-48.7 (14,912 samples, 0.15%) + + + +polyDivMod (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +rec (18,403 samples, 0.18%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +map (1,299 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-173.5 (53,367 samples, 0.53%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (4,706 samples, 0.05%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-435.5 (4,176 samples, 0.04%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-161.5 (900 samples, 0.01%) + + + +@anon-func-161.5 (1,564 samples, 0.02%) + + + +polyAdd (2,208 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (59,455 samples, 0.59%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (9,594 samples, 0.09%) + + + +@anon-func-173.5 (10,088 samples, 0.10%) + + + +polySub (1,216 samples, 0.01%) + + + +map (1,430 samples, 0.01%) + + + +rec (11,517 samples, 0.11%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (4,096 samples, 0.04%) + + + +@anon-func-435.5 (28,927 samples, 0.29%) + + + +@anon-func-161.5 (1,100 samples, 0.01%) + + + +rec (39,039 samples, 0.38%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-173.5 (1,124,069 samples, 11.08%) +@anon-func-173.5 + + +@anon-func-51.11 (8,120 samples, 0.08%) + + + +polyAddTerm (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (6,942 samples, 0.07%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,184 samples, 0.05%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-300.5 (2,303 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (88,128 samples, 0.87%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +rec (1,377 samples, 0.01%) + + + +@anon-func-300.5 (9,320 samples, 0.09%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-361.7 (1,232 samples, 0.01%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,187 samples, 0.03%) + + + +@anon-func-30.36 (931 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +interleave (1,136 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-173.5 (59,369 samples, 0.59%) + + + +@anon-func-481.5 (1,773 samples, 0.02%) + + + +elemMul (12,320 samples, 0.12%) + + + +@anon-func-79.3 (892 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-173.5 (249,766 samples, 2.46%) +@a.. + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,980 samples, 0.02%) + + + +@anon-func-173.5 (3,510 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (9,715 samples, 0.10%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-265.5 (1,099 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (4,389 samples, 0.04%) + + + +@anon-func-481.5 (2,300 samples, 0.02%) + + + +@anon-func-173.5 (6,708 samples, 0.07%) + + + +polyDivMod (880 samples, 0.01%) + + + +polyDivMod (1,504 samples, 0.01%) + + + +rec (1,368 samples, 0.01%) + + + +@anon-func-173.5 (1,680 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-173.5 (71,181 samples, 0.70%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (102,443 samples, 1.01%) + + + +go (1,584 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +pathCoords (2,950 samples, 0.03%) + + + +@anon-func-173.5 (41,005 samples, 0.40%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (43,776 samples, 0.43%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,308 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-61.36 (14,912 samples, 0.15%) + + + +@anon-func-435.5 (2,585 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +correction (1,719 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (61,171 samples, 0.60%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,255 samples, 0.02%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +polyAdd (2,690 samples, 0.03%) + + + +$lambda (1,120 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (24,704 samples, 0.24%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-173.5 (10,400 samples, 0.10%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +generate (2,955 samples, 0.03%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-173.5 (72,039 samples, 0.71%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (2,887 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +natZipWith (112,896 samples, 1.11%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,431 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (10,976 samples, 0.11%) + + + +encode (864 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-481.5 (4,999 samples, 0.05%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (18,127 samples, 0.18%) + + + +@anon-func-173.5 (55,700 samples, 0.55%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +rec (6,767 samples, 0.07%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyDivMod (19,924 samples, 0.20%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-161.5 (12,320 samples, 0.12%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-173.5 (10,816 samples, 0.11%) + + + +map (1,584 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,982 samples, 0.03%) + + + +@anon-func-161.5 (31,481 samples, 0.31%) + + + +polyAdd (2,304 samples, 0.02%) + + + +pathCoords (2,349 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (40,916 samples, 0.40%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,825 samples, 0.05%) + + + +rec (38,112 samples, 0.38%) + + + +@anon-func-79.3 (1,504 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +map (1,950 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (8,140 samples, 0.08%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (13,970 samples, 0.14%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +interleave (1,299 samples, 0.01%) + + + +@anon-func-435.5 (13,801 samples, 0.14%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +generate (2,255 samples, 0.02%) + + + +@anon-func-173.5 (4,153 samples, 0.04%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (1,840 samples, 0.02%) + + + +patternCoords (1,944 samples, 0.02%) + + + +@anon-func-435.5 (4,180 samples, 0.04%) + + + +encode (2,877 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (175,494 samples, 1.73%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-161.5 (1,656 samples, 0.02%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (2,886 samples, 0.03%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,623 samples, 0.03%) + + + +interleave (1,299 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +elemMul (4,752 samples, 0.05%) + + + +@anon-func-300.5 (1,666 samples, 0.02%) + + + +@anon-func-173.5 (116,176 samples, 1.15%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (52,340 samples, 0.52%) + + + +@anon-func-173.5 (50,996 samples, 0.50%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-48.7 (17,696 samples, 0.17%) + + + +@anon-func-79.3 (2,887 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polyGrow (1,034 samples, 0.01%) + + + +@anon-func-48.7 (1,391 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,470 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,326 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-173.5 (977,493 samples, 9.64%) +@anon-func-173.5 + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-79.3 (3,004 samples, 0.03%) + + + +@anon-func-173.5 (277,469 samples, 2.74%) +@a.. + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (4,732 samples, 0.05%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-265.5 (904 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-173.5 (33,524 samples, 0.33%) + + + +map (1,584 samples, 0.02%) + + + +polyAdd (6,848 samples, 0.07%) + + + +correction (24,704 samples, 0.24%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +@anon-func-173.5 (983,717 samples, 9.70%) +@anon-func-173.5 + + +correction (864 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +polyScale (1,152 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +map (9,140 samples, 0.09%) + + + +encode (2,592 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-435.5 (14,976 samples, 0.15%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (94,963 samples, 0.94%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (10,560 samples, 0.10%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +rec (1,284 samples, 0.01%) + + + +@anon-func-173.5 (168,965 samples, 1.67%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-435.5 (5,555 samples, 0.05%) + + + +@anon-func-173.5 (681,541 samples, 6.72%) +@anon-fun.. + + +pathCoords (2,255 samples, 0.02%) + + + +map (2,384 samples, 0.02%) + + + +polyAdd (1,584 samples, 0.02%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +@anon-func-435.5 (5,881 samples, 0.06%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +polyScale (1,170 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +encode (1,504 samples, 0.01%) + + + +natZipWith (120,967 samples, 1.19%) + + + +@anon-func-173.5 (6,396 samples, 0.06%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,470 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (6,266 samples, 0.06%) + + + +polyDivMod (1,517 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-362.41 (111,595 samples, 1.10%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +rec (29,151 samples, 0.29%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (263,846 samples, 2.60%) +@a.. + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,304 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (34,560 samples, 0.34%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-435.5 (7,425 samples, 0.07%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (1,011 samples, 0.01%) + + + +toList (2,695 samples, 0.03%) + + + +@anon-func-173.5 (4,324 samples, 0.04%) + + + +interleave (3,424 samples, 0.03%) + + + +foldr (4,076 samples, 0.04%) + + + +@anon-func-161.5 (1,012 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-173.5 (217,558 samples, 2.14%) +@.. + + +polyAddTerm (1,517 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (84,667 samples, 0.83%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +elemAdd (120,967 samples, 1.19%) + + + +correction (1,760 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-173.5 (5,106 samples, 0.05%) + + + +@anon-func-435.5 (23,040 samples, 0.23%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-393.5 (3,091 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (1,511 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +interleave (1,017 samples, 0.01%) + + + +@anon-func-173.5 (8,996 samples, 0.09%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (2,090 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polySub (1,216 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (8,800 samples, 0.09%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (24,232 samples, 0.24%) + + + +encode (2,877 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (3,025 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +natZipWith (46,368 samples, 0.46%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (226,006 samples, 2.23%) +@.. + + +@anon-func-481.5 (2,911 samples, 0.03%) + + + +@anon-func-481.5 (3,394 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (9,709 samples, 0.10%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (1,568 samples, 0.02%) + + + +polySub (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (4,342 samples, 0.04%) + + + +@anon-func-435.5 (39,926 samples, 0.39%) + + + +@anon-func-79.3 (1,504 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (18,040 samples, 0.18%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (114,832 samples, 1.13%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +polyAddTerm (1,023 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (450,125 samples, 4.44%) +@anon.. + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +finderCoords (972 samples, 0.01%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-435.5 (40,574 samples, 0.40%) + + + +@anon-func-435.5 (20,736 samples, 0.20%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-481.5 (3,080 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (29,492 samples, 0.29%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +rec (58,491 samples, 0.58%) + + + +traceCoords (1,107 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-435.5 (107,520 samples, 1.06%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (4,256 samples, 0.04%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (17,248 samples, 0.17%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (62,887 samples, 0.62%) + + + +@anon-func-51.11 (24,704 samples, 0.24%) + + + +interleave (864 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (5,974 samples, 0.06%) + + + +@anon-func-161.5 (888 samples, 0.01%) + + + +@anon-func-435.5 (9,907 samples, 0.10%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (6,214 samples, 0.06%) + + + +interleave (1,120 samples, 0.01%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (2,743 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-435.5 (10,207 samples, 0.10%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-435.5 (8,059 samples, 0.08%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,787 samples, 0.07%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,297 samples, 0.01%) + + + +@anon-func-173.5 (480,265 samples, 4.73%) +@anon.. + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +$lambda (3,040 samples, 0.03%) + + + +@anon-func-173.5 (7,618 samples, 0.08%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +encode (1,107 samples, 0.01%) + + + +@anon-func-79.3 (5,944 samples, 0.06%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-173.5 (86,097 samples, 0.85%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +generate (2,982 samples, 0.03%) + + + +@anon-func-54.15 (972 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (4,985 samples, 0.05%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (176,198 samples, 1.74%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAdd (1,568 samples, 0.02%) + + + +map (1,120 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +rec (6,183 samples, 0.06%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +$lambda (1,184 samples, 0.01%) + + + +rec (2,403 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-173.5 (2,188 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-173.5 (38,228 samples, 0.38%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (5,974 samples, 0.06%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,200 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-481.5 (2,639 samples, 0.03%) + + + +@anon-func-435.5 (22,880 samples, 0.23%) + + + +@anon-func-38.11 (1,017 samples, 0.01%) + + + +@anon-func-51.11 (1,092 samples, 0.01%) + + + +@anon-func-435.5 (7,840 samples, 0.08%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +rec (38,730 samples, 0.38%) + + + +@anon-func-481.5 (3,042 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-435.5 (13,627 samples, 0.13%) + + + +$lambda (2,496 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +polyDivMod (1,517 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,186 samples, 0.04%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-435.5 (62,464 samples, 0.62%) + + + +rec (6,017 samples, 0.06%) + + + +elemMul (10,656 samples, 0.11%) + + + +@anon-func-161.5 (10,080 samples, 0.10%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-161.5 (3,456 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (6,336 samples, 0.06%) + + + +@anon-func-79.3 (71,900 samples, 0.71%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +rec (3,915 samples, 0.04%) + + + +@anon-func-173.5 (105,875 samples, 1.04%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (42,610 samples, 0.42%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (46,964 samples, 0.46%) + + + +encode (1,104 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (17,160 samples, 0.17%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,024 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (3,375 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,780 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-161.5 (3,111 samples, 0.03%) + + + +@anon-func-161.5 (2,880 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,632 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-173.5 (4,871 samples, 0.05%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +encode (14,912 samples, 0.15%) + + + +rec (9,142 samples, 0.09%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,365 samples, 0.02%) + + + +@anon-func-48.7 (1,761 samples, 0.02%) + + + +@anon-func-173.5 (10,660 samples, 0.11%) + + + +$lambda (1,152 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +go (1,142 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (23,167 samples, 0.23%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyZipWith (1,218 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,237 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (561,806 samples, 5.54%) +@anon-f.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,160 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyAdd (1,619 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (19,224 samples, 0.19%) + + + +interleave (1,760 samples, 0.02%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,326 samples, 0.01%) + + + +@anon-func-435.5 (34,314 samples, 0.34%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-435.5 (23,887 samples, 0.24%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +generate (972 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyTrim (31,180 samples, 0.31%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +correction (892 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +rec (2,731 samples, 0.03%) + + + +@anon-func-435.5 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-412.5 (6,035 samples, 0.06%) + + + +@anon-func-435.5 (5,376 samples, 0.05%) + + + +@anon-func-30.36 (1,200 samples, 0.01%) + + + +@anon-func-229.5 (2,159 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (19,924 samples, 0.20%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +go (13,768 samples, 0.14%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-173.5 (89,243 samples, 0.88%) + + + +@anon-func-300.5 (1,207 samples, 0.01%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (1,261 samples, 0.01%) + + + +polyAddTerm (1,115 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,880 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +polyAdd (864 samples, 0.01%) + + + +encode (10,152 samples, 0.10%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (915,253 samples, 9.02%) +@anon-func-17.. + + +correction (1,104 samples, 0.01%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,541 samples, 0.02%) + + + +@anon-func-161.5 (2,304 samples, 0.02%) + + + +@anon-func-435.5 (57,600 samples, 0.57%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (56,062 samples, 0.55%) + + + +@anon-func-173.5 (48,376 samples, 0.48%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (9,120 samples, 0.09%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-300.5 (46,208 samples, 0.46%) + + + +interleave (1,125 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (23,664 samples, 0.23%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (226,231 samples, 2.23%) +@.. + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,232 samples, 0.01%) + + + +@anon-func-435.5 (12,613 samples, 0.12%) + + + +@anon-func-435.5 (3,648 samples, 0.04%) + + + +interleave (2,880 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-173.5 (999,277 samples, 9.85%) +@anon-func-173.5 + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (1,081 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +natZipWith (48,384 samples, 0.48%) + + + +$lambda (2,880 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-173.5 (219,670 samples, 2.17%) +@.. + + +@anon-func-173.5 (225,302 samples, 2.22%) +@.. + + +@anon-func-173.5 (74,327 samples, 0.73%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-435.5 (34,558 samples, 0.34%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (979 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +elemMul (6,336 samples, 0.06%) + + + +@anon-func-38.11 (1,517 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-435.5 (10,633 samples, 0.10%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,504 samples, 0.01%) + + + +@anon-func-435.5 (3,637 samples, 0.04%) + + + +encode (1,104 samples, 0.01%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +$lambda (1,107 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (171,270 samples, 1.69%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-51.11 (1,023 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-481.5 (5,487 samples, 0.05%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polySub (1,184 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (8,476 samples, 0.08%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +pathCoords (2,982 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (5,947 samples, 0.06%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (886 samples, 0.01%) + + + +@anon-func-173.5 (10,192 samples, 0.10%) + + + +$lambda (2,950 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (1,280 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,826 samples, 0.03%) + + + +go (1,950 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +natZipWith (16,128 samples, 0.16%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +@anon-func-435.5 (7,700 samples, 0.08%) + + + +natZipWith (7,392 samples, 0.07%) + + + +@anon-func-51.11 (8,262 samples, 0.08%) + + + +rec (2,017 samples, 0.02%) + + + +rec (100,830 samples, 0.99%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (4,910 samples, 0.05%) + + + +rec (13,743 samples, 0.14%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (912,141 samples, 8.99%) +@anon-func-1.. + + +map (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-300.5 (1,299 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,406 samples, 0.03%) + + + +@anon-func-435.5 (3,340 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +interleave (3,630 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (931 samples, 0.01%) + + + +@anon-func-173.5 (7,748 samples, 0.08%) + + + +@anon-func-79.3 (1,875 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (35,818 samples, 0.35%) + + + +@anon-func-173.5 (132,778 samples, 1.31%) + + + +generate (2,975 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-481.5 (2,177 samples, 0.02%) + + + +@anon-func-229.5 (7,176 samples, 0.07%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-300.5 (1,048 samples, 0.01%) + + + +encode (1,440 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +polyAdd (3,520 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-435.5 (7,040 samples, 0.07%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-173.5 (613,200 samples, 6.04%) +@anon-fu.. + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-173.5 (15,868 samples, 0.16%) + + + +rec (2,029 samples, 0.02%) + + + +correction (1,120 samples, 0.01%) + + + +@anon-func-173.5 (161,414 samples, 1.59%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +rec (35,949 samples, 0.35%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +interleave (1,584 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-435.5 (20,085 samples, 0.20%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-300.5 (2,448 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,882 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-173.5 (54,662 samples, 0.54%) + + + +go (1,216 samples, 0.01%) + + + +rec (1,161 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (195,734 samples, 1.93%) +@.. + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-173.5 (507,391 samples, 5.00%) +@anon-.. + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (865,461 samples, 8.53%) +@anon-func-1.. + + +polyMulTerm (1,511 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyPadLeft (1,409 samples, 0.01%) + + + +polyDivMod (1,440 samples, 0.01%) + + + +@anon-func-79.3 (5,208 samples, 0.05%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (896 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +polySub (2,592 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +rec (900 samples, 0.01%) + + + +@anon-func-173.5 (64,031 samples, 0.63%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +go (1,517 samples, 0.01%) + + + +@anon-func-173.5 (927,701 samples, 9.15%) +@anon-func-17.. + + +@anon-func-435.5 (93,312 samples, 0.92%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-173.5 (5,486 samples, 0.05%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-173.5 (799,953 samples, 7.89%) +@anon-func-.. + + +go (2,880 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +interleave (931 samples, 0.01%) + + + +@anon-func-435.5 (14,976 samples, 0.15%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +polySub (2,592 samples, 0.03%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +go (1,200 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-435.5 (10,387 samples, 0.10%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +rec (11,017 samples, 0.11%) + + + +@anon-func-173.5 (9,750 samples, 0.10%) + + + +@anon-func-173.5 (4,836 samples, 0.05%) + + + +@anon-func-173.5 (4,472 samples, 0.04%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyAdd (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (2,748 samples, 0.03%) + + + +@anon-func-173.5 (95,821 samples, 0.94%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-481.5 (1,404 samples, 0.01%) + + + +$lambda (1,023 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (4,726 samples, 0.05%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-435.5 (21,632 samples, 0.21%) + + + +polyPadRight (2,506 samples, 0.02%) + + + +@anon-func-173.5 (26,242 samples, 0.26%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-173.5 (81,235 samples, 0.80%) + + + +@anon-func-173.5 (1,046,113 samples, 10.31%) +@anon-func-173.5 + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-173.5 (174,086 samples, 1.72%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (24,310 samples, 0.24%) + + + +pathCoords (1,980 samples, 0.02%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-173.5 (205,590 samples, 2.03%) +@.. + + +@anon-func-161.5 (888 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +rec (2,835 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyScale (2,384 samples, 0.02%) + + + +@anon-func-173.5 (1,198 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (43,230 samples, 0.43%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (882 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,720 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-173.5 (31,926 samples, 0.31%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (1,116 samples, 0.01%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-435.5 (106,037 samples, 1.05%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +toTarget (3,630 samples, 0.04%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (4,368 samples, 0.04%) + + + +$lambda (1,527 samples, 0.02%) + + + +@anon-func-435.5 (12,096 samples, 0.12%) + + + +$lambda (3,424 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +natFromBytes (36,288 samples, 0.36%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +correction (1,391 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +elemAdd (24,192 samples, 0.24%) + + + +@anon-func-173.5 (1,820 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +polySub (2,592 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (4,340 samples, 0.04%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-38.11 (11,934 samples, 0.12%) + + + +@anon-func-79.3 (4,808 samples, 0.05%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (1,517 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,741 samples, 0.05%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (4,240 samples, 0.04%) + + + +@anon-func-79.3 (1,518 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-54.15 (2,884 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +elemMul (12,672 samples, 0.12%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,716 samples, 0.02%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (95,249 samples, 0.94%) + + + +@anon-func-435.5 (12,019 samples, 0.12%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,080 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +polySub (2,496 samples, 0.02%) + + + +interleave (892 samples, 0.01%) + + + +@anon-func-435.5 (142,077 samples, 1.40%) + + + +map (1,760 samples, 0.02%) + + + +polyAddTerm (1,115 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +rec (35,022 samples, 0.35%) + + + +@anon-func-173.5 (504,377 samples, 4.97%) +@anon-.. + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +traceCoords (1,107 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-173.5 (4,363 samples, 0.04%) + + + +generate (2,614,330 samples, 25.77%) +generate + + +$lambda (864 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,761 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,504 samples, 0.01%) + + + +toBlocks (3,630 samples, 0.04%) + + + +@anon-func-435.5 (13,312 samples, 0.13%) + + + +@anon-func-173.5 (634,861 samples, 6.26%) +@anon-fu.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +go (1,761 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAdd (3,520 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (232,259 samples, 2.29%) +@.. + + +encode (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,327 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +correction (1,261 samples, 0.01%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-173.5 (6,292 samples, 0.06%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (876 samples, 0.01%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-173.5 (687,765 samples, 6.78%) +@anon-fun.. + + +generate (2,877 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-435.5 (56,320 samples, 0.56%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (9,282 samples, 0.09%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (2,975 samples, 0.03%) + + + +polySub (1,517 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-173.5 (211,161 samples, 2.08%) +@.. + + +@anon-func-173.5 (44,281 samples, 0.44%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-173.5 (2,019 samples, 0.02%) + + + +go (1,200 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,826 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,200 samples, 0.01%) + + + +@anon-func-435.5 (18,370 samples, 0.18%) + + + +encode (1,184 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (23,752 samples, 0.23%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +encode (1,511 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-161.5 (1,593 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-435.5 (78,080 samples, 0.77%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (9,471 samples, 0.09%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (29,150 samples, 0.29%) + + + +@anon-func-173.5 (3,555 samples, 0.04%) + + + +@anon-func-435.5 (28,702 samples, 0.28%) + + + +@anon-func-435.5 (25,774 samples, 0.25%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-435.5 (3,249 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (579,890 samples, 5.72%) +@anon-f.. + + +polySub (1,216 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +rec (9,909 samples, 0.10%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +correction (1,125 samples, 0.01%) + + + +@anon-func-173.5 (84,592 samples, 0.83%) + + + +@anon-func-435.5 (80,640 samples, 0.79%) + + + +interleave (1,184 samples, 0.01%) + + + +elemMul (4,576 samples, 0.05%) + + + +correction (864 samples, 0.01%) + + + +map (1,391 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +polyAddTerm (880 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-435.5 (4,429 samples, 0.04%) + + + +@anon-func-79.3 (1,092 samples, 0.01%) + + + +@anon-func-173.5 (160,710 samples, 1.58%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-173.5 (229,526 samples, 2.26%) +@.. + + +interleave (931 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +encode (892 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-300.5 (19,224 samples, 0.19%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +natToBytes (51,072 samples, 0.50%) + + + +natXor (10,752 samples, 0.11%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +finderCoords (2,826 samples, 0.03%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,614,330 samples, 25.77%) +@anon-func-79.3 + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (23,822 samples, 0.23%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (135,811 samples, 1.34%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (4,754 samples, 0.05%) + + + +@anon-func-435.5 (25,507 samples, 0.25%) + + + +@anon-func-393.5 (5,575 samples, 0.05%) + + + +rec (18,620 samples, 0.18%) + + + +encode (2,592 samples, 0.03%) + + + +polyPadLeft (2,322 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +polyZipWith (1,159 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,760 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-481.5 (2,408 samples, 0.02%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +map (1,207 samples, 0.01%) + + + +map (3,431 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,011 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +elemAdd (8,064 samples, 0.08%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +interleave (1,767 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +go (931 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-481.5 (1,190 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +rec (24,516 samples, 0.24%) + + + +$lambda (864 samples, 0.01%) + + + +generate (4,734 samples, 0.05%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +natXor (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (650,421 samples, 6.41%) +@anon-fu.. + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,326 samples, 0.01%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +correction (1,299 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,765 samples, 0.07%) + + + +rec (860 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (1,600 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (15,067 samples, 0.15%) + + + +@anon-func-435.5 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,719 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +patternCoords (1,730 samples, 0.02%) + + + +polyAdd (5,760 samples, 0.06%) + + + +encode (2,486 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +scale (12,672 samples, 0.12%) + + + +@anon-func-173.5 (100,873 samples, 0.99%) + + + +map (1,120 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +polyAdd (1,104 samples, 0.01%) + + + +$lambda (4,400 samples, 0.04%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-412.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (88,385 samples, 0.87%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,517 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +polyLeadCoeff (1,061 samples, 0.01%) + + + +@anon-func-173.5 (9,386 samples, 0.09%) + + + +@anon-func-48.7 (1,299 samples, 0.01%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-173.5 (6,318 samples, 0.06%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +$lambda (1,011 samples, 0.01%) + + + +@anon-func-435.5 (12,521 samples, 0.12%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +@anon-func-300.5 (34,944 samples, 0.34%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-173.5 (4,845 samples, 0.05%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (9,936 samples, 0.10%) + + + +@anon-func-38.11 (1,261 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-173.5 (940,149 samples, 9.27%) +@anon-func-17.. + + +encode (1,950 samples, 0.02%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-289.5 (1,664 samples, 0.02%) + + + +@anon-func-173.5 (218,262 samples, 2.15%) +@.. + + +encode (1,584 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-173.5 (495,335 samples, 4.88%) +@anon-.. + + +@anon-func-54.15 (26,689 samples, 0.26%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +polyAdd (70,912 samples, 0.70%) + + + +map (2,880 samples, 0.03%) + + + +correction (1,386 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-435.5 (33,280 samples, 0.33%) + + + +encode (1,023 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-173.5 (6,838 samples, 0.07%) + + + +correction (864 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-435.5 (29,678 samples, 0.29%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-173.5 (1,563 samples, 0.02%) + + + +@anon-func-79.3 (14,912 samples, 0.15%) + + + +@anon-func-173.5 (1,102,129 samples, 10.86%) +@anon-func-173.5 + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (3,431 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,884 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (25,088 samples, 0.25%) + + + +@anon-func-435.5 (8,767 samples, 0.09%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +polyAdd (1,184 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,011 samples, 0.01%) + + + +polyAdd (880 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-173.5 (96,016 samples, 0.95%) + + + +@anon-func-481.5 (2,383 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (4,400 samples, 0.04%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +rowwise (2,614,330 samples, 25.77%) +rowwise + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-173.5 (108,061 samples, 1.07%) + + + +polyDivMod (1,142 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (4,808 samples, 0.05%) + + + +interleave (1,207 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-79.3 (892 samples, 0.01%) + + + +@anon-func-435.5 (4,675 samples, 0.05%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (32,180 samples, 0.32%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-173.5 (239,454 samples, 2.36%) +@.. + + +go (864 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-244.5 (46,576 samples, 0.46%) + + + +@anon-func-173.5 (94,672 samples, 0.93%) + + + +correction (3,424 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +rec (33,477 samples, 0.33%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-435.5 (15,967 samples, 0.16%) + + + +@anon-func-435.5 (42,854 samples, 0.42%) + + + +@anon-func-481.5 (6,673 samples, 0.07%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-54.15 (1,821 samples, 0.02%) + + + +rec (14,517 samples, 0.14%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +rec (73,476 samples, 0.72%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-48.7 (892 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-32.65 (1,730 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (14,839 samples, 0.15%) + + + +@anon-func-435.5 (8,640 samples, 0.09%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-54.15 (4,808 samples, 0.05%) + + + +@anon-func-435.5 (23,527 samples, 0.23%) + + + +polySub (864 samples, 0.01%) + + + +rec (7,209 samples, 0.07%) + + + +@anon-func-51.11 (1,116 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (140,998 samples, 1.39%) + + + +polyAdd (3,520 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,774 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,212 samples, 0.02%) + + + +rec (2,619 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (9,074 samples, 0.09%) + + + +correction (1,120 samples, 0.01%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,077 samples, 0.04%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +map (1,472 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (50,294 samples, 0.50%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (12,544 samples, 0.12%) + + + +polySub (2,592 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-173.5 (1,095,905 samples, 10.80%) +@anon-func-173.5 + + +interleave (1,200 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (24,232 samples, 0.24%) + + + +@anon-func-173.5 (10,870 samples, 0.11%) + + + +interleave (1,120 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (9,140 samples, 0.09%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-265.5 (11,403 samples, 0.11%) + + + +polyAdd (2,688 samples, 0.03%) + + + +@anon-func-51.11 (3,431 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (936 samples, 0.01%) + + + +polyDivMod (1,380 samples, 0.01%) + + + +@anon-func-435.5 (8,064 samples, 0.08%) + + + +map (2,496 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyZipWith (29,376 samples, 0.29%) + + + +@anon-func-435.5 (4,730 samples, 0.05%) + + + +polyDivMod (880 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,394 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +@anon-func-173.5 (167,046 samples, 1.65%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +polyAdd (6,848 samples, 0.07%) + + + +polyScale (1,886 samples, 0.02%) + + + +rec (28,842 samples, 0.28%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-435.5 (7,535 samples, 0.07%) + + + +@anon-func-51.11 (2,128 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-173.5 (3,868 samples, 0.04%) + + + +polyScale (2,384 samples, 0.02%) + + + +@anon-func-435.5 (7,327 samples, 0.07%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (37,888 samples, 0.37%) + + + +map (1,391 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-173.5 (98,151 samples, 0.97%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-173.5 (4,480 samples, 0.04%) + + + +@anon-func-30.36 (1,380 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +B+sub (945 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-173.5 (184,862 samples, 1.82%) +@.. + + +@anon-func-435.5 (48,046 samples, 0.47%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-435.5 (11,425 samples, 0.11%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (1,394 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,016 samples, 0.02%) + + + +rec (26,679 samples, 0.26%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-412.5 (2,344 samples, 0.02%) + + + +@anon-func-48.7 (24,704 samples, 0.24%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (26,370 samples, 0.26%) + + + +map (1,152 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +$lambda (1,952 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +generate (2,457 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (58,311 samples, 0.57%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +interleave (1,115 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (17,767 samples, 0.18%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +correction (1,216 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (21,948 samples, 0.22%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,022 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +encode (1,944 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-173.5 (2,756 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +polySub (3,424 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (202,774 samples, 2.00%) +@.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,504 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (268,070 samples, 2.64%) +@a.. + + +@anon-func-48.7 (2,754 samples, 0.03%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (38,912 samples, 0.38%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-173.5 (62,029 samples, 0.61%) + + + +@anon-func-289.5 (49,052 samples, 0.48%) + + + +@anon-func-435.5 (50,786 samples, 0.50%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (2,208 samples, 0.02%) + + + +@anon-func-435.5 (3,312 samples, 0.03%) + + + +@anon-func-173.5 (221,782 samples, 2.19%) +@.. + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,391 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,408 samples, 0.05%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-161.5 (979 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (15,552 samples, 0.15%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-48.7 (26,689 samples, 0.26%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +@anon-func-173.5 (7,046 samples, 0.07%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (6,517 samples, 0.06%) + + + +log (13,824 samples, 0.14%) + + + +rec (15,295 samples, 0.15%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +encode (1,023 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-79.3 (3,111 samples, 0.03%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-173.5 (416,971 samples, 4.11%) +@ano.. + + +rec (1,223 samples, 0.01%) + + + +@anon-func-173.5 (4,220 samples, 0.04%) + + + +@anon-func-173.5 (104,159 samples, 1.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (474,237 samples, 4.67%) +@anon.. + + +@anon-func-435.5 (7,056 samples, 0.07%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAdd (5,760 samples, 0.06%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (11,767 samples, 0.12%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +rec (3,243 samples, 0.03%) + + + +@anon-func-481.5 (1,470 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,177 samples, 0.06%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-435.5 (13,248 samples, 0.13%) + + + +generate (2,975 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,730 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (549,743 samples, 5.42%) +@anon-f.. + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (1,932 samples, 0.02%) + + + +@anon-func-173.5 (46,465 samples, 0.46%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-173.5 (725,109 samples, 7.15%) +@anon-fun.. + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-435.5 (10,368 samples, 0.10%) + + + +@anon-func-435.5 (2,200 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +rec (1,485 samples, 0.01%) + + + +$lambda (1,730 samples, 0.02%) + + + +@anon-func-173.5 (462,181 samples, 4.56%) +@anon.. + + +$lambda (1,216 samples, 0.01%) + + + +polyAdd (2,880 samples, 0.03%) + + + +polyDivMod (1,892 samples, 0.02%) + + + +@anon-func-79.3 (11,934 samples, 0.12%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,267 samples, 0.01%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +polyScale (1,152 samples, 0.01%) + + + +@anon-func-435.5 (10,039 samples, 0.10%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,349 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,300 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (1,617 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-173.5 (7,774 samples, 0.08%) + + + +@anon-func-435.5 (33,120 samples, 0.33%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (44,948 samples, 0.44%) + + + +@anon-func-173.5 (552,764 samples, 5.45%) +@anon-f.. + + +map (3,424 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (3,111 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyPadLeft (1,770 samples, 0.02%) + + + +@anon-func-54.15 (972 samples, 0.01%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +rec (7,642 samples, 0.08%) + + + +@anon-func-173.5 (2,990 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-393.5 (891 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-173.5 (5,145 samples, 0.05%) + + + +@anon-func-435.5 (7,531 samples, 0.07%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (52,094 samples, 0.51%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (774,901 samples, 7.64%) +@anon-func.. + + +@anon-func-173.5 (9,620 samples, 0.09%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (1,391 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (3,431 samples, 0.03%) + + + +finderCoords (1,944 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (7,643 samples, 0.08%) + + + +polyAdd (2,304 samples, 0.02%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-173.5 (2,996 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (20,236 samples, 0.20%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (39,134 samples, 0.39%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (5,132 samples, 0.05%) + + + +$lambda (1,152 samples, 0.01%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (996,165 samples, 9.82%) +@anon-func-173.5 + + +@anon-func-289.5 (3,033 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-173.5 (859,081 samples, 8.47%) +@anon-func-1.. + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (5,974 samples, 0.06%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (1,115 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +polySub (2,592 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,224 samples, 0.01%) + + + +@anon-func-173.5 (117,520 samples, 1.16%) + + + +@anon-func-79.3 (5,974 samples, 0.06%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +step (1,100 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (103,301 samples, 1.02%) + + + +encode (14,612 samples, 0.14%) + + + +polyAdd (1,568 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyPadLeft (2,325 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-435.5 (15,070 samples, 0.15%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (63,745 samples, 0.63%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +@anon-func-30.36 (10,608 samples, 0.10%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,704 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (1,792 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-244.5 (2,112 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +rec (5,751 samples, 0.06%) + + + +rec (884 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-393.5 (6,035 samples, 0.06%) + + + +generate (2,877 samples, 0.03%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-481.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,248 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (261,030 samples, 2.57%) +@a.. + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-173.5 (1,049,225 samples, 10.34%) +@anon-func-173.5 + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +encode (1,380 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (501,363 samples, 4.94%) +@anon-.. + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-435.5 (30,528 samples, 0.30%) + + + +map (1,304 samples, 0.01%) + + + +go (1,767 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +$lambda (24,704 samples, 0.24%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (1,155 samples, 0.01%) + + + +@anon-func-435.5 (41,634 samples, 0.41%) + + + +@anon-func-453.5 (1,027 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +encode (10,152 samples, 0.10%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-435.5 (1,920 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-173.5 (98,479 samples, 0.97%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +polyAdd (1,586 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +encode (1,116 samples, 0.01%) + + + +@anon-func-161.5 (1,377 samples, 0.01%) + + + +@anon-func-300.5 (1,125 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +rec (5,892 samples, 0.06%) + + + +@anon-func-435.5 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (85,264 samples, 0.84%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-161.5 (3,920 samples, 0.04%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-481.5 (1,960 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +encode (1,664 samples, 0.02%) + + + +@anon-func-435.5 (56,327 samples, 0.56%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (52,709 samples, 0.52%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,207 samples, 0.01%) + + + +@anon-func-30.36 (3,431 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +rec (30,387 samples, 0.30%) + + + +@anon-func-173.5 (588,932 samples, 5.81%) +@anon-f.. + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-173.5 (66,605 samples, 0.66%) + + + +@anon-func-435.5 (4,835 samples, 0.05%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +polyTrim (2,372 samples, 0.02%) + + + +rec (3,816 samples, 0.04%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +go (981 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-435.5 (39,682 samples, 0.39%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (162,937 samples, 1.61%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +interleave (1,642 samples, 0.02%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (20,894 samples, 0.21%) + + + +@anon-func-435.5 (21,230 samples, 0.21%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,204 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +rec (20,075 samples, 0.20%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,851 samples, 0.03%) + + + +@anon-func-481.5 (7,450 samples, 0.07%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-173.5 (91,984 samples, 0.91%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (899,693 samples, 8.87%) +@anon-func-1.. + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (46,970 samples, 0.46%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,761 samples, 0.02%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-481.5 (1,608 samples, 0.02%) + + + +@anon-func-435.5 (3,920 samples, 0.04%) + + + +@anon-func-173.5 (2,340 samples, 0.02%) + + + +@anon-func-48.7 (1,944 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-481.5 (2,084 samples, 0.02%) + + + +generate (2,826 samples, 0.03%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +polySub (19,224 samples, 0.19%) + + + +encode (1,439 samples, 0.01%) + + + +@anon-func-265.5 (13,113 samples, 0.13%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,304 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +B_add (195,642 samples, 1.93%) +B.. + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-173.5 (4,989 samples, 0.05%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +generate (2,486 samples, 0.02%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +polyAdd (29,376 samples, 0.29%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (8,120 samples, 0.08%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-435.5 (10,027 samples, 0.10%) + + + +polySub (2,880 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-173.5 (34,726 samples, 0.34%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +polyScale (1,152 samples, 0.01%) + + + +rec (908 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,066 samples, 0.04%) + + + +@anon-func-173.5 (3,178 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (383,817 samples, 3.78%) +@ano.. + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-173.5 (143,814 samples, 1.42%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (13,141 samples, 0.13%) + + + +@anon-func-48.7 (886 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (11,467 samples, 0.11%) + + + +@anon-func-173.5 (6,422 samples, 0.06%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +rec (12,017 samples, 0.12%) + + + +go (864 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-435.5 (62,534 samples, 0.62%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-173.5 (59,169 samples, 0.58%) + + + +rec (35,640 samples, 0.35%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-481.5 (4,461 samples, 0.04%) + + + +$lambda (2,880 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-173.5 (10,348 samples, 0.10%) + + + +@anon-func-161.5 (1,107 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-481.5 (1,098 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-173.5 (201,366 samples, 1.99%) +@.. + + +encode (2,975 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +generate (1,980 samples, 0.02%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-173.5 (1,482 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +correction (1,115 samples, 0.01%) + + + +polyLeadCoeff (10,686 samples, 0.11%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-289.5 (2,623 samples, 0.03%) + + + +@anon-func-173.5 (137,512 samples, 1.36%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +pathCoords (2,955 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (884 samples, 0.01%) + + + +rec (19,922 samples, 0.20%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-435.5 (2,048 samples, 0.02%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +encode (15,487 samples, 0.15%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +rec (937 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,952 samples, 0.04%) + + + +correction (1,248 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,892 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-265.5 (2,625 samples, 0.03%) + + + +@anon-func-435.5 (8,640 samples, 0.09%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,002 samples, 0.05%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (23,210 samples, 0.23%) + + + +@anon-func-435.5 (19,841 samples, 0.20%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-435.5 (6,277 samples, 0.06%) + + + +interleave (1,170 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +$lambda (2,955 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (8,145 samples, 0.08%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +flatten (5,944 samples, 0.06%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (2,880 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,232 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (4,928 samples, 0.05%) + + + +generate (21,908 samples, 0.22%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-435.5 (39,040 samples, 0.38%) + + + +@anon-func-481.5 (1,407 samples, 0.01%) + + + +natFromBits (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-481.5 (4,531 samples, 0.04%) + + + +@anon-func-30.36 (19,924 samples, 0.20%) + + + +@anon-func-435.5 (8,704 samples, 0.09%) + + + +@anon-func-481.5 (1,014 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (1,517 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +natXor (35,616 samples, 0.35%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (42,932 samples, 0.42%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +$lambda (14,612 samples, 0.14%) + + + +polyDivMod (1,886 samples, 0.02%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +polyAdd (1,728 samples, 0.02%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,128 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-435.5 (14,300 samples, 0.14%) + + + +@anon-func-32.65 (3,111 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +rec (1,701 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (188,622 samples, 1.86%) +@.. + + +map (2,000 samples, 0.02%) + + + +rec (36,876 samples, 0.36%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +foldr (972 samples, 0.01%) + + + +@anon-func-435.5 (3,868 samples, 0.04%) + + + +polySub (1,104 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +padLeftTo (994 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-173.5 (1,136,517 samples, 11.20%) +@anon-func-173.5 + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-38.11 (10,152 samples, 0.10%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,760 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +encode (2,384 samples, 0.02%) + + + +natXor (49,728 samples, 0.49%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-435.5 (1,408 samples, 0.01%) + + + +encode (2,982 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (3,033 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-481.5 (5,660 samples, 0.06%) + + + +map (880 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,230 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,049 samples, 0.09%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +map (1,392 samples, 0.01%) + + + +@anon-func-38.11 (1,207 samples, 0.01%) + + + +rec (9,767 samples, 0.10%) + + + +$lambda (1,267 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-173.5 (153,670 samples, 1.51%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-435.5 (11,107 samples, 0.11%) + + + +encode (864 samples, 0.01%) + + + +correction (1,767 samples, 0.02%) + + + +@anon-func-133.5 (2,826,106 samples, 27.86%) +@anon-func-133.5 + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (80,663 samples, 0.80%) + + + +@anon-func-173.5 (1,120 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-161.5 (4,480 samples, 0.04%) + + + +@anon-func-54.15 (2,982 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (5,158 samples, 0.05%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polySub (1,392 samples, 0.01%) + + + +rec (11,064 samples, 0.11%) + + + +@anon-func-173.5 (905,917 samples, 8.93%) +@anon-func-1.. + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +rec (2,809 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +polySub (1,760 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-453.5 (2,065 samples, 0.02%) + + + +polyAdd (1,696 samples, 0.02%) + + + +interleave (1,518 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +encode (1,392 samples, 0.01%) + + + +rec (2,081 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +interleave (2,448 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (877,909 samples, 8.65%) +@anon-func-1.. + + +map (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,623 samples, 0.03%) + + + +@anon-func-173.5 (78,661 samples, 0.78%) + + + +encode (5,944 samples, 0.06%) + + + +@anon-func-435.5 (2,048 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-48.7 (3,111 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,480 samples, 0.02%) + + + +@anon-func-173.5 (5,275 samples, 0.05%) + + + +@anon-func-51.11 (3,111 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (3,604 samples, 0.04%) + + + +generate (2,877 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-435.5 (36,754 samples, 0.36%) + + + +@anon-func-161.5 (26,470 samples, 0.26%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,616 samples, 0.06%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +polyZipWith (1,909 samples, 0.02%) + + + +@anon-func-300.5 (10,608 samples, 0.10%) + + + +@anon-func-435.5 (30,898 samples, 0.30%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (4,160 samples, 0.04%) + + + +$lambda (2,880 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-300.5 (19,924 samples, 0.20%) + + + +$lambda (2,754 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +interleave (926 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +map (1,023 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,386 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-173.5 (8,684 samples, 0.09%) + + + +memcpy (3,606 samples, 0.04%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,982 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,571 samples, 0.02%) + + + +$lambda (1,120 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-79.3 (4,400 samples, 0.04%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-161.5 (5,600 samples, 0.06%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (3,228 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-161.5 (2,486 samples, 0.02%) + + + +@anon-func-481.5 (1,392 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (2,325 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +rec (2,341 samples, 0.02%) + + + +@anon-func-435.5 (8,320 samples, 0.08%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (4,693 samples, 0.05%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-161.5 (1,971 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-435.5 (3,493 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,762 samples, 0.09%) + + + +@anon-func-79.3 (2,255 samples, 0.02%) + + + +go (3,424 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +rec (5,535 samples, 0.05%) + + + +map (1,760 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (18,432 samples, 0.18%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +interleave (960 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (12,650 samples, 0.12%) + + + +toListWithLength (5,666 samples, 0.06%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (19,109 samples, 0.19%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-173.5 (55,243 samples, 0.54%) + + + +elemDiv (1,152 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-51.11 (3,004 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-481.5 (923 samples, 0.01%) + + + +rec (1,951 samples, 0.02%) + + + +@anon-func-173.5 (6,630 samples, 0.07%) + + + +step (1,340 samples, 0.01%) + + + +@anon-func-173.5 (1,920 samples, 0.02%) + + + +@anon-func-173.5 (32,852 samples, 0.32%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (11,287 samples, 0.11%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +map (2,592 samples, 0.03%) + + + +map (1,048 samples, 0.01%) + + + +@anon-func-173.5 (70,484 samples, 0.69%) + + + +@anon-func-435.5 (18,590 samples, 0.18%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +rec (8,006 samples, 0.08%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-435.5 (1,856 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (7,927 samples, 0.08%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-173.5 (270,886 samples, 2.67%) +@a.. + + +polySub (880 samples, 0.01%) + + + +polyAddTerm (24,704 samples, 0.24%) + + + +map (1,120 samples, 0.01%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +@anon-func-435.5 (5,167 samples, 0.05%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (89,296 samples, 0.88%) + + + +@anon-func-48.7 (19,224 samples, 0.19%) + + + +@anon-func-38.11 (1,642 samples, 0.02%) + + + +@anon-func-32.65 (1,390 samples, 0.01%) + + + +@anon-func-481.5 (6,886 samples, 0.07%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +finderTRCoords (3,520 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,308 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (26,689 samples, 0.26%) + + + +rec (3,321 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-435.5 (11,110 samples, 0.11%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyGrow (1,147 samples, 0.01%) + + + +@anon-func-435.5 (18,144 samples, 0.18%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +traceCoords (4,808 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (118,192 samples, 1.17%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +rec (41,511 samples, 0.41%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (153,895 samples, 1.52%) + + + +@anon-func-173.5 (18,325 samples, 0.18%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (16,687 samples, 0.16%) + + + +@anon-func-173.5 (404,915 samples, 3.99%) +@ano.. + + +go (1,216 samples, 0.01%) + + + +@anon-func-173.5 (100,189 samples, 0.99%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,267 samples, 0.01%) + + + +@anon-func-173.5 (1,837 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-161.5 (8,800 samples, 0.09%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,040 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-435.5 (53,534 samples, 0.53%) + + + +@anon-func-173.5 (1,152,077 samples, 11.36%) +@anon-func-173.5 + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (1,659 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,017 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (1,430 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +patternCoords (2,826 samples, 0.03%) + + + +@anon-func-173.5 (3,608 samples, 0.04%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-435.5 (3,200 samples, 0.03%) + + + +go (3,080 samples, 0.03%) + + + +toList (3,463 samples, 0.03%) + + + +@anon-func-481.5 (5,019 samples, 0.05%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (45,919 samples, 0.45%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyZipWith (3,527 samples, 0.03%) + + + +interleave (1,267 samples, 0.01%) + + + +encode (2,826 samples, 0.03%) + + + +@anon-func-173.5 (40,459 samples, 0.40%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +rec (17,892 samples, 0.18%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-419.37 (10,920 samples, 0.11%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (8,190 samples, 0.08%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (23,772 samples, 0.23%) + + + +generate (1,394 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-173.5 (38,115 samples, 0.38%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +rec (1,119 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +pathCoords (2,955 samples, 0.03%) + + + +@anon-func-79.3 (4,734 samples, 0.05%) + + + +rec (8,142 samples, 0.08%) + + + +@anon-func-481.5 (993 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (19,475 samples, 0.19%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,207 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,092 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (10,105 samples, 0.10%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +rec (2,939 samples, 0.03%) + + + +map (1,767 samples, 0.02%) + + + +@anon-func-48.7 (2,480 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,473 samples, 0.05%) + + + +$lambda (1,184 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-161.5 (4,872 samples, 0.05%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +encode (886 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (24,960 samples, 0.25%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (265,254 samples, 2.61%) +@a.. + + +map (1,216 samples, 0.01%) + + + +@anon-func-173.5 (298,723 samples, 2.94%) +@a.. + + +$lambda (880 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (18,377 samples, 0.18%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (157,190 samples, 1.55%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +rec (868 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +$lambda (1,014 samples, 0.01%) + + + +polySub (892 samples, 0.01%) + + + +@anon-func-38.11 (931 samples, 0.01%) + + + +@anon-func-161.5 (1,944 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +map (1,200 samples, 0.01%) + + + +$lambda (1,642 samples, 0.02%) + + + +@anon-func-48.7 (1,764 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (3,040 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,390 samples, 0.01%) + + + +@anon-func-173.5 (44,008 samples, 0.43%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (21,888 samples, 0.22%) + + + +@anon-func-435.5 (12,085 samples, 0.12%) + + + +@anon-func-435.5 (3,072 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (4,808 samples, 0.05%) + + + +@anon-func-161.5 (1,548 samples, 0.02%) + + + +generate (1,107 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (8,528 samples, 0.08%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (55,028 samples, 0.54%) + + + +polyAdd (1,664 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-173.5 (55,516 samples, 0.55%) + + + +go (1,760 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +polyDivMod (1,504 samples, 0.01%) + + + +@anon-func-173.5 (1,027,285 samples, 10.13%) +@anon-func-173.5 + + +@anon-func-173.5 (631,749 samples, 6.23%) +@anon-fu.. + + +map (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +natXor (16,128 samples, 0.16%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +$lambda (1,761 samples, 0.02%) + + + +@anon-func-173.5 (930,813 samples, 9.18%) +@anon-func-17.. + + +polyAdd (5,760 samples, 0.06%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (5,390 samples, 0.05%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,267 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-435.5 (11,520 samples, 0.11%) + + + +@anon-func-435.5 (1,848 samples, 0.02%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,267 samples, 0.01%) + + + +@anon-func-435.5 (7,095 samples, 0.07%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-173.5 (2,158 samples, 0.02%) + + + +timingHCoords (960 samples, 0.01%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (972 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-300.5 (10,152 samples, 0.10%) + + + +polyGrow (2,506 samples, 0.02%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (8,632 samples, 0.09%) + + + +padLeftTo (2,619 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-173.5 (10,556 samples, 0.10%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +encode (11,934 samples, 0.12%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (341,387 samples, 3.37%) +@an.. + + +map (1,216 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (19,924 samples, 0.20%) + + + +$lambda (1,886 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +map (1,136 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (5,500 samples, 0.05%) + + + +encode (1,023 samples, 0.01%) + + + +@anon-func-173.5 (10,582 samples, 0.10%) + + + +@anon-func-435.5 (5,707 samples, 0.06%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,144 samples, 0.06%) + + + +@anon-func-435.5 (11,359 samples, 0.11%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (16,128 samples, 0.16%) + + + +polySub (1,104 samples, 0.01%) + + + +generate (21,948 samples, 0.22%) + + + +@anon-func-435.5 (15,787 samples, 0.16%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-173.5 (135,496 samples, 1.34%) + + + +rec (14,142 samples, 0.14%) + + + +@anon-func-300.5 (4,912 samples, 0.05%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-393.5 (1,242 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (7,267 samples, 0.07%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (6,710 samples, 0.07%) + + + +interleave (880 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,805 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +correction (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (87,813 samples, 0.87%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,092 samples, 0.01%) + + + +@anon-func-435.5 (6,144 samples, 0.06%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +rec (6,885 samples, 0.07%) + + + +@anon-func-435.5 (16,280 samples, 0.16%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +polyGrow (1,909 samples, 0.02%) + + + +@anon-func-173.5 (884,133 samples, 8.72%) +@anon-func-1.. + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (75,264 samples, 0.74%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,847 samples, 0.10%) + + + +rec (2,565 samples, 0.03%) + + + +polyAdd (5,184 samples, 0.05%) + + + +encode (2,975 samples, 0.03%) + + + +correction (1,023 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-435.5 (29,920 samples, 0.29%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,764 samples, 0.02%) + + + +polyZipWith (960 samples, 0.01%) + + + +@anon-func-173.5 (31,597 samples, 0.31%) + + + +$lambda (2,975 samples, 0.03%) + + + +natXor (81,984 samples, 0.81%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-173.5 (89,587 samples, 0.88%) + + + +@anon-func-32.65 (2,075 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-173.5 (6,370 samples, 0.06%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +interleave (1,017 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (3,515 samples, 0.03%) + + + +@anon-func-30.36 (2,448 samples, 0.02%) + + + +@anon-func-173.5 (762,453 samples, 7.52%) +@anon-func.. + + +@anon-func-435.5 (16,060 samples, 0.16%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (38,275 samples, 0.38%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +go (1,216 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-435.5 (19,968 samples, 0.20%) + + + +map (2,448 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyScale (1,261 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,256 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-435.5 (9,837 samples, 0.10%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (44,160 samples, 0.44%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +encode (5,208 samples, 0.05%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +rec (1,067 samples, 0.01%) + + + +@anon-func-173.5 (12,046 samples, 0.12%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (18,848 samples, 0.19%) + + + +rec (25,752 samples, 0.25%) + + + +map (926 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (14,256 samples, 0.14%) + + + +polyScale (2,384 samples, 0.02%) + + + +polyZipWith (2,752 samples, 0.03%) + + + +rec (2,887 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-173.5 (148,038 samples, 1.46%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-173.5 (4,819 samples, 0.05%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-161.5 (1,232 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (35,200 samples, 0.35%) + + + +@anon-func-435.5 (8,064 samples, 0.08%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (33,880 samples, 0.33%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-481.5 (4,563 samples, 0.04%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +go (1,023 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (28,704 samples, 0.28%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,472 samples, 0.01%) + + + +@anon-func-435.5 (11,557 samples, 0.11%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (1,116 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,886 samples, 0.02%) + + + +@anon-func-435.5 (7,150 samples, 0.07%) + + + +@anon-func-173.5 (12,319 samples, 0.12%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-161.5 (8,064 samples, 0.08%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +rec (29,769 samples, 0.29%) + + + +@anon-func-173.5 (4,233 samples, 0.04%) + + + +@anon-func-79.3 (3,111 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (4,896 samples, 0.05%) + + + +@anon-func-79.3 (1,170 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +rec (2,133 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,861 samples, 0.09%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +rec (29,460 samples, 0.29%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,448 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +map (1,380 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-435.5 (5,376 samples, 0.05%) + + + +interleave (2,592 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (1,745 samples, 0.02%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +map (5,944 samples, 0.06%) + + + +go (864 samples, 0.01%) + + + +go (46,208 samples, 0.46%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-435.5 (12,320 samples, 0.12%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,104 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,142 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (14,612 samples, 0.14%) + + + +@anon-func-173.5 (95,535 samples, 0.94%) + + + +correction (864 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-435.5 (38,720 samples, 0.38%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (24,640 samples, 0.24%) + + + +map (15,487 samples, 0.15%) + + + +@anon-func-173.5 (3,692 samples, 0.04%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,461 samples, 0.02%) + + + +@anon-func-300.5 (6,107 samples, 0.06%) + + + +map (864 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyZipWith (3,659 samples, 0.04%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyDivMod (1,299 samples, 0.01%) + + + +pathCoords (6,022 samples, 0.06%) + + + +@anon-func-161.5 (1,748 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (35,328 samples, 0.35%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,029 samples, 0.01%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +$lambda (1,440 samples, 0.01%) + + + +@anon-func-173.5 (162,822 samples, 1.61%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,320 samples, 0.05%) + + + +go (1,104 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,200 samples, 0.01%) + + + +columnwise (17,696 samples, 0.17%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polyDivMod (1,136 samples, 0.01%) + + + +encode (1,200 samples, 0.01%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-481.5 (7,190 samples, 0.07%) + + + +@anon-func-435.5 (11,789 samples, 0.12%) + + + +correction (1,184 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (2,304 samples, 0.02%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (23,090 samples, 0.23%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (106,096 samples, 1.05%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (5,335 samples, 0.05%) + + + +rec (10,517 samples, 0.10%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +polyAdd (1,104 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-481.5 (2,030 samples, 0.02%) + + + +@anon-func-435.5 (2,548 samples, 0.03%) + + + +rec (16,642 samples, 0.16%) + + + +@anon-func-173.5 (659,757 samples, 6.50%) +@anon-fu.. + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +rec (2,965 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +map (14,912 samples, 0.15%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (3,520 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +rec (1,145 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +map (24,232 samples, 0.24%) + + + +go (1,152 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,112 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +rec (2,025 samples, 0.02%) + + + +@anon-func-435.5 (10,240 samples, 0.10%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +@anon-func-48.7 (76,220 samples, 0.75%) + + + +@anon-func-48.7 (6,016 samples, 0.06%) + + + +$lambda (2,688 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +correction (19,924 samples, 0.20%) + + + +correction (1,952 samples, 0.02%) + + + +$lambda (24,232 samples, 0.24%) + + + +go (880 samples, 0.01%) + + + +encode (2,882 samples, 0.03%) + + + +rec (885 samples, 0.01%) + + + +@anon-func-161.5 (21,888 samples, 0.22%) + + + +map (2,592 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-173.5 (10,296 samples, 0.10%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-435.5 (13,497 samples, 0.13%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +rec (3,213 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (152,262 samples, 1.50%) + + + +rec (167,517 samples, 1.65%) + + + +$lambda (8,120 samples, 0.08%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (1,584 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-481.5 (6,597 samples, 0.07%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +polySub (1,104 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-435.5 (104,378 samples, 1.03%) + + + +@anon-func-412.5 (2,712 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +polyDivMod (1,207 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-453.5 (5,822 samples, 0.06%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (271,441 samples, 2.68%) +@a.. + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +map (931 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (2,449 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,365 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-51.11 (1,299 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (11,755 samples, 0.12%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (743,781 samples, 7.33%) +@anon-func.. + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,106 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +encode (1,092 samples, 0.01%) + + + +@anon-func-173.5 (62,315 samples, 0.61%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (8,785 samples, 0.09%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +rec (16,335 samples, 0.16%) + + + +encode (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-435.5 (27,648 samples, 0.27%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-173.5 (207,702 samples, 2.05%) +@.. + + +polySub (1,104 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +rec (2,393 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (190,102 samples, 1.87%) +@.. + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,391 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (5,015 samples, 0.05%) + + + +polyDivMod (1,299 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +map (1,642 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (27,847 samples, 0.27%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyAdd (2,592 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-435.5 (3,769 samples, 0.04%) + + + +@anon-func-435.5 (12,210 samples, 0.12%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (1,107 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (71,900 samples, 0.71%) + + + +finderBLCoords (2,826 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-161.5 (2,774 samples, 0.03%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (10,152 samples, 0.10%) + + + +rec (6,142 samples, 0.06%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,739 samples, 0.07%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +polyDivMod (15,487 samples, 0.15%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +polyAddTerm (10,152 samples, 0.10%) + + + +interleave (2,000 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-173.5 (2,470 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-173.5 (63,764 samples, 0.63%) + + + +@anon-func-173.5 (307,765 samples, 3.03%) +@an.. + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (13,273 samples, 0.13%) + + + +@anon-func-173.5 (15,958 samples, 0.16%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +map (892 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,796 samples, 0.04%) + + + +@anon-func-173.5 (15,049 samples, 0.15%) + + + +@anon-func-79.3 (1,248 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-435.5 (34,814 samples, 0.34%) + + + +interleave (1,216 samples, 0.01%) + + + +traceCoords (2,614,330 samples, 25.77%) +traceCoords + + +@anon-func-300.5 (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +rec (5,589 samples, 0.06%) + + + +@anon-func-173.5 (57,739 samples, 0.57%) + + + +@anon-func-435.5 (1,650 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +rec (6,267 samples, 0.06%) + + + +@anon-func-435.5 (26,656 samples, 0.26%) + + + +$lambda (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyAddTerm (1,642 samples, 0.02%) + + + +@anon-func-481.5 (1,610 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-173.5 (65,747 samples, 0.65%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,821 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (17,401 samples, 0.17%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (26,689 samples, 0.26%) + + + +rec (52,169 samples, 0.51%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (1,094 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,391 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (24,058 samples, 0.24%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +pathCoords (1,571 samples, 0.02%) + + + +@anon-func-229.5 (875 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (11,179 samples, 0.11%) + + + +elemAdd (46,368 samples, 0.46%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +encode (972 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polyAdd (2,592 samples, 0.03%) + + + +@anon-func-481.5 (2,647 samples, 0.03%) + + + +@anon-func-173.5 (87,527 samples, 0.86%) + + + +polyMulTerm (1,092 samples, 0.01%) + + + +@anon-func-173.5 (21,055 samples, 0.21%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,293 samples, 0.11%) + + + +rec (27,297 samples, 0.27%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,115 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-481.5 (1,143 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +rec (40,893 samples, 0.40%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (7,696 samples, 0.08%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +rec (1,457 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (36,254 samples, 0.36%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,884 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,398 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,207 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (29,952 samples, 0.30%) + + + +@anon-func-173.5 (2,054 samples, 0.02%) + + + +polyAdd (1,409 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (11,545 samples, 0.11%) + + + +@anon-func-48.7 (1,980 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,400 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-173.5 (258,214 samples, 2.55%) +@a.. + + +@anon-func-481.5 (6,366 samples, 0.06%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +map (1,115 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-173.5 (567,834 samples, 5.60%) +@anon-f.. + + +map (1,952 samples, 0.02%) + + + +$lambda (1,386 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (61,454 samples, 0.61%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (41,654 samples, 0.41%) + + + +@anon-func-173.5 (952,597 samples, 9.39%) +@anon-func-17.. + + +generate (1,664 samples, 0.02%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +polySub (3,424 samples, 0.03%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-173.5 (253,357 samples, 2.50%) +@a.. + + +polyDivMod (864 samples, 0.01%) + + + +rec (5,427 samples, 0.05%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (67,177 samples, 0.66%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-435.5 (8,192 samples, 0.08%) + + + +generate (2,877 samples, 0.03%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-79.3 (14,912 samples, 0.15%) + + + +@anon-func-161.5 (3,575 samples, 0.04%) + + + +$lambda (2,975 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +rec (972 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (4,400 samples, 0.04%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,440 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (1,642 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +map (1,207 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-161.5 (28,970 samples, 0.29%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (1,824 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +correction (2,448 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-173.5 (1,077,233 samples, 10.62%) +@anon-func-173.5 + + +@anon-func-173.5 (107,440 samples, 1.06%) + + + +@anon-func-393.5 (1,422 samples, 0.01%) + + + +@anon-func-173.5 (113,488 samples, 1.12%) + + + +@anon-func-161.5 (1,728 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (49,468 samples, 0.49%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (50,752 samples, 0.50%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +pathCoords (2,955 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (25,969 samples, 0.26%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (17,506 samples, 0.17%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (979 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,815 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (84,381 samples, 0.83%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +map (1,184 samples, 0.01%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (26,947 samples, 0.27%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,418 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-435.5 (5,170 samples, 0.05%) + + + +@anon-func-79.3 (9,320 samples, 0.09%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (2,273 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +elemAdd (12,096 samples, 0.12%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-173.5 (604,002 samples, 5.95%) +@anon-f.. + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +go (1,299 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-173.5 (4,446 samples, 0.04%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (9,152 samples, 0.09%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-435.5 (32,928 samples, 0.32%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (1,200 samples, 0.01%) + + + +@anon-func-32.65 (2,826 samples, 0.03%) + + + +encode (1,115 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (25,150 samples, 0.25%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,767 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +pathCoords (2,955 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-173.5 (111,309 samples, 1.10%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-300.5 (16,026 samples, 0.16%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-435.5 (4,840 samples, 0.05%) + + + +@anon-func-435.5 (99,142 samples, 0.98%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (4,914 samples, 0.05%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-435.5 (14,080 samples, 0.14%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +natFromBytes (32,928 samples, 0.32%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-173.5 (58,388 samples, 0.58%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (13,768 samples, 0.14%) + + + +rec (46,920 samples, 0.46%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +polyDivMod (1,125 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-435.5 (30,410 samples, 0.30%) + + + +@anon-func-229.5 (5,926 samples, 0.06%) + + + +@anon-func-161.5 (17,696 samples, 0.17%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (103,680 samples, 1.02%) + + + +init (1,675 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (5,280 samples, 0.05%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (453,139 samples, 4.47%) +@anon.. + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-48.7 (1,875 samples, 0.02%) + + + +@anon-func-435.5 (38,414 samples, 0.38%) + + + +correction (1,184 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +polyAdd (960 samples, 0.01%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-435.5 (29,827 samples, 0.29%) + + + +generate (2,877 samples, 0.03%) + + + +rec (83,186 samples, 0.82%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-481.5 (960 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (860 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (5,984 samples, 0.06%) + + + +@anon-func-32.65 (5,208 samples, 0.05%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-173.5 (50,287 samples, 0.50%) + + + +polyAdd (1,664 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (199,254 samples, 1.96%) +@.. + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-435.5 (5,485 samples, 0.05%) + + + +@anon-func-173.5 (921,477 samples, 9.08%) +@anon-func-17.. + + +go (3,424 samples, 0.03%) + + + +@anon-func-173.5 (2,892 samples, 0.03%) + + + +rec (2,575 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (42,370 samples, 0.42%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-435.5 (38,054 samples, 0.38%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (235,862 samples, 2.33%) +@.. + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (68,035 samples, 0.67%) + + + +@anon-func-173.5 (189,362 samples, 1.87%) +@.. + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,011 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +encode (882 samples, 0.01%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (13,009 samples, 0.13%) + + + +@anon-func-48.7 (1,404 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (7,168 samples, 0.07%) + + + +@anon-func-173.5 (152,966 samples, 1.51%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-435.5 (11,660 samples, 0.11%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,636 samples, 0.02%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-173.5 (965,045 samples, 9.51%) +@anon-func-17.. + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (27,127 samples, 0.27%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,253 samples, 0.01%) + + + +map (1,386 samples, 0.01%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-38.11 (892 samples, 0.01%) + + + +@anon-func-173.5 (34,180 samples, 0.34%) + + + +@anon-func-30.36 (1,504 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-481.5 (945 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-435.5 (2,695 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,014 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-173.5 (3,542 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,432 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (181,126 samples, 1.79%) + + + +@anon-func-300.5 (1,142 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +correction (1,115 samples, 0.01%) + + + +rec (16,392 samples, 0.16%) + + + +revAppend (2,822,044 samples, 27.82%) +revAppend + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,190 samples, 0.01%) + + + +@anon-func-173.5 (1,016 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-435.5 (2,883 samples, 0.03%) + + + +@anon-func-173.5 (262,438 samples, 2.59%) +@a.. + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +$lambda (1,200 samples, 0.01%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-173.5 (8,008 samples, 0.08%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-435.5 (15,840 samples, 0.16%) + + + +map (1,584 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-435.5 (26,880 samples, 0.26%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (61,814 samples, 0.61%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (235,273 samples, 2.32%) +@.. + + +encode (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (43,454 samples, 0.43%) + + + +@anon-func-435.5 (3,802 samples, 0.04%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,990 samples, 0.05%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (12,151 samples, 0.12%) + + + +$lambda (1,104 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (960 samples, 0.01%) + + + +@anon-func-481.5 (2,475 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (6,336 samples, 0.06%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (3,111 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,767 samples, 0.02%) + + + +polyScale (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (3,520 samples, 0.03%) + + + +natToBits (6,726 samples, 0.07%) + + + +@anon-func-435.5 (10,890 samples, 0.11%) + + + +@anon-func-161.5 (2,808 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +rec (2,943 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +rec (25,134 samples, 0.25%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +$lambda (21,948 samples, 0.22%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (2,816 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (83,434 samples, 0.82%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (943,261 samples, 9.30%) +@anon-func-17.. + + +$lambda (2,877 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-413.22 (4,232 samples, 0.04%) + + + +rec (91,674 samples, 0.90%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-481.5 (891 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-412.5 (3,091 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,434 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (17,696 samples, 0.17%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,767 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (2,878 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,967 samples, 0.04%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +toList (1,323 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +$lambda (1,115 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (2,688 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-362.41 (270,886 samples, 2.67%) +@a.. + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (18,816 samples, 0.19%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,664 samples, 0.02%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +finderCoords (1,944 samples, 0.02%) + + + +@anon-func-173.5 (109,593 samples, 1.08%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +map (880 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +interleave (14,912 samples, 0.15%) + + + +map (2,480 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (141,030 samples, 1.39%) + + + +interleave (1,184 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-435.5 (21,870 samples, 0.22%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +natXor (51,072 samples, 0.50%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-161.5 (1,404 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-79.3 (21,888 samples, 0.22%) + + + +@anon-func-435.5 (3,005 samples, 0.03%) + + + +@anon-func-173.5 (98,863 samples, 0.97%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (890,357 samples, 8.78%) +@anon-func-1.. + + +rec (14,892 samples, 0.15%) + + + +interleave (1,584 samples, 0.02%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (2,315 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +generate (2,760 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +interleave (1,760 samples, 0.02%) + + + +rec (15,017 samples, 0.15%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-161.5 (990 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-173.5 (398,887 samples, 3.93%) +@ano.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,107 samples, 0.01%) + + + +generate (2,955 samples, 0.03%) + + + +@anon-func-173.5 (35,272 samples, 0.35%) + + + +@anon-func-30.36 (1,504 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,391 samples, 0.01%) + + + +@anon-func-173.5 (3,770 samples, 0.04%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +encode (8,120 samples, 0.08%) + + + +go (1,216 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (60,374 samples, 0.60%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +elemToBits (4,872 samples, 0.05%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-435.5 (11,136 samples, 0.11%) + + + +@anon-func-435.5 (37,536 samples, 0.37%) + + + +@anon-func-435.5 (10,765 samples, 0.11%) + + + +encode (1,184 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-481.5 (3,520 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +@anon-func-173.5 (14,776 samples, 0.15%) + + + +@anon-func-229.5 (7,551 samples, 0.07%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyAdd (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (22,602 samples, 0.22%) + + + +@anon-func-48.7 (1,821 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polyAdd (1,402 samples, 0.01%) + + + +@anon-func-435.5 (42,374 samples, 0.42%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-412.5 (1,890 samples, 0.02%) + + + +@anon-func-173.5 (114,245 samples, 1.13%) + + + +polyDivMod (10,152 samples, 0.10%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-38.11 (886 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,887 samples, 0.02%) + + + +polySub (1,504 samples, 0.01%) + + + +encode (1,386 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,188 samples, 0.05%) + + + +pathCoords (2,877 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-435.5 (91,392 samples, 0.90%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,518 samples, 0.01%) + + + +go (1,892 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +interleave (1,380 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,248 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,730 samples, 0.02%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polySub (1,216 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (46,694 samples, 0.46%) + + + +@anon-func-173.5 (5,200 samples, 0.05%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +natFromBytes (34,944 samples, 0.34%) + + + +@anon-func-435.5 (2,420 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-435.5 (5,933 samples, 0.06%) + + + +@anon-func-435.5 (18,260 samples, 0.18%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +$lambda (2,955 samples, 0.03%) + + + +polyZipWith (3,008 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-435.5 (62,174 samples, 0.61%) + + + +@anon-func-435.5 (12,007 samples, 0.12%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (71,753 samples, 0.71%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-435.5 (55,694 samples, 0.55%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-173.5 (3,334 samples, 0.03%) + + + +@anon-func-79.3 (76,220 samples, 0.75%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (21,948 samples, 0.22%) + + + +@anon-func-435.5 (12,760 samples, 0.13%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,398 samples, 0.02%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (19,488 samples, 0.19%) + + + +@anon-func-79.3 (1,571 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,278 samples, 0.01%) + + + +@anon-func-481.5 (3,112 samples, 0.03%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +polyDivMod (2,754 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (7,920 samples, 0.08%) + + + +@anon-func-173.5 (166,342 samples, 1.64%) + + + +@anon-func-173.5 (5,223 samples, 0.05%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-435.5 (6,545 samples, 0.06%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (5,171 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +natZipWith (36,288 samples, 0.36%) + + + +rec (1,743 samples, 0.02%) + + + +@anon-func-173.5 (235,158 samples, 2.32%) +@.. + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-481.5 (1,434 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (74,983 samples, 0.74%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-435.5 (46,334 samples, 0.46%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,826 samples, 0.03%) + + + +@anon-func-32.65 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +encode (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +polyAdd (1,954 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-54.15 (5,974 samples, 0.06%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,134 samples, 0.04%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (17,710 samples, 0.17%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-481.5 (2,836 samples, 0.03%) + + + +@anon-func-453.5 (3,245 samples, 0.03%) + + + +@anon-func-435.5 (7,399 samples, 0.07%) + + + +map (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +generate (1,404 samples, 0.01%) + + + +log (4,992 samples, 0.05%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (3,072 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,232 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-79.3 (19,224 samples, 0.19%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +polyAdd (2,304 samples, 0.02%) + + + +go (3,424 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (972 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (185,614 samples, 1.83%) +@.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-161.5 (1,170 samples, 0.01%) + + + +@anon-func-435.5 (10,368 samples, 0.10%) + + + +@anon-func-435.5 (27,648 samples, 0.27%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,793 samples, 0.05%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,390 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-481.5 (3,135 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (14,080 samples, 0.14%) + + + +@anon-func-265.5 (10,548 samples, 0.10%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +encode (1,944 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-173.5 (35,540 samples, 0.35%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (3,439 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-300.5 (1,142 samples, 0.01%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +polyDivMod (1,504 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-435.5 (5,005 samples, 0.05%) + + + +polyAddTerm (1,207 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +wpow_nat<Nat64> (7,574 samples, 0.07%) + + + +map (1,017 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +generate (1,944 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (7,488 samples, 0.07%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +$lambda (10,608 samples, 0.10%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-161.5 (5,208 samples, 0.05%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +rec (4,410 samples, 0.04%) + + + +encode (4,266 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +elemAdd (36,288 samples, 0.36%) + + + +@anon-func-435.5 (1,089 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +compacting_gc (3,228 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-173.5 (1,133,405 samples, 11.17%) +@anon-func-173.5 + + +encode (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,950 samples, 0.03%) + + + +@anon-func-435.5 (16,576 samples, 0.16%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,011 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,980 samples, 0.06%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,689 samples, 0.05%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (881,021 samples, 8.68%) +@anon-func-1.. + + +go (880 samples, 0.01%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (2,392 samples, 0.02%) + + + +pathCoords (2,955 samples, 0.03%) + + + +generate (1,232 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (9,438 samples, 0.09%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,470 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-173.5 (26,788 samples, 0.26%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,936 samples, 0.05%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,440 samples, 0.01%) + + + +@anon-func-435.5 (7,465 samples, 0.07%) + + + +$lambda (880 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyAdd (2,688 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +@anon-func-173.5 (834,185 samples, 8.22%) +@anon-func-.. + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +correction (1,299 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-173.5 (171,979 samples, 1.70%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,011 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,826 samples, 0.03%) + + + +natZipWith (10,752 samples, 0.11%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (23,040 samples, 0.23%) + + + +@anon-func-173.5 (1,576 samples, 0.02%) + + + +encode (1,104 samples, 0.01%) + + + +polyPadLeft (1,659 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +finderCoords (1,944 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-481.5 (4,034 samples, 0.04%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-38.11 (1,326 samples, 0.01%) + + + +@anon-func-38.11 (15,487 samples, 0.15%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-435.5 (12,430 samples, 0.12%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (20,996 samples, 0.21%) + + + +rec (39,657 samples, 0.39%) + + + +polyZipWith (928 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +traceCoords (1,571 samples, 0.02%) + + + +traceCoords (21,888 samples, 0.22%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +rec (3,699 samples, 0.04%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (3,248 samples, 0.03%) + + + +@anon-func-481.5 (2,926 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,026 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,255 samples, 0.02%) + + + +@anon-func-54.15 (2,760 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,571 samples, 0.04%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +interleave (1,115 samples, 0.01%) + + + +@anon-func-48.7 (1,200 samples, 0.01%) + + + +@anon-func-173.5 (10,426 samples, 0.10%) + + + +@anon-func-173.5 (98,704 samples, 0.97%) + + + +@anon-func-48.7 (1,430 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (3,424 samples, 0.03%) + + + +polyAdd (1,104 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-173.5 (5,080 samples, 0.05%) + + + +@anon-func-173.5 (1,159 samples, 0.01%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +@anon-func-435.5 (14,976 samples, 0.15%) + + + +map (864 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (10,152 samples, 0.10%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (238,714 samples, 2.35%) +@.. + + +@anon-func-435.5 (1,408 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-435.5 (18,480 samples, 0.18%) + + + +@anon-func-481.5 (7,166 samples, 0.07%) + + + +@anon-func-173.5 (353,521 samples, 3.48%) +@an.. + + +go (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,396 samples, 0.04%) + + + +polyAdd (2,208 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-173.5 (9,776 samples, 0.10%) + + + +@anon-func-435.5 (3,392 samples, 0.03%) + + + +@anon-func-79.3 (1,017 samples, 0.01%) + + + +@anon-func-173.5 (105,589 samples, 1.04%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +polyMulTerm (1,200 samples, 0.01%) + + + +@anon-func-173.5 (10,504 samples, 0.10%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (1,299 samples, 0.01%) + + + +@anon-func-173.5 (4,441 samples, 0.04%) + + + +correction (2,000 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +$lambda (2,826 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,592 samples, 0.03%) + + + +interleave (1,892 samples, 0.02%) + + + +@anon-func-435.5 (28,160 samples, 0.28%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-435.5 (14,410 samples, 0.14%) + + + +@anon-func-173.5 (1,898 samples, 0.02%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-173.5 (5,197 samples, 0.05%) + + + +@anon-func-300.5 (1,391 samples, 0.01%) + + + +@anon-func-435.5 (6,435 samples, 0.06%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (15,487 samples, 0.15%) + + + +@anon-func-435.5 (2,560 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +@anon-func-73.5 (13,617 samples, 0.13%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-173.5 (37,556 samples, 0.37%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (310,779 samples, 3.06%) +@an.. + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,772 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-412.5 (1,976 samples, 0.02%) + + + +@anon-func-79.3 (1,267 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +rec (2,112 samples, 0.02%) + + + +@anon-func-161.5 (35,584 samples, 0.35%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,107 samples, 0.01%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,386 samples, 0.01%) + + + +@anon-func-173.5 (97,537 samples, 0.96%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-435.5 (38,774 samples, 0.38%) + + + +correction (1,152 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,198 samples, 0.04%) + + + +@anon-func-173.5 (32,542 samples, 0.32%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-435.5 (7,201 samples, 0.07%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +rec (12,517 samples, 0.12%) + + + +@anon-func-435.5 (58,574 samples, 0.58%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,504 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-435.5 (6,421 samples, 0.06%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +polyZipWith (1,954 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-435.5 (19,008 samples, 0.19%) + + + +@anon-func-38.11 (1,440 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAddTerm (1,200 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (9,216 samples, 0.09%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (80,560 samples, 0.79%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +go (1,142 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +rec (12,392 samples, 0.12%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,875 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +patternCoords (2,826 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-173.5 (2,210 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-412.5 (1,104 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-412.5 (891 samples, 0.01%) + + + +@anon-func-265.5 (1,225 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +encode (936 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,636 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyDivMod (1,115 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,693 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (665,981 samples, 6.57%) +@anon-fu.. + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-435.5 (20,451 samples, 0.20%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-393.5 (4,666 samples, 0.05%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-161.5 (1,296 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (4,266 samples, 0.04%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-161.5 (8,928 samples, 0.09%) + + + +@anon-func-435.5 (24,960 samples, 0.25%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-161.5 (6,336 samples, 0.06%) + + + +@anon-func-161.5 (12,926 samples, 0.13%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (5,617 samples, 0.06%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +rec (1,584 samples, 0.02%) + + + +@anon-func-161.5 (3,849 samples, 0.04%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (972 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,750 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +encode (2,955 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,430 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,330 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-481.5 (4,131 samples, 0.04%) + + + +polyAdd (5,376 samples, 0.05%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (896 samples, 0.01%) + + + +@anon-func-51.11 (1,115 samples, 0.01%) + + + +@anon-func-435.5 (896 samples, 0.01%) + + + +formatCoords (1,730 samples, 0.02%) + + + +@anon-func-435.5 (44,318 samples, 0.44%) + + + +$lambda (1,142 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyScale (1,011 samples, 0.01%) + + + +@anon-func-481.5 (1,295 samples, 0.01%) + + + +polyDivMod (1,048 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +polyScale (1,760 samples, 0.02%) + + + +@anon-func-173.5 (223,190 samples, 2.20%) +@.. + + +interleave (1,184 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,120 samples, 0.03%) + + + +@anon-func-161.5 (5,184 samples, 0.05%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (17,696 samples, 0.17%) + + + +@anon-func-173.5 (13,411 samples, 0.13%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-289.5 (2,486 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,299 samples, 0.01%) + + + +@anon-func-161.5 (3,780 samples, 0.04%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-173.5 (3,328 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyAdd (4,992 samples, 0.05%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,248 samples, 0.01%) + + + +@anon-func-173.5 (7,904 samples, 0.08%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +rowwise (21,888 samples, 0.22%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (525,475 samples, 5.18%) +@anon-.. + + +@anon-func-79.3 (2,486 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (3,520 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (936 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (909,029 samples, 8.96%) +@anon-func-1.. + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (980,605 samples, 9.67%) +@anon-func-173.5 + + +rec (3,424 samples, 0.03%) + + + +@anon-func-435.5 (127,661 samples, 1.26%) + + + +@anon-func-173.5 (64,889 samples, 0.64%) + + + +@anon-func-435.5 (34,560 samples, 0.34%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-173.5 (1,508 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-173.5 (80,949 samples, 0.80%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-61.36 (14,612 samples, 0.14%) + + + +@anon-func-173.5 (13,746 samples, 0.14%) + + + +go (864 samples, 0.01%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +flatten (24,232 samples, 0.24%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-161.5 (4,576 samples, 0.05%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (270,182 samples, 2.66%) +@a.. + + +polyDivMod (1,760 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-435.5 (9,570 samples, 0.09%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +@anon-func-435.5 (15,620 samples, 0.15%) + + + +rec (16,665 samples, 0.16%) + + + +@anon-func-79.3 (3,033 samples, 0.03%) + + + +encode (1,761 samples, 0.02%) + + + +go (2,000 samples, 0.02%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-173.5 (8,138 samples, 0.08%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +rec (25,443 samples, 0.25%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,120 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +rec (88,131 samples, 0.87%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-300.5 (1,014 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-173.5 (2,253 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,496 samples, 0.02%) + + + +rec (5,211 samples, 0.05%) + + + +correction (1,104 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-173.5 (145,926 samples, 1.44%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-435.5 (2,176 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-173.5 (6,604 samples, 0.07%) + + + +$lambda (892 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +interleave (23,752 samples, 0.23%) + + + +scale (12,320 samples, 0.12%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-435.5 (14,848 samples, 0.15%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,230 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAdd (1,568 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (637,973 samples, 6.29%) +@anon-fu.. + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (21,907 samples, 0.22%) + + + +@anon-func-229.5 (9,225 samples, 0.09%) + + + +@anon-func-54.15 (1,704 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,139,629 samples, 11.23%) +@anon-func-173.5 + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (1,200 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,200 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-435.5 (70,272 samples, 0.69%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-30.36 (46,208 samples, 0.46%) + + + +correction (1,767 samples, 0.02%) + + + +pathCoords (2,457 samples, 0.02%) + + + +@anon-func-453.5 (3,766 samples, 0.04%) + + + +@anon-func-435.5 (1,716 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +next (4,020 samples, 0.04%) + + + +correction (880 samples, 0.01%) + + + +polyScale (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,200 samples, 0.01%) + + + +@anon-func-435.5 (2,560 samples, 0.03%) + + + +@anon-func-48.7 (1,248 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (864 samples, 0.01%) + + + +rec (13,892 samples, 0.14%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (11,648 samples, 0.11%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (6,565 samples, 0.06%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,173 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,950 samples, 0.02%) + + + +generate (2,955 samples, 0.03%) + + + +pathCoords (2,955 samples, 0.03%) + + + +@anon-func-435.5 (48,840 samples, 0.48%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (531,503 samples, 5.24%) +@anon-.. + + +interleave (1,142 samples, 0.01%) + + + +@anon-func-79.3 (3,033 samples, 0.03%) + + + +@anon-func-173.5 (263,142 samples, 2.59%) +@a.. + + +polyAdd (1,696 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +natZipWith (34,944 samples, 0.34%) + + + +encode (880 samples, 0.01%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +traceCoords (2,112 samples, 0.02%) + + + +polyZipWith (928 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +rec (4,671 samples, 0.05%) + + + +@anon-func-173.5 (5,642 samples, 0.06%) + + + +@anon-func-481.5 (5,070 samples, 0.05%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-32.65 (4,734 samples, 0.05%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +pathCoords (1,664 samples, 0.02%) + + + +@anon-func-173.5 (4,004 samples, 0.04%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,117,845 samples, 11.02%) +@anon-func-173.5 + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +correction (1,142 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (18,871 samples, 0.19%) + + + +generate (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-412.5 (1,755 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,486 samples, 0.02%) + + + +@anon-func-300.5 (8,262 samples, 0.08%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (10,747 samples, 0.11%) + + + +@anon-func-435.5 (17,930 samples, 0.18%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (12,765 samples, 0.13%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (19,690 samples, 0.19%) + + + +rec (3,144 samples, 0.03%) + + + +@anon-func-435.5 (9,511 samples, 0.09%) + + + +@anon-func-435.5 (13,440 samples, 0.13%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,767 samples, 0.02%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +@anon-func-79.3 (886 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-435.5 (3,685 samples, 0.04%) + + + +@anon-func-265.5 (1,750 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +finderCoords (3,520 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (30,140 samples, 0.30%) + + + +go (2,688 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-435.5 (4,267 samples, 0.04%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +elemAdd (51,072 samples, 0.50%) + + + +@anon-func-30.36 (1,642 samples, 0.02%) + + + +$lambda (1,767 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,767 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (111,153 samples, 1.10%) + + + +@anon-func-79.3 (1,719 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAddTerm (1,299 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (882 samples, 0.01%) + + + +@anon-func-173.5 (471,223 samples, 4.65%) +@anon.. + + +@anon-func-435.5 (58,934 samples, 0.58%) + + + +rec (17,642 samples, 0.17%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,430 samples, 0.01%) + + + +@anon-func-173.5 (1,250 samples, 0.01%) + + + +rec (4,077 samples, 0.04%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,640 samples, 0.04%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (5,760 samples, 0.06%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +map (1,392 samples, 0.01%) + + + +@anon-func-412.5 (1,134 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,836 samples, 0.02%) + + + +@anon-func-412.5 (9,678 samples, 0.10%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (88,099 samples, 0.87%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-173.5 (937,037 samples, 9.24%) +@anon-func-17.. + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (36,864 samples, 0.36%) + + + +@anon-func-435.5 (9,216 samples, 0.09%) + + + +go (2,372 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-435.5 (32,118 samples, 0.32%) + + + +rec (13,420 samples, 0.13%) + + + +correction (2,592 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (54,614 samples, 0.54%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +rec (44,316 samples, 0.44%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (58,560 samples, 0.58%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +scale (4,752 samples, 0.05%) + + + +@anon-func-79.3 (1,719 samples, 0.02%) + + + +map (1,142 samples, 0.01%) + + + +@anon-func-435.5 (33,014 samples, 0.33%) + + + +@anon-func-435.5 (120,967 samples, 1.19%) + + + +@anon-func-51.11 (21,888 samples, 0.22%) + + + +go (1,584 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (6,016 samples, 0.06%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-435.5 (32,832 samples, 0.32%) + + + +@anon-func-481.5 (1,610 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +go (1,261 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-481.5 (1,610 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +polyPadLeft (3,875 samples, 0.04%) + + + +@anon-func-435.5 (40,256 samples, 0.40%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +encode (931 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (25,286 samples, 0.25%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +go (886 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-435.5 (2,112 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +generate (2,955 samples, 0.03%) + + + +@anon-func-54.15 (2,614,330 samples, 25.77%) +@anon-func-54.15 + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,664 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (7,644 samples, 0.08%) + + + +go (1,504 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +rec (2,549 samples, 0.03%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +finderTLCoords (972 samples, 0.01%) + + + +$lambda (14,912 samples, 0.15%) + + + +@anon-func-161.5 (6,022 samples, 0.06%) + + + +@anon-func-435.5 (16,830 samples, 0.17%) + + + +@anon-func-79.3 (1,116 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +rec (4,455 samples, 0.04%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +padLeft (1,050 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyAdd (2,592 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +pathCoords (71,900 samples, 0.71%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (68,321 samples, 0.67%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-79.3 (5,208 samples, 0.05%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +@anon-func-173.5 (47,011 samples, 0.46%) + + + +polyAdd (2,909 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,288 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-173.5 (255,398 samples, 2.52%) +@a.. + + +correction (2,688 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-435.5 (1,792 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,381 samples, 0.04%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +map (2,688 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (164,934 samples, 1.63%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,012 samples, 0.01%) + + + +polyPadRight (1,586 samples, 0.02%) + + + +@anon-func-173.5 (1,248 samples, 0.01%) + + + +@anon-func-481.5 (5,467 samples, 0.05%) + + + +$lambda (1,719 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,200 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +generate (2,882 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,504 samples, 0.01%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,230 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,642 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (4,628 samples, 0.05%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +natToBits (1,791 samples, 0.02%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-435.5 (26,587 samples, 0.26%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +polyGrow (1,619 samples, 0.02%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +polyScale (2,384 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (243,214 samples, 2.40%) +@.. + + +interleave (864 samples, 0.01%) + + + +@anon-func-173.5 (66,319 samples, 0.65%) + + + +natXor (32,928 samples, 0.32%) + + + +@anon-func-54.15 (1,107 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-435.5 (39,744 samples, 0.39%) + + + +pathCoords (2,877 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-173.5 (111,595 samples, 1.10%) + + + +@anon-func-161.5 (2,400 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-173.5 (1,130,293 samples, 11.14%) +@anon-func-173.5 + + +rec (18,142 samples, 0.18%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (4,238 samples, 0.04%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (1,439 samples, 0.01%) + + + +rec (3,017 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +link_start (981 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,464 samples, 0.03%) + + + +@anon-func-435.5 (14,107 samples, 0.14%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +rec (7,892 samples, 0.08%) + + + +interleave (1,887 samples, 0.02%) + + + +@anon-func-173.5 (1,107 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,107 samples, 0.01%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,155 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (106,607 samples, 1.05%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-435.5 (5,568 samples, 0.05%) + + + +polyScale (1,760 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (16,181 samples, 0.16%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-30.36 (892 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,207 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +polyGrow (1,954 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (72,897 samples, 0.72%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-173.5 (5,044 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +rec (3,245 samples, 0.03%) + + + +@anon-func-48.7 (3,520 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +polyAdd (2,496 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (11,095 samples, 0.11%) + + + +@anon-func-481.5 (4,058 samples, 0.04%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (19,719 samples, 0.19%) + + + +@anon-func-48.7 (21,888 samples, 0.22%) + + + +pathCoords (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (2,349 samples, 0.02%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-54.15 (1,944 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-435.5 (7,003 samples, 0.07%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-435.5 (97,020 samples, 0.96%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-435.5 (11,220 samples, 0.11%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (1,045 samples, 0.01%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (2,644 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (3,024 samples, 0.03%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +pathCoords (5,208 samples, 0.05%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (1,299 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +rec (2,289 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (4,320 samples, 0.04%) + + + +pathCoords (21,908 samples, 0.22%) + + + +@anon-func-48.7 (1,107 samples, 0.01%) + + + +@anon-func-38.11 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,614,330 samples, 25.77%) +@anon-func-79.3 + + +map (864 samples, 0.01%) + + + +polySub (1,642 samples, 0.02%) + + + +polySub (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (19,360 samples, 0.19%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-435.5 (66,887 samples, 0.66%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-173.5 (90,387 samples, 0.89%) + + + +polyAdd (2,304 samples, 0.02%) + + + +$lambda (972 samples, 0.01%) + + + +@anon-func-173.5 (8,242 samples, 0.08%) + + + +@anon-func-435.5 (34,048 samples, 0.34%) + + + +interleave (2,592 samples, 0.03%) + + + +correction (1,207 samples, 0.01%) + + + +@anon-func-79.3 (4,734 samples, 0.05%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (21,874 samples, 0.22%) + + + +@anon-func-435.5 (1,280 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +correction (1,120 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +rec (14,642 samples, 0.14%) + + + +polySub (931 samples, 0.01%) + + + +rec (14,392 samples, 0.14%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (4,995 samples, 0.05%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +pathCoords (6,016 samples, 0.06%) + + + +polyDivMod (1,092 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-435.5 (2,048 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +$lambda (13,768 samples, 0.14%) + + + +correction (2,592 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-173.5 (4,207 samples, 0.04%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +correction (1,092 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-435.5 (9,216 samples, 0.09%) + + + +rec (2,601 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-173.5 (33,634 samples, 0.33%) + + + +natXor (6,720 samples, 0.07%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (4,884 samples, 0.05%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +go (1,207 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +polySub (2,880 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-161.5 (3,404 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,384 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +$lambda (1,430 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (6,864 samples, 0.07%) + + + +@anon-func-173.5 (70,895 samples, 0.70%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,993 samples, 0.02%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +correction (46,208 samples, 0.46%) + + + +@anon-func-481.5 (1,068 samples, 0.01%) + + + +@anon-func-435.5 (42,734 samples, 0.42%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-393.5 (2,808 samples, 0.03%) + + + +generate (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,107 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +$lambda (936 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-300.5 (931 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (12,160 samples, 0.12%) + + + +polyMulTerm (1,761 samples, 0.02%) + + + +polyDivMod (1,636 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,061 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +encode (1,253 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-481.5 (3,568 samples, 0.04%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (36,742 samples, 0.36%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,013 samples, 0.02%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +go (1,023 samples, 0.01%) + + + +@anon-func-435.5 (73,927 samples, 0.73%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-173.5 (4,597 samples, 0.05%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (3,538 samples, 0.03%) + + + +@anon-func-79.3 (1,391 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-173.5 (974,381 samples, 9.61%) +@anon-func-173.5 + + +@anon-func-38.11 (1,504 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,368 samples, 0.02%) + + + +@anon-func-51.11 (4,734 samples, 0.05%) + + + +@anon-func-173.5 (2,279 samples, 0.02%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (73,906 samples, 0.73%) + + + +rec (1,665 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (1,472 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,619,743 samples, 25.82%) +@anon-func-79.3 + + +polySub (880 samples, 0.01%) + + + +@anon-func-435.5 (4,469 samples, 0.04%) + + + +natZipWith (66,528 samples, 0.66%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,710 samples, 0.02%) + + + +polySub (3,424 samples, 0.03%) + + + +$lambda (1,092 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-173.5 (896,581 samples, 8.84%) +@anon-func-1.. + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-435.5 (18,987 samples, 0.19%) + + + +@anon-func-435.5 (32,010 samples, 0.32%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-393.5 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,200 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (1,176,980 samples, 11.60%) +@anon-func-173.5 + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +rec (2,133 samples, 0.02%) + + + +@anon-func-481.5 (915 samples, 0.01%) + + + +@anon-func-481.5 (3,175 samples, 0.03%) + + + +@anon-func-79.3 (9,140 samples, 0.09%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-161.5 (888 samples, 0.01%) + + + +rec (133,559 samples, 1.32%) + + + +B_pow (35,231 samples, 0.35%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +polyScale (1,152 samples, 0.01%) + + + +rec (5,913 samples, 0.06%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,386 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,173 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +rec (275,272 samples, 2.71%) +rec + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (65,774 samples, 0.65%) + + + +@anon-func-435.5 (864 samples, 0.01%) + + + +@anon-func-173.5 (233,046 samples, 2.30%) +@.. + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +natToBits (6,372 samples, 0.06%) + + + +@anon-func-435.5 (41,360 samples, 0.41%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-173.5 (4,506 samples, 0.04%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (328,863 samples, 3.24%) +@an.. + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (91,245 samples, 0.90%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (82,379 samples, 0.81%) + + + +@anon-func-435.5 (2,112 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-481.5 (2,970 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyAddTerm (1,299 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +$lambda (1,023 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-173.5 (8,323 samples, 0.08%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +interleave (13,768 samples, 0.14%) + + + +correction (1,216 samples, 0.01%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-481.5 (958 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +polyAddTerm (1,504 samples, 0.01%) + + + +@anon-func-161.5 (2,826 samples, 0.03%) + + + +@anon-func-435.5 (9,216 samples, 0.09%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-435.5 (42,122 samples, 0.42%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,472 samples, 0.01%) + + + +@anon-func-481.5 (3,354 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +rec (15,267 samples, 0.15%) + + + +@anon-func-173.5 (172,678 samples, 1.70%) + + + +@anon-func-435.5 (2,592 samples, 0.03%) + + + +encode (1,504 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,302 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (3,904 samples, 0.04%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,651 samples, 0.02%) + + + +@anon-func-435.5 (6,490 samples, 0.06%) + + + +@anon-func-173.5 (2,240 samples, 0.02%) + + + +@anon-func-435.5 (16,867 samples, 0.17%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (2,955 samples, 0.03%) + + + +polyScale (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +natXor (66,528 samples, 0.66%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-300.5 (892 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +map (19,224 samples, 0.19%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (7,729 samples, 0.08%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +go (2,448 samples, 0.02%) + + + +correction (10,608 samples, 0.10%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (4,752 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (40,732 samples, 0.40%) + + + +rec (1,587 samples, 0.02%) + + + +@anon-func-51.11 (936 samples, 0.01%) + + + +@anon-func-361.7 (2,760 samples, 0.03%) + + + +@anon-func-435.5 (24,288 samples, 0.24%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,950 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-435.5 (44,562 samples, 0.44%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (8,833 samples, 0.09%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +polySub (1,952 samples, 0.02%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,114 samples, 0.01%) + + + +@anon-func-173.5 (77,035 samples, 0.76%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,352 samples, 0.08%) + + + +@anon-func-51.11 (931 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,636 samples, 0.02%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-51.11 (13,768 samples, 0.14%) + + + +@anon-func-51.11 (1,767 samples, 0.02%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-173.5 (721,997 samples, 7.12%) +@anon-fun.. + + +@anon-func-173.5 (5,694 samples, 0.06%) + + + +correction (1,184 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +go (2,880 samples, 0.03%) + + + +map (23,772 samples, 0.23%) + + + +@anon-func-173.5 (4,576 samples, 0.05%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-173.5 (2,357 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-173.5 (71,828 samples, 0.71%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,392 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (10,670 samples, 0.11%) + + + +go (3,424 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,155,189 samples, 11.39%) +@anon-func-173.5 + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,430 samples, 0.01%) + + + +traceCoords (2,255 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +interleave (1,207 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +rec (5,767 samples, 0.06%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,017 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (12,887 samples, 0.13%) + + + +@anon-func-435.5 (36,998 samples, 0.36%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (1,404 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +rec (3,645 samples, 0.04%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +interleave (1,092 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-435.5 (19,597 samples, 0.19%) + + + +polyAdd (2,506 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,835 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +polyScale (886 samples, 0.01%) + + + +@anon-func-173.5 (51,668 samples, 0.51%) + + + +polyAddTerm (1,472 samples, 0.01%) + + + +@anon-func-51.11 (1,023 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-173.5 (2,730 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-481.5 (3,399 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (93,819 samples, 0.92%) + + + +@anon-func-435.5 (3,547 samples, 0.03%) + + + +@anon-func-173.5 (4,012 samples, 0.04%) + + + +@anon-func-173.5 (4,498 samples, 0.04%) + + + +go (1,216 samples, 0.01%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-173.5 (610,030 samples, 6.01%) +@anon-fu.. + + +correction (1,104 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +generate (1,764 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-481.5 (2,240 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,884 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (10,152 samples, 0.10%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +encode (1,390 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (2,944 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,713 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,178 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (40,320 samples, 0.40%) + + + +toTarget (2,880 samples, 0.03%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-161.5 (1,440 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (3,520 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-481.5 (1,053 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (190,063 samples, 1.87%) +@.. + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (4,715 samples, 0.05%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-173.5 (7,332 samples, 0.07%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (199,741 samples, 1.97%) +@.. + + +generate (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-481.5 (1,975 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,299 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (13,087 samples, 0.13%) + + + +@anon-func-173.5 (4,454 samples, 0.04%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +$lambda (1,404 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +pathCoords (21,948 samples, 0.22%) + + + +@anon-func-435.5 (35,534 samples, 0.35%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (93,906 samples, 0.93%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +encode (19,224 samples, 0.19%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (15,937 samples, 0.16%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (13,807 samples, 0.14%) + + + +polyAdd (2,592 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (1,023 samples, 0.01%) + + + +@anon-func-173.5 (28,426 samples, 0.28%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (13,131 samples, 0.13%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-99.14 (2,695 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-435.5 (1,728 samples, 0.02%) + + + +@anon-func-173.5 (700,213 samples, 6.90%) +@anon-fun.. + + +polyDivMod (1,152 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +map (1,248 samples, 0.01%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +@anon-func-435.5 (93,837 samples, 0.93%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (21,908 samples, 0.22%) + + + +interleave (1,584 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,115 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,619,743 samples, 25.82%) +@anon-func-48.7 + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (1,391 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +toList (5,666 samples, 0.06%) + + + +rec (12,142 samples, 0.12%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (931 samples, 0.01%) + + + +polyAdd (2,208 samples, 0.02%) + + + +$lambda (2,880 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +finderTRCoords (2,826 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (3,371 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +map (1,017 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,728 samples, 0.05%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-435.5 (7,040 samples, 0.07%) + + + +$lambda (880 samples, 0.01%) + + + +rec (2,653 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-173.5 (24,877 samples, 0.25%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (3,936 samples, 0.04%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (22,114 samples, 0.22%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,634 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +map (10,608 samples, 0.10%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +finderCoords (2,826 samples, 0.03%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-48.7 (931 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (313,793 samples, 3.09%) +@an.. + + +@anon-func-38.11 (864 samples, 0.01%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +@anon-func-79.3 (2,950 samples, 0.03%) + + + +@anon-func-30.36 (1,017 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (268,427 samples, 2.65%) +@a.. + + +rec (2,267 samples, 0.02%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-173.5 (9,100 samples, 0.09%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +polyGrow (29,376 samples, 0.29%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +@anon-func-173.5 (2,045 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-435.5 (8,947 samples, 0.09%) + + + +@anon-func-481.5 (2,135 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +elemAdd (66,528 samples, 0.66%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (89,968 samples, 0.89%) + + + +formatHCoords (1,394 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-435.5 (11,520 samples, 0.11%) + + + +@anon-func-481.5 (1,785 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-481.5 (2,220 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +natFromBits (1,584 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,352 samples, 0.01%) + + + +@anon-func-79.3 (1,394 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (18,865 samples, 0.19%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (2,970 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,482 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +map (1,200 samples, 0.01%) + + + +@anon-func-435.5 (6,720 samples, 0.07%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +polyAdd (1,664 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (25,920 samples, 0.26%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-173.5 (712,661 samples, 7.03%) +@anon-fun.. + + +@anon-func-173.5 (7,098 samples, 0.07%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (14,612 samples, 0.14%) + + + +encode (1,216 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-173.5 (211,222 samples, 2.08%) +@.. + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-173.5 (254,694 samples, 2.51%) +@a.. + + +correction (1,584 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +generate (2,955 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-435.5 (28,387 samples, 0.28%) + + + +@anon-func-30.36 (4,266 samples, 0.04%) + + + +rec (1,639 samples, 0.02%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (5,226 samples, 0.05%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,011,725 samples, 9.97%) +@anon-func-173.5 + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +go (931 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-173.5 (108,784 samples, 1.07%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-435.5 (6,145 samples, 0.06%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (6,496 samples, 0.06%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,430 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +polyScale (1,152 samples, 0.01%) + + + +@anon-func-173.5 (6,526 samples, 0.06%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-435.5 (58,214 samples, 0.57%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (7,205 samples, 0.07%) + + + +forIn (1,323 samples, 0.01%) + + + +rec (4,347 samples, 0.04%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (13,472 samples, 0.13%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-173.5 (109,307 samples, 1.08%) + + + +@anon-func-481.5 (3,905 samples, 0.04%) + + + +@anon-func-79.3 (2,754 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-435.5 (28,567 samples, 0.28%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyDivMod (1,267 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyZipWith (1,409 samples, 0.01%) + + + +correction (2,887 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +rec (2,241 samples, 0.02%) + + + +correction (1,115 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +map (1,875 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,667 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +rec (6,021 samples, 0.06%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (960 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +go (926 samples, 0.01%) + + + +@anon-func-51.11 (1,704 samples, 0.02%) + + + +@anon-func-79.3 (19,224 samples, 0.19%) + + + +$lambda (892 samples, 0.01%) + + + +@anon-func-481.5 (1,925 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,230 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +rec (28,533 samples, 0.28%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (45,090 samples, 0.44%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,170 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,764 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +parse (1,340 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +toListWithLength (954 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-289.5 (1,527 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-173.5 (335,125 samples, 3.30%) +@an.. + + +toBlocks (14,612 samples, 0.14%) + + + +encode (1,952 samples, 0.02%) + + + +finderCoords (3,520 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-38.11 (1,207 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +map (1,120 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-173.5 (51,106 samples, 0.50%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +rec (5,049 samples, 0.05%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +rec (61,293 samples, 0.60%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,630 samples, 0.04%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-161.5 (3,520 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-453.5 (7,300 samples, 0.07%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-48.7 (8,262 samples, 0.08%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +rowwise (2,619,743 samples, 25.82%) +rowwise + + +@anon-func-393.5 (3,540 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-173.5 (5,590 samples, 0.06%) + + + +@anon-func-161.5 (2,255 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +go (10,152 samples, 0.10%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,651 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,712 samples, 0.12%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +pathCoords (1,944 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (4,266 samples, 0.04%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +encode (1,584 samples, 0.02%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +rec (8,082 samples, 0.08%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-435.5 (46,080 samples, 0.45%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +encode (1,980 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-265.5 (1,925 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +rec (20,730 samples, 0.20%) + + + +rec (4,509 samples, 0.04%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-173.5 (2,344 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-173.5 (30,470 samples, 0.30%) + + + +@anon-func-435.5 (113,245 samples, 1.12%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-173.5 (4,155 samples, 0.04%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polySub (1,380 samples, 0.01%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +map (19,924 samples, 0.20%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,212 samples, 0.04%) + + + +polySub (864 samples, 0.01%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-173.5 (104,752 samples, 1.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-173.5 (1,602 samples, 0.02%) + + + +@anon-func-435.5 (935 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +$lambda (1,023 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,267 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (980 samples, 0.01%) + + + +$lambda (19,224 samples, 0.19%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,120 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-435.5 (18,920 samples, 0.19%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (9,320 samples, 0.09%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-481.5 (3,355 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyAdd (1,728 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +rec (4,887 samples, 0.05%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (8,554 samples, 0.08%) + + + +map (2,688 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-435.5 (18,667 samples, 0.18%) + + + +rec (16,892 samples, 0.17%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +encode (1,391 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,760 samples, 0.03%) + + + +rec (5,438 samples, 0.05%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (98,032 samples, 0.97%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,767 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +interleave (46,208 samples, 0.46%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (12,672 samples, 0.12%) + + + +@anon-func-435.5 (8,064 samples, 0.08%) + + + +@anon-func-435.5 (21,382 samples, 0.21%) + + + +map (1,092 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +pathCoords (979 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (48,649 samples, 0.48%) + + + +@anon-func-435.5 (13,735 samples, 0.14%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyMulTerm (1,636 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (214,742 samples, 2.12%) +@.. + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-435.5 (31,680 samples, 0.31%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,953 samples, 0.12%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +polyAdd (3,659 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (6,906 samples, 0.07%) + + + +map (1,152 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-32.65 (6,022 samples, 0.06%) + + + +rec (12,767 samples, 0.13%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,345 samples, 0.04%) + + + +polyAdd (2,368 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +polyScale (1,152 samples, 0.01%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (9,790 samples, 0.10%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,982 samples, 0.03%) + + + +@anon-func-481.5 (3,905 samples, 0.04%) + + + +polySub (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (971,269 samples, 9.57%) +@anon-func-17.. + + +polySub (1,952 samples, 0.02%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (23,898 samples, 0.24%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (4,949 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (43,882 samples, 0.43%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-435.5 (14,592 samples, 0.14%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (7,153 samples, 0.07%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-435.5 (28,832 samples, 0.28%) + + + +@anon-func-435.5 (15,180 samples, 0.15%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +correction (1,511 samples, 0.01%) + + + +polyAdd (3,431 samples, 0.03%) + + + +rec (19,224 samples, 0.19%) + + + +@anon-func-62.5 (311,378 samples, 3.07%) +@an.. + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +rec (14,267 samples, 0.14%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (9,724 samples, 0.10%) + + + +@anon-func-161.5 (990 samples, 0.01%) + + + +polyDivMod (1,511 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +parse (1,100 samples, 0.01%) + + + +rec (4,642 samples, 0.05%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +natFromBits (1,184 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,023 samples, 0.01%) + + + +rec (53,821 samples, 0.53%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,790 samples, 0.04%) + + + +@anon-func-173.5 (10,310 samples, 0.10%) + + + +polySub (1,952 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-173.5 (92,679 samples, 0.91%) + + + +@anon-func-173.5 (162,118 samples, 1.60%) + + + +finderBLCoords (1,944 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-300.5 (19,224 samples, 0.19%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (932 samples, 0.01%) + + + +$lambda (2,212 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +rec (8,767 samples, 0.09%) + + + +@anon-func-173.5 (8,346 samples, 0.08%) + + + +toBlocks (960 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-79.3 (1,173 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-173.5 (4,082 samples, 0.04%) + + + +@anon-func-79.3 (2,884 samples, 0.03%) + + + +rec (8,642 samples, 0.09%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (21,908 samples, 0.22%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (52,380 samples, 0.52%) + + + +@anon-func-173.5 (97,823 samples, 0.96%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-54.15 (979 samples, 0.01%) + + + +@anon-func-173.5 (2,540 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +polyScale (1,200 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +compacting_gc (1,017 samples, 0.01%) + + + +@anon-func-173.5 (10,842 samples, 0.11%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-435.5 (52,814 samples, 0.52%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +@anon-func-173.5 (5,954 samples, 0.06%) + + + +correction (880 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-435.5 (5,440 samples, 0.05%) + + + +@anon-func-173.5 (1,043,001 samples, 10.28%) +@anon-func-173.5 + + +flatten (1,430 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (2,600 samples, 0.03%) + + + +polyZipWith (2,659 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,527 samples, 0.02%) + + + +@anon-func-173.5 (79,519 samples, 0.78%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +elemAdd (49,728 samples, 0.49%) + + + +polySub (1,760 samples, 0.02%) + + + +polyGrow (1,402 samples, 0.01%) + + + +@anon-func-173.5 (812,401 samples, 8.01%) +@anon-func-.. + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,486 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,330 samples, 0.04%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyScale (2,384 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.02%) + + + +encode (2,000 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (17,600 samples, 0.17%) + + + +$lambda (3,520 samples, 0.03%) + + + +@anon-func-435.5 (13,860 samples, 0.14%) + + + +@anon-func-79.3 (76,220 samples, 0.75%) + + + +rec (8,667 samples, 0.09%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (4,734 samples, 0.05%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (182,606 samples, 1.80%) +@.. + + +@anon-func-173.5 (1,315 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (5,356 samples, 0.05%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,908 samples, 0.04%) + + + +@anon-func-173.5 (178,007 samples, 1.75%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAdd (5,184 samples, 0.05%) + + + +$lambda (19,224 samples, 0.19%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (75,590 samples, 0.75%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (14,230 samples, 0.14%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +encode (1,887 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (546,729 samples, 5.39%) +@anon-.. + + +map (2,880 samples, 0.03%) + + + +@anon-func-481.5 (4,999 samples, 0.05%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,088 samples, 0.05%) + + + +@anon-func-79.3 (1,391 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (11,788 samples, 0.12%) + + + +columnwise (71,900 samples, 0.71%) + + + +polyPadLeft (1,402 samples, 0.01%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,736 samples, 0.05%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +rec (3,142 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +rec (892 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (210,518 samples, 2.08%) +@.. + + +@anon-func-79.3 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +go (1,120 samples, 0.01%) + + + +polyDivMod (1,023 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (2,887 samples, 0.03%) + + + +rec (6,450 samples, 0.06%) + + + +@anon-func-435.5 (14,630 samples, 0.14%) + + + +@anon-func-161.5 (3,888 samples, 0.04%) + + + +@anon-func-173.5 (4,285 samples, 0.04%) + + + +@anon-func-173.5 (1,537 samples, 0.02%) + + + +map (1,120 samples, 0.01%) + + + +@anon-func-300.5 (1,267 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +rec (18,017 samples, 0.18%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,779 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +go (1,216 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,656 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-412.5 (1,620 samples, 0.02%) + + + +@anon-func-173.5 (8,866 samples, 0.09%) + + + +go (864 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +go (1,017 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-289.5 (1,253 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (4,239 samples, 0.04%) + + + +pathCoords (1,764 samples, 0.02%) + + + +@anon-func-79.3 (1,404 samples, 0.01%) + + + +rec (916 samples, 0.01%) + + + +@anon-func-265.5 (1,400 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (31,104 samples, 0.31%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (140,294 samples, 1.38%) + + + +$lambda (1,248 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (600,988 samples, 5.92%) +@anon-f.. + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +patternCoords (1,404 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (52,051 samples, 0.51%) + + + +rec (1,301 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-435.5 (19,470 samples, 0.19%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +rec (43,014 samples, 0.42%) + + + +polyAdd (1,034 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +@anon-func-173.5 (2,514 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-38.11 (24,704 samples, 0.24%) + + + +polySub (1,760 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,761 samples, 0.02%) + + + +rec (47,788 samples, 0.47%) + + + +@anon-func-481.5 (2,574 samples, 0.03%) + + + +@anon-func-481.5 (1,890 samples, 0.02%) + + + +@anon-func-173.5 (73,183 samples, 0.72%) + + + +@anon-func-173.5 (236,566 samples, 2.33%) +@.. + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (926 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-435.5 (18,304 samples, 0.18%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +generate (2,619,743 samples, 25.82%) +generate + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polyAdd (3,520 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-494.5 (1,799 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +rec (23,108 samples, 0.23%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,704 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (4,610 samples, 0.05%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +generate (1,760 samples, 0.02%) + + + +@anon-func-435.5 (22,176 samples, 0.22%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +pathCoords (2,212 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-161.5 (7,056 samples, 0.07%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (54,450 samples, 0.54%) + + + +@anon-func-435.5 (17,047 samples, 0.17%) + + + +map (864 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (731,333 samples, 7.21%) +@anon-func.. + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,391 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,023 samples, 0.01%) + + + +@anon-func-79.3 (1,170 samples, 0.01%) + + + +rec (3,905 samples, 0.04%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,902 samples, 0.06%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (703,325 samples, 6.93%) +@anon-fun.. + + +@anon-func-435.5 (135,794 samples, 1.34%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (28,699 samples, 0.28%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (115,200 samples, 1.14%) + + + +@anon-func-30.36 (19,224 samples, 0.19%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-28.22 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (5,944 samples, 0.06%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-173.5 (5,184 samples, 0.05%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (30,494 samples, 0.30%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (4,896 samples, 0.05%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (9,048 samples, 0.09%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (66,368 samples, 0.65%) + + + +@anon-func-173.5 (110,128 samples, 1.09%) + + + +@anon-func-161.5 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (15,680 samples, 0.15%) + + + +@anon-func-161.5 (6,272 samples, 0.06%) + + + +natXor (8,064 samples, 0.08%) + + + +correction (1,216 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (1,200 samples, 0.01%) + + + +@anon-func-435.5 (16,720 samples, 0.16%) + + + +@anon-func-51.11 (46,208 samples, 0.46%) + + + +@anon-func-435.5 (4,290 samples, 0.04%) + + + +interleave (880 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +interleave (1,886 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyPadRight (4,125 samples, 0.04%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +polyNew (945 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,815 samples, 0.06%) + + + +map (1,184 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-173.5 (259,385 samples, 2.56%) +@a.. + + +go (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-173.5 (138,825 samples, 1.37%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +encode (1,200 samples, 0.01%) + + + +@anon-func-435.5 (5,023 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (51,014 samples, 0.50%) + + + +@anon-func-173.5 (51,722 samples, 0.51%) + + + +@anon-func-435.5 (4,225 samples, 0.04%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +polyAdd (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyAddTerm (1,267 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (6,292 samples, 0.06%) + + + +go (1,584 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (1,511 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-435.5 (3,328 samples, 0.03%) + + + +polyScale (2,384 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +interleave (1,760 samples, 0.02%) + + + +encode (931 samples, 0.01%) + + + +@anon-func-38.11 (1,886 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (42,260 samples, 0.42%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (2,112 samples, 0.02%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,686 samples, 0.04%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-453.5 (3,245 samples, 0.03%) + + + +@anon-func-173.5 (570,848 samples, 5.63%) +@anon-f.. + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-173.5 (7,020 samples, 0.07%) + + + +correction (931 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-481.5 (4,526 samples, 0.04%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,244 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +polyAddTerm (892 samples, 0.01%) + + + +rec (40,584 samples, 0.40%) + + + +@anon-func-300.5 (1,518 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-300.5 (1,299 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-361.7 (3,033 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +rec (5,267 samples, 0.05%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +rec (3,537 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +foldr (1,820 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +polyAddTerm (1,017 samples, 0.01%) + + + +@anon-func-38.11 (1,125 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,261 samples, 0.01%) + + + +@anon-func-173.5 (53,038 samples, 0.52%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (359,549 samples, 3.54%) +@an.. + + +map (2,000 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +polyAdd (5,376 samples, 0.05%) + + + +generate (3,111 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (931 samples, 0.01%) + + + +@anon-func-173.5 (147,867 samples, 1.46%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (697,101 samples, 6.87%) +@anon-fun.. + + +polyAdd (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-435.5 (11,821 samples, 0.12%) + + + +@anon-func-435.5 (31,680 samples, 0.31%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +encode (1,391 samples, 0.01%) + + + +@anon-func-161.5 (2,212 samples, 0.02%) + + + +@anon-func-173.5 (2,813 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-481.5 (1,182 samples, 0.01%) + + + +polyDivMod (1,767 samples, 0.02%) + + + +@anon-func-173.5 (1,064,785 samples, 10.50%) +@anon-func-173.5 + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,915 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-161.5 (1,260 samples, 0.01%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (13,056 samples, 0.13%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-38.11 (19,224 samples, 0.19%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,265 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (2,208 samples, 0.02%) + + + +interleave (1,504 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (15,840 samples, 0.16%) + + + +@anon-func-161.5 (2,470 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +traceCoords (2,619,743 samples, 25.82%) +traceCoords + + +@anon-func-435.5 (71,126 samples, 0.70%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,222 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +rec (16,017 samples, 0.16%) + + + +@anon-func-435.5 (3,373 samples, 0.03%) + + + +@anon-func-173.5 (61,076 samples, 0.60%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (2,036 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (1,017 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-161.5 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,017 samples, 0.01%) + + + +polyZipWith (2,852 samples, 0.03%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-173.5 (2,097 samples, 0.02%) + + + +polyAdd (3,008 samples, 0.03%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (1,120 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (6,656 samples, 0.07%) + + + +polySub (2,688 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (1,390 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (65,461 samples, 0.65%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-173.5 (265,958 samples, 2.62%) +@a.. + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyScale (2,384 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +map (1,504 samples, 0.01%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (74,910 samples, 0.74%) + + + +go (864 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-435.5 (59,136 samples, 0.58%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-435.5 (31,616 samples, 0.31%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,435 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +go (1,048 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (7,462 samples, 0.07%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (78,947 samples, 0.78%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +$lambda (3,033 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (11,773 samples, 0.12%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +rec (1,517 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,068 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-173.5 (150,854 samples, 1.49%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +interleave (9,320 samples, 0.09%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (344,479 samples, 3.40%) +@an.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-32.65 (1,253 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +generate (71,900 samples, 0.71%) + + + +encode (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +natXor (12,096 samples, 0.12%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (1,729 samples, 0.02%) + + + +@anon-func-435.5 (23,334 samples, 0.23%) + + + +@anon-func-173.5 (62,383 samples, 0.61%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,623 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (30,836 samples, 0.30%) + + + +generate (4,808 samples, 0.05%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (19,140 samples, 0.19%) + + + +interleave (931 samples, 0.01%) + + + +@anon-func-435.5 (12,283 samples, 0.12%) + + + +polySub (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +correction (1,200 samples, 0.01%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-481.5 (3,135 samples, 0.03%) + + + +@anon-func-435.5 (10,560 samples, 0.10%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (246,950 samples, 2.43%) +@a.. + + +encode (1,184 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,719 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +polyZipWith (909 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-481.5 (923 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,528 samples, 0.06%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (9,643 samples, 0.10%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-393.5 (1,608 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-435.5 (4,957 samples, 0.05%) + + + +@anon-func-173.5 (10,790 samples, 0.11%) + + + +@anon-func-48.7 (1,892 samples, 0.02%) + + + +polyAdd (2,880 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,376 samples, 0.02%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +traceCoords (1,980 samples, 0.02%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (165,638 samples, 1.63%) + + + +@anon-func-173.5 (116,848 samples, 1.15%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (873 samples, 0.01%) + + + +@anon-func-173.5 (4,940 samples, 0.05%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,587 samples, 0.08%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,112 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (3,072 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (71,900 samples, 0.71%) + + + +@anon-func-54.15 (17,696 samples, 0.17%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (17,279 samples, 0.17%) + + + +@anon-func-173.5 (4,702 samples, 0.05%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +rec (17,267 samples, 0.17%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-481.5 (6,816 samples, 0.07%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (21,222 samples, 0.21%) + + + +@anon-func-48.7 (1,392 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-481.5 (1,242 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-435.5 (15,360 samples, 0.15%) + + + +pathCoords (2,975 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (781,125 samples, 7.70%) +@anon-func.. + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,448 samples, 0.02%) + + + +@anon-func-173.5 (1,108,353 samples, 10.93%) +@anon-func-173.5 + + +@anon-func-30.36 (880 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +@anon-func-300.5 (1,392 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (19,924 samples, 0.20%) + + + +@anon-func-435.5 (2,544 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,803 samples, 0.04%) + + + +$lambda (3,520 samples, 0.03%) + + + +polyDivMod (2,887 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyDivMod (1,518 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-435.5 (4,987 samples, 0.05%) + + + +@anon-func-435.5 (1,280 samples, 0.01%) + + + +@anon-func-435.5 (18,621 samples, 0.18%) + + + +elemMul (19,360 samples, 0.19%) + + + +encode (1,216 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (94,105 samples, 0.93%) + + + +$lambda (1,704 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (3,904 samples, 0.04%) + + + +polyScale (2,000 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (945 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (33,338 samples, 0.33%) + + + +interleave (1,584 samples, 0.02%) + + + +map (2,384 samples, 0.02%) + + + +interleave (1,299 samples, 0.01%) + + + +@anon-func-173.5 (6,682 samples, 0.07%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,299 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,755 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-173.5 (247,654 samples, 2.44%) +@a.. + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (184,035 samples, 1.81%) +@.. + + +@anon-func-173.5 (59,060 samples, 0.58%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,349 samples, 0.02%) + + + +@anon-func-161.5 (5,728 samples, 0.06%) + + + +correction (1,184 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +go (931 samples, 0.01%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (4,311 samples, 0.04%) + + + +@anon-func-38.11 (1,392 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-453.5 (2,170 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-173.5 (301,737 samples, 2.97%) +@a.. + + +generate (1,944 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (134,152 samples, 1.32%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +@anon-func-300.5 (24,704 samples, 0.24%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (25,344 samples, 0.25%) + + + +@anon-func-173.5 (101,392 samples, 1.00%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (6,016 samples, 0.06%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,516 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +encode (2,496 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (19,747 samples, 0.19%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,074 samples, 0.03%) + + + +@anon-func-435.5 (4,957 samples, 0.05%) + + + +generate (2,877 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (426,013 samples, 4.20%) +@ano.. + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (37,620 samples, 0.37%) + + + +@anon-func-173.5 (23,822 samples, 0.23%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (768,677 samples, 7.58%) +@anon-func.. + + +@anon-func-435.5 (14,960 samples, 0.15%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +scale (8,624 samples, 0.09%) + + + +@anon-func-229.5 (4,943 samples, 0.05%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (46,292 samples, 0.46%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-173.5 (10,010 samples, 0.10%) + + + +@anon-func-435.5 (8,587 samples, 0.08%) + + + +@anon-func-161.5 (2,208 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +polyDivMod (926 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (18,304 samples, 0.18%) + + + +@anon-func-435.5 (3,901 samples, 0.04%) + + + +@anon-func-435.5 (22,048 samples, 0.22%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-173.5 (3,386 samples, 0.03%) + + + +@anon-func-161.5 (26,689 samples, 0.26%) + + + +polyZipWith (2,322 samples, 0.02%) + + + +@anon-func-173.5 (3,503 samples, 0.03%) + + + +@anon-func-435.5 (19,231 samples, 0.19%) + + + +interleave (1,761 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +rec (13,517 samples, 0.13%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-173.5 (1,276 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,225 samples, 0.05%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-173.5 (3,900 samples, 0.04%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-481.5 (3,520 samples, 0.03%) + + + +@anon-func-161.5 (8,960 samples, 0.09%) + + + +@anon-func-481.5 (3,575 samples, 0.04%) + + + +@anon-func-173.5 (60,599 samples, 0.60%) + + + +@anon-func-435.5 (10,927 samples, 0.11%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (6,136 samples, 0.06%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,529 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +polyGrow (909 samples, 0.01%) + + + +polyGrow (1,659 samples, 0.02%) + + + +elemFromBits (1,584 samples, 0.02%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (41,129 samples, 0.41%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (331,955 samples, 3.27%) +@an.. + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-173.5 (41,824 samples, 0.41%) + + + +encode (864 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-173.5 (2,761 samples, 0.03%) + + + +@anon-func-173.5 (662,869 samples, 6.53%) +@anon-fu.. + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +generate (6,022 samples, 0.06%) + + + +rec (23,112 samples, 0.23%) + + + +rec (1,353 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,227 samples, 0.09%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (4,181 samples, 0.04%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (2,384 samples, 0.02%) + + + +@anon-func-435.5 (8,495 samples, 0.08%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +interleave (11,934 samples, 0.12%) + + + +@anon-func-161.5 (936 samples, 0.01%) + + + +interleave (1,511 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,457 samples, 0.02%) + + + +@anon-func-393.5 (1,512 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-173.5 (902,805 samples, 8.90%) +@anon-func-1.. + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (8,047 samples, 0.08%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (10,010 samples, 0.10%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (33,826 samples, 0.33%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (149,285 samples, 1.47%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +go (1,391 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +correction (2,000 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +map (23,752 samples, 0.23%) + + + +polyLeadCoeff (1,530 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (4,017 samples, 0.04%) + + + +encode (932 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,982 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-173.5 (72,611 samples, 0.72%) + + + +$lambda (2,592 samples, 0.03%) + + + +rec (6,475 samples, 0.06%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (893,469 samples, 8.81%) +@anon-func-1.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (1,642 samples, 0.02%) + + + +@anon-func-481.5 (1,143 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (8,007 samples, 0.08%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyScale (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-289.5 (1,390 samples, 0.01%) + + + +rec (1,971 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +encode (1,767 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,486 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (48,384 samples, 0.48%) + + + +@anon-func-173.5 (24,331 samples, 0.24%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (2,255 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (24,704 samples, 0.24%) + + + +polyGrow (3,159 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,142 samples, 0.01%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +rec (36,258 samples, 0.36%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (63,092 samples, 0.62%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-435.5 (92,160 samples, 0.91%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (4,051 samples, 0.04%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (23,752 samples, 0.23%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +rec (10,392 samples, 0.10%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +rec (16,767 samples, 0.17%) + + + +generate (882 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-435.5 (11,689 samples, 0.12%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-173.5 (3,200 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-173.5 (83,248 samples, 0.82%) + + + +@anon-func-435.5 (1,430 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-435.5 (16,913 samples, 0.17%) + + + +@anon-func-48.7 (2,448 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-173.5 (61,748 samples, 0.61%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (165,951 samples, 1.64%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (3,438 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +encode (1,173 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +patternCoords (6,016 samples, 0.06%) + + + +polySub (2,592 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (7,857 samples, 0.08%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyGrow (2,159 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +rec (2,497 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +go (3,424 samples, 0.03%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (26,752 samples, 0.26%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-161.5 (3,510 samples, 0.03%) + + + +@anon-func-161.5 (3,245 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (63,974 samples, 0.63%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +go (1,380 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +map (892 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-38.11 (1,115 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (23,680 samples, 0.23%) + + + +@anon-func-435.5 (29,647 samples, 0.29%) + + + +@anon-func-173.5 (214,038 samples, 2.11%) +@.. + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +alog (7,308 samples, 0.07%) + + + +@anon-func-173.5 (59,741 samples, 0.59%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-229.5 (5,659 samples, 0.06%) + + + +map (1,104 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-54.15 (1,527 samples, 0.02%) + + + +@anon-func-435.5 (78,694 samples, 0.78%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +encode (1,517 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +rec (2,237 samples, 0.02%) + + + +interleave (936 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +polyGrow (1,674 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +polySub (46,208 samples, 0.46%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (972 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +toBlocks (3,375 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (4,400 samples, 0.04%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +encode (5,974 samples, 0.06%) + + + +@anon-func-79.3 (24,232 samples, 0.24%) + + + +$lambda (2,592 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +@anon-func-481.5 (1,651 samples, 0.02%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (4,194 samples, 0.04%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (246,210 samples, 2.43%) +@a.. + + +@anon-func-173.5 (36,364 samples, 0.36%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-481.5 (4,723 samples, 0.05%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,253 samples, 0.01%) + + + +map (23,732 samples, 0.23%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,105,241 samples, 10.90%) +@anon-func-173.5 + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (1,767 samples, 0.02%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-173.5 (5,174 samples, 0.05%) + + + +@anon-func-51.11 (1,011 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-173.5 (4,923 samples, 0.05%) + + + +map (1,952 samples, 0.02%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (1,907 samples, 0.02%) + + + +@anon-func-435.5 (1,419 samples, 0.01%) + + + +@anon-func-79.3 (2,982 samples, 0.03%) + + + +@anon-func-481.5 (2,970 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (2,496 samples, 0.02%) + + + +rec (3,392 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +go (3,946 samples, 0.04%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (176,902 samples, 1.74%) + + + +go (1,152 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-173.5 (8,034 samples, 0.08%) + + + +@anon-func-173.5 (4,558 samples, 0.04%) + + + +@anon-func-51.11 (1,980 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (76,009 samples, 0.75%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +encode (2,826 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (852,857 samples, 8.41%) +@anon-func-1.. + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +elemAdd (16,128 samples, 0.16%) + + + +rec (9,234 samples, 0.09%) + + + +@anon-func-289.5 (2,884 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,261 samples, 0.01%) + + + +@anon-func-435.5 (1,947 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (67,392 samples, 0.66%) + + + +@anon-func-481.5 (3,334 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,011 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-32.65 (972 samples, 0.01%) + + + +encode (2,128 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,236 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (10,868 samples, 0.11%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-300.5 (15,487 samples, 0.15%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +traceCoords (5,208 samples, 0.05%) + + + +@anon-func-435.5 (6,688 samples, 0.07%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-435.5 (61,746 samples, 0.61%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (2,605 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-435.5 (10,560 samples, 0.10%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,321 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (10,608 samples, 0.10%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,115 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +rec (2,003 samples, 0.02%) + + + +interleave (2,384 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-481.5 (1,785 samples, 0.02%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +rec (51,485 samples, 0.51%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (6,796 samples, 0.07%) + + + +scale (6,336 samples, 0.06%) + + + +@anon-func-435.5 (19,872 samples, 0.20%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-68.41 (19,488 samples, 0.19%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +correction (1,170 samples, 0.01%) + + + +@anon-func-435.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (30,187 samples, 0.30%) + + + +@anon-func-435.5 (63,614 samples, 0.63%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,984 samples, 0.10%) + + + +@anon-func-30.36 (13,768 samples, 0.14%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-54.15 (21,908 samples, 0.22%) + + + +map (1,200 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +rec (8,392 samples, 0.08%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (3,907 samples, 0.04%) + + + +@anon-func-435.5 (3,307 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,449 samples, 0.15%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +@anon-func-173.5 (5,824 samples, 0.06%) + + + +correction (1,584 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +scale (35,584 samples, 0.35%) + + + +@anon-func-30.36 (1,200 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-44.5 (228,532 samples, 2.25%) +@.. + + +@anon-func-435.5 (15,247 samples, 0.15%) + + + +correction (1,136 samples, 0.01%) + + + +go (1,200 samples, 0.01%) + + + +@anon-func-435.5 (3,520 samples, 0.03%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,252 samples, 0.05%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-173.5 (3,087 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-494.5 (875 samples, 0.01%) + + + +go (892 samples, 0.01%) + + + +@anon-func-161.5 (1,390 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-393.5 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-173.5 (159,302 samples, 1.57%) + + + +$lambda (1,944 samples, 0.02%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +rec (4,892 samples, 0.05%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +$lambda (1,207 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (183,358 samples, 1.81%) +@.. + + +interleave (1,386 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-435.5 (24,787 samples, 0.24%) + + + +@anon-func-32.65 (2,486 samples, 0.02%) + + + +rec (5,017 samples, 0.05%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +polyAdd (1,085 samples, 0.01%) + + + +@anon-func-246.51 (2,112 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +polyDivMod (1,767 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-173.5 (39,913 samples, 0.39%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-393.5 (1,976 samples, 0.02%) + + + +@anon-func-38.11 (1,115 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (17,696 samples, 0.17%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polySub (1,216 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (8,120 samples, 0.08%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +rec (5,643 samples, 0.06%) + + + +@anon-func-173.5 (5,236 samples, 0.05%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (4,545 samples, 0.04%) + + + +@anon-func-173.5 (2,058 samples, 0.02%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (31,142 samples, 0.31%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (229,245 samples, 2.26%) +@.. + + +encode (1,886 samples, 0.02%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,142 samples, 0.01%) + + + +@anon-func-453.5 (3,884 samples, 0.04%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +rec (1,899 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +rec (45,184 samples, 0.45%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (19,224 samples, 0.19%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +@anon-func-51.11 (1,571 samples, 0.02%) + + + +@anon-func-435.5 (2,475 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (9,577 samples, 0.09%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-161.5 (9,279 samples, 0.09%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (64,603 samples, 0.64%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (5,850 samples, 0.06%) + + + +@anon-func-161.5 (21,948 samples, 0.22%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (1,963 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,260 samples, 0.01%) + + + +@anon-func-435.5 (4,032 samples, 0.04%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-361.7 (1,821 samples, 0.02%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,280 samples, 0.01%) + + + +@anon-func-173.5 (543,715 samples, 5.36%) +@anon-.. + + +correction (880 samples, 0.01%) + + + +@anon-func-481.5 (2,647 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +map (1,518 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (564,820 samples, 5.57%) +@anon-f.. + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,934 samples, 0.04%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polyOrder (1,186 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +rec (20,356 samples, 0.20%) + + + +rec (68,740 samples, 0.68%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,380 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,380 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-173.5 (644,197 samples, 6.35%) +@anon-fu.. + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (66,134 samples, 0.65%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +rec (32,241 samples, 0.32%) + + + +@anon-func-435.5 (7,763 samples, 0.08%) + + + +@anon-func-435.5 (8,910 samples, 0.09%) + + + +correction (1,299 samples, 0.01%) + + + +@anon-func-435.5 (928 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (139,590 samples, 1.38%) + + + +@anon-func-173.5 (259,622 samples, 2.56%) +@a.. + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (1,664 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (10,081 samples, 0.10%) + + + +polySub (1,299 samples, 0.01%) + + + +@anon-func-173.5 (96,107 samples, 0.95%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +rec (24,825 samples, 0.24%) + + + +@anon-func-300.5 (19,488 samples, 0.19%) + + + +encode (2,000 samples, 0.02%) + + + +rec (7,037 samples, 0.07%) + + + +@anon-func-173.5 (69,179 samples, 0.68%) + + + +@anon-func-48.7 (1,394 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +@anon-func-173.5 (989,941 samples, 9.76%) +@anon-func-173.5 + + +$lambda (1,584 samples, 0.02%) + + + +encode (1,232 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyPadRight (953 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (892 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (64,486 samples, 0.64%) + + + +@anon-func-173.5 (8,788 samples, 0.09%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-73.5 (109,809 samples, 1.08%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +rec (49,666 samples, 0.49%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +go (2,000 samples, 0.02%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,200 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +rec (4,185 samples, 0.04%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,498 samples, 0.01%) + + + +@anon-func-173.5 (3,874 samples, 0.04%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +polyPadLeft (1,674 samples, 0.02%) + + + +rec (1,267 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +polyMulTerm (1,170 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (41,878 samples, 0.41%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-481.5 (8,009 samples, 0.08%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +rec (1,142 samples, 0.01%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,872 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +interleave (2,592 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,973 samples, 0.04%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,027 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyPadLeft (1,159 samples, 0.01%) + + + +polyPadRight (2,690 samples, 0.03%) + + + +go (1,642 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,101 samples, 0.01%) + + + +@anon-func-173.5 (2,735 samples, 0.03%) + + + +@anon-func-435.5 (2,560 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-300.5 (67,086 samples, 0.66%) + + + +flatten (1,430 samples, 0.01%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (3,040 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,246 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (71,900 samples, 0.71%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (146,266 samples, 1.44%) + + + +rec (46,486 samples, 0.46%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-435.5 (27,328 samples, 0.27%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,534 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-481.5 (5,502 samples, 0.05%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (1,066 samples, 0.01%) + + + +encode (1,404 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +natZipWith (8,064 samples, 0.08%) + + + +interleave (8,262 samples, 0.08%) + + + +@anon-func-173.5 (107,877 samples, 1.06%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (5,944 samples, 0.06%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (10,120 samples, 0.10%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (256,102 samples, 2.52%) +@a.. + + +interleave (2,592 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-173.5 (407,929 samples, 4.02%) +@ano.. + + +polyDivMod (1,952 samples, 0.02%) + + + +polyPadRight (2,322 samples, 0.02%) + + + +@anon-func-481.5 (1,330 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,915 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +map (2,754 samples, 0.03%) + + + +@anon-func-435.5 (6,930 samples, 0.07%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (2,704 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-435.5 (19,584 samples, 0.19%) + + + +polyGrow (2,909 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +natXor (7,392 samples, 0.07%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (15,595 samples, 0.15%) + + + +@anon-func-435.5 (7,865 samples, 0.08%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +polyAdd (928 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +go (931 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-481.5 (2,577 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (144,518 samples, 1.42%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (101,215 samples, 1.00%) + + + +@anon-func-79.3 (46,208 samples, 0.46%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (105,424 samples, 1.04%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-435.5 (22,267 samples, 0.22%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (9,075 samples, 0.09%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (4,808 samples, 0.05%) + + + +@anon-func-79.3 (1,892 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +polyPadLeft (1,147 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,404 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polySub (1,875 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,242 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (53,894 samples, 0.53%) + + + +encode (2,975 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-161.5 (6,624 samples, 0.07%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (5,056 samples, 0.05%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-435.5 (42,240 samples, 0.42%) + + + +$lambda (864 samples, 0.01%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +patternCoords (1,944 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,227 samples, 0.08%) + + + +polyDivMod (19,224 samples, 0.19%) + + + +$lambda (2,880 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyDivMod (931 samples, 0.01%) + + + +natZipWith (81,984 samples, 0.81%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,886 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,905 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (8,736 samples, 0.09%) + + + +correction (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +step (972 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (50,710 samples, 0.50%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +correction (1,504 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (120,208 samples, 1.18%) + + + +polyScale (1,760 samples, 0.02%) + + + +polyDivMod (8,262 samples, 0.08%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (202,119 samples, 1.99%) +@.. + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +elemAdd (10,752 samples, 0.11%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,287 samples, 0.05%) + + + +@anon-func-32.65 (1,664 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polySub (2,688 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +finderTLCoords (2,826 samples, 0.03%) + + + +rec (40,275 samples, 0.40%) + + + +rec (9,017 samples, 0.09%) + + + +pathCoords (2,486 samples, 0.02%) + + + +@anon-func-68.41 (5,376 samples, 0.05%) + + + +@anon-func-435.5 (51,734 samples, 0.51%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-435.5 (50,654 samples, 0.50%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,115 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,274 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (19,360 samples, 0.19%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-173.5 (3,738 samples, 0.04%) + + + +interleave (1,760 samples, 0.02%) + + + +generate (1,704 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (1,053 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-173.5 (178,310 samples, 1.76%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-173.5 (170,566 samples, 1.68%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (924,589 samples, 9.11%) +@anon-func-17.. + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,814 samples, 0.09%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (70,037 samples, 0.69%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,075 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (23,744 samples, 0.23%) + + + +@anon-func-173.5 (208,147 samples, 2.05%) +@.. + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,198,764 samples, 11.82%) +@anon-func-173.5 + + +generate (2,975 samples, 0.03%) + + + +polyDivMod (1,261 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +polyMulTerm (1,200 samples, 0.01%) + + + +@anon-func-435.5 (5,184 samples, 0.05%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,772 samples, 0.02%) + + + +$lambda (931 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (14,520 samples, 0.14%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-435.5 (30,854 samples, 0.30%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (198,550 samples, 1.96%) +@.. + + +$lambda (864 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +rec (1,868 samples, 0.02%) + + + +encode (1,892 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (9,408 samples, 0.09%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (936 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +go (1,299 samples, 0.01%) + + + +@anon-func-435.5 (31,574 samples, 0.31%) + + + +@anon-func-435.5 (43,776 samples, 0.43%) + + + +@anon-func-173.5 (1,794 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (29,107 samples, 0.29%) + + + +generate (2,975 samples, 0.03%) + + + +polyScale (1,386 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +polyZipWith (5,767 samples, 0.06%) + + + +polyAdd (5,376 samples, 0.05%) + + + +go (1,120 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-161.5 (3,552 samples, 0.04%) + + + +@anon-func-30.36 (2,754 samples, 0.03%) + + + +$lambda (2,480 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,642 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-481.5 (3,324 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (1,142 samples, 0.01%) + + + +@anon-func-173.5 (159,923 samples, 1.58%) + + + +go (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,584 samples, 0.04%) + + + +@anon-func-173.5 (64,317 samples, 0.63%) + + + +rec (1,171 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-173.5 (84,095 samples, 0.83%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (3,354 samples, 0.03%) + + + +rec (2,991 samples, 0.03%) + + + +@anon-func-51.11 (1,326 samples, 0.01%) + + + +map (1,142 samples, 0.01%) + + + +@anon-func-173.5 (47,157 samples, 0.46%) + + + +@anon-func-30.36 (1,125 samples, 0.01%) + + + +@anon-func-435.5 (88,670 samples, 0.87%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (12,547 samples, 0.12%) + + + +@anon-func-435.5 (7,590 samples, 0.07%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,002,389 samples, 9.88%) +@anon-func-173.5 + + +next (11,877 samples, 0.12%) + + + +@anon-func-48.7 (1,200 samples, 0.01%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (6,871 samples, 0.07%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-435.5 (10,208 samples, 0.10%) + + + +@anon-func-481.5 (894 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (1,434 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (37,729 samples, 0.37%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +elemDiv (1,760 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-51.11 (892 samples, 0.01%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (39,640 samples, 0.39%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-361.7 (882 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,876 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-435.5 (9,445 samples, 0.09%) + + + +map (1,584 samples, 0.02%) + + + +polyAdd (2,368 samples, 0.02%) + + + +polyGrow (2,325 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,248 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-51.11 (931 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (5,376 samples, 0.05%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (5,278 samples, 0.05%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +$lambda (6,022 samples, 0.06%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-173.5 (1,148,965 samples, 11.33%) +@anon-func-173.5 + + +encode (864 samples, 0.01%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +pathCoords (2,826 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +go (1,120 samples, 0.01%) + + + +encode (2,384 samples, 0.02%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-435.5 (5,060 samples, 0.05%) + + + +@anon-func-435.5 (24,967 samples, 0.25%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyPadRight (1,770 samples, 0.02%) + + + +@anon-func-481.5 (2,624 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,111 samples, 0.03%) + + + +@anon-func-435.5 (5,089 samples, 0.05%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (56,881 samples, 0.56%) + + + +polyZipWith (864 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,795 samples, 0.04%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-300.5 (1,380 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-173.5 (3,484 samples, 0.03%) + + + +@anon-func-99.14 (1,470 samples, 0.01%) + + + +@anon-func-173.5 (4,654 samples, 0.05%) + + + +go (864 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +encode (2,955 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +interleave (23,772 samples, 0.23%) + + + +@anon-func-435.5 (7,296 samples, 0.07%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-435.5 (14,400 samples, 0.14%) + + + +correction (880 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-173.5 (167,750 samples, 1.65%) + + + +@anon-func-435.5 (1,664 samples, 0.02%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +natXor (34,944 samples, 0.34%) + + + +rec (19,705 samples, 0.19%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-435.5 (5,824 samples, 0.06%) + + + +@anon-func-435.5 (9,900 samples, 0.10%) + + + +map (864 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +natToBytes (108,864 samples, 1.07%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +natZipWith (2,688 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +interleave (1,115 samples, 0.01%) + + + +@anon-func-481.5 (2,164 samples, 0.02%) + + + +@anon-func-435.5 (24,640 samples, 0.24%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-173.5 (71,425 samples, 0.70%) + + + +go (880 samples, 0.01%) + + + +@anon-func-435.5 (1,664 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (40,658 samples, 0.40%) + + + +polyAddTerm (1,518 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +rec (66,480 samples, 0.66%) + + + +@anon-func-51.11 (1,232 samples, 0.01%) + + + +@anon-func-173.5 (100,531 samples, 0.99%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +encode (1,267 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-173.5 (105,017 samples, 1.04%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +rec (31,623 samples, 0.31%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (46,208 samples, 0.46%) + + + +@anon-func-32.65 (2,349 samples, 0.02%) + + + +interleave (1,440 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (66,528 samples, 0.66%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-435.5 (18,656 samples, 0.18%) + + + +go (2,880 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-48.7 (15,487 samples, 0.15%) + + + +$lambda (1,504 samples, 0.01%) + + + +encode (4,400 samples, 0.04%) + + + +polyDivMod (1,767 samples, 0.02%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-173.5 (1,768 samples, 0.02%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +rec (22,971 samples, 0.23%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +traceCoords (4,734 samples, 0.05%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-393.5 (1,240 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +natToBits (9,735 samples, 0.10%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (3,360 samples, 0.03%) + + + +@anon-func-435.5 (1,221 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyAdd (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (12,907 samples, 0.13%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$loop/1 (3,946 samples, 0.04%) + + + +@anon-func-435.5 (1,927 samples, 0.02%) + + + +@anon-func-173.5 (77,453 samples, 0.76%) + + + +@anon-func-173.5 (34,999 samples, 0.35%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (32,606 samples, 0.32%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (15,456 samples, 0.15%) + + + +encode (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,005,501 samples, 9.91%) +@anon-func-173.5 + + +@anon-func-435.5 (49,214 samples, 0.49%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-435.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (1,706 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (128,476 samples, 1.27%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (10,080 samples, 0.10%) + + + +encode (2,975 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (11,934 samples, 0.12%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (2,944 samples, 0.03%) + + + +@anon-func-79.3 (2,457 samples, 0.02%) + + + +pathCoords (972 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +encode (2,384 samples, 0.02%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (1,354 samples, 0.01%) + + + +go (1,392 samples, 0.01%) + + + +polySub (1,207 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-435.5 (19,567 samples, 0.19%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +encode (2,212 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-300.5 (1,170 samples, 0.01%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +@anon-func-79.3 (2,614,330 samples, 25.77%) +@anon-func-79.3 + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (42,944 samples, 0.42%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-161.5 (1,936 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-173.5 (4,116 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,142 samples, 0.01%) + + + +@anon-func-173.5 (3,373 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-173.5 (200,662 samples, 1.98%) +@.. + + +@anon-func-481.5 (6,423 samples, 0.06%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (6,240 samples, 0.06%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-173.5 (750,005 samples, 7.39%) +@anon-func.. + + +@anon-func-30.36 (1,886 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,100 samples, 0.02%) + + + +@anon-func-173.5 (401,901 samples, 3.96%) +@ano.. + + +@anon-func-435.5 (8,832 samples, 0.09%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (12,992 samples, 0.13%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-481.5 (2,030 samples, 0.02%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +polyZipWith (2,409 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (46,656 samples, 0.46%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polySub (1,267 samples, 0.01%) + + + +@anon-func-173.5 (129,916 samples, 1.28%) + + + +@anon-func-173.5 (75,667 samples, 0.75%) + + + +natXor (112,896 samples, 1.11%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-435.5 (16,669 samples, 0.16%) + + + +foldr (1,375 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-173.5 (146,630 samples, 1.45%) + + + +map (880 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (83,523 samples, 0.82%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,767 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (936 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,522 samples, 0.02%) + + + +@anon-func-173.5 (107,019 samples, 1.05%) + + + +polyAdd (3,159 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (395,873 samples, 3.90%) +@ano.. + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (2,880 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,039,889 samples, 10.25%) +@anon-func-173.5 + + +@anon-func-435.5 (3,850 samples, 0.04%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-173.5 (3,191 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +forIn (1,775 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +pathCoords (2,955 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-435.5 (26,506 samples, 0.26%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (972 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-435.5 (25,190 samples, 0.25%) + + + +$lambda (46,208 samples, 0.46%) + + + +map (2,880 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-289.5 (1,116 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +patternCoords (3,520 samples, 0.03%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-435.5 (7,040 samples, 0.07%) + + + +polySub (2,688 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,349 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,151 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (16,059 samples, 0.16%) + + + +encode (2,877 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (5,974 samples, 0.06%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,391 samples, 0.01%) + + + +@anon-func-435.5 (27,136 samples, 0.27%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-435.5 (960 samples, 0.01%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +polyAdd (5,760 samples, 0.06%) + + + +$lambda (4,808 samples, 0.05%) + + + +@anon-func-173.5 (4,376 samples, 0.04%) + + + +correction (1,173 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +polyAdd (928 samples, 0.01%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (3,496 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyScale (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (156,486 samples, 1.54%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyNew (972 samples, 0.01%) + + + +@anon-func-173.5 (90,959 samples, 0.90%) + + + +@anon-func-48.7 (2,614,330 samples, 25.77%) +@anon-func-48.7 + + +correction (1,184 samples, 0.01%) + + + +@anon-func-173.5 (1,211 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyMulTerm (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +pathCoords (26,689 samples, 0.26%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-435.5 (6,624 samples, 0.07%) + + + +@anon-func-435.5 (36,288 samples, 0.36%) + + + +$lambda (2,877 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-435.5 (80,640 samples, 0.79%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,889 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +rec (2,642 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (124,240 samples, 1.22%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,350 samples, 0.09%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-173.5 (6,448 samples, 0.06%) + + + +polySub (1,184 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,678 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-453.5 (1,422 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (1,431 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-435.5 (28,160 samples, 0.28%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (14,190 samples, 0.14%) + + + +finderCoords (972 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +formatCoords (1,394 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,299 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +@anon-func-435.5 (13,530 samples, 0.13%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (990 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +toListWithLength (1,470 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (142,406 samples, 1.40%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-173.5 (66,033 samples, 0.65%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,136 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (205,133 samples, 2.02%) +@.. + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-173.5 (59,732 samples, 0.59%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (10,752 samples, 0.11%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +rec (11,642 samples, 0.11%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (32,224 samples, 0.32%) + + + +map (1,104 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-435.5 (8,739 samples, 0.09%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,120 samples, 0.05%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-435.5 (62,894 samples, 0.62%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-453.5 (7,040 samples, 0.07%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-173.5 (27,607 samples, 0.27%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,792 samples, 0.02%) + + + +@anon-func-161.5 (1,196 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +map (10,152 samples, 0.10%) + + + +polyZipWith (1,216 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (9,127 samples, 0.09%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,430 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-265.5 (2,853 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,207 samples, 0.01%) + + + +polyScale (1,760 samples, 0.02%) + + + +@anon-func-173.5 (123,568 samples, 1.22%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (2,683 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyZipWith (70,912 samples, 0.70%) + + + +encode (2,496 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +pathCoords (1,404 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-173.5 (14,816 samples, 0.15%) + + + +@anon-func-173.5 (2,184 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,299 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (65,054 samples, 0.64%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,224 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (7,680 samples, 0.08%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (23,296 samples, 0.23%) + + + +@anon-func-300.5 (1,674 samples, 0.02%) + + + +@anon-func-173.5 (9,022 samples, 0.09%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (15,693 samples, 0.15%) + + + +correction (1,216 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +polyPadLeft (1,909 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (120,086 samples, 1.18%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-173.5 (124,912 samples, 1.23%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (7,645 samples, 0.08%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-435.5 (1,728 samples, 0.02%) + + + +@anon-func-173.5 (3,621 samples, 0.04%) + + + +rec (46,052 samples, 0.45%) + + + +interleave (3,424 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (1,207 samples, 0.01%) + + + +rec (1,847 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (105,303 samples, 1.04%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,136 samples, 0.01%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +polyMulTerm (1,886 samples, 0.02%) + + + +correction (2,688 samples, 0.03%) + + + +rec (3,642 samples, 0.04%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +$lambda (23,752 samples, 0.23%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (392,859 samples, 3.87%) +@ano.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +interleave (864 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,184 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-481.5 (3,272 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-54.15 (4,808 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +rec (3,767 samples, 0.04%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-38.11 (1,011 samples, 0.01%) + + + +@anon-func-435.5 (6,380 samples, 0.06%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-51.11 (3,520 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (47,520 samples, 0.47%) + + + +map (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-300.5 (1,392 samples, 0.01%) + + + +@anon-func-435.5 (31,616 samples, 0.31%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,352 samples, 0.04%) + + + +rec (50,801 samples, 0.50%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-173.5 (4,415 samples, 0.04%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-161.5 (1,107 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (96,768 samples, 0.95%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-32.65 (1,944 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-173.5 (12,128 samples, 0.12%) + + + +encode (1,216 samples, 0.01%) + + + +map (1,125 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (13,768 samples, 0.14%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (13,207 samples, 0.13%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +forIn (1,107 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (20,130 samples, 0.20%) + + + +@anon-func-435.5 (69,966 samples, 0.69%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +map (864 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,394 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (1,392 samples, 0.01%) + + + +@anon-func-435.5 (2,592 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-412.5 (1,104 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (32,234 samples, 0.32%) + + + +@anon-func-51.11 (1,504 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (42,366 samples, 0.42%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (31,360 samples, 0.31%) + + + +@anon-func-173.5 (1,055 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +rec (11,583 samples, 0.11%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (1,728 samples, 0.02%) + + + +@anon-func-173.5 (29,073 samples, 0.29%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-393.5 (9,678 samples, 0.10%) + + + +go (2,592 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +rec (1,925 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (1,164,525 samples, 11.48%) +@anon-func-173.5 + + +map (1,104 samples, 0.01%) + + + +correction (1,115 samples, 0.01%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-173.5 (7,852 samples, 0.08%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-173.5 (78,375 samples, 0.77%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (863 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-173.5 (196,091 samples, 1.93%) +@.. + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-435.5 (8,064 samples, 0.08%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,564 samples, 0.05%) + + + +map (880 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (16,141 samples, 0.16%) + + + +@anon-func-173.5 (1,120,957 samples, 11.05%) +@anon-func-173.5 + + +rec (21,658 samples, 0.21%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +map (4,266 samples, 0.04%) + + + +encode (1,875 samples, 0.02%) + + + +interleave (886 samples, 0.01%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-173.5 (4,767 samples, 0.05%) + + + +@anon-func-435.5 (3,300 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +@anon-func-435.5 (4,455 samples, 0.04%) + + + +@anon-func-435.5 (17,645 samples, 0.17%) + + + +generate (2,877 samples, 0.03%) + + + +rec (1,509 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +B_div (57,798 samples, 0.57%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-173.5 (19,963 samples, 0.20%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +rec (3,711 samples, 0.04%) + + + +map (1,887 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +pathCoords (2,075 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (94,000 samples, 0.93%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (57,134 samples, 0.56%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +polyAdd (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyLen (2,628 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (10,374 samples, 0.10%) + + + +polyAddTerm (1,207 samples, 0.01%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +@anon-func-48.7 (19,224 samples, 0.19%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-435.5 (27,238 samples, 0.27%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +$lambda (1,184 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +correction (1,200 samples, 0.01%) + + + +@anon-func-161.5 (1,008 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (32,654 samples, 0.32%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,289 samples, 0.01%) + + + +encode (1,200 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (3,380 samples, 0.03%) + + + +@anon-func-393.5 (1,755 samples, 0.02%) + + + +@anon-func-481.5 (5,482 samples, 0.05%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +interleave (1,115 samples, 0.01%) + + + +rec (63,303 samples, 0.62%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (101,405 samples, 1.00%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +map (1,120 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-173.5 (14,144 samples, 0.14%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (3,465 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-481.5 (5,307 samples, 0.05%) + + + +go (864 samples, 0.01%) + + + +@anon-func-412.5 (1,240 samples, 0.01%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +$lambda (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (3,520 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (4,108 samples, 0.04%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (4,808 samples, 0.05%) + + + +@anon-func-435.5 (3,905 samples, 0.04%) + + + +map (1,760 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (44,894 samples, 0.44%) + + + +@anon-func-435.5 (8,125 samples, 0.08%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (7,098 samples, 0.07%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +pathCoords (2,112 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-161.5 (1,820 samples, 0.02%) + + + +@anon-func-38.11 (1,207 samples, 0.01%) + + + +@anon-func-51.11 (1,511 samples, 0.01%) + + + +@anon-func-435.5 (28,946 samples, 0.29%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +rec (3,245 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,112 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (960 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (45,373 samples, 0.45%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-173.5 (58,025 samples, 0.57%) + + + +@anon-func-161.5 (6,246 samples, 0.06%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +@anon-func-435.5 (30,784 samples, 0.30%) + + + +@anon-func-481.5 (4,073 samples, 0.04%) + + + +pathCoords (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (9,379 samples, 0.09%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (45,646 samples, 0.45%) + + + +interleave (880 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +finderCoords (3,520 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,375 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-435.5 (28,512 samples, 0.28%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-173.5 (7,514 samples, 0.07%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +rec (27,647 samples, 0.27%) + + + +@anon-func-435.5 (17,600 samples, 0.17%) + + + +@anon-func-173.5 (4,290 samples, 0.04%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,623 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +rec (3,355 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +go (2,384 samples, 0.02%) + + + +interleave (1,584 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (960 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (57,453 samples, 0.57%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (108,163 samples, 1.07%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-173.5 (83,237 samples, 0.82%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-161.5 (3,136 samples, 0.03%) + + + +@anon-func-38.11 (1,391 samples, 0.01%) + + + +@anon-func-393.5 (6,748 samples, 0.07%) + + + +map (2,592 samples, 0.03%) + + + +polyAdd (1,218 samples, 0.01%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-435.5 (9,240 samples, 0.09%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,527 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (70,407 samples, 0.69%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,627 samples, 0.05%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,840 samples, 0.04%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (96,679 samples, 0.95%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-173.5 (1,133 samples, 0.01%) + + + +encode (1,394 samples, 0.01%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,764 samples, 0.02%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +$lambda (2,000 samples, 0.02%) + + + +pathCoords (2,955 samples, 0.03%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,200 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +rec (19,271 samples, 0.19%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (26,582 samples, 0.26%) + + + +encode (1,207 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,754 samples, 0.03%) + + + +@anon-func-481.5 (3,107 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (21,888 samples, 0.22%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAddTerm (10,152 samples, 0.10%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-173.5 (3,881 samples, 0.04%) + + + +@anon-func-173.5 (73,172 samples, 0.72%) + + + +@anon-func-435.5 (33,280 samples, 0.33%) + + + +generate (1,107 samples, 0.01%) + + + +@anon-func-173.5 (380,803 samples, 3.75%) +@ano.. + + +@anon-func-435.5 (3,135 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (10,368 samples, 0.10%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (9,280 samples, 0.09%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-435.5 (5,811 samples, 0.06%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +$lambda (3,630 samples, 0.04%) + + + +rec (2,835 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,761 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +polyAdd (864 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-161.5 (4,608 samples, 0.05%) + + + +go (3,424 samples, 0.03%) + + + +$lambda (26,582 samples, 0.26%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,619,743 samples, 25.82%) +@anon-func-79.3 + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,785 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-173.5 (148,742 samples, 1.47%) + + + +polyScale (1,092 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (6,160 samples, 0.06%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (21,888 samples, 0.22%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (14,740 samples, 0.15%) + + + +@anon-func-32.65 (3,033 samples, 0.03%) + + + +@anon-func-435.5 (8,480 samples, 0.08%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,128 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +elemAdd (19,488 samples, 0.19%) + + + +@anon-func-173.5 (15,322 samples, 0.15%) + + + +interleave (1,023 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (10,944 samples, 0.11%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-173.5 (7,254 samples, 0.07%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +toBlocks (4,400 samples, 0.04%) + + + +@anon-func-393.5 (1,106 samples, 0.01%) + + + +@anon-func-173.5 (1,508 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +@anon-func-453.5 (2,065 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (43,189 samples, 0.43%) + + + +@anon-func-481.5 (1,890 samples, 0.02%) + + + +@anon-func-435.5 (18,847 samples, 0.19%) + + + +@anon-func-79.3 (3,040 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (961,933 samples, 9.48%) +@anon-func-17.. + + +polyZipWith (2,506 samples, 0.02%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (1,392 samples, 0.01%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (880 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +polyPadLeft (909 samples, 0.01%) + + + +go (935 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +correction (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-161.5 (7,840 samples, 0.08%) + + + +@anon-func-30.36 (23,772 samples, 0.23%) + + + +rec (8,267 samples, 0.08%) + + + +@anon-func-481.5 (4,546 samples, 0.04%) + + + +@anon-func-173.5 (2,527 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +foldr (912 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +elemNew (1,591 samples, 0.02%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (35,616 samples, 0.35%) + + + +@anon-func-435.5 (19,207 samples, 0.19%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +map (1,440 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +correction (11,934 samples, 0.12%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (5,885 samples, 0.06%) + + + +@anon-func-51.11 (24,232 samples, 0.24%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +$lambda (6,016 samples, 0.06%) + + + +@anon-func-435.5 (15,427 samples, 0.15%) + + + +rec (20,573 samples, 0.20%) + + + +@anon-func-30.36 (1,017 samples, 0.01%) + + + +@anon-func-435.5 (10,340 samples, 0.10%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,342 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,023 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (447,111 samples, 4.41%) +@anon.. + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-173.5 (4,966 samples, 0.05%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +polySub (2,688 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (192,918 samples, 1.90%) +@.. + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-161.5 (5,488 samples, 0.05%) + + + +@anon-func-173.5 (169,862 samples, 1.67%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAdd (960 samples, 0.01%) + + + +@anon-func-173.5 (245,470 samples, 2.42%) +@a.. + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (110,800 samples, 1.09%) + + + +@anon-func-79.3 (1,326 samples, 0.01%) + + + +@anon-func-361.7 (1,527 samples, 0.02%) + + + +interleave (19,224 samples, 0.19%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (41,472 samples, 0.41%) + + + +@anon-func-173.5 (144,853 samples, 1.43%) + + + +@anon-func-435.5 (13,824 samples, 0.14%) + + + +@anon-func-32.65 (2,950 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,970 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (184,110 samples, 1.81%) +@.. + + +@anon-func-435.5 (13,985 samples, 0.14%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +interleave (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +traceCoords (17,696 samples, 0.17%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,021,061 samples, 10.07%) +@anon-func-173.5 + + +@anon-func-173.5 (5,301 samples, 0.05%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-173.5 (4,524 samples, 0.04%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (3,988 samples, 0.04%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,056 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (7,687 samples, 0.08%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (840,409 samples, 8.28%) +@anon-func-.. + + +@anon-func-79.3 (4,808 samples, 0.05%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-265.5 (1,143 samples, 0.01%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +polyAdd (1,159 samples, 0.01%) + + + +correction (1,120 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-161.5 (1,824 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +polyOrder (2,772 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +elemMul (35,584 samples, 0.35%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +$lambda (5,208 samples, 0.05%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,304 samples, 0.01%) + + + +@anon-func-51.11 (2,950 samples, 0.03%) + + + +@anon-func-30.36 (1,440 samples, 0.01%) + + + +@anon-func-79.3 (8,120 samples, 0.08%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +$lambda (10,152 samples, 0.10%) + + + +@anon-func-38.11 (1,142 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-289.5 (979 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +encode (2,955 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-435.5 (3,520 samples, 0.03%) + + + +@anon-func-173.5 (938 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,014 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +@anon-func-173.5 (2,626 samples, 0.03%) + + + +@anon-func-173.5 (50,014 samples, 0.49%) + + + +@anon-func-173.5 (83,481 samples, 0.82%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +polyScale (1,120 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +encode (9,140 samples, 0.09%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (3,432 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (12,679 samples, 0.12%) + + + +@anon-func-173.5 (419,985 samples, 4.14%) +@ano.. + + +@anon-func-173.5 (594,960 samples, 5.86%) +@anon-f.. + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +B_sub (37,695 samples, 0.37%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-481.5 (3,575 samples, 0.04%) + + + +@anon-func-435.5 (3,575 samples, 0.04%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,458 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +@anon-func-173.5 (993,053 samples, 9.79%) +@anon-func-173.5 + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-481.5 (1,800 samples, 0.02%) + + + +@anon-func-435.5 (2,176 samples, 0.02%) + + + +rec (2,892 samples, 0.03%) + + + +correction (2,000 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (34,453 samples, 0.34%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (17,233 samples, 0.17%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-435.5 (120,453 samples, 1.19%) + + + +@anon-func-435.5 (10,171 samples, 0.10%) + + + +@anon-func-79.3 (8,262 samples, 0.08%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-435.5 (2,530 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-435.5 (9,667 samples, 0.10%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-161.5 (19,334 samples, 0.19%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +rec (8,017 samples, 0.08%) + + + +encode (1,107 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,761 samples, 0.02%) + + + +rec (1,323 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,304 samples, 0.02%) + + + +@anon-func-435.5 (5,760 samples, 0.06%) + + + +@anon-func-265.5 (1,050 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,404 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-481.5 (5,990 samples, 0.06%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +natXor (48,384 samples, 0.48%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,768 samples, 0.09%) + + + +@anon-func-173.5 (622,413 samples, 6.14%) +@anon-fu.. + + +@anon-func-51.11 (960 samples, 0.01%) + + + +@anon-func-435.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-435.5 (8,064 samples, 0.08%) + + + +encode (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-300.5 (1,023 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (102,144 samples, 1.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +polyAdd (1,147 samples, 0.01%) + + + +@anon-func-173.5 (206,998 samples, 2.04%) +@.. + + +@anon-func-32.65 (17,696 samples, 0.17%) + + + +map (1,760 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +polyPadLeft (3,159 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +correction (1,504 samples, 0.01%) + + + +$lambda (26,689 samples, 0.26%) + + + +$lambda (3,424 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-173.5 (168,454 samples, 1.66%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (709,549 samples, 6.99%) +@anon-fun.. + + +toListWithLength (3,463 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +rec (11,392 samples, 0.11%) + + + +encode (2,480 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +@anon-func-161.5 (1,288 samples, 0.01%) + + + +@anon-func-161.5 (1,248 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (510,405 samples, 5.03%) +@anon-.. + + +@anon-func-435.5 (9,792 samples, 0.10%) + + + +map (2,384 samples, 0.02%) + + + +natFromBits (1,184 samples, 0.01%) + + + +@anon-func-48.7 (23,752 samples, 0.23%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (7,104 samples, 0.07%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-173.5 (2,631 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,800 samples, 0.09%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-79.3 (3,004 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (7,680 samples, 0.08%) + + + +$lambda (2,877 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-173.5 (17,779 samples, 0.18%) + + + +finderTRCoords (1,944 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +$lambda (2,448 samples, 0.02%) + + + +@anon-func-79.3 (1,504 samples, 0.01%) + + + +@anon-func-435.5 (10,176 samples, 0.10%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (4,800 samples, 0.05%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-435.5 (13,987 samples, 0.14%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-435.5 (21,632 samples, 0.21%) + + + +polyAddTerm (1,023 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (53,760 samples, 0.53%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +polyOrder (20,648 samples, 0.20%) + + + +generate (21,888 samples, 0.22%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (1,115 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +polyScale (2,000 samples, 0.02%) + + + +polyAddTerm (2,000 samples, 0.02%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (3,456 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,107 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-435.5 (2,287 samples, 0.02%) + + + +@anon-func-173.5 (79,805 samples, 0.79%) + + + +map (880 samples, 0.01%) + + + +@anon-func-30.36 (1,767 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-453.5 (7,070 samples, 0.07%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (3,431 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-173.5 (6,760 samples, 0.07%) + + + +generate (1,230 samples, 0.01%) + + + +@anon-func-173.5 (76,693 samples, 0.76%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-435.5 (10,699 samples, 0.11%) + + + +$lambda (1,504 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (102,736 samples, 1.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAdd (6,848 samples, 0.07%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-161.5 (5,472 samples, 0.05%) + + + +@anon-func-435.5 (11,550 samples, 0.11%) + + + +map (864 samples, 0.01%) + + + +@anon-func-173.5 (3,926 samples, 0.04%) + + + +@anon-func-173.5 (204,886 samples, 2.02%) +@.. + + +encode (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,480 samples, 0.02%) + + + +@anon-func-173.5 (186,366 samples, 1.84%) +@.. + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (1,638 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-412.5 (1,242 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (286,511 samples, 2.82%) +@a.. + + +@anon-func-51.11 (880 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,212 samples, 0.02%) + + + +encode (1,504 samples, 0.01%) + + + +@anon-func-173.5 (20,509 samples, 0.20%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +__wasm_call_ctors (981 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,511 samples, 0.01%) + + + +@anon-func-161.5 (42,242 samples, 0.42%) + + + +correction (1,184 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-173.5 (4,168 samples, 0.04%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-393.5 (1,104 samples, 0.01%) + + + +B_pow (7,574 samples, 0.07%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (7,641 samples, 0.08%) + + + +@anon-func-173.5 (2,370 samples, 0.02%) + + + +@anon-func-161.5 (2,619,743 samples, 25.82%) +@anon-func-161.5 + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,386 samples, 0.01%) + + + +polyZipWith (1,770 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (2,006 samples, 0.02%) + + + +@anon-func-300.5 (1,767 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-48.7 (1,730 samples, 0.02%) + + + +rec (2,079 samples, 0.02%) + + + +@anon-func-173.5 (1,300 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (77,760 samples, 0.77%) + + + +@anon-func-435.5 (40,934 samples, 0.40%) + + + +@anon-func-30.36 (1,391 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (926 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-173.5 (241,710 samples, 2.38%) +@.. + + +elemFromBits (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +interleave (1,430 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (14,351 samples, 0.14%) + + + +pathCoords (1,704 samples, 0.02%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-435.5 (1,344 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-244.5 (2,822,044 samples, 27.82%) +@anon-func-244.5 + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +rec (10,642 samples, 0.10%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (1,571 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +rec (4,078 samples, 0.04%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-79.3 (892 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (41,588 samples, 0.41%) + + + +@anon-func-79.3 (4,808 samples, 0.05%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (3,520 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-173.5 (102,157 samples, 1.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +traceCoords (76,220 samples, 0.75%) + + + +@anon-func-79.3 (2,882 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (926 samples, 0.01%) + + + +@anon-func-435.5 (1,485 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-173.5 (50,560 samples, 0.50%) + + + +rec (34,404 samples, 0.34%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +$lambda (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,248 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,624 samples, 0.03%) + + + +rec (78,978 samples, 0.78%) + + + +@anon-func-173.5 (2,905 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +go (2,754 samples, 0.03%) + + + +@anon-func-173.5 (737,557 samples, 7.27%) +@anon-func.. + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +rec (6,237 samples, 0.06%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-173.5 (3,068 samples, 0.03%) + + + +@anon-func-173.5 (108,112 samples, 1.07%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (2,457 samples, 0.02%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +$lambda (2,000 samples, 0.02%) + + + +correction (1,023 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (3,520 samples, 0.03%) + + + +@anon-func-173.5 (1,068 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (141,702 samples, 1.40%) + + + +@anon-func-173.5 (22,420 samples, 0.22%) + + + +map (9,320 samples, 0.09%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,323 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyLen (162,472 samples, 1.60%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-173.5 (3,146 samples, 0.03%) + + + +rec (25,758 samples, 0.25%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (8,262 samples, 0.08%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,754 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-173.5 (9,932 samples, 0.10%) + + + +map (2,592 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-51.11 (24,704 samples, 0.24%) + + + +correction (880 samples, 0.01%) + + + +interleave (2,887 samples, 0.03%) + + + +@anon-func-173.5 (1,158,301 samples, 11.42%) +@anon-func-173.5 + + +map (1,104 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (1,125 samples, 0.01%) + + + +pathCoords (2,955 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +interleave (1,023 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (7,365 samples, 0.07%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (3,033 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-161.5 (5,760 samples, 0.06%) + + + +@anon-func-435.5 (4,224 samples, 0.04%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,472 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (4,752 samples, 0.05%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (11,911 samples, 0.12%) + + + +map (19,224 samples, 0.19%) + + + +map (1,152 samples, 0.01%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-173.5 (1,195,652 samples, 11.79%) +@anon-func-173.5 + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +go (1,017 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (45,760 samples, 0.45%) + + + +@anon-func-173.5 (2,071 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +polyZipWith (864 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,124 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,517 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-173.5 (44,554 samples, 0.44%) + + + +polyMulTerm (1,386 samples, 0.01%) + + + +@anon-func-48.7 (1,944 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (5,887 samples, 0.06%) + + + +@anon-func-173.5 (43,604 samples, 0.43%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,075 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-161.5 (1,386 samples, 0.01%) + + + +@anon-func-435.5 (7,397 samples, 0.07%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-300.5 (1,200 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-161.5 (5,312 samples, 0.05%) + + + +@anon-func-30.36 (1,392 samples, 0.01%) + + + +@anon-func-173.5 (7,930 samples, 0.08%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,164 samples, 0.08%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (3,431 samples, 0.03%) + + + +@anon-func-173.5 (7,722 samples, 0.08%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-173.5 (164,230 samples, 1.62%) + + + +@anon-func-435.5 (25,147 samples, 0.25%) + + + +@anon-func-173.5 (7,944 samples, 0.08%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,221 samples, 0.05%) + + + +motoko_rts::memory::ic::linear_memory::_$LT$impl$u20$motoko_rts..memory..Memory$u20$for$u20$motoko_rts..memory..ic..IcMemory$GT$::grow_memory::hc224903332a6c43e (6,336 samples, 0.06%) + + + +@anon-func-173.5 (2,210 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,391 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-435.5 (25,530 samples, 0.25%) + + + +@anon-func-173.5 (2,175 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +polyPadRight (2,138 samples, 0.02%) + + + +@anon-func-38.11 (1,017 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (887,245 samples, 8.75%) +@anon-func-1.. + + +go (24,704 samples, 0.24%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-435.5 (1,387 samples, 0.01%) + + + +@anon-func-173.5 (5,200 samples, 0.05%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,340 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-161.5 (33,200 samples, 0.33%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (24,320 samples, 0.24%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +finderTRCoords (972 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-161.5 (8,624 samples, 0.09%) + + + +@anon-func-435.5 (8,407 samples, 0.08%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAdd (3,424 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +rec (2,757 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,540 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (64,334 samples, 0.63%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (1,344 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +map (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,240 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +toList (1,323 samples, 0.01%) + + + +@anon-func-435.5 (11,040 samples, 0.11%) + + + +@anon-func-173.5 (9,854 samples, 0.10%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (7,488 samples, 0.07%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +elemAdd (36,960 samples, 0.36%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-161.5 (1,404 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +finderCoords (2,826 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-435.5 (15,840 samples, 0.16%) + + + +formatVCoords (1,730 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +map (1,184 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,944 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-173.5 (933,925 samples, 9.21%) +@anon-func-17.. + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,485 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +go (10,152 samples, 0.10%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-173.5 (1,638 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,950 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-412.5 (1,140 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (809,289 samples, 7.98%) +@anon-func-.. + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (9,841 samples, 0.10%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,014 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (10,608 samples, 0.10%) + + + +@anon-func-435.5 (960 samples, 0.01%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-481.5 (1,330 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +elemAdd (8,064 samples, 0.08%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyDivMod (931 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyAdd (1,952 samples, 0.02%) + + + +interleave (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +rec (2,889 samples, 0.03%) + + + +natFromBytes (19,488 samples, 0.19%) + + + +map (1,104 samples, 0.01%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (18,560 samples, 0.18%) + + + +correction (13,768 samples, 0.14%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (60,192 samples, 0.59%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (489,307 samples, 4.82%) +@anon-.. + + +@anon-func-481.5 (2,030 samples, 0.02%) + + + +@anon-func-173.5 (7,384 samples, 0.07%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,075 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (36,614 samples, 0.36%) + + + +@anon-func-173.5 (187,049 samples, 1.84%) +@.. + + +@anon-func-161.5 (11,200 samples, 0.11%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +$lambda (2,112 samples, 0.02%) + + + +@anon-func-435.5 (14,167 samples, 0.14%) + + + +interleave (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyDivMod (1,023 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-161.5 (2,760 samples, 0.03%) + + + +rec (7,267 samples, 0.07%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (38,900 samples, 0.38%) + + + +interleave (864 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,446 samples, 0.01%) + + + +@anon-func-435.5 (26,994 samples, 0.27%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (29,792 samples, 0.29%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-435.5 (45,100 samples, 0.44%) + + + +polyAddTerm (1,767 samples, 0.02%) + + + +@anon-func-435.5 (5,419 samples, 0.05%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (6,560 samples, 0.06%) + + + +@anon-func-435.5 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (28,458 samples, 0.28%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,618 samples, 0.03%) + + + +correction (19,224 samples, 0.19%) + + + +@anon-func-435.5 (6,665 samples, 0.07%) + + + +@anon-func-173.5 (20,793 samples, 0.20%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +$lambda (2,955 samples, 0.03%) + + + +@anon-func-435.5 (3,080 samples, 0.03%) + + + +@anon-func-435.5 (37,974 samples, 0.37%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,504 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,524 samples, 0.02%) + + + +go (2,000 samples, 0.02%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +polyPadLeft (3,409 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (4,808 samples, 0.05%) + + + +@anon-func-38.11 (1,299 samples, 0.01%) + + + +@anon-func-48.7 (4,734 samples, 0.05%) + + + +elemAdd (48,384 samples, 0.48%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (17,767 samples, 0.18%) + + + +go (1,304 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-161.5 (872 samples, 0.01%) + + + +@anon-func-30.36 (24,232 samples, 0.24%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,821 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +correction (15,487 samples, 0.15%) + + + +traceCoords (71,900 samples, 0.71%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-435.5 (4,462 samples, 0.04%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +polySub (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-453.5 (4,539 samples, 0.04%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-173.5 (101,543 samples, 1.00%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (73,755 samples, 0.73%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-435.5 (8,917 samples, 0.09%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (11,301 samples, 0.11%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,728 samples, 0.02%) + + + +@anon-func-435.5 (1,408 samples, 0.01%) + + + +polySub (3,424 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (10,608 samples, 0.10%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +encode (932 samples, 0.01%) + + + +scale (3,552 samples, 0.04%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (9,984 samples, 0.10%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +rec (95,943 samples, 0.95%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (199,958 samples, 1.97%) +@.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,328 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (107,591 samples, 1.06%) + + + +@anon-func-54.15 (1,664 samples, 0.02%) + + + +interleave (2,592 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +rec (2,727 samples, 0.03%) + + + +elemDiv (2,480 samples, 0.02%) + + + +@anon-func-173.5 (4,784 samples, 0.05%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-173.5 (283,497 samples, 2.79%) +@a.. + + +@anon-func-173.5 (1,664 samples, 0.02%) + + + +polyZipWith (3,409 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-435.5 (6,937 samples, 0.07%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +map (1,299 samples, 0.01%) + + + +@anon-func-51.11 (1,230 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,636 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +elemAdd (35,616 samples, 0.35%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,986 samples, 0.04%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (1,192,540 samples, 11.76%) +@anon-func-173.5 + + +polyAdd (1,664 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +encode (1,107 samples, 0.01%) + + + +rowwise (2,457 samples, 0.02%) + + + +@anon-func-51.11 (14,612 samples, 0.14%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,170 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,982 samples, 0.03%) + + + +natXor (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-173.5 (8,606 samples, 0.08%) + + + +@anon-func-435.5 (6,160 samples, 0.06%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +generate (17,696 samples, 0.17%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (22,464 samples, 0.22%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +encode (1,120 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (23,785 samples, 0.23%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (136,840 samples, 1.35%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (675,317 samples, 6.66%) +@anon-fun.. + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,886 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (7,031 samples, 0.07%) + + + +generate (2,975 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-435.5 (5,376 samples, 0.05%) + + + +rec (186,584 samples, 1.84%) +rec + + +@anon-func-173.5 (9,987 samples, 0.10%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (6,875 samples, 0.07%) + + + +rec (3,753 samples, 0.04%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (199,105 samples, 1.96%) +@.. + + +pathCoords (2,877 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (2,474 samples, 0.02%) + + + +@anon-func-435.5 (11,227 samples, 0.11%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (250,343 samples, 2.47%) +@a.. + + +map (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (76,220 samples, 0.75%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (10,560 samples, 0.10%) + + + +encode (1,767 samples, 0.02%) + + + +@anon-func-435.5 (2,746 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polySub (2,688 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +rec (1,535 samples, 0.02%) + + + +@anon-func-435.5 (49,934 samples, 0.49%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,480 samples, 0.02%) + + + +@anon-func-173.5 (19,417 samples, 0.19%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +natXor (36,288 samples, 0.36%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-435.5 (13,420 samples, 0.13%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-435.5 (47,360 samples, 0.47%) + + + +@anon-func-32.65 (2,457 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (3,328 samples, 0.03%) + + + +@anon-func-173.5 (656,645 samples, 6.47%) +@anon-fu.. + + +@anon-func-453.5 (7,020 samples, 0.07%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAddTerm (1,504 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +interleave (1,023 samples, 0.01%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-435.5 (2,915 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-173.5 (79,233 samples, 0.78%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-435.5 (2,581 samples, 0.03%) + + + +@anon-func-173.5 (237,974 samples, 2.35%) +@.. + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (10,368 samples, 0.10%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-54.15 (3,033 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +pathCoords (3,033 samples, 0.03%) + + + +@anon-func-435.5 (1,728 samples, 0.02%) + + + +@anon-func-435.5 (4,864 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-173.5 (4,142 samples, 0.04%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +finderTLCoords (1,944 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +$lambda (1,887 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (7,920 samples, 0.08%) + + + +rec (60,359 samples, 0.60%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,048 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +correction (1,760 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,657 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +toTarget (3,040 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (34,454 samples, 0.34%) + + + +encode (2,975 samples, 0.03%) + + + +polyPadLeft (2,506 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-48.7 (1,023 samples, 0.01%) + + + +map (46,208 samples, 0.46%) + + + +encode (2,975 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (931 samples, 0.01%) + + + +@anon-func-173.5 (9,516 samples, 0.09%) + + + +encode (2,880 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,125 samples, 0.01%) + + + +@anon-func-48.7 (932 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polyZipWith (1,402 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +generate (1,527 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,760 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,944 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-32.65 (3,520 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-435.5 (4,891 samples, 0.05%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,664 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-435.5 (29,952 samples, 0.30%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (82,951 samples, 0.82%) + + + +rec (5,103 samples, 0.05%) + + + +@anon-func-435.5 (7,597 samples, 0.07%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +map (1,719 samples, 0.02%) + + + +@anon-func-435.5 (74,176 samples, 0.73%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +interleave (1,326 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (2,480 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (268,774 samples, 2.65%) +@a.. + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,024 samples, 0.01%) + + + +@anon-func-435.5 (12,349 samples, 0.12%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-435.5 (17,280 samples, 0.17%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (216,150 samples, 2.13%) +@.. + + +generate (2,975 samples, 0.03%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (12,547 samples, 0.12%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-173.5 (89,815 samples, 0.89%) + + + +@anon-func-435.5 (17,157 samples, 0.17%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-481.5 (4,142 samples, 0.04%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (23,732 samples, 0.23%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (21,908 samples, 0.22%) + + + +interleave (2,880 samples, 0.03%) + + + +polyZipWith (3,159 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,840 samples, 0.16%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (2,696 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (35,778 samples, 0.35%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +@anon-func-435.5 (24,200 samples, 0.24%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +rec (4,563 samples, 0.04%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (1,380 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,882 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyAdd (1,696 samples, 0.02%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +polyAdd (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (43,008 samples, 0.42%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,207 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,938 samples, 0.02%) + + + +encode (932 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (11,934 samples, 0.12%) + + + +@anon-func-173.5 (3,960 samples, 0.04%) + + + +alloc_words (6,336 samples, 0.06%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-173.5 (9,126 samples, 0.09%) + + + +@anon-func-435.5 (3,960 samples, 0.04%) + + + +natZipWith (5,376 samples, 0.05%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,391 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,392 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (21,547 samples, 0.21%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (218,966 samples, 2.16%) +@.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +polyDivMod (1,299 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-453.5 (3,716 samples, 0.04%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +rec (57,557 samples, 0.57%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyDivMod (1,386 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (227,414 samples, 2.24%) +@.. + + +$lambda (864 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (2,750 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (196,438 samples, 1.94%) +@.. + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,664 samples, 0.02%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (17,050 samples, 0.17%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (2,448 samples, 0.02%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (2,548 samples, 0.03%) + + + +encode (1,136 samples, 0.01%) + + + +@anon-func-173.5 (209,110 samples, 2.06%) +@.. + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (880 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +columnwise (1,980 samples, 0.02%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-393.5 (9,082 samples, 0.09%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (11,827 samples, 0.12%) + + + +interleave (24,232 samples, 0.24%) + + + +encode (892 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (2,647 samples, 0.03%) + + + +@anon-func-173.5 (6,812 samples, 0.07%) + + + +@anon-func-173.5 (265,413 samples, 2.62%) +@a.. + + +@anon-func-161.5 (888 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyPadLeft (2,138 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +go (1,014 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (34,070 samples, 0.34%) + + + +encode (1,152 samples, 0.01%) + + + +polyDivMod (892 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (57,716 samples, 0.57%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (36,288 samples, 0.36%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +@anon-func-173.5 (4,663 samples, 0.05%) + + + +polyScale (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +pathCoords (2,882 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (6,022 samples, 0.06%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,092 samples, 0.01%) + + + +@anon-func-495.31 (1,375 samples, 0.01%) + + + +@anon-func-32.65 (2,884 samples, 0.03%) + + + +@anon-func-435.5 (34,848 samples, 0.34%) + + + +@anon-func-161.5 (1,107 samples, 0.01%) + + + +@anon-func-173.5 (14,503 samples, 0.14%) + + + +rec (4,517 samples, 0.04%) + + + +generate (2,975 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +$lambda (9,140 samples, 0.09%) + + + +@anon-func-435.5 (17,280 samples, 0.17%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,120 samples, 0.01%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (1,518 samples, 0.01%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (79,888 samples, 0.79%) + + + +correction (2,880 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +rec (1,116 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-246.51 (2,822,044 samples, 27.82%) +@anon-func-246.51 + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (8,710 samples, 0.09%) + + + +encode (1,764 samples, 0.02%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (29,376 samples, 0.29%) + + + +@anon-func-48.7 (1,767 samples, 0.02%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +correction (1,887 samples, 0.02%) + + + +correction (2,688 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (5,974 samples, 0.06%) + + + +interleave (1,642 samples, 0.02%) + + + +@anon-func-435.5 (3,835 samples, 0.04%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-435.5 (48,494 samples, 0.48%) + + + +$lambda (2,496 samples, 0.02%) + + + +$lambda (1,571 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (22,693 samples, 0.22%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (8,085 samples, 0.08%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,518 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (36,910 samples, 0.36%) + + + +polySub (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +encode (1,017 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +rec (21,224 samples, 0.21%) + + + +@anon-func-435.5 (2,640 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +correction (2,880 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,685 samples, 0.02%) + + + +@anon-func-481.5 (4,915 samples, 0.05%) + + + +rec (21,007 samples, 0.21%) + + + +$lambda (2,877 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (429,027 samples, 4.23%) +@anon.. + + +@anon-func-435.5 (4,231 samples, 0.04%) + + + +$lambda (864 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,595 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-481.5 (2,151 samples, 0.02%) + + + +@anon-func-173.5 (79,216 samples, 0.78%) + + + +@anon-func-435.5 (5,995 samples, 0.06%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (477,251 samples, 4.70%) +@anon.. + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (42,643 samples, 0.42%) + + + +@anon-func-435.5 (15,400 samples, 0.15%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (15,290 samples, 0.15%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (1,690 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (178,117 samples, 1.76%) + + + +@anon-func-435.5 (28,214 samples, 0.28%) + + + +polyAdd (1,728 samples, 0.02%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +polyAdd (3,168 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (72,325 samples, 0.71%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (2,574 samples, 0.03%) + + + +@anon-func-435.5 (30,912 samples, 0.30%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (26,654 samples, 0.26%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (2,955 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (2,754 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAdd (2,208 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-229.5 (2,409 samples, 0.02%) + + + +@anon-func-435.5 (16,128 samples, 0.16%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,050 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-173.5 (58,597 samples, 0.58%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,890 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (3,607 samples, 0.04%) + + + +@anon-func-435.5 (112,896 samples, 1.11%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-48.7 (4,808 samples, 0.05%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (171,974 samples, 1.70%) + + + +polyAdd (3,904 samples, 0.04%) + + + +$lambda (3,004 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-51.11 (2,826 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,048 samples, 0.01%) + + + +@anon-func-435.5 (40,414 samples, 0.40%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-161.5 (1,664 samples, 0.02%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,261 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-481.5 (5,880 samples, 0.06%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-435.5 (21,888 samples, 0.22%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (5,406 samples, 0.05%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,642 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,504 samples, 0.01%) + + + +@anon-func-173.5 (31,508 samples, 0.31%) + + + +go (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyMulTerm (1,014 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,760 samples, 0.03%) + + + +@anon-func-48.7 (882 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-161.5 (10,368 samples, 0.10%) + + + +@anon-func-435.5 (3,043 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (71,467 samples, 0.70%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,212 samples, 0.02%) + + + +rec (1,863 samples, 0.02%) + + + +@anon-func-481.5 (877 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (11,934 samples, 0.12%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-435.5 (4,447 samples, 0.04%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (69,888 samples, 0.69%) + + + +encode (1,152 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +natFromBytes (7,392 samples, 0.07%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (37,242 samples, 0.37%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +polyScale (2,000 samples, 0.02%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +rec (37,803 samples, 0.37%) + + + +@anon-func-300.5 (1,053 samples, 0.01%) + + + +@anon-func-79.3 (23,772 samples, 0.23%) + + + +@anon-func-435.5 (957 samples, 0.01%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-173.5 (540,701 samples, 5.33%) +@anon-.. + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-79.3 (24,704 samples, 0.24%) + + + +@anon-func-435.5 (67,226 samples, 0.66%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,826 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,023 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (347,493 samples, 3.43%) +@an.. + + +encode (1,584 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,075 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +rec (10,142 samples, 0.10%) + + + +@anon-func-173.5 (84,953 samples, 0.84%) + + + +@anon-func-435.5 (47,054 samples, 0.46%) + + + +@anon-func-48.7 (2,950 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-481.5 (3,150 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (26,689 samples, 0.26%) + + + +map (1,011 samples, 0.01%) + + + +@anon-func-435.5 (4,033 samples, 0.04%) + + + +@anon-func-173.5 (1,980 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,432 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-289.5 (1,232 samples, 0.01%) + + + +encode (1,142 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-435.5 (2,029 samples, 0.02%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyAdd (3,520 samples, 0.03%) + + + +polyGrow (1,586 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-481.5 (4,470 samples, 0.04%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (85,936 samples, 0.85%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-300.5 (926 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (83,809 samples, 0.83%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (1,061,673 samples, 10.47%) +@anon-func-173.5 + + +@anon-func-435.5 (57,024 samples, 0.56%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-173.5 (3,647 samples, 0.04%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,746 samples, 0.06%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-435.5 (7,993 samples, 0.08%) + + + +pathCoords (1,944 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-51.11 (1,142 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +polyAdd (4,992 samples, 0.05%) + + + +encode (1,152 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-435.5 (4,576 samples, 0.05%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +$lambda (2,955 samples, 0.03%) + + + +@anon-func-173.5 (1,180,092 samples, 11.63%) +@anon-func-173.5 + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +natFromBytes (49,728 samples, 0.49%) + + + +@anon-func-173.5 (16,832 samples, 0.17%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,243 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (972 samples, 0.01%) + + + +$lambda (1,875 samples, 0.02%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +$lambda (46,208 samples, 0.46%) + + + +natZipWith (51,072 samples, 0.50%) + + + +correction (9,320 samples, 0.09%) + + + +interleave (1,152 samples, 0.01%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +generate (6,016 samples, 0.06%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polyAddTerm (880 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (4,640 samples, 0.05%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (5,280 samples, 0.05%) + + + +@anon-func-435.5 (1,056 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (32,850 samples, 0.32%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-161.5 (1,730 samples, 0.02%) + + + +@anon-func-435.5 (931 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +polySub (1,017 samples, 0.01%) + + + +@anon-func-51.11 (6,022 samples, 0.06%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,104 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (1,392 samples, 0.01%) + + + +rec (1,539 samples, 0.02%) + + + +rec (3,861 samples, 0.04%) + + + +encode (880 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (2,475 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (2,670 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-173.5 (338,373 samples, 3.34%) +@an.. + + +@anon-func-435.5 (185,325 samples, 1.83%) +@.. + + +correction (1,152 samples, 0.01%) + + + +@anon-func-435.5 (3,168 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +rec (11,892 samples, 0.12%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +pathCoords (972 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (20,736 samples, 0.20%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +polyGrow (1,409 samples, 0.01%) + + + +@anon-func-51.11 (1,299 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-435.5 (6,607 samples, 0.07%) + + + +$lambda (1,216 samples, 0.01%) + + + +rec (1,691 samples, 0.02%) + + + +@anon-func-173.5 (6,916 samples, 0.07%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-435.5 (10,237 samples, 0.10%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +$lambda (1,200 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (10,303 samples, 0.10%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (3,431 samples, 0.03%) + + + +@anon-func-173.5 (1,654 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-265.5 (6,273 samples, 0.06%) + + + +@anon-func-173.5 (99,163 samples, 0.98%) + + + +pathCoords (2,877 samples, 0.03%) + + + +compacting_gc (18,543 samples, 0.18%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (6,656 samples, 0.07%) + + + +map (864 samples, 0.01%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +rec (34,095 samples, 0.34%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-173.5 (80,377 samples, 0.79%) + + + +@anon-func-435.5 (2,784 samples, 0.03%) + + + +rec (3,267 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (65,397 samples, 0.64%) + + + +@anon-func-173.5 (289,525 samples, 2.85%) +@a.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-435.5 (25,344 samples, 0.25%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-435.5 (4,992 samples, 0.05%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-173.5 (150,150 samples, 1.48%) + + + +rec (76,874 samples, 0.76%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +encode (46,208 samples, 0.46%) + + + +@anon-func-173.5 (582,904 samples, 5.75%) +@anon-f.. + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (41,278 samples, 0.41%) + + + +go (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-481.5 (1,190 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-173.5 (38,548 samples, 0.38%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-173.5 (95,344 samples, 0.94%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,210 samples, 0.01%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-173.5 (2,487 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (240,958 samples, 2.38%) +@.. + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-173.5 (248,358 samples, 2.45%) +@a.. + + +$lambda (2,975 samples, 0.03%) + + + +map (1,952 samples, 0.02%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-173.5 (977 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (56,372 samples, 0.56%) + + + +go (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (12,960 samples, 0.13%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-435.5 (2,560 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,391 samples, 0.01%) + + + +@anon-func-173.5 (4,108 samples, 0.04%) + + + +map (1,584 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (1,952 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,128 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (1,767 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,067 samples, 0.05%) + + + +@anon-func-173.5 (109,456 samples, 1.08%) + + + +@anon-func-173.5 (4,272 samples, 0.04%) + + + +@anon-func-48.7 (1,014 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (7,878 samples, 0.08%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-173.5 (237,270 samples, 2.34%) +@.. + + +@anon-func-229.5 (7,960 samples, 0.08%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-173.5 (4,420 samples, 0.04%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,314 samples, 0.05%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (34,944 samples, 0.34%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +patternCoords (6,022 samples, 0.06%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,327 samples, 0.15%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,539 samples, 0.08%) + + + +@anon-func-435.5 (1,683 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (10,686 samples, 0.11%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +polyDivMod (1,115 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (7,111 samples, 0.07%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (5,950 samples, 0.06%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-435.5 (2,409 samples, 0.02%) + + + +@anon-func-173.5 (2,214 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyAdd (1,568 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,648 samples, 0.11%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,924 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,207 samples, 0.01%) + + + +@anon-func-173.5 (50,171 samples, 0.49%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (13,824 samples, 0.14%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +rec (12,646 samples, 0.12%) + + + +encode (1,584 samples, 0.02%) + + + +toBlocks (8,120 samples, 0.08%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +interleave (1,173 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (1,636 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-435.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +polySub (1,023 samples, 0.01%) + + + +generate (972 samples, 0.01%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +@anon-func-435.5 (1,747 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-173.5 (150,881 samples, 1.49%) + + + +@anon-func-79.3 (979 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +polyOrder (15,590 samples, 0.15%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +pathCoords (2,826 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-173.5 (4,992 samples, 0.05%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (11,029 samples, 0.11%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,207 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (10,935 samples, 0.11%) + + + +@anon-func-173.5 (244,718 samples, 2.41%) +@a.. + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +encode (1,571 samples, 0.02%) + + + +@anon-func-435.5 (2,517 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +rec (2,420 samples, 0.02%) + + + +@anon-func-435.5 (4,594 samples, 0.05%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +polyAdd (2,432 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-435.5 (5,518 samples, 0.05%) + + + +@anon-func-435.5 (924 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +polyDivMod (1,200 samples, 0.01%) + + + +scale (2,288 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polyZipWith (880 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,430 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +rec (3,685 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-435.5 (78,198 samples, 0.77%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,023 samples, 0.01%) + + + +go (1,391 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (928 samples, 0.01%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-161.5 (1,664 samples, 0.02%) + + + +@anon-func-435.5 (12,367 samples, 0.12%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (19,250 samples, 0.19%) + + + +polyAddTerm (1,142 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-435.5 (2,079 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +elemDiv (1,120 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (35,046 samples, 0.35%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-435.5 (13,750 samples, 0.14%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-173.5 (68,893 samples, 0.68%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,920 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (33,907 samples, 0.33%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (20,139 samples, 0.20%) + + + +encode (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +rec (3,051 samples, 0.03%) + + + +@anon-func-265.5 (1,034 samples, 0.01%) + + + +@anon-func-481.5 (2,525 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (77,377 samples, 0.76%) + + + +go (864 samples, 0.01%) + + + +@anon-func-435.5 (12,643 samples, 0.12%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-481.5 (3,107 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +generate (3,520 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-435.5 (3,840 samples, 0.04%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +polyNew (2,277 samples, 0.02%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +generate (76,220 samples, 0.75%) + + + +@anon-func-173.5 (10,062 samples, 0.10%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-435.5 (27,667 samples, 0.27%) + + + +go (1,104 samples, 0.01%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyLen (1,314 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (5,544 samples, 0.05%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (2,866 samples, 0.03%) + + + +interleave (2,000 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +rec (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +pathCoords (1,760 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyZipWith (2,880 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (3,217 samples, 0.03%) + + + +@anon-func-173.5 (7,670 samples, 0.08%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (9,308 samples, 0.09%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-173.5 (356,535 samples, 3.51%) +@an.. + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (43,462 samples, 0.43%) + + + +$lambda (2,877 samples, 0.03%) + + + +encode (46,208 samples, 0.46%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-481.5 (1,610 samples, 0.02%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (3,520 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +polyAdd (5,376 samples, 0.05%) + + + +@anon-func-435.5 (10,447 samples, 0.10%) + + + +@anon-func-435.5 (3,859 samples, 0.04%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +finderBLCoords (972 samples, 0.01%) + + + +encode (9,320 samples, 0.09%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (1,732 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +polyAdd (2,752 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (2,880 samples, 0.03%) + + + +elemAdd (5,376 samples, 0.05%) + + + +polyScale (1,152 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,553 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (13,640 samples, 0.13%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,304 samples, 0.02%) + + + +@anon-func-173.5 (1,586 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +elemToBits (876 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-435.5 (20,329 samples, 0.20%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-244.5 (2,810,764 samples, 27.71%) +@anon-func-244.5 + + +correction (1,216 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +pathCoords (1,230 samples, 0.01%) + + + +@anon-func-435.5 (6,600 samples, 0.07%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +rec (38,421 samples, 0.38%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +pathCoords (2,619,743 samples, 25.82%) +pathCoords + + +@anon-func-435.5 (45,306 samples, 0.45%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-435.5 (1,815 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,863 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (5,440 samples, 0.05%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,582 samples, 0.04%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +natXor (19,488 samples, 0.19%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (1,504 samples, 0.01%) + + + +@anon-func-435.5 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (67,342 samples, 0.66%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-435.5 (6,787 samples, 0.07%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (32,362 samples, 0.32%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (29,922 samples, 0.29%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +generate (2,955 samples, 0.03%) + + + +correction (1,017 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-481.5 (1,387 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +pathCoords (1,232 samples, 0.01%) + + + +@anon-func-173.5 (4,298 samples, 0.04%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,225 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +rec (59,425 samples, 0.59%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-173.5 (9,802 samples, 0.10%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (39,194 samples, 0.39%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (793,729 samples, 7.82%) +@anon-func-.. + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-481.5 (5,019 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-173.5 (257,510 samples, 2.54%) +@a.. + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (1,564 samples, 0.02%) + + + +encode (2,955 samples, 0.03%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-412.5 (1,350 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (3,520 samples, 0.03%) + + + +@anon-func-173.5 (46,192 samples, 0.46%) + + + +interleave (1,152 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-173.5 (86,608 samples, 0.85%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (5,944 samples, 0.06%) + + + +@anon-func-435.5 (20,384 samples, 0.20%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +natZipWith (36,960 samples, 0.36%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +polyAddTerm (931 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-48.7 (3,040 samples, 0.03%) + + + +correction (1,892 samples, 0.02%) + + + +@anon-func-435.5 (11,330 samples, 0.11%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (122,896 samples, 1.21%) + + + +@anon-func-481.5 (1,190 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +foldr (1,485 samples, 0.01%) + + + +@anon-func-435.5 (30,166 samples, 0.30%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +interleave (2,880 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-173.5 (5,382 samples, 0.05%) + + + +pathCoords (5,974 samples, 0.06%) + + + +map (2,496 samples, 0.02%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-173.5 (6,188 samples, 0.06%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (10,002 samples, 0.10%) + + + +$loop/1 (8,145 samples, 0.08%) + + + +@anon-func-435.5 (1,175 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (96,688 samples, 0.95%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (6,013 samples, 0.06%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (11,667 samples, 0.12%) + + + +@anon-func-30.36 (1,023 samples, 0.01%) + + + +@anon-func-173.5 (1,042 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +rec (2,523 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (23,239 samples, 0.23%) + + + +@anon-func-32.65 (6,016 samples, 0.06%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (498,349 samples, 4.91%) +@anon-.. + + +polyAdd (5,184 samples, 0.05%) + + + +map (2,496 samples, 0.02%) + + + +$lambda (882 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +interleave (1,207 samples, 0.01%) + + + +elemAdd (34,944 samples, 0.34%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (6,578 samples, 0.06%) + + + +polyMulTerm (1,391 samples, 0.01%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polyScale (2,384 samples, 0.02%) + + + +go (2,880 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (2,149 samples, 0.02%) + + + +@anon-func-435.5 (5,683 samples, 0.06%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,255 samples, 0.02%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +rec (8,540 samples, 0.08%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-79.3 (1,390 samples, 0.01%) + + + +encode (1,821 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +map (886 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (8,983 samples, 0.09%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (18,543 samples, 0.18%) + + + +map (2,000 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (15,776 samples, 0.16%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (10,764 samples, 0.11%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +elemAdd (73,927 samples, 0.73%) + + + +@anon-func-32.65 (2,982 samples, 0.03%) + + + +@anon-func-435.5 (22,087 samples, 0.22%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (52,800 samples, 0.52%) + + + +@anon-func-173.5 (4,025 samples, 0.04%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +pathCoords (972 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +polyAdd (2,688 samples, 0.03%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-481.5 (1,330 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +forIn (1,470 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (7,370 samples, 0.07%) + + + +@anon-func-161.5 (34,106 samples, 0.34%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,115 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,409 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (1,299 samples, 0.01%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-435.5 (10,435 samples, 0.10%) + + + +$lambda (3,431 samples, 0.03%) + + + +@anon-func-161.5 (1,760 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +polyAdd (5,376 samples, 0.05%) + + + +encode (2,496 samples, 0.02%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-435.5 (60,014 samples, 0.59%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,785 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +interleave (1,391 samples, 0.01%) + + + +$lambda (1,116 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-32.65 (1,404 samples, 0.01%) + + + +@anon-func-435.5 (44,174 samples, 0.44%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyAdd (1,674 samples, 0.02%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-173.5 (8,096 samples, 0.08%) + + + +go (864 samples, 0.01%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +go (1,767 samples, 0.02%) + + + +@anon-func-435.5 (51,840 samples, 0.51%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-435.5 (5,824 samples, 0.06%) + + + +@anon-func-435.5 (22,080 samples, 0.22%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,011 samples, 0.01%) + + + +@anon-func-173.5 (7,176 samples, 0.07%) + + + +@anon-func-173.5 (19,558 samples, 0.19%) + + + +@anon-func-435.5 (5,120 samples, 0.05%) + + + +$lambda (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-265.5 (5,418 samples, 0.05%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyZipWith (960 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +rec (31,314 samples, 0.31%) + + + +elemMul (6,336 samples, 0.06%) + + + +@anon-func-33.5 (1,213 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,518 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (1,730 samples, 0.02%) + + + +@anon-func-173.5 (87,280 samples, 0.86%) + + + +@anon-func-173.5 (181,021 samples, 1.78%) + + + +interleave (1,104 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +go (1,023 samples, 0.01%) + + + +encode (1,207 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (1,568 samples, 0.02%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +rec (15,767 samples, 0.16%) + + + +@anon-func-435.5 (7,333 samples, 0.07%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (10,152 samples, 0.10%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (6,080 samples, 0.06%) + + + +$lambda (1,760 samples, 0.02%) + + + +interleave (1,392 samples, 0.01%) + + + +@anon-func-161.5 (3,648 samples, 0.04%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (7,800 samples, 0.08%) + + + +rec (114,775 samples, 1.13%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (59,654 samples, 0.59%) + + + +@anon-func-161.5 (864 samples, 0.01%) + + + +@anon-func-48.7 (23,772 samples, 0.23%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (3,660 samples, 0.04%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +interleave (3,375 samples, 0.03%) + + + +@anon-func-481.5 (990 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +correction (1,767 samples, 0.02%) + + + +@anon-func-54.15 (2,112 samples, 0.02%) + + + +@anon-func-173.5 (573,862 samples, 5.66%) +@anon-f.. + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,014 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-453.5 (876 samples, 0.01%) + + + +@anon-func-173.5 (3,712 samples, 0.04%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-481.5 (3,738 samples, 0.04%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-435.5 (2,145 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-173.5 (5,876 samples, 0.06%) + + + +elemAdd (2,688 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (3,360 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-435.5 (46,080 samples, 0.45%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-26.5 (2,814 samples, 0.03%) + + + +map (2,887 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-173.5 (160,006 samples, 1.58%) + + + +polyAdd (1,584 samples, 0.02%) + + + +@anon-func-173.5 (262,399 samples, 2.59%) +@a.. + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (7,384 samples, 0.07%) + + + +rec (34,713 samples, 0.34%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (18,307 samples, 0.18%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,380 samples, 0.01%) + + + +@anon-func-30.36 (23,752 samples, 0.23%) + + + +@anon-func-79.3 (1,980 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,323 samples, 0.08%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-161.5 (891 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyGrow (2,322 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +rec (1,977 samples, 0.02%) + + + +@anon-func-38.11 (1,142 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (26,176 samples, 0.26%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,115 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,518 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +@anon-func-453.5 (8,967 samples, 0.09%) + + + +generate (3,520 samples, 0.03%) + + + +$lambda (2,623 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +@anon-func-435.5 (1,551 samples, 0.02%) + + + +@anon-func-435.5 (13,537 samples, 0.13%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (2,263 samples, 0.02%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-48.7 (1,386 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +go (1,767 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,032 samples, 0.02%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +correction (2,000 samples, 0.02%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +toList (1,775 samples, 0.02%) + + + +map (1,200 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (5,323 samples, 0.05%) + + + +@anon-func-435.5 (1,485 samples, 0.01%) + + + +@anon-func-173.5 (3,751 samples, 0.04%) + + + +@anon-func-173.5 (80,467 samples, 0.79%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +@anon-func-481.5 (1,895 samples, 0.02%) + + + +@anon-func-173.5 (111,023 samples, 1.09%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +polyDivMod (1,142 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +polyAdd (2,368 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-435.5 (31,874 samples, 0.31%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-300.5 (1,207 samples, 0.01%) + + + +@anon-func-173.5 (2,957 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +rec (10,605 samples, 0.10%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,551 samples, 0.05%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (2,123 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (10,152 samples, 0.10%) + + + +$lambda (1,230 samples, 0.01%) + + + +@anon-func-173.5 (91,817 samples, 0.91%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +rec (1,015 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (10,691 samples, 0.11%) + + + +toList (1,470 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,287 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-51.11 (2,457 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (17,490 samples, 0.17%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (3,138 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,636 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (2,909 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +rec (19,467 samples, 0.19%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-435.5 (6,475 samples, 0.06%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +$lambda (1,152 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-435.5 (64,512 samples, 0.64%) + + + +@anon-func-435.5 (4,416 samples, 0.04%) + + + +polyAdd (2,852 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +pathCoords (1,821 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +encode (2,955 samples, 0.03%) + + + +pathCoords (2,955 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (2,464 samples, 0.02%) + + + +@anon-func-435.5 (29,467 samples, 0.29%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (1,504 samples, 0.01%) + + + +polyZipWith (3,904 samples, 0.04%) + + + +@anon-func-173.5 (121,552 samples, 1.20%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (4,266 samples, 0.04%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,882 samples, 0.03%) + + + +@anon-func-173.5 (1,456 samples, 0.01%) + + + +@anon-func-435.5 (5,749 samples, 0.06%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,950 samples, 0.02%) + + + +@anon-func-435.5 (4,591 samples, 0.05%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +$lambda (932 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,349 samples, 0.02%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (47,284 samples, 0.47%) + + + +@anon-func-48.7 (1,017 samples, 0.01%) + + + +natToBytes (48,384 samples, 0.48%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (13,619 samples, 0.13%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-435.5 (12,096 samples, 0.12%) + + + +@anon-func-48.7 (5,208 samples, 0.05%) + + + +@anon-func-435.5 (9,504 samples, 0.09%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (3,004 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (5,665 samples, 0.06%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-161.5 (9,360 samples, 0.09%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyScale (1,761 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-161.5 (7,040 samples, 0.07%) + + + +@anon-func-173.5 (16,160 samples, 0.16%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-435.5 (7,296 samples, 0.07%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-435.5 (3,136 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (843,521 samples, 8.32%) +@anon-func-.. + + +encode (1,952 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,767 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-435.5 (26,262 samples, 0.26%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +rec (6,892 samples, 0.07%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +polySub (1,767 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +go (1,760 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +polyAdd (2,880 samples, 0.03%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +rec (1,795 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (134,869 samples, 1.33%) + + + +@anon-func-173.5 (1,127,181 samples, 11.11%) +@anon-func-173.5 + + +foldr (999 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +elemAdd (36,288 samples, 0.36%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (68,468 samples, 0.67%) + + + +polyGrow (1,152 samples, 0.01%) + + + +@anon-func-173.5 (133,480 samples, 1.32%) + + + +@anon-func-173.5 (88,624 samples, 0.87%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,248 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-32.65 (972 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-173.5 (177,606 samples, 1.75%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-435.5 (11,887 samples, 0.12%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-229.5 (6,801 samples, 0.07%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (267,366 samples, 2.64%) +@a.. + + +@anon-func-435.5 (23,040 samples, 0.23%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +correction (1,299 samples, 0.01%) + + + +@anon-func-173.5 (45,620 samples, 0.45%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,920 samples, 0.02%) + + + +@anon-func-412.5 (4,276 samples, 0.04%) + + + +polyDivMod (1,761 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +rec (892 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-435.5 (31,934 samples, 0.31%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyAdd (3,875 samples, 0.04%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (5,208 samples, 0.05%) + + + +map (1,104 samples, 0.01%) + + + +polyLeadCoeff (1,326 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +natToBytes (16,128 samples, 0.16%) + + + +@anon-func-173.5 (3,666 samples, 0.04%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-30.36 (1,511 samples, 0.01%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (24,704 samples, 0.24%) + + + +interleave (880 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (228,118 samples, 2.25%) +@.. + + +@anon-func-173.5 (2,110 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (14,612 samples, 0.14%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-435.5 (10,230 samples, 0.10%) + + + +pathCoords (2,955 samples, 0.03%) + + + +@anon-func-435.5 (27,487 samples, 0.27%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +correction (931 samples, 0.01%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,167,637 samples, 11.51%) +@anon-func-173.5 + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +go (2,000 samples, 0.02%) + + + +@anon-func-161.5 (972 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (21,187 samples, 0.21%) + + + +encode (1,430 samples, 0.01%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-173.5 (106,161 samples, 1.05%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (10,567 samples, 0.10%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +@anon-func-161.5 (1,472 samples, 0.01%) + + + +@anon-func-173.5 (256,806 samples, 2.53%) +@a.. + + +encode (19,224 samples, 0.19%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +patternCoords (3,520 samples, 0.03%) + + + +@anon-func-161.5 (4,032 samples, 0.04%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-435.5 (2,845 samples, 0.03%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +polySub (1,104 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-435.5 (6,211 samples, 0.06%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +correction (1,184 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (10,218 samples, 0.10%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-173.5 (4,056 samples, 0.04%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (228,822 samples, 2.26%) +@.. + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,886 samples, 0.02%) + + + +@anon-func-412.5 (5,575 samples, 0.05%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,884 samples, 0.03%) + + + +@anon-func-173.5 (69,140 samples, 0.68%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-30.36 (931 samples, 0.01%) + + + +polyPadRight (1,954 samples, 0.02%) + + + +@anon-func-173.5 (99,505 samples, 0.98%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (11,520 samples, 0.11%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +encode (6,022 samples, 0.06%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (2,560 samples, 0.03%) + + + +@anon-func-173.5 (107,305 samples, 1.06%) + + + +encode (1,299 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,200 samples, 0.01%) + + + +@anon-func-435.5 (9,349 samples, 0.09%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +natFromBits (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (179,718 samples, 1.77%) + + + +@anon-func-361.7 (2,623 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,107 samples, 0.01%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,472 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (12,745 samples, 0.13%) + + + +@anon-func-435.5 (69,120 samples, 0.68%) + + + +encode (3,520 samples, 0.03%) + + + +@anon-func-435.5 (22,627 samples, 0.22%) + + + +@anon-func-48.7 (3,630 samples, 0.04%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyAdd (2,159 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (231,638 samples, 2.28%) +@.. + + +go (2,384 samples, 0.02%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (9,958 samples, 0.10%) + + + +@anon-func-435.5 (6,247 samples, 0.06%) + + + +@anon-func-435.5 (54,974 samples, 0.54%) + + + +go (2,000 samples, 0.02%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-30.36 (3,004 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-435.5 (57,024 samples, 0.56%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,200 samples, 0.01%) + + + +interleave (1,216 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (234,454 samples, 2.31%) +@.. + + +@anon-func-54.15 (1,571 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (9,020 samples, 0.09%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-435.5 (9,487 samples, 0.09%) + + + +$lambda (2,880 samples, 0.03%) + + + +polySub (1,952 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-435.5 (25,042 samples, 0.25%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polyAdd (5,376 samples, 0.05%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-435.5 (5,632 samples, 0.06%) + + + +@anon-func-79.3 (1,527 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (233,750 samples, 2.30%) +@.. + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +map (931 samples, 0.01%) + + + +@anon-func-300.5 (1,100 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-48.7 (9,140 samples, 0.09%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (15,488 samples, 0.15%) + + + +flatten (2,128 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,617 samples, 0.08%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (7,124 samples, 0.07%) + + + +@anon-func-435.5 (13,824 samples, 0.14%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +polySub (1,952 samples, 0.02%) + + + +rec (3,591 samples, 0.04%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (8,352 samples, 0.08%) + + + +$lambda (1,764 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +correction (1,518 samples, 0.01%) + + + +correction (10,152 samples, 0.10%) + + + +@anon-func-481.5 (2,970 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +interleave (23,732 samples, 0.23%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,099,017 samples, 10.83%) +@anon-func-173.5 + + +@anon-func-435.5 (48,134 samples, 0.47%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +go (1,299 samples, 0.01%) + + + +@anon-func-38.11 (1,511 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (55,334 samples, 0.55%) + + + +@anon-func-300.5 (3,728 samples, 0.04%) + + + +@anon-func-79.3 (1,767 samples, 0.02%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-435.5 (17,227 samples, 0.17%) + + + +interleave (1,584 samples, 0.02%) + + + +scale (19,360 samples, 0.19%) + + + +polyGrow (2,852 samples, 0.03%) + + + +interleave (2,000 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-38.11 (1,887 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (157,894 samples, 1.56%) + + + +@anon-func-48.7 (2,128 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (74,041 samples, 0.73%) + + + +@anon-func-435.5 (25,920 samples, 0.26%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (2,048 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +finderCoords (5,974 samples, 0.06%) + + + +@anon-func-161.5 (1,116 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,821 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (5,520 samples, 0.05%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +rec (2,644 samples, 0.03%) + + + +@anon-func-173.5 (179,014 samples, 1.76%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (988 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +polyMulTerm (1,261 samples, 0.01%) + + + +polyDivMod (11,934 samples, 0.12%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyDivMod (1,642 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +pathCoords (1,107 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +polyAdd (2,208 samples, 0.02%) + + + +@anon-func-173.5 (2,566 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +encode (3,630 samples, 0.04%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +polyAdd (3,904 samples, 0.04%) + + + +$lambda (3,424 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-435.5 (24,192 samples, 0.24%) + + + +@anon-func-51.11 (4,400 samples, 0.04%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,144 samples, 0.06%) + + + +@anon-func-99.14 (1,323 samples, 0.01%) + + + +@anon-func-161.5 (6,976 samples, 0.07%) + + + +@anon-func-173.5 (147,334 samples, 1.45%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (846,633 samples, 8.35%) +@anon-func-.. + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (33,582 samples, 0.33%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +go (1,120 samples, 0.01%) + + + +@anon-func-51.11 (1,391 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (1,584 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-435.5 (20,240 samples, 0.20%) + + + +@anon-func-435.5 (64,694 samples, 0.64%) + + + +$lambda (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-435.5 (16,170 samples, 0.16%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +rec (6,930 samples, 0.07%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +encode (1,023 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-173.5 (456,153 samples, 4.50%) +@anon.. + + +polyZipWith (928 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-173.5 (4,832 samples, 0.05%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAddTerm (1,391 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (886 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (43,814 samples, 0.43%) + + + +interleave (2,000 samples, 0.02%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (44,352 samples, 0.44%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (130,558 samples, 1.29%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,048 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-30.36 (46,208 samples, 0.46%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,568 samples, 0.02%) + + + +polyMulTerm (931 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-173.5 (80,091 samples, 0.79%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (19,520 samples, 0.19%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,459 samples, 0.01%) + + + +@anon-func-161.5 (28,432 samples, 0.28%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (70,609 samples, 0.70%) + + + +correction (2,496 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-435.5 (1,184 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (7,436 samples, 0.07%) + + + +@anon-func-481.5 (5,955 samples, 0.06%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (61,457 samples, 0.61%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (1,044 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +@anon-func-481.5 (3,171 samples, 0.03%) + + + +@anon-func-435.5 (2,515 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (15,510 samples, 0.15%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (9,130 samples, 0.09%) + + + +encode (2,688 samples, 0.03%) + + + +$lambda (1,636 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-412.5 (4,218 samples, 0.04%) + + + +generate (2,877 samples, 0.03%) + + + +polyScale (1,760 samples, 0.02%) + + + +encode (1,017 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +correction (1,207 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (3,409 samples, 0.03%) + + + +@anon-func-481.5 (1,785 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-173.5 (3,269 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-48.7 (1,719 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-48.7 (892 samples, 0.01%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-435.5 (18,816 samples, 0.19%) + + + +encode (24,704 samples, 0.24%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,983 samples, 0.09%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-173.5 (3,764 samples, 0.04%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,075 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +elemAdd (32,928 samples, 0.32%) + + + +rec (35,331 samples, 0.35%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +correction (926 samples, 0.01%) + + + +generate (3,520 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,571 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyDivMod (1,392 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (46,208 samples, 0.46%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,255 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-32.65 (21,908 samples, 0.22%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +$lambda (1,511 samples, 0.01%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-173.5 (625,525 samples, 6.17%) +@anon-fu.. + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,760 samples, 0.03%) + + + +@anon-func-435.5 (7,680 samples, 0.08%) + + + +@anon-func-173.5 (280,483 samples, 2.76%) +@a.. + + +correction (864 samples, 0.01%) + + + +@anon-func-173.5 (127,756 samples, 1.26%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,400 samples, 0.04%) + + + +encode (26,689 samples, 0.26%) + + + +@anon-func-435.5 (26,767 samples, 0.26%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (63,459 samples, 0.63%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +patternCoords (1,394 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,207 samples, 0.01%) + + + +@anon-func-265.5 (875 samples, 0.01%) + + + +polyAdd (2,592 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (1,887 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (15,571 samples, 0.15%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-229.5 (1,051 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (821,737 samples, 8.10%) +@anon-func-.. + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-481.5 (1,434 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,504 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,584 samples, 0.05%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (93,247 samples, 0.92%) + + + +traceCoords (1,704 samples, 0.02%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-54.15 (1,394 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (33,734 samples, 0.33%) + + + +@anon-func-173.5 (827,961 samples, 8.16%) +@anon-func-.. + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (22,987 samples, 0.23%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +rec (17,017 samples, 0.17%) + + + +@anon-func-79.3 (1,517 samples, 0.01%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +rec (1,431 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (10,813 samples, 0.11%) + + + +$lambda (2,877 samples, 0.03%) + + + +rec (15,488 samples, 0.15%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (27,170 samples, 0.27%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,092 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-173.5 (1,560 samples, 0.02%) + + + +@anon-func-54.15 (1,764 samples, 0.02%) + + + +@anon-func-435.5 (7,808 samples, 0.08%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,264 samples, 0.04%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,950 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +generate (26,689 samples, 0.26%) + + + +rec (876 samples, 0.01%) + + + +@anon-func-435.5 (34,094 samples, 0.34%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +generate (5,208 samples, 0.05%) + + + +@anon-func-173.5 (1,941 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +rec (5,319 samples, 0.05%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-161.5 (1,872 samples, 0.02%) + + + +@anon-func-173.5 (103,587 samples, 1.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (17,889 samples, 0.18%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +polyZipWith (70,912 samples, 0.70%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,207 samples, 0.01%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-435.5 (25,867 samples, 0.25%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-481.5 (989 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyAdd (2,304 samples, 0.02%) + + + +@anon-func-54.15 (972 samples, 0.01%) + + + +$lambda (1,048 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +rec (52,887 samples, 0.52%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,642 samples, 0.02%) + + + +@anon-func-173.5 (5,041 samples, 0.05%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-30.36 (931 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-161.5 (3,168 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (3,904 samples, 0.04%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-54.15 (1,253 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (18,255 samples, 0.18%) + + + +@anon-func-173.5 (8,580 samples, 0.08%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +rec (7,517 samples, 0.07%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-435.5 (1,320 samples, 0.01%) + + + +rec (7,392 samples, 0.07%) + + + +go (1,392 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (76,220 samples, 0.75%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-54.15 (5,208 samples, 0.05%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (50,833 samples, 0.50%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-173.5 (7,410 samples, 0.07%) + + + +interleave (1,952 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (3,113 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-173.5 (54,356 samples, 0.54%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,750 samples, 0.02%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +@anon-func-435.5 (34,802 samples, 0.34%) + + + +go (864 samples, 0.01%) + + + +@anon-func-435.5 (6,909 samples, 0.07%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-173.5 (92,961 samples, 0.92%) + + + +@anon-func-161.5 (1,656 samples, 0.02%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-435.5 (11,990 samples, 0.12%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (13,075 samples, 0.13%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (47,354 samples, 0.47%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (21,328 samples, 0.21%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-173.5 (10,894 samples, 0.11%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-173.5 (100,048 samples, 0.99%) + + + +@anon-func-32.65 (1,230 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +rec (4,779 samples, 0.05%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,947 samples, 0.04%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-481.5 (1,959 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-173.5 (129,783 samples, 1.28%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +map (1,120 samples, 0.01%) + + + +@anon-func-54.15 (2,882 samples, 0.03%) + + + +go (1,386 samples, 0.01%) + + + +@anon-func-173.5 (374,775 samples, 3.69%) +@ano.. + + +go (1,207 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-173.5 (1,183,204 samples, 11.66%) +@anon-func-173.5 + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +map (13,768 samples, 0.14%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (10,608 samples, 0.10%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +rec (13,267 samples, 0.13%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (3,168 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (15,487 samples, 0.15%) + + + +@anon-func-173.5 (1,055,449 samples, 10.40%) +@anon-func-173.5 + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (20,736 samples, 0.20%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,838 samples, 0.03%) + + + +@anon-func-300.5 (1,511 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (243,966 samples, 2.40%) +@a.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,764 samples, 0.02%) + + + +toTarget (4,400 samples, 0.04%) + + + +encode (3,424 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,664 samples, 0.02%) + + + +@anon-func-435.5 (19,456 samples, 0.19%) + + + +polyPadLeft (2,659 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +correction (1,152 samples, 0.01%) + + + +generate (2,950 samples, 0.03%) + + + +toListWithLength (1,323 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,440 samples, 0.01%) + + + +@anon-func-173.5 (53,012 samples, 0.52%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-73.5 (290,548 samples, 2.86%) +@a.. + + +range (3,420 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-161.5 (1,092 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (892 samples, 0.01%) + + + +traceCoords (2,457 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (990 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (39,094 samples, 0.39%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +$lambda (1,120 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-32.65 (1,232 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-173.5 (438,069 samples, 4.32%) +@anon.. + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (86,016 samples, 0.85%) + + + +@anon-func-300.5 (24,704 samples, 0.24%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (11,744 samples, 0.12%) + + + +@anon-func-173.5 (3,855 samples, 0.04%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +patternCoords (3,520 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-265.5 (7,983 samples, 0.08%) + + + +go (10,608 samples, 0.10%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +@anon-func-173.5 (16,414 samples, 0.16%) + + + +rec (26,988 samples, 0.27%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +rec (43,448 samples, 0.43%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (26,582 samples, 0.26%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (28,160 samples, 0.28%) + + + +@anon-func-173.5 (8,847 samples, 0.09%) + + + +@anon-func-51.11 (3,630 samples, 0.04%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-435.5 (25,687 samples, 0.25%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +rec (2,445 samples, 0.02%) + + + +@anon-func-481.5 (2,310 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (8,195 samples, 0.08%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,136 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-173.5 (44,143 samples, 0.44%) + + + +map (1,152 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (7,275 samples, 0.07%) + + + +$lambda (2,000 samples, 0.02%) + + + +encode (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (20,020 samples, 0.20%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (115,504 samples, 1.14%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (1,393 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (1,748 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (16,960 samples, 0.17%) + + + +@anon-func-265.5 (13,968 samples, 0.14%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +traceCoords (1,760 samples, 0.02%) + + + +polyAddTerm (1,216 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-173.5 (1,798 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +toTarget (8,120 samples, 0.08%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-435.5 (10,963 samples, 0.11%) + + + +interleave (2,688 samples, 0.03%) + + + +polyDivMod (1,875 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (4,320 samples, 0.04%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (54,970 samples, 0.54%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +polyAdd (1,696 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (59,847 samples, 0.59%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (2,169 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-161.5 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-173.5 (242,462 samples, 2.39%) +@.. + + +map (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +rec (2,107 samples, 0.02%) + + + +rec (41,820 samples, 0.41%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-173.5 (3,289 samples, 0.03%) + + + +encode (1,115 samples, 0.01%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-435.5 (12,943 samples, 0.13%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (6,552 samples, 0.06%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-161.5 (1,110 samples, 0.01%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-161.5 (17,600 samples, 0.17%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,504 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (249,474 samples, 2.46%) +@a.. + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,882 samples, 0.03%) + + + +@anon-func-161.5 (4,160 samples, 0.04%) + + + +polyScale (1,760 samples, 0.02%) + + + +interleave (1,216 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +polyAdd (1,184 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-435.5 (3,520 samples, 0.03%) + + + +@anon-func-79.3 (71,900 samples, 0.71%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,902 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +step (946 samples, 0.01%) + + + +encode (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,826 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (19,144 samples, 0.19%) + + + +rec (2,913 samples, 0.03%) + + + +@anon-func-173.5 (1,067,897 samples, 10.53%) +@anon-func-173.5 + + +polySub (3,424 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-265.5 (1,575 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +rec (28,224 samples, 0.28%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +rec (1,093 samples, 0.01%) + + + +@anon-func-173.5 (9,334 samples, 0.09%) + + + +$lambda (2,688 samples, 0.03%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-51.11 (14,912 samples, 0.15%) + + + +@anon-func-51.11 (1,517 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,100 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,887 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (26,048 samples, 0.26%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,562 samples, 0.04%) + + + +rec (123,858 samples, 1.22%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-300.5 (1,023 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (6,022 samples, 0.06%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +rec (10,692 samples, 0.11%) + + + +@anon-func-161.5 (5,760 samples, 0.06%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +polyAddTerm (1,392 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +$lambda (2,884 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +rec (2,367 samples, 0.02%) + + + +correction (1,216 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +$lambda (931 samples, 0.01%) + + + +@anon-func-435.5 (40,170 samples, 0.40%) + + + +polyDivMod (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (256,371 samples, 2.53%) +@a.. + + +$lambda (2,000 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (6,048 samples, 0.06%) + + + +@anon-func-38.11 (1,200 samples, 0.01%) + + + +@anon-func-173.5 (163,526 samples, 1.61%) + + + +@anon-func-300.5 (1,360 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (19,924 samples, 0.20%) + + + +@anon-func-173.5 (193,077 samples, 1.90%) +@.. + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,882 samples, 0.03%) + + + +@anon-func-435.5 (31,232 samples, 0.31%) + + + +polyAdd (1,760 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +go (2,000 samples, 0.02%) + + + +map (1,152 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (3,198 samples, 0.03%) + + + +encode (1,267 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,399 samples, 0.03%) + + + +@anon-func-79.3 (1,944 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-48.7 (6,022 samples, 0.06%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,253 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,808 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,862 samples, 0.05%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +$lambda (1,767 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +finderTLCoords (6,022 samples, 0.06%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (26,582 samples, 0.26%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +go (14,612 samples, 0.14%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,353 samples, 0.05%) + + + +@anon-func-38.11 (9,140 samples, 0.09%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +rec (2,185 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +natZipWith (8,064 samples, 0.08%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (23,296 samples, 0.23%) + + + +@anon-func-51.11 (1,120 samples, 0.01%) + + + +@anon-func-51.11 (1,299 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-173.5 (4,888 samples, 0.05%) + + + +correction (19,224 samples, 0.19%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (3,009 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (30,897 samples, 0.30%) + + + +@anon-func-435.5 (4,032 samples, 0.04%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,136 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-265.5 (8,838 samples, 0.09%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (1,944 samples, 0.02%) + + + +map (1,023 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +correction (8,262 samples, 0.08%) + + + +interleave (1,216 samples, 0.01%) + + + +polyAdd (1,664 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (226,710 samples, 2.23%) +@.. + + +encode (880 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +polyGrow (1,085 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-453.5 (6,950 samples, 0.07%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +$lambda (1,430 samples, 0.01%) + + + +@anon-func-435.5 (15,264 samples, 0.15%) + + + +@anon-func-229.5 (2,931 samples, 0.03%) + + + +@anon-func-435.5 (48,854 samples, 0.48%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (16,128 samples, 0.16%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,349 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +map (1,120 samples, 0.01%) + + + +@anon-func-48.7 (1,115 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-435.5 (6,541 samples, 0.06%) + + + +$lambda (931 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (892 samples, 0.01%) + + + +@anon-func-30.36 (1,115 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +@anon-func-173.5 (2,136 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-435.5 (46,848 samples, 0.46%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-173.5 (2,722 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +encode (1,430 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (71,900 samples, 0.71%) + + + +polyAdd (2,304 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +encode (17,696 samples, 0.17%) + + + +@anon-func-173.5 (784,237 samples, 7.73%) +@anon-func.. + + +encode (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyPadLeft (2,690 samples, 0.03%) + + + +@anon-func-79.3 (6,016 samples, 0.06%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-30.36 (23,732 samples, 0.23%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (972 samples, 0.01%) + + + +@anon-func-161.5 (2,872 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (3,412 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (10,608 samples, 0.10%) + + + +@anon-func-481.5 (1,143 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-435.5 (114,850 samples, 1.13%) + + + +@anon-func-435.5 (49,280 samples, 0.49%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (7,424 samples, 0.07%) + + + +@anon-func-173.5 (3,139 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +@anon-func-173.5 (746,893 samples, 7.36%) +@anon-func.. + + +@anon-func-435.5 (5,079 samples, 0.05%) + + + +@anon-func-48.7 (46,208 samples, 0.46%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-412.5 (2,646 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyOrder (12,012 samples, 0.12%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,115 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (17,280 samples, 0.17%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-173.5 (1,170,749 samples, 11.54%) +@anon-func-173.5 + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (1,846 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +$lambda (1,184 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-79.3 (1,136 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (1,792 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-161.5 (11,520 samples, 0.11%) + + + +interleave (2,880 samples, 0.03%) + + + +polySub (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (23,578 samples, 0.23%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +polyZipWith (2,690 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +next (8,019 samples, 0.08%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (46,208 samples, 0.46%) + + + +rec (1,769 samples, 0.02%) + + + +@anon-func-435.5 (23,328 samples, 0.23%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,642 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (4,858 samples, 0.05%) + + + +@anon-func-173.5 (304,751 samples, 3.00%) +@an.. + + +encode (2,975 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (11,934 samples, 0.12%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +rec (18,372 samples, 0.18%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-435.5 (17,380 samples, 0.17%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyAddTerm (1,391 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-173.5 (6,838 samples, 0.07%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyAdd (3,527 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +@anon-func-173.5 (4,103 samples, 0.04%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (36,212 samples, 0.36%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-161.5 (5,280 samples, 0.05%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (24,192 samples, 0.24%) + + + +@anon-func-435.5 (15,552 samples, 0.15%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyAdd (1,152 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-161.5 (6,912 samples, 0.07%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (10,152 samples, 0.10%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-435.5 (5,280 samples, 0.05%) + + + +@anon-func-435.5 (4,495 samples, 0.04%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyMulTerm (1,136 samples, 0.01%) + + + +@anon-func-435.5 (9,984 samples, 0.10%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +rec (20,790 samples, 0.20%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-435.5 (51,840 samples, 0.51%) + + + +map (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (4,992 samples, 0.05%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,394 samples, 0.01%) + + + +@anon-func-435.5 (4,950 samples, 0.05%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-435.5 (1,728 samples, 0.02%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (9,698 samples, 0.10%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (882 samples, 0.01%) + + + +natXor (120,967 samples, 1.19%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-435.5 (5,122 samples, 0.05%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-435.5 (21,626 samples, 0.21%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (65,780 samples, 0.65%) + + + +polyScale (1,014 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +interleave (1,120 samples, 0.01%) + + + +polyScale (2,000 samples, 0.02%) + + + +map (880 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-161.5 (972 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +rec (12,892 samples, 0.13%) + + + +@anon-func-161.5 (1,944 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyGrow (1,770 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (3,375 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-173.5 (803,065 samples, 7.92%) +@anon-func-.. + + +$lambda (2,496 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-481.5 (5,412 samples, 0.05%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (1,104 samples, 0.01%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +polyDivMod (1,267 samples, 0.01%) + + + +@anon-func-51.11 (1,875 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +encode (1,944 samples, 0.02%) + + + +polyAdd (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (1,394 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +go (1,584 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polySub (1,760 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-161.5 (5,148 samples, 0.05%) + + + +map (1,952 samples, 0.02%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,381 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (1,571 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (10,203 samples, 0.10%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (892 samples, 0.01%) + + + +@anon-func-173.5 (81,807 samples, 0.81%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +rec (33,168 samples, 0.33%) + + + +@anon-func-435.5 (2,761 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +polyAdd (1,664 samples, 0.02%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +finderTLCoords (3,520 samples, 0.03%) + + + +rec (72,292 samples, 0.71%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,023 samples, 0.01%) + + + +@anon-func-51.11 (1,267 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (653,533 samples, 6.44%) +@anon-fu.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +$lambda (972 samples, 0.01%) + + + +@anon-func-79.3 (6,022 samples, 0.06%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,589 samples, 0.02%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (18,011 samples, 0.18%) + + + +map (880 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +patternCoords (21,908 samples, 0.22%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (2,659 samples, 0.03%) + + + +@anon-func-173.5 (9,701 samples, 0.10%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,058,561 samples, 10.44%) +@anon-func-173.5 + + +@anon-func-173.5 (180,422 samples, 1.78%) + + + +@anon-func-435.5 (4,807 samples, 0.05%) + + + +generate (1,116 samples, 0.01%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyZipWith (4,272 samples, 0.04%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-173.5 (28,820 samples, 0.28%) + + + +correction (1,184 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +@anon-func-173.5 (2,918 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +polySub (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (15,815 samples, 0.16%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (1,536 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,612 samples, 0.02%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +@anon-func-68.41 (32,928 samples, 0.32%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (1,036,777 samples, 10.22%) +@anon-func-173.5 + + +polyAdd (3,409 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,349 samples, 0.02%) + + + +rec (5,481 samples, 0.05%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-435.5 (16,390 samples, 0.16%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +map (1,120 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-435.5 (17,035 samples, 0.17%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,430 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +$lambda (1,517 samples, 0.01%) + + + +rec (3,429 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-173.5 (2,331 samples, 0.02%) + + + +rec (7,767 samples, 0.08%) + + + +polySub (2,496 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (10,152 samples, 0.10%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-481.5 (2,106 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-481.5 (945 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,805 samples, 0.03%) + + + +@anon-func-481.5 (1,470 samples, 0.01%) + + + +@anon-func-265.5 (2,100 samples, 0.02%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-435.5 (3,168 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (28,800 samples, 0.28%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +encode (3,431 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-435.5 (4,704 samples, 0.05%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (174,993 samples, 1.73%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-435.5 (26,496 samples, 0.26%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-161.5 (3,058 samples, 0.03%) + + + +@anon-func-435.5 (3,410 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +rec (2,861 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (155,782 samples, 1.54%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-453.5 (2,065 samples, 0.02%) + + + +$lambda (2,880 samples, 0.03%) + + + +rec (1,041 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +$lambda (1,184 samples, 0.01%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-289.5 (2,112 samples, 0.02%) + + + +$lambda (2,496 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +generate (3,033 samples, 0.03%) + + + +B_rem (84,384 samples, 0.83%) + + + +@anon-func-79.3 (15,487 samples, 0.15%) + + + +@anon-func-435.5 (13,310 samples, 0.13%) + + + +@anon-func-435.5 (8,455 samples, 0.08%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +polySub (1,584 samples, 0.02%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-173.5 (97,360 samples, 0.96%) + + + +@anon-func-435.5 (44,074 samples, 0.43%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-393.5 (1,104 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (25,920 samples, 0.26%) + + + +@anon-func-435.5 (14,850 samples, 0.15%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,115 samples, 0.01%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (67,749 samples, 0.67%) + + + +polyDivMod (1,642 samples, 0.02%) + + + +@anon-func-393.5 (2,646 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,146 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAdd (3,520 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (886 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-173.5 (849,745 samples, 8.38%) +@anon-func-.. + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (90,673 samples, 0.89%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-453.5 (2,065 samples, 0.02%) + + + +@anon-func-173.5 (2,860 samples, 0.03%) + + + +polyZipWith (3,520 samples, 0.03%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,024 samples, 0.02%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-453.5 (4,641 samples, 0.05%) + + + +@anon-func-173.5 (2,383 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +$lambda (2,619,743 samples, 25.82%) +$lambda + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-481.5 (3,590 samples, 0.04%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyDivMod (1,299 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (17,270 samples, 0.17%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,340 samples, 0.01%) + + + +@anon-func-48.7 (1,299 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (21,367 samples, 0.21%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (20,650 samples, 0.20%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (5,720 samples, 0.06%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (1,642 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,071,009 samples, 10.56%) +@anon-func-173.5 + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-173.5 (104,731 samples, 1.03%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (33,440 samples, 0.33%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (1,472 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +traceCoords (2,882 samples, 0.03%) + + + +toBlocks (3,040 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,207 samples, 0.01%) + + + +@anon-func-173.5 (10,738 samples, 0.11%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (6,084 samples, 0.06%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (65,175 samples, 0.64%) + + + +@anon-func-54.15 (2,826 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,304 samples, 0.05%) + + + +@anon-func-435.5 (24,067 samples, 0.24%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +rec (3,267 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +map (24,704 samples, 0.24%) + + + +@anon-func-300.5 (4,725 samples, 0.05%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-229.5 (8,840 samples, 0.09%) + + + +$lambda (2,975 samples, 0.03%) + + + +remember_continuation (3,946 samples, 0.04%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,115 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,954 samples, 0.02%) + + + +@anon-func-173.5 (100,720 samples, 0.99%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-435.5 (4,510 samples, 0.04%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,777 samples, 0.04%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (181,866 samples, 1.79%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-481.5 (1,610 samples, 0.02%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,840 samples, 0.04%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,016 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,267 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +encode (1,200 samples, 0.01%) + + + +polyAdd (1,952 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (120,351 samples, 1.19%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +polyAdd (1,216 samples, 0.01%) + + + +polySub (1,216 samples, 0.01%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-173.5 (78,047 samples, 0.77%) + + + +@anon-func-435.5 (19,580 samples, 0.19%) + + + +polyDivMod (864 samples, 0.01%) + + + +polySub (1,184 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +rec (6,392 samples, 0.06%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (14,961 samples, 0.15%) + + + +@anon-func-79.3 (76,220 samples, 0.75%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAdd (5,760 samples, 0.06%) + + + +@anon-func-161.5 (1,102 samples, 0.01%) + + + +@anon-func-48.7 (979 samples, 0.01%) + + + +@anon-func-173.5 (112,816 samples, 1.11%) + + + +encode (2,880 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (492,321 samples, 4.85%) +@anon-.. + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +polyAdd (2,688 samples, 0.03%) + + + +polyGrow (3,409 samples, 0.03%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-435.5 (63,367 samples, 0.62%) + + + +correction (1,584 samples, 0.02%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (258,918 samples, 2.55%) +@a.. + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-481.5 (2,151 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (223,217 samples, 2.20%) +@.. + + +@anon-func-435.5 (12,481 samples, 0.12%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (12,155 samples, 0.12%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,887 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (47,557 samples, 0.47%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (7,147 samples, 0.07%) + + + +$lambda (1,107 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (1,527 samples, 0.02%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +encode (1,796 samples, 0.02%) + + + +@anon-func-161.5 (1,380 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (32,256 samples, 0.32%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-435.5 (2,277 samples, 0.02%) + + + +encode (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-51.11 (1,440 samples, 0.01%) + + + +@anon-func-435.5 (249,773 samples, 2.46%) +@a.. + + +go (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +natFromBits (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,944 samples, 0.02%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (32,256 samples, 0.32%) + + + +polyAdd (1,952 samples, 0.02%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (5,746 samples, 0.06%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,173 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyAdd (1,659 samples, 0.02%) + + + +map (1,326 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (1,142,741 samples, 11.26%) +@anon-func-173.5 + + +@anon-func-435.5 (31,104 samples, 0.31%) + + + +@anon-func-435.5 (39,494 samples, 0.39%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyZipWith (2,325 samples, 0.02%) + + + +@anon-func-173.5 (103,408 samples, 1.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-173.5 (8,658 samples, 0.09%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,995 samples, 0.02%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,887 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +@anon-func-481.5 (945 samples, 0.01%) + + + +@anon-func-48.7 (11,934 samples, 0.12%) + + + +@anon-func-300.5 (1,261 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,892 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-229.5 (1,801 samples, 0.02%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (156,909 samples, 1.55%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-161.5 (4,290 samples, 0.04%) + + + +polyAdd (1,664 samples, 0.02%) + + + +rec (22,526 samples, 0.22%) + + + +@anon-func-173.5 (4,160 samples, 0.04%) + + + +@anon-func-173.5 (39,367 samples, 0.39%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (31,261 samples, 0.31%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-173.5 (53,696 samples, 0.53%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-265.5 (4,563 samples, 0.04%) + + + +@anon-func-435.5 (14,080 samples, 0.14%) + + + +@anon-func-161.5 (2,457 samples, 0.02%) + + + +polyAdd (5,376 samples, 0.05%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +go (1,120 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +polySub (1,184 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +interleave (2,496 samples, 0.02%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,299 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-229.5 (892 samples, 0.01%) + + + +@anon-func-173.5 (54,354 samples, 0.54%) + + + +rec (5,265 samples, 0.05%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-173.5 (240,206 samples, 2.37%) +@.. + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +rec (7,142 samples, 0.07%) + + + +@anon-func-435.5 (6,272 samples, 0.06%) + + + +@anon-func-435.5 (23,520 samples, 0.23%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-435.5 (163,701 samples, 1.61%) + + + +@anon-func-300.5 (3,662 samples, 0.04%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,944 samples, 0.09%) + + + +map (1,760 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-173.5 (209,814 samples, 2.07%) +@.. + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (7,885 samples, 0.08%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +go (1,248 samples, 0.01%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-435.5 (42,624 samples, 0.42%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +@anon-func-30.36 (931 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-173.5 (946,373 samples, 9.33%) +@anon-func-17.. + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,014 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (13,267 samples, 0.13%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-435.5 (19,008 samples, 0.19%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-173.5 (7,424 samples, 0.07%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (1,024 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-412.5 (9,082 samples, 0.09%) + + + +polyAddTerm (880 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-173.5 (76,340 samples, 0.75%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (26,582 samples, 0.26%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-435.5 (17,568 samples, 0.17%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyAddTerm (1,104 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-30.36 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (13,405 samples, 0.13%) + + + +polySub (1,184 samples, 0.01%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-161.5 (1,664 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,623 samples, 0.05%) + + + +polyZipWith (3,424 samples, 0.03%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +rec (911 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (21,120 samples, 0.21%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (2,366 samples, 0.02%) + + + +polyAdd (880 samples, 0.01%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +rec (41,202 samples, 0.41%) + + + +map (1,104 samples, 0.01%) + + + +rec (2,159 samples, 0.02%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +polyAddTerm (2,887 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,826 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +polySub (3,424 samples, 0.03%) + + + +@anon-func-173.5 (74,655 samples, 0.74%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (16,640 samples, 0.16%) + + + +pathCoords (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (10,530 samples, 0.10%) + + + +correction (9,140 samples, 0.09%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,623 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-246.51 (5,202 samples, 0.05%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-393.5 (1,104 samples, 0.01%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-161.5 (26,582 samples, 0.26%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +rec (4,725 samples, 0.05%) + + + +correction (864 samples, 0.01%) + + + +$lambda (1,120 samples, 0.01%) + + + +map (1,642 samples, 0.02%) + + + +@anon-func-412.5 (6,748 samples, 0.07%) + + + +generate (1,571 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (992 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (86,955 samples, 0.86%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (20,647 samples, 0.20%) + + + +@anon-func-435.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-173.5 (951 samples, 0.01%) + + + +@anon-func-173.5 (169,158 samples, 1.67%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,457 samples, 0.02%) + + + +polyLeadCoeff (2,466 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +rec (248,989 samples, 2.45%) +rec + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +@anon-func-435.5 (2,310 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (5,373 samples, 0.05%) + + + +polyPadLeft (3,659 samples, 0.04%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,391 samples, 0.01%) + + + +@anon-func-435.5 (10,369 samples, 0.10%) + + + +rec (2,419 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (8,398 samples, 0.08%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,517 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +correction (936 samples, 0.01%) + + + +@anon-func-435.5 (1,870 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,400 samples, 0.02%) + + + +encode (1,104 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +polyAdd (1,568 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (3,165 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-79.3 (4,808 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (1,216 samples, 0.01%) + + + +@anon-func-435.5 (19,008 samples, 0.19%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-435.5 (46,208 samples, 0.46%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,267 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (15,392 samples, 0.15%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,480 samples, 0.02%) + + + +interleave (2,000 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +rowwise (1,760 samples, 0.02%) + + + +rec (22,092 samples, 0.22%) + + + +@anon-func-435.5 (2,639 samples, 0.03%) + + + +pathCoords (3,520 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +encode (1,518 samples, 0.01%) + + + +go (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-173.5 (6,058 samples, 0.06%) + + + +@anon-func-435.5 (8,250 samples, 0.08%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-92.40 (2,198 samples, 0.02%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (1,380 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,074,121 samples, 10.59%) +@anon-func-173.5 + + +encode (864 samples, 0.01%) + + + +go (2,592 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-173.5 (459,167 samples, 4.53%) +@anon.. + + +interleave (880 samples, 0.01%) + + + +encode (931 samples, 0.01%) + + + +@anon-func-79.3 (1,116 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +rec (42,146 samples, 0.42%) + + + +map (1,115 samples, 0.01%) + + + +@anon-func-435.5 (5,452 samples, 0.05%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (206,949 samples, 2.04%) +@.. + + +encode (2,592 samples, 0.03%) + + + +@anon-func-453.5 (3,245 samples, 0.03%) + + + +$lambda (1,299 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,172 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,112 samples, 0.02%) + + + +@anon-func-289.5 (2,760 samples, 0.03%) + + + +@anon-func-54.15 (2,826 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +$lambda (1,017 samples, 0.01%) + + + +@anon-func-481.5 (2,151 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +polyAdd (70,912 samples, 0.70%) + + + +@anon-func-435.5 (4,297 samples, 0.04%) + + + +@anon-func-173.5 (10,784 samples, 0.11%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +rec (30,078 samples, 0.30%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (173,382 samples, 1.71%) + + + +@anon-func-435.5 (22,807 samples, 0.22%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (880 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,160 samples, 0.04%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (4,808 samples, 0.05%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-51.11 (1,170 samples, 0.01%) + + + +@anon-func-481.5 (2,850 samples, 0.03%) + + + +B_eq (159,065 samples, 1.57%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +finderCoords (21,948 samples, 0.22%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +rec (6,642 samples, 0.07%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-435.5 (18,810 samples, 0.19%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +correction (1,023 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +$lambda (5,974 samples, 0.06%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-161.5 (1,036 samples, 0.01%) + + + +@anon-func-173.5 (32,815 samples, 0.32%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +go (1,184 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,727 samples, 0.04%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (322,835 samples, 3.18%) +@an.. + + +natZipWith (35,616 samples, 0.35%) + + + +go (1,485 samples, 0.01%) + + + +rec (37,185 samples, 0.37%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyZipWith (2,304 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (19,924 samples, 0.20%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +rec (81,082 samples, 0.80%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +go (17,776 samples, 0.18%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +@anon-func-173.5 (96,965 samples, 0.96%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +go (1,518 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +polyZipWith (1,586 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-173.5 (39,572 samples, 0.39%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (131,356 samples, 1.29%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-481.5 (1,387 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +rec (8,517 samples, 0.08%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (117,259 samples, 1.16%) + + + +@anon-func-161.5 (1,248 samples, 0.01%) + + + +go (1,173 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (28,153 samples, 0.28%) + + + +@anon-func-161.5 (2,784 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +@anon-func-419.37 (5,340 samples, 0.05%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-48.7 (19,924 samples, 0.20%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-435.5 (3,740 samples, 0.04%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +correction (1,200 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (132,797 samples, 1.31%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,517 samples, 0.01%) + + + +map (3,424 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (1,785 samples, 0.02%) + + + +@anon-func-361.7 (3,111 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +rec (2,783 samples, 0.03%) + + + +@anon-func-173.5 (6,344 samples, 0.06%) + + + +@anon-func-300.5 (2,880 samples, 0.03%) + + + +scale (10,656 samples, 0.11%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-453.5 (3,245 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,328 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-481.5 (910 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +map (1,120 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (12,877 samples, 0.13%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +go (2,880 samples, 0.03%) + + + +polyZipWith (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +pathCoords (1,394 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (101,877 samples, 1.00%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,950 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +encode (1,299 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,718 samples, 0.04%) + + + +@anon-func-173.5 (17,504 samples, 0.17%) + + + +@anon-func-435.5 (27,726 samples, 0.27%) + + + +encode (2,877 samples, 0.03%) + + + +formatVCoords (1,404 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (16,960 samples, 0.17%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (33,361 samples, 0.33%) + + + +interleave (892 samples, 0.01%) + + + +@anon-func-481.5 (1,210 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-54.15 (3,111 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,760 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,562 samples, 0.04%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-92.40 (4,725 samples, 0.05%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +map (1,430 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,132 samples, 0.04%) + + + +@anon-func-435.5 (31,104 samples, 0.31%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-481.5 (8,227 samples, 0.08%) + + + +@anon-func-435.5 (36,022 samples, 0.36%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +rec (12,775 samples, 0.13%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-393.5 (1,350 samples, 0.01%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-173.5 (49,741 samples, 0.49%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (20,736 samples, 0.20%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +go (15,487 samples, 0.15%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,068 samples, 0.01%) + + + +$lambda (1,944 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,792 samples, 0.05%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (56,054 samples, 0.55%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-173.5 (362,563 samples, 3.57%) +@an.. + + +@anon-func-435.5 (26,407 samples, 0.26%) + + + +@anon-func-173.5 (11,164 samples, 0.11%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (28,027 samples, 0.28%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +map (931 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +patternCoords (1,944 samples, 0.02%) + + + +@anon-func-229.5 (1,426 samples, 0.01%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (9,775 samples, 0.10%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-173.5 (6,019 samples, 0.06%) + + + +@anon-func-435.5 (5,376 samples, 0.05%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-481.5 (2,403 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,142 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-68.41 (36,288 samples, 0.36%) + + + +$lambda (2,000 samples, 0.02%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-435.5 (86,262 samples, 0.85%) + + + +generate (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyPadRight (2,125 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +polyAdd (2,432 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +correction (1,207 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (33,088 samples, 0.33%) + + + +@anon-func-51.11 (972 samples, 0.01%) + + + +@anon-func-173.5 (92,389 samples, 0.91%) + + + +$lambda (2,975 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-48.7 (1,571 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,517 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +correction (864 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-173.5 (7,072 samples, 0.07%) + + + +@anon-func-173.5 (195,030 samples, 1.92%) +@.. + + +map (1,636 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (1,092,793 samples, 10.77%) +@anon-func-173.5 + + +@anon-func-300.5 (1,504 samples, 0.01%) + + + +go (1,115 samples, 0.01%) + + + +@anon-func-435.5 (35,894 samples, 0.35%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +$lambda (1,261 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (35,101 samples, 0.35%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,023 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +$lambda (1,170 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (4,096 samples, 0.04%) + + + +@anon-func-173.5 (220,203 samples, 2.17%) +@.. + + +correction (2,592 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-435.5 (38,950 samples, 0.38%) + + + +@anon-func-51.11 (1,017 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,398 samples, 0.02%) + + + +natXor (36,288 samples, 0.36%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +rec (15,142 samples, 0.15%) + + + +@anon-func-435.5 (7,680 samples, 0.08%) + + + +@anon-func-173.5 (25,944 samples, 0.26%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-435.5 (40,902 samples, 0.40%) + + + +encode (2,255 samples, 0.02%) + + + +polyMulTerm (2,384 samples, 0.02%) + + + +@anon-func-173.5 (2,002 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (1,728 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (38,002 samples, 0.37%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-30.36 (1,267 samples, 0.01%) + + + +sleb128_decode (2,001 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +encode (931 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +natXor (108,864 samples, 1.07%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +correction (1,120 samples, 0.01%) + + + +@anon-func-435.5 (52,580 samples, 0.52%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (377,948 samples, 3.73%) +@ano.. + + +@anon-func-38.11 (1,200 samples, 0.01%) + + + +polyNew (1,485 samples, 0.01%) + + + +@anon-func-161.5 (1,380 samples, 0.01%) + + + +@anon-func-435.5 (17,280 samples, 0.17%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,448 samples, 0.08%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +@anon-func-435.5 (23,347 samples, 0.23%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +go (2,384 samples, 0.02%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,925 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-173.5 (8,892 samples, 0.09%) + + + +correction (1,014 samples, 0.01%) + + + +@anon-func-38.11 (1,642 samples, 0.02%) + + + +@anon-func-173.5 (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,642 samples, 0.02%) + + + +@anon-func-435.5 (108,864 samples, 1.07%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,017 samples, 0.01%) + + + +@anon-func-435.5 (34,944 samples, 0.34%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (4,927 samples, 0.05%) + + + +rec (30,696 samples, 0.30%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-173.5 (647,309 samples, 6.38%) +@anon-fu.. + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-435.5 (62,208 samples, 0.61%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,504 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (13,669 samples, 0.13%) + + + +@anon-func-38.11 (10,608 samples, 0.10%) + + + +@anon-func-481.5 (2,030 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,409 samples, 0.06%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +parse (946 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +polyAdd (5,376 samples, 0.05%) + + + +@anon-func-435.5 (2,432 samples, 0.02%) + + + +map (1,184 samples, 0.01%) + + + +step (1,485 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (1,120 samples, 0.01%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +go (1,511 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (3,072 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (2,075 samples, 0.02%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polyPadRight (2,874 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-435.5 (19,027 samples, 0.19%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,719 samples, 0.02%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-32.65 (1,944 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +generate (1,390 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-481.5 (2,970 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-173.5 (368,591 samples, 3.63%) +@ano.. + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,875 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (27,307 samples, 0.27%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,730 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (33,374 samples, 0.33%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-173.5 (158,598 samples, 1.56%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (10,244 samples, 0.10%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +go (1,504 samples, 0.01%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +map (1,504 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-173.5 (53,185 samples, 0.52%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,950 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (4,480 samples, 0.04%) + + + +@anon-func-435.5 (11,520 samples, 0.11%) + + + +@anon-func-48.7 (26,582 samples, 0.26%) + + + +@anon-func-435.5 (6,805 samples, 0.07%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +pathCoords (2,955 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (1,895 samples, 0.02%) + + + +encode (1,207 samples, 0.01%) + + + +@anon-func-54.15 (1,107 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (880 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +polyMulTerm (1,152 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-435.5 (5,920 samples, 0.06%) + + + +rec (2,220 samples, 0.02%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-435.5 (5,830 samples, 0.06%) + + + +rec (16,142 samples, 0.16%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +map (1,152 samples, 0.01%) + + + +rec (4,232 samples, 0.04%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-173.5 (223,894 samples, 2.21%) +@.. + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (4,467 samples, 0.04%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +go (1,104 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +correction (931 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +rec (16,267 samples, 0.16%) + + + +@anon-func-453.5 (3,245 samples, 0.03%) + + + +@anon-func-435.5 (3,208 samples, 0.03%) + + + +encode (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-229.5 (1,000 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +map (3,004 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +map (10,152 samples, 0.10%) + + + +@anon-func-481.5 (1,430 samples, 0.01%) + + + +polyZipWith (1,568 samples, 0.02%) + + + +interleave (2,384 samples, 0.02%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +generate (26,582 samples, 0.26%) + + + +correction (2,880 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (19,963 samples, 0.20%) + + + +toListWithLength (1,323 samples, 0.01%) + + + +go (1,200 samples, 0.01%) + + + +@anon-func-173.5 (47,830 samples, 0.47%) + + + +@anon-func-300.5 (2,268 samples, 0.02%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (74,439 samples, 0.73%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (868,573 samples, 8.56%) +@anon-func-1.. + + +interleave (1,760 samples, 0.02%) + + + +rec (24,035 samples, 0.24%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,640 samples, 0.09%) + + + +rec (963 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +polyZipWith (2,592 samples, 0.03%) + + + +polyGrow (2,690 samples, 0.03%) + + + +@anon-func-481.5 (3,688 samples, 0.04%) + + + +@anon-func-173.5 (104,969 samples, 1.03%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +natZipWith (108,864 samples, 1.07%) + + + +@anon-func-48.7 (1,267 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +obj_idx<0> (50,328 samples, 0.50%) + + + +go (880 samples, 0.01%) + + + +encode (2,623 samples, 0.03%) + + + +@anon-func-54.15 (6,016 samples, 0.06%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (25,440 samples, 0.25%) + + + +@anon-func-173.5 (29,245 samples, 0.29%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (1,944 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +rec (6,561 samples, 0.06%) + + + +pathCoords (1,253 samples, 0.01%) + + + +@anon-func-435.5 (9,593 samples, 0.09%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-51.11 (21,948 samples, 0.22%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +correction (2,496 samples, 0.02%) + + + +encode (2,688 samples, 0.03%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-173.5 (48,980 samples, 0.48%) + + + +rec (2,511 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +polyAdd (1,104 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-435.5 (24,798 samples, 0.24%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,936 samples, 0.06%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (94,391 samples, 0.93%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyZipWith (29,376 samples, 0.29%) + + + +polyAdd (3,424 samples, 0.03%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-79.3 (21,948 samples, 0.22%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-173.5 (108,449 samples, 1.07%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +$lambda (4,266 samples, 0.04%) + + + +polyZipWith (2,159 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (52,454 samples, 0.52%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-435.5 (1,188 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +go (1,207 samples, 0.01%) + + + +@anon-func-173.5 (18,598 samples, 0.18%) + + + +$lambda (2,592 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-161.5 (16,512 samples, 0.16%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +interleave (3,424 samples, 0.03%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-51.11 (2,882 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +rec (22,743 samples, 0.22%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +interleave (2,384 samples, 0.02%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (1,104 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (63,173 samples, 0.62%) + + + +@anon-func-161.5 (2,614,330 samples, 25.77%) +@anon-func-161.5 + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (24,607 samples, 0.24%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,145,853 samples, 11.30%) +@anon-func-173.5 + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +encode (1,704 samples, 0.02%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-481.5 (4,058 samples, 0.04%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (109,440 samples, 1.08%) + + + +@anon-func-173.5 (684,653 samples, 6.75%) +@anon-fun.. + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,075 samples, 0.02%) + + + +@anon-func-435.5 (28,224 samples, 0.28%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +go (11,934 samples, 0.12%) + + + +polyAdd (1,152 samples, 0.01%) + + + +@anon-func-30.36 (5,944 samples, 0.06%) + + + +@anon-func-173.5 (641,085 samples, 6.32%) +@anon-fu.. + + +polyAdd (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (35,534 samples, 0.35%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,842 samples, 0.04%) + + + +polyAdd (2,688 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +generate (2,349 samples, 0.02%) + + + +rec (17,392 samples, 0.17%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-173.5 (67,796 samples, 0.67%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-435.5 (8,288 samples, 0.08%) + + + +rec (17,517 samples, 0.17%) + + + +@anon-func-173.5 (36,637 samples, 0.36%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyMulTerm (936 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-173.5 (86,383 samples, 0.85%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyScale (1,152 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +$lambda (1,136 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (48,103 samples, 0.47%) + + + +@anon-func-435.5 (3,872 samples, 0.04%) + + + +go (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyTrim (5,544 samples, 0.05%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAdd (928 samples, 0.01%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,067 samples, 0.06%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-173.5 (5,210 samples, 0.05%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +polyPadLeft (1,954 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (129,196 samples, 1.27%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (295,553 samples, 2.91%) +@a.. + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-173.5 (2,579 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (10,567 samples, 0.10%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-161.5 (21,280 samples, 0.21%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-161.5 (4,608 samples, 0.05%) + + + +@anon-func-48.7 (3,033 samples, 0.03%) + + + +@anon-func-38.11 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +polyAdd (2,688 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +natZipWith (49,728 samples, 0.49%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (33,920 samples, 0.33%) + + + +@anon-func-435.5 (98,496 samples, 0.97%) + + + +@anon-func-173.5 (1,380 samples, 0.01%) + + + +@anon-func-48.7 (1,267 samples, 0.01%) + + + +@anon-func-435.5 (5,775 samples, 0.06%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (13,090 samples, 0.13%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-435.5 (4,992 samples, 0.05%) + + + +polyAdd (864 samples, 0.01%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-435.5 (23,424 samples, 0.23%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +$lambda (1,517 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-435.5 (9,472 samples, 0.09%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +rec (7,017 samples, 0.07%) + + + +rec (85,352 samples, 0.84%) + + + +@anon-func-48.7 (3,520 samples, 0.03%) + + + +toTarget (3,375 samples, 0.03%) + + + +@anon-func-387.7 (1,932 samples, 0.02%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,023 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (41,294 samples, 0.41%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (880 samples, 0.01%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (9,542 samples, 0.09%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +log (21,120 samples, 0.21%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +$lambda (1,120 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +rec (1,275 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,216 samples, 0.01%) + + + +elemAdd (112,896 samples, 1.11%) + + + +$lambda (1,152 samples, 0.01%) + + + +correction (2,592 samples, 0.03%) + + + +map (1,023 samples, 0.01%) + + + +@anon-func-173.5 (534,517 samples, 5.27%) +@anon-.. + + +encode (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (9,267 samples, 0.09%) + + + +rec (3,555 samples, 0.04%) + + + +@anon-func-161.5 (21,908 samples, 0.22%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +elemAdd (108,864 samples, 1.07%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +$lambda (21,888 samples, 0.22%) + + + +@anon-func-79.3 (1,391 samples, 0.01%) + + + +@anon-func-173.5 (20,782 samples, 0.20%) + + + +correction (24,704 samples, 0.24%) + + + +@anon-func-481.5 (5,299 samples, 0.05%) + + + +@anon-func-51.11 (1,115 samples, 0.01%) + + + +@anon-func-38.11 (1,517 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-173.5 (69,812 samples, 0.69%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (24,192 samples, 0.24%) + + + +go (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +$lambda (2,349 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-300.5 (1,267 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +correction (2,880 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +@anon-func-435.5 (13,603 samples, 0.13%) + + + +natFromBits (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-393.5 (1,890 samples, 0.02%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,712 samples, 0.04%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (6,105 samples, 0.06%) + + + +rec (13,767 samples, 0.14%) + + + +@anon-func-435.5 (12,217 samples, 0.12%) + + + +@anon-func-48.7 (3,431 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (2,395 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-173.5 (2,396 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +rec (13,642 samples, 0.13%) + + + +@anon-func-453.5 (3,190 samples, 0.03%) + + + +@anon-func-435.5 (74,880 samples, 0.74%) + + + +@anon-func-435.5 (19,353 samples, 0.19%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (7,795 samples, 0.08%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +go (1,517 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-435.5 (1,155 samples, 0.01%) + + + +polyAdd (1,760 samples, 0.02%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-79.3 (1,392 samples, 0.01%) + + + +@anon-func-435.5 (3,328 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,201 samples, 0.05%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +map (1,184 samples, 0.01%) + + + +polyAdd (2,409 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-173.5 (8,112 samples, 0.08%) + + + +@anon-func-173.5 (81,521 samples, 0.80%) + + + +@anon-func-300.5 (2,009 samples, 0.02%) + + + +@anon-func-435.5 (35,200 samples, 0.35%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +polyAdd (3,904 samples, 0.04%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (63,254 samples, 0.62%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,955 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (4,759 samples, 0.05%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-173.5 (43,735 samples, 0.43%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAdd (2,208 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyDivMod (931 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-173.5 (151,558 samples, 1.49%) + + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-161.5 (888 samples, 0.01%) + + + +@anon-func-30.36 (1,472 samples, 0.01%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +@anon-func-481.5 (3,585 samples, 0.04%) + + + +@anon-func-48.7 (926 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +go (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (3,367 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-481.5 (2,667 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +polyZipWith (1,152 samples, 0.01%) + + + +@anon-func-161.5 (6,048 samples, 0.06%) + + + +encode (2,877 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +toTarget (960 samples, 0.01%) + + + +@anon-func-173.5 (25,696 samples, 0.25%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +polyAdd (1,584 samples, 0.02%) + + + +polySub (1,584 samples, 0.02%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-79.3 (14,612 samples, 0.14%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (10,634 samples, 0.10%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (371,761 samples, 3.66%) +@ano.. + + +@anon-func-48.7 (1,636 samples, 0.02%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-435.5 (13,009 samples, 0.13%) + + + +polyTrim (1,584 samples, 0.02%) + + + +rec (5,859 samples, 0.06%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,920 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +$lambda (71,900 samples, 0.71%) + + + +$lambda (1,391 samples, 0.01%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-173.5 (2,292 samples, 0.02%) + + + +@anon-func-435.5 (82,478 samples, 0.81%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-173.5 (38,821 samples, 0.38%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-173.5 (65,108 samples, 0.64%) + + + +rec (62,244 samples, 0.61%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +leb128_decode (2,597 samples, 0.03%) + + + +@anon-func-173.5 (214,175 samples, 2.11%) +@.. + + +@anon-func-435.5 (891 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (2,304 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +correction (1,391 samples, 0.01%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (244,315 samples, 2.41%) +@a.. + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +$lambda (1,017 samples, 0.01%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-435.5 (1,100 samples, 0.01%) + + + +@anon-func-435.5 (49,728 samples, 0.49%) + + + +$lambda (2,975 samples, 0.03%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (10,452 samples, 0.10%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +natZipWith (2,688 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +alog (2,639 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +rec (3,245 samples, 0.03%) + + + +interleave (2,000 samples, 0.02%) + + + +correction (2,592 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-173.5 (81,232 samples, 0.80%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polySub (1,952 samples, 0.02%) + + + +@anon-func-30.36 (24,704 samples, 0.24%) + + + +generate (2,975 samples, 0.03%) + + + +rec (24,207 samples, 0.24%) + + + +@anon-func-300.5 (1,120 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyZipWith (2,432 samples, 0.02%) + + + +@anon-func-173.5 (365,577 samples, 3.60%) +@ano.. + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +@anon-func-435.5 (8,851 samples, 0.09%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +rec (12,642 samples, 0.12%) + + + +@anon-func-481.5 (2,090 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-161.5 (1,161 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-48.7 (23,732 samples, 0.23%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-435.5 (7,135 samples, 0.07%) + + + +@anon-func-300.5 (1,200 samples, 0.01%) + + + +encode (2,384 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +polyPadRight (1,218 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (6,162 samples, 0.06%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,392 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,595 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (17,696 samples, 0.17%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-453.5 (3,736 samples, 0.04%) + + + +encode (1,216 samples, 0.01%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-435.5 (38,218 samples, 0.38%) + + + +@anon-func-435.5 (4,864 samples, 0.05%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-68.41 (34,944 samples, 0.34%) + + + +@anon-func-48.7 (1,116 samples, 0.01%) + + + +@anon-func-393.5 (2,712 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +polyZipWith (3,168 samples, 0.03%) + + + +polySub (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,628 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-435.5 (16,327 samples, 0.16%) + + + +@anon-func-435.5 (4,000 samples, 0.04%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +polyDivMod (1,017 samples, 0.01%) + + + +@anon-func-79.3 (1,892 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polySub (2,592 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (7,975 samples, 0.08%) + + + +@anon-func-173.5 (2,853 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +@anon-func-435.5 (2,467 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-173.5 (36,091 samples, 0.36%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,207 samples, 0.01%) + + + +correction (1,760 samples, 0.02%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (1,392 samples, 0.01%) + + + +interleave (2,592 samples, 0.03%) + + + +@anon-func-481.5 (1,083 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyAdd (1,568 samples, 0.02%) + + + +interleave (880 samples, 0.01%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +rec (1,020 samples, 0.01%) + + + +@anon-func-173.5 (10,114 samples, 0.10%) + + + +correction (2,592 samples, 0.03%) + + + +@anon-func-173.5 (73,469 samples, 0.72%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-481.5 (1,485 samples, 0.01%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-244.5 (2,112 samples, 0.02%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (1,173,868 samples, 11.57%) +@anon-func-173.5 + + +@anon-func-79.3 (9,320 samples, 0.09%) + + + +polyScale (1,120 samples, 0.01%) + + + +@anon-func-435.5 (30,007 samples, 0.30%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (5,689 samples, 0.06%) + + + +correction (1,760 samples, 0.02%) + + + +encode (1,472 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,592 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +polySub (3,424 samples, 0.03%) + + + +polyZipWith (3,431 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +map (1,584 samples, 0.02%) + + + +polyDivMod (1,120 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (2,000 samples, 0.02%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-173.5 (70,323 samples, 0.69%) + + + +correction (1,120 samples, 0.01%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +encode (2,880 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (8,268 samples, 0.08%) + + + +@anon-func-173.5 (2,879 samples, 0.03%) + + + +rec (5,020 samples, 0.05%) + + + +@anon-func-173.5 (6,474 samples, 0.06%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-173.5 (693,989 samples, 6.84%) +@anon-fun.. + + +generate (2,955 samples, 0.03%) + + + +correction (1,120 samples, 0.01%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-481.5 (3,658 samples, 0.04%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-435.5 (11,057 samples, 0.11%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,109 samples, 0.03%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-435.5 (1,925 samples, 0.02%) + + + +@anon-func-173.5 (4,650 samples, 0.05%) + + + +@anon-func-173.5 (96,393 samples, 0.95%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (4,608 samples, 0.05%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (20,287 samples, 0.20%) + + + +@anon-func-435.5 (2,827 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +polyAdd (1,760 samples, 0.02%) + + + +polyZipWith (2,368 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,806 samples, 0.05%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,023 samples, 0.01%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +correction (1,120 samples, 0.01%) + + + +interleave (2,496 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (1,664 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (597,974 samples, 5.89%) +@anon-f.. + + +@anon-func-435.5 (5,120 samples, 0.05%) + + + +go (1,184 samples, 0.01%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-173.5 (558,792 samples, 5.51%) +@anon-f.. + + +@anon-func-79.3 (1,116 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (11,520 samples, 0.11%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAddTerm (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,207 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (20,467 samples, 0.20%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +pathCoords (3,520 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +@anon-func-173.5 (4,810 samples, 0.05%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-435.5 (90,053 samples, 0.89%) + + + +rowwise (2,112 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (24,192 samples, 0.24%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +polyMulTerm (1,760 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-161.5 (14,128 samples, 0.14%) + + + +@anon-func-161.5 (1,184 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-54.15 (1,944 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAdd (4,992 samples, 0.05%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-435.5 (14,229 samples, 0.14%) + + + +@anon-func-173.5 (6,752 samples, 0.07%) + + + +@anon-func-161.5 (4,608 samples, 0.05%) + + + +rec (2,997 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-229.5 (6,318 samples, 0.06%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +map (880 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (931 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +encode (2,955 samples, 0.03%) + + + +map (864 samples, 0.01%) + + + +encode (1,216 samples, 0.01%) + + + +encode (1,152 samples, 0.01%) + + + +encode (1,104 samples, 0.01%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (12,592 samples, 0.12%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (22,447 samples, 0.22%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +@anon-func-173.5 (8,970 samples, 0.09%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (37,694 samples, 0.37%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,457 samples, 0.02%) + + + +map (2,880 samples, 0.03%) + + + +rec (37,494 samples, 0.37%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (20,207 samples, 0.20%) + + + +$lambda (2,688 samples, 0.03%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +polyAdd (1,216 samples, 0.01%) + + + +polyPadRight (1,782 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +@anon-func-481.5 (2,750 samples, 0.03%) + + + +interleave (1,584 samples, 0.02%) + + + +rec (4,767 samples, 0.05%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (7,540 samples, 0.07%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-173.5 (678,429 samples, 6.69%) +@anon-fun.. + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (220,374 samples, 2.17%) +@.. + + +polySub (864 samples, 0.01%) + + + +@anon-func-481.5 (5,891 samples, 0.06%) + + + +@anon-func-173.5 (1,014,837 samples, 10.00%) +@anon-func-173.5 + + +@anon-func-289.5 (2,955 samples, 0.03%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (95,771 samples, 0.94%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (1,920 samples, 0.02%) + + + +go (880 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (4,103 samples, 0.04%) + + + +map (2,880 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +encode (2,688 samples, 0.03%) + + + +encode (2,619,743 samples, 25.82%) +encode + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,170 samples, 0.01%) + + + +@anon-func-265.5 (7,128 samples, 0.07%) + + + +@anon-func-435.5 (10,656 samples, 0.11%) + + + +@anon-func-173.5 (4,350 samples, 0.04%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,384 samples, 0.02%) + + + +go (2,592 samples, 0.03%) + + + +@anon-func-173.5 (253,286 samples, 2.50%) +@a.. + + +@anon-func-79.3 (864 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +interleave (1,152 samples, 0.01%) + + + +toListWithLength (1,107 samples, 0.01%) + + + +@anon-func-161.5 (2,080 samples, 0.02%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyScale (2,000 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +@anon-func-435.5 (39,854 samples, 0.39%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (25,920 samples, 0.26%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +polyDivMod (1,584 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (16,147 samples, 0.16%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-435.5 (43,094 samples, 0.42%) + + + +polyPadRight (2,475 samples, 0.02%) + + + +@anon-func-48.7 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +polyAddTerm (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +map (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-161.5 (4,015 samples, 0.04%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (1,419 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +rec (2,705 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-435.5 (21,727 samples, 0.21%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-173.5 (260,326 samples, 2.57%) +@a.. + + +@anon-func-435.5 (36,510 samples, 0.36%) + + + +@anon-func-51.11 (2,955 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (12,727 samples, 0.13%) + + + +@anon-func-173.5 (204,182 samples, 2.01%) +@.. + + +@anon-func-173.5 (138,184 samples, 1.36%) + + + +encode (1,230 samples, 0.01%) + + + +map (1,115 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +@anon-func-393.5 (1,140 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,120 samples, 0.01%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (2,384 samples, 0.02%) + + + +@anon-func-435.5 (3,127 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +patternCoords (26,689 samples, 0.26%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-173.5 (918,365 samples, 9.05%) +@anon-func-17.. + + +@anon-func-51.11 (864 samples, 0.01%) + + + +map (2,128 samples, 0.02%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyAdd (2,138 samples, 0.02%) + + + +@anon-func-173.5 (7,488 samples, 0.07%) + + + +@anon-func-79.3 (2,619,743 samples, 25.82%) +@anon-func-79.3 + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAdd (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (82,665 samples, 0.81%) + + + +@anon-func-173.5 (3,425 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +polyDivMod (46,208 samples, 0.46%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (1,115 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +interleave (2,688 samples, 0.03%) + + + +forIn (2,695 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,120 samples, 0.01%) + + + +@anon-func-173.5 (2,080 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (23,512 samples, 0.23%) + + + +@anon-func-79.3 (2,486 samples, 0.02%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (13,664 samples, 0.13%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,607 samples, 0.15%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (1,952 samples, 0.02%) + + + +@anon-func-173.5 (134,824 samples, 1.33%) + + + +@anon-func-173.5 (55,789 samples, 0.55%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (690,877 samples, 6.81%) +@anon-fun.. + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-435.5 (16,704 samples, 0.16%) + + + +map (2,000 samples, 0.02%) + + + +interleave (2,496 samples, 0.02%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,881 samples, 0.02%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +elemToBits (2,774 samples, 0.03%) + + + +@anon-func-51.11 (2,384 samples, 0.02%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +elemFromBits (1,184 samples, 0.01%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-481.5 (1,575 samples, 0.02%) + + + +@anon-func-173.5 (5,093 samples, 0.05%) + + + +map (1,216 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +polyMulTerm (1,207 samples, 0.01%) + + + +@anon-func-435.5 (40,214 samples, 0.40%) + + + +@anon-func-481.5 (2,154 samples, 0.02%) + + + +polyAdd (1,760 samples, 0.02%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +map (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (39,168 samples, 0.39%) + + + +correction (2,688 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +interleave (3,424 samples, 0.03%) + + + +interleave (1,719 samples, 0.02%) + + + +@anon-func-30.36 (1,216 samples, 0.01%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (66,452 samples, 0.66%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (1,248 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (936 samples, 0.01%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,172 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (24,247 samples, 0.24%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-173.5 (2,592 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,767 samples, 0.02%) + + + +@anon-func-173.5 (217,189 samples, 2.14%) +@.. + + +correction (1,216 samples, 0.01%) + + + +map (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (8,745 samples, 0.09%) + + + +rec (1,017 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (30,816 samples, 0.30%) + + + +correction (1,104 samples, 0.01%) + + + +polyScale (1,511 samples, 0.01%) + + + +@anon-func-435.5 (9,115 samples, 0.09%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,950 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (422,999 samples, 4.17%) +@ano.. + + +interleave (2,496 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-435.5 (50,688 samples, 0.50%) + + + +encode (2,877 samples, 0.03%) + + + +columnwise (76,220 samples, 0.75%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,550 samples, 0.02%) + + + +map (1,299 samples, 0.01%) + + + +@anon-func-435.5 (97,920 samples, 0.97%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-435.5 (65,414 samples, 0.64%) + + + +rec (2,627 samples, 0.03%) + + + +polyDivMod (2,480 samples, 0.02%) + + + +@anon-func-173.5 (10,036 samples, 0.10%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +$lambda (1,107 samples, 0.01%) + + + +map (2,496 samples, 0.02%) + + + +$lambda (2,880 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +polyZipWith (6,848 samples, 0.07%) + + + +polyDivMod (864 samples, 0.01%) + + + +rec (13,142 samples, 0.13%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (104,445 samples, 1.03%) + + + +go (1,760 samples, 0.02%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +correction (1,952 samples, 0.02%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +interleave (3,040 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (1,200 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-173.5 (3,230 samples, 0.03%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (888 samples, 0.01%) + + + +@anon-func-435.5 (1,120 samples, 0.01%) + + + +encode (2,496 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +go (2,688 samples, 0.03%) + + + +@anon-func-435.5 (162,254 samples, 1.60%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +go (1,152 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (10,450 samples, 0.10%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (3,490 samples, 0.03%) + + + +$lambda (3,424 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-173.5 (669,093 samples, 6.60%) +@anon-fu.. + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (2,709 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +rec (16,517 samples, 0.16%) + + + +@anon-func-161.5 (962 samples, 0.01%) + + + +@anon-func-38.11 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polyGrow (2,409 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +polySub (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-173.5 (8,502 samples, 0.08%) + + + +$lambda (864 samples, 0.01%) + + + +polyDivMod (2,384 samples, 0.02%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,404 samples, 0.01%) + + + +@anon-func-54.15 (2,955 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +polyZipWith (1,584 samples, 0.02%) + + + +polyAdd (5,767 samples, 0.06%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (29,791 samples, 0.29%) + + + +elemToBits (1,971 samples, 0.02%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-38.11 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (6,055 samples, 0.06%) + + + +rec (16,180 samples, 0.16%) + + + +polyZipWith (1,674 samples, 0.02%) + + + +@anon-func-79.3 (21,908 samples, 0.22%) + + + +encode (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-173.5 (7,228 samples, 0.07%) + + + +@anon-func-173.5 (13,138 samples, 0.13%) + + + +polySub (19,224 samples, 0.19%) + + + +@anon-func-173.5 (64,436 samples, 0.64%) + + + +@anon-func-173.5 (6,032 samples, 0.06%) + + + +@anon-func-51.11 (1,299 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-435.5 (2,640 samples, 0.03%) + + + +interleave (1,299 samples, 0.01%) + + + +@anon-func-161.5 (2,950 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (3,736 samples, 0.04%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (4,165 samples, 0.04%) + + + +interleave (3,424 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (53,684 samples, 0.53%) + + + +$lambda (2,496 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +interleave (1,216 samples, 0.01%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyAdd (2,496 samples, 0.02%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +interleave (1,152 samples, 0.01%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (67,124 samples, 0.66%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,642 samples, 0.02%) + + + +@anon-func-51.11 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (2,787 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +rec (4,267 samples, 0.04%) + + + +@anon-func-51.11 (3,424 samples, 0.03%) + + + +polyDivMod (2,000 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +rec (27,606 samples, 0.27%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-435.5 (72,576 samples, 0.72%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (86,495 samples, 0.85%) + + + +polySub (2,592 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-435.5 (86,400 samples, 0.85%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +polyDivMod (864 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (21,120 samples, 0.21%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +@anon-func-300.5 (3,510 samples, 0.03%) + + + +@anon-func-32.65 (2,826 samples, 0.03%) + + + +rec (5,967 samples, 0.06%) + + + +@anon-func-435.5 (8,064 samples, 0.08%) + + + +pathCoords (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +patternCoords (21,948 samples, 0.22%) + + + +map (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +encode (1,584 samples, 0.02%) + + + +rec (2,187 samples, 0.02%) + + + +@anon-func-435.5 (34,560 samples, 0.34%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +$lambda (1,115 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (2,880 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +$lambda (2,384 samples, 0.02%) + + + +@anon-func-435.5 (12,187 samples, 0.12%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +correction (1,584 samples, 0.02%) + + + +correction (1,517 samples, 0.01%) + + + +@anon-func-481.5 (3,107 samples, 0.03%) + + + +rec (4,401 samples, 0.04%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (964 samples, 0.01%) + + + +go (3,424 samples, 0.03%) + + + +polyMulTerm (1,023 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +$lambda (2,955 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +correction (1,184 samples, 0.01%) + + + +@anon-func-51.11 (1,200 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +@anon-func-161.5 (4,480 samples, 0.04%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (3,477 samples, 0.03%) + + + +@anon-func-173.5 (5,119 samples, 0.05%) + + + +@anon-func-173.5 (72,500 samples, 0.71%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-173.5 (93,328 samples, 0.92%) + + + +@anon-func-48.7 (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +$lambda (864 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-161.5 (3,456 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (2,227 samples, 0.02%) + + + +@anon-func-173.5 (62,601 samples, 0.62%) + + + +@anon-func-173.5 (27,334 samples, 0.27%) + + + +correction (1,584 samples, 0.02%) + + + +@anon-func-435.5 (27,482 samples, 0.27%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +scale (6,976 samples, 0.07%) + + + +encode (1,760 samples, 0.02%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +interleave (5,944 samples, 0.06%) + + + +interleave (2,496 samples, 0.02%) + + + +encode (1,952 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-173.5 (5,434 samples, 0.05%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyDivMod (24,704 samples, 0.24%) + + + +polyZipWith (1,619 samples, 0.02%) + + + +polyPadLeft (1,034 samples, 0.01%) + + + +@anon-func-173.5 (1,024,173 samples, 10.10%) +@anon-func-173.5 + + +encode (1,152 samples, 0.01%) + + + +map (880 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (3,232 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (71,156 samples, 0.70%) + + + +@anon-func-361.7 (1,253 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +polyAddTerm (2,688 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,304 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,000 samples, 0.02%) + + + +@anon-func-173.5 (528,489 samples, 5.21%) +@anon-.. + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-38.11 (1,184 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (35,520 samples, 0.35%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-265.5 (1,998 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +encode (2,877 samples, 0.03%) + + + +polyAdd (1,728 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-481.5 (4,159 samples, 0.04%) + + + +$lambda (1,023 samples, 0.01%) + + + +@anon-func-173.5 (607,016 samples, 5.98%) +@anon-f.. + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +polyAddTerm (2,496 samples, 0.02%) + + + +@anon-func-32.65 (2,955 samples, 0.03%) + + + +polyAdd (3,424 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +encode (2,884 samples, 0.03%) + + + +polySub (880 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +encode (2,877 samples, 0.03%) + + + +correction (2,880 samples, 0.03%) + + + +@anon-func-412.5 (1,104 samples, 0.01%) + + + +polyAdd (928 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +rec (15,892 samples, 0.16%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +polyAddTerm (1,767 samples, 0.02%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +rec (4,941 samples, 0.05%) + + + +interleave (1,584 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +rec (2,349 samples, 0.02%) + + + +go (1,760 samples, 0.02%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-265.5 (2,450 samples, 0.02%) + + + +traceCoords (4,808 samples, 0.05%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (2,880 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +correction (1,104 samples, 0.01%) + + + +rec (6,129 samples, 0.06%) + + + +rec (14,293 samples, 0.14%) + + + +polySub (1,152 samples, 0.01%) + + + +$lambda (1,304 samples, 0.01%) + + + +correction (2,000 samples, 0.02%) + + + +@anon-func-435.5 (2,880 samples, 0.03%) + + + +generate (2,975 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +polyDivMod (1,152 samples, 0.01%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-435.5 (13,867 samples, 0.14%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +encode (1,760 samples, 0.02%) + + + +polyAdd (1,584 samples, 0.02%) + + + +@anon-func-435.5 (8,129 samples, 0.08%) + + + +@anon-func-173.5 (537,531 samples, 5.30%) +@anon-.. + + +@anon-func-173.5 (62,420 samples, 0.62%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +encode (23,752 samples, 0.23%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-173.5 (3,829 samples, 0.04%) + + + +go (892 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +polyAdd (1,104 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,115 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +rec (1,561 samples, 0.02%) + + + +@anon-func-51.11 (1,392 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +interleave (1,584 samples, 0.02%) + + + +@anon-func-173.5 (56,608 samples, 0.56%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-48.7 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +polySub (1,584 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +@anon-func-173.5 (516,433 samples, 5.09%) +@anon-.. + + +@anon-func-51.11 (1,152 samples, 0.01%) + + + +@anon-func-51.11 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (2,688 samples, 0.03%) + + + +@anon-func-481.5 (1,451 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (68,411 samples, 0.67%) + + + +@anon-func-79.3 (6,016 samples, 0.06%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,592 samples, 0.03%) + + + +polyZipWith (4,992 samples, 0.05%) + + + +$lambda (1,760 samples, 0.02%) + + + +polySub (1,952 samples, 0.02%) + + + +correction (1,104 samples, 0.01%) + + + +@anon-func-48.7 (3,424 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (5,488 samples, 0.05%) + + + +@anon-func-32.65 (882 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +polyAddTerm (2,880 samples, 0.03%) + + + +go (1,152 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +correction (1,216 samples, 0.01%) + + + +polyDivMod (1,173 samples, 0.01%) + + + +interleave (1,952 samples, 0.02%) + + + +@anon-func-173.5 (10,322 samples, 0.10%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (76,220 samples, 0.75%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-435.5 (3,076 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +pathCoords (2,623 samples, 0.03%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-435.5 (12,320 samples, 0.12%) + + + +encode (1,767 samples, 0.02%) + + + +polyAdd (4,992 samples, 0.05%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +interleave (2,688 samples, 0.03%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +encode (23,772 samples, 0.23%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (8,450 samples, 0.08%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (47,636 samples, 0.47%) + + + +$lambda (1,120 samples, 0.01%) + + + +correction (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (3,190 samples, 0.03%) + + + +map (2,592 samples, 0.03%) + + + +correction (1,104 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-435.5 (26,180 samples, 0.26%) + + + +@anon-func-173.5 (222,486 samples, 2.19%) +@.. + + +polyScale (2,000 samples, 0.02%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (4,032 samples, 0.04%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-173.5 (2,808 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (2,614,330 samples, 25.77%) +encode + + +@anon-func-300.5 (1,017 samples, 0.01%) + + + +rec (1,767 samples, 0.02%) + + + +$lambda (1,232 samples, 0.01%) + + + +@anon-func-412.5 (1,106 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-54.15 (882 samples, 0.01%) + + + +@anon-func-173.5 (197,846 samples, 1.95%) +@.. + + +@anon-func-173.5 (1,641 samples, 0.02%) + + + +@anon-func-435.5 (990 samples, 0.01%) + + + +@anon-func-300.5 (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (17,142 samples, 0.17%) + + + +polySub (2,496 samples, 0.02%) + + + +$lambda (76,220 samples, 0.75%) + + + +go (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +correction (886 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +pathCoords (2,760 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-30.36 (1,104 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-30.36 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (1,980 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,517 samples, 0.01%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +@anon-func-481.5 (1,650 samples, 0.02%) + + + +@anon-func-173.5 (141,839 samples, 1.40%) + + + +correction (3,424 samples, 0.03%) + + + +@anon-func-79.3 (1,216 samples, 0.01%) + + + +go (1,952 samples, 0.02%) + + + +encode (6,016 samples, 0.06%) + + + +polyMulTerm (1,299 samples, 0.01%) + + + +correction (864 samples, 0.01%) + + + +@anon-func-435.5 (9,959 samples, 0.10%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (1,216 samples, 0.01%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-435.5 (24,066 samples, 0.24%) + + + +@anon-func-435.5 (29,952 samples, 0.30%) + + + +polyAddTerm (1,184 samples, 0.01%) + + + +$lambda (1,216 samples, 0.01%) + + + +@anon-func-481.5 (2,530 samples, 0.02%) + + + +@anon-func-173.5 (34,868 samples, 0.34%) + + + +encode (880 samples, 0.01%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-435.5 (19,387 samples, 0.19%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +$lambda (23,732 samples, 0.23%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +rec (23,589 samples, 0.23%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-229.5 (875 samples, 0.01%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (27,061 samples, 0.27%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-48.7 (1,216 samples, 0.01%) + + + +@anon-func-481.5 (2,921 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (85,811 samples, 0.85%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +rec (23,280 samples, 0.23%) + + + +correction (1,952 samples, 0.02%) + + + +@anon-func-393.5 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +@anon-func-51.11 (2,619,743 samples, 25.82%) +@anon-func-51.11 + + +@anon-func-393.5 (1,620 samples, 0.02%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-435.5 (37,632 samples, 0.37%) + + + +map (1,760 samples, 0.02%) + + + +$lambda (1,584 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +polyDivMod (1,952 samples, 0.02%) + + + +polyDivMod (2,880 samples, 0.03%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (3,472 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +interleave (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +@anon-func-161.5 (1,040 samples, 0.01%) + + + +@anon-func-30.36 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +map (1,391 samples, 0.01%) + + + +@anon-func-289.5 (2,822,044 samples, 27.82%) +@anon-func-289.5 + + +interleave (2,592 samples, 0.03%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +$lambda (3,424 samples, 0.03%) + + + +@anon-func-173.5 (4,571 samples, 0.05%) + + + +polyZipWith (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,200 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +correction (1,761 samples, 0.02%) + + + +@anon-func-435.5 (19,968 samples, 0.20%) + + + +@anon-func-48.7 (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (58,190 samples, 0.57%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-435.5 (1,452 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-161.5 (2,805 samples, 0.03%) + + + +map (1,892 samples, 0.02%) + + + +@anon-func-38.11 (926 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (1,511 samples, 0.01%) + + + +@anon-func-173.5 (831,073 samples, 8.19%) +@anon-func-.. + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,952 samples, 0.02%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-173.5 (3,048 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (4,224 samples, 0.04%) + + + +$lambda (1,504 samples, 0.01%) + + + +@anon-func-173.5 (1,083,457 samples, 10.68%) +@anon-func-173.5 + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +$lambda (2,760 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +rec (6,075 samples, 0.06%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +interleave (1,760 samples, 0.02%) + + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +@anon-func-79.3 (2,212 samples, 0.02%) + + + +@anon-func-173.5 (110,165 samples, 1.09%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,887 samples, 0.02%) + + + +map (3,424 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,184 samples, 0.01%) + + + +@anon-func-173.5 (3,978 samples, 0.04%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +rec (2,295 samples, 0.02%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-51.11 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (9,760 samples, 0.10%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (5,184 samples, 0.05%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +interleave (24,704 samples, 0.24%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +map (1,299 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-173.5 (3,035 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +map (1,104 samples, 0.01%) + + + +@anon-func-38.11 (1,023 samples, 0.01%) + + + +@anon-func-435.5 (17,600 samples, 0.17%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polySub (2,496 samples, 0.02%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +correction (1,216 samples, 0.01%) + + + +@anon-func-481.5 (1,870 samples, 0.02%) + + + +rec (39,348 samples, 0.39%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-435.5 (21,888 samples, 0.22%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +rec (1,249 samples, 0.01%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +encode (2,592 samples, 0.03%) + + + +go (3,424 samples, 0.03%) + + + +@anon-func-51.11 (26,582 samples, 0.26%) + + + +@anon-func-435.5 (16,128 samples, 0.16%) + + + +go (2,592 samples, 0.03%) + + + +encode (864 samples, 0.01%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-173.5 (949,485 samples, 9.36%) +@anon-func-17.. + + +polyZipWith (2,496 samples, 0.02%) + + + +@anon-func-79.3 (1,267 samples, 0.01%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (1,152 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-300.5 (3,424 samples, 0.03%) + + + +rec (3,399 samples, 0.03%) + + + +rec (13,392 samples, 0.13%) + + + +@anon-func-387.7 (1,932 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +rec (15,642 samples, 0.15%) + + + +@anon-func-30.36 (3,424 samples, 0.03%) + + + +correction (2,384 samples, 0.02%) + + + +encode (2,880 samples, 0.03%) + + + +rec (5,517 samples, 0.05%) + + + +polyDivMod (3,431 samples, 0.03%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-481.5 (3,190 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-481.5 (2,906 samples, 0.03%) + + + +$lambda (2,688 samples, 0.03%) + + + +go (1,023 samples, 0.01%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +polyZipWith (3,875 samples, 0.04%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +go (1,760 samples, 0.02%) + + + +polyAddTerm (880 samples, 0.01%) + + + +@anon-func-435.5 (2,688 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-30.36 (1,299 samples, 0.01%) + + + +@anon-func-161.5 (15,840 samples, 0.16%) + + + +@anon-func-435.5 (1,920 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyPadRight (1,221 samples, 0.01%) + + + +polyDivMod (864 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-173.5 (106,447 samples, 1.05%) + + + +@anon-func-361.7 (1,390 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +go (864 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +@anon-func-38.11 (1,216 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +rec (1,468 samples, 0.01%) + + + +polySub (2,880 samples, 0.03%) + + + +@anon-func-435.5 (1,254 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +rec (945 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +interleave (1,104 samples, 0.01%) + + + +interleave (880 samples, 0.01%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-435.5 (8,251 samples, 0.08%) + + + +@anon-func-79.3 (10,152 samples, 0.10%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,456 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (3,737 samples, 0.04%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (3,725 samples, 0.04%) + + + +@anon-func-79.3 (2,496 samples, 0.02%) + + + +polySub (1,184 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (44,992 samples, 0.44%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +@anon-func-54.15 (3,520 samples, 0.03%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +@anon-func-435.5 (12,672 samples, 0.12%) + + + +@anon-func-435.5 (125,322 samples, 1.24%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (1,104 samples, 0.01%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +polyDivMod (880 samples, 0.01%) + + + +encode (1,952 samples, 0.02%) + + + +@anon-func-173.5 (104,080 samples, 1.03%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +go (864 samples, 0.01%) + + + +@anon-func-173.5 (9,256 samples, 0.09%) + + + +@anon-func-435.5 (6,912 samples, 0.07%) + + + +@anon-func-79.3 (1,017 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +map (1,584 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +go (880 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +polyAdd (6,848 samples, 0.07%) + + + +encode (864 samples, 0.01%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +go (864 samples, 0.01%) + + + +correction (880 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +@anon-func-54.15 (1,730 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +interleave (2,880 samples, 0.03%) + + + +@anon-func-412.5 (3,908 samples, 0.04%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (3,424 samples, 0.03%) + + + +go (1,952 samples, 0.02%) + + + +@anon-func-173.5 (174,790 samples, 1.72%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-435.5 (7,296 samples, 0.07%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (628,637 samples, 6.20%) +@anon-fu.. + + +log (13,440 samples, 0.13%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +@anon-func-173.5 (138,886 samples, 1.37%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +@anon-func-30.36 (1,267 samples, 0.01%) + + + +@anon-func-173.5 (2,834 samples, 0.03%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +generate (1,944 samples, 0.02%) + + + +@anon-func-173.5 (50,324 samples, 0.50%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,017 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +$lambda (886 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (1,485 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +@anon-func-229.5 (5,409 samples, 0.05%) + + + +@anon-func-173.5 (389,845 samples, 3.84%) +@ano.. + + +$lambda (880 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-435.5 (97,621 samples, 0.96%) + + + +@anon-func-30.36 (2,592 samples, 0.03%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-79.3 (1,584 samples, 0.02%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +encode (3,424 samples, 0.03%) + + + +@anon-func-435.5 (7,776 samples, 0.08%) + + + +polyZipWith (1,664 samples, 0.02%) + + + +map (864 samples, 0.01%) + + + +$lambda (2,496 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +correction (1,152 samples, 0.01%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-173.5 (252,582 samples, 2.49%) +@a.. + + +@anon-func-38.11 (2,000 samples, 0.02%) + + + +polyDivMod (864 samples, 0.01%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (2,592 samples, 0.03%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polySub (864 samples, 0.01%) + + + +@anon-func-79.3 (5,944 samples, 0.06%) + + + +$lambda (880 samples, 0.01%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,760 samples, 0.02%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +polyZipWith (1,696 samples, 0.02%) + + + +@anon-func-435.5 (38,462 samples, 0.38%) + + + +polyZipWith (2,208 samples, 0.02%) + + + +@anon-func-48.7 (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,125 samples, 0.01%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-481.5 (1,213 samples, 0.01%) + + + +$lambda (1,184 samples, 0.01%) + + + +@anon-func-300.5 (931 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,821 samples, 0.02%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyAddTerm (3,424 samples, 0.03%) + + + +@anon-func-435.5 (4,235 samples, 0.04%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (8,690 samples, 0.09%) + + + +@anon-func-173.5 (759,341 samples, 7.49%) +@anon-func.. + + +correction (1,184 samples, 0.01%) + + + +@anon-func-481.5 (1,910 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-435.5 (156,493 samples, 1.54%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +encode (2,496 samples, 0.02%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +@anon-func-161.5 (1,296 samples, 0.01%) + + + +@anon-func-481.5 (3,806 samples, 0.04%) + + + +map (1,216 samples, 0.01%) + + + +@anon-func-38.11 (880 samples, 0.01%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +encode (1,152 samples, 0.01%) + + + +polyDivMod (3,424 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (54,656 samples, 0.54%) + + + +map (2,384 samples, 0.02%) + + + +@anon-func-265.5 (9,693 samples, 0.10%) + + + +rec (5,805 samples, 0.06%) + + + +@anon-func-173.5 (4,246 samples, 0.04%) + + + +@anon-func-79.3 (864 samples, 0.01%) + + + +@anon-func-48.7 (1,584 samples, 0.02%) + + + +@anon-func-435.5 (15,083 samples, 0.15%) + + + +correction (2,384 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,826 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +generate (5,974 samples, 0.06%) + + + +@anon-func-79.3 (1,200 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-79.3 (1,952 samples, 0.02%) + + + +interleave (1,184 samples, 0.01%) + + + +generate (1,821 samples, 0.02%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (931 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +pathCoords (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,120 samples, 0.01%) + + + +polyAddTerm (864 samples, 0.01%) + + + +polyZipWith (5,760 samples, 0.06%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +encode (1,152 samples, 0.01%) + + + +polyAdd (864 samples, 0.01%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +map (864 samples, 0.01%) + + + +$lambda (2,000 samples, 0.02%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (1,378 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +$lambda (2,496 samples, 0.02%) + + + +revAppend (2,112 samples, 0.02%) + + + +@anon-func-435.5 (11,088 samples, 0.11%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +polyAddTerm (1,200 samples, 0.01%) + + + +@anon-func-51.11 (1,584 samples, 0.02%) + + + +@anon-func-173.5 (86,669 samples, 0.85%) + + + +@anon-func-48.7 (2,592 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-289.5 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (14,112 samples, 0.14%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +go (1,184 samples, 0.01%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +@anon-func-79.3 (3,375 samples, 0.03%) + + + +@anon-func-300.5 (5,376 samples, 0.05%) + + + +encode (1,152 samples, 0.01%) + + + +@anon-func-173.5 (10,920 samples, 0.11%) + + + +@anon-func-51.11 (2,688 samples, 0.03%) + + + +polyAdd (5,184 samples, 0.05%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (2,496 samples, 0.02%) + + + +rec (206,355 samples, 2.03%) +rec + + +encode (2,975 samples, 0.03%) + + + +@anon-func-300.5 (1,760 samples, 0.02%) + + + +@anon-func-481.5 (2,965 samples, 0.03%) + + + +$lambda (1,216 samples, 0.01%) + + + +rec (4,293 samples, 0.04%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-400.13 (920 samples, 0.01%) + + + +@anon-func-435.5 (960 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +correction (1,760 samples, 0.02%) + + + +correction (864 samples, 0.01%) + + + +$lambda (1,152 samples, 0.01%) + + + +@anon-func-481.5 (6,463 samples, 0.06%) + + + +@anon-func-173.5 (1,302 samples, 0.01%) + + + +@anon-func-38.11 (1,173 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,688 samples, 0.03%) + + + +$lambda (1,584 samples, 0.02%) + + + +@anon-func-30.36 (2,880 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +polyDivMod (1,760 samples, 0.02%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (213,334 samples, 2.10%) +@.. + + +@anon-func-79.3 (882 samples, 0.01%) + + + +encode (2,826 samples, 0.03%) + + + +$lambda (2,592 samples, 0.03%) + + + +@anon-func-38.11 (2,754 samples, 0.03%) + + + +@anon-func-48.7 (2,982 samples, 0.03%) + + + +@anon-func-38.11 (3,424 samples, 0.03%) + + + +canister_init (1,675 samples, 0.02%) + + + +@anon-func-173.5 (7,202 samples, 0.07%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +generate (2,877 samples, 0.03%) + + + +pathCoords (2,877 samples, 0.03%) + + + +interleave (880 samples, 0.01%) + + + +rec (17,767 samples, 0.18%) + + + +correction (1,636 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-173.5 (230,934 samples, 2.28%) +@.. + + +correction (2,592 samples, 0.03%) + + + +@anon-func-79.3 (19,224 samples, 0.19%) + + + +polyGrow (1,159 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-361.7 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +interleave (864 samples, 0.01%) + + + +@anon-func-435.5 (31,680 samples, 0.31%) + + + +@anon-func-289.5 (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyZipWith (1,952 samples, 0.02%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-30.36 (880 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,075 samples, 0.02%) + + + +finderCoords (6,016 samples, 0.06%) + + + +@anon-func-435.5 (8,320 samples, 0.08%) + + + +@anon-func-38.11 (1,767 samples, 0.02%) + + + +polyScale (1,136 samples, 0.01%) + + + +@anon-func-51.11 (882 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +@anon-func-300.5 (2,592 samples, 0.03%) + + + +flatten (23,752 samples, 0.23%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +polyAdd (1,104 samples, 0.01%) + + + +@anon-func-173.5 (3,835 samples, 0.04%) + + + +polySub (1,142 samples, 0.01%) + + + +scale (4,576 samples, 0.05%) + + + +polyDivMod (1,216 samples, 0.01%) + + + +polyZipWith (1,184 samples, 0.01%) + + + +@anon-func-38.11 (2,688 samples, 0.03%) + + + +@anon-func-300.5 (1,152 samples, 0.01%) + + + +map (931 samples, 0.01%) + + + +@anon-func-435.5 (170,909 samples, 1.68%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polyAddTerm (1,584 samples, 0.02%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +$lambda (880 samples, 0.01%) + + + +@anon-func-300.5 (2,688 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +go (2,496 samples, 0.02%) + + + +@anon-func-173.5 (3,673 samples, 0.04%) + + + +@anon-func-300.5 (880 samples, 0.01%) + + + +polySub (1,760 samples, 0.02%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-92.40 (3,662 samples, 0.04%) + + + +@anon-func-38.11 (864 samples, 0.01%) + + + +polyAdd (2,688 samples, 0.03%) + + + +@anon-func-173.5 (1,008,613 samples, 9.94%) +@anon-func-173.5 + + +interleave (15,487 samples, 0.15%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +@anon-func-481.5 (1,895 samples, 0.02%) + + + +@anon-func-38.11 (1,152 samples, 0.01%) + + + +pathCoords (2,975 samples, 0.03%) + + + +encode (4,808 samples, 0.05%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-51.11 (880 samples, 0.01%) + + + +$lambda (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-173.5 (155,078 samples, 1.53%) + + + +polyMulTerm (2,000 samples, 0.02%) + + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +@anon-func-79.3 (17,696 samples, 0.17%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-161.5 (2,877 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +correction (880 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-173.5 (4,030 samples, 0.04%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +@anon-func-435.5 (2,320 samples, 0.02%) + + + +@anon-func-51.11 (864 samples, 0.01%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-48.7 (2,255 samples, 0.02%) + + + +rec (3,517 samples, 0.03%) + + + +map (2,496 samples, 0.02%) + + + +@anon-func-30.36 (2,384 samples, 0.02%) + + + +encode (1,760 samples, 0.02%) + + + +@anon-func-54.15 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +polyMulTerm (1,011 samples, 0.01%) + + + +polyDivMod (2,592 samples, 0.03%) + + + +@anon-func-79.3 (21,888 samples, 0.22%) + + + +@anon-func-38.11 (2,880 samples, 0.03%) + + + +correction (10,152 samples, 0.10%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +$lambda (2,975 samples, 0.03%) + + + +polyAdd (1,760 samples, 0.02%) + + + +rec (4,023 samples, 0.04%) + + + +rec (1,068 samples, 0.01%) + + + +@anon-func-300.5 (2,724 samples, 0.03%) + + + +@anon-func-51.11 (1,207 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,384 samples, 0.02%) + + + +@anon-func-79.3 (1,760 samples, 0.02%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-435.5 (6,215 samples, 0.06%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-48.7 (1,887 samples, 0.02%) + + + +polyZipWith (1,760 samples, 0.02%) + + + +@anon-func-173.5 (2,983 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (2,592 samples, 0.03%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (17,947 samples, 0.18%) + + + +encode (2,975 samples, 0.03%) + + + +@anon-func-30.36 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (4,064 samples, 0.04%) + + + +@anon-func-435.5 (51,374 samples, 0.51%) + + + +@anon-func-173.5 (968,157 samples, 9.54%) +@anon-func-17.. + + +@anon-func-51.11 (1,104 samples, 0.01%) + + + +correction (3,424 samples, 0.03%) + + + +encode (2,975 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +@anon-func-32.65 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,952 samples, 0.02%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-48.7 (2,975 samples, 0.03%) + + + +@anon-func-435.5 (13,741 samples, 0.14%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-51.11 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (97,251 samples, 0.96%) + + + +go (1,104 samples, 0.01%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +@anon-func-32.65 (979 samples, 0.01%) + + + +@anon-func-48.7 (2,955 samples, 0.03%) + + + +@anon-func-48.7 (1,760 samples, 0.02%) + + + +generate (2,075 samples, 0.02%) + + + +@anon-func-300.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (3,595 samples, 0.04%) + + + +polyDivMod (864 samples, 0.01%) + + + +correction (1,152 samples, 0.01%) + + + +@anon-func-173.5 (41,551 samples, 0.41%) + + + +polyDivMod (1,104 samples, 0.01%) + + + +go (2,688 samples, 0.03%) + + + +encode (1,584 samples, 0.02%) + + + +@anon-func-79.3 (1,107 samples, 0.01%) + + + +$lambda (880 samples, 0.01%) + + + +polyDivMod (1,391 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +@anon-func-435.5 (21,952 samples, 0.22%) + + + +@anon-func-79.3 (1,104 samples, 0.01%) + + + +polyDivMod (2,688 samples, 0.03%) + + + +polyZipWith (928 samples, 0.01%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +rec (1,613 samples, 0.02%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +@anon-func-79.3 (1,184 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +@anon-func-173.5 (1,161,413 samples, 11.45%) +@anon-func-173.5 + + +@anon-func-435.5 (72,962 samples, 0.72%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,104 samples, 0.01%) + + + +correction (2,688 samples, 0.03%) + + + +polyDivMod (2,496 samples, 0.02%) + + + +polyZipWith (1,728 samples, 0.02%) + + + +polyAdd (928 samples, 0.01%) + + + +@anon-func-481.5 (2,333 samples, 0.02%) + + + +@anon-func-173.5 (77,812 samples, 0.77%) + + + +@anon-func-79.3 (880 samples, 0.01%) + + + +polySub (3,431 samples, 0.03%) + + + +finderCoords (972 samples, 0.01%) + + + +go (880 samples, 0.01%) + + + +$lambda (864 samples, 0.01%) + + + +generate (2,975 samples, 0.03%) + + + +polyZipWith (5,184 samples, 0.05%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +@anon-func-51.11 (2,975 samples, 0.03%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +@anon-func-48.7 (1,517 samples, 0.01%) + + + +@anon-func-289.5 (2,075 samples, 0.02%) + + + +polyZipWith (5,376 samples, 0.05%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + +go (1,104 samples, 0.01%) + + + +go (1,875 samples, 0.02%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (1,760 samples, 0.02%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +patternCoords (5,974 samples, 0.06%) + + + +@anon-func-435.5 (6,820 samples, 0.07%) + + + +@anon-func-79.3 (979 samples, 0.01%) + + + +$lambda (1,173 samples, 0.01%) + + + +rec (14,017 samples, 0.14%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (12,540 samples, 0.12%) + + + +polyAddTerm (1,152 samples, 0.01%) + + + +@anon-func-435.5 (4,627 samples, 0.05%) + + + +@anon-func-435.5 (1,440 samples, 0.01%) + + + +@anon-func-481.5 (1,750 samples, 0.02%) + + + +generate (2,955 samples, 0.03%) + + + +@anon-func-30.36 (1,152 samples, 0.01%) + + + +@anon-func-173.5 (114,160 samples, 1.13%) + + + +@anon-func-48.7 (1,184 samples, 0.01%) + + + +$lambda (2,975 samples, 0.03%) + + + +natToBytes (73,927 samples, 0.73%) + + + +@anon-func-161.5 (920 samples, 0.01%) + + + +step (999 samples, 0.01%) + + + +@anon-func-435.5 (21,007 samples, 0.21%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +encode (880 samples, 0.01%) + + + +go (1,886 samples, 0.02%) + + + +$lambda (2,975 samples, 0.03%) + + + +@anon-func-38.11 (1,760 samples, 0.02%) + + + +B_gt (32,676 samples, 0.32%) + + + +@anon-func-161.5 (5,974 samples, 0.06%) + + + +@anon-func-435.5 (81,984 samples, 0.81%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +generate (2,877 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +polyAddTerm (1,952 samples, 0.02%) + + + +map (1,216 samples, 0.01%) + + + +$lambda (1,952 samples, 0.02%) + + + +@anon-func-79.3 (2,212 samples, 0.02%) + + + +@anon-func-173.5 (191,510 samples, 1.89%) +@.. + + +$lambda (864 samples, 0.01%) + + + +forIn (954 samples, 0.01%) + + + +@anon-func-79.3 (2,955 samples, 0.03%) + + + +interleave (3,424 samples, 0.03%) + + + +@anon-func-48.7 (2,688 samples, 0.03%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +$lambda (3,520 samples, 0.03%) + + + +encode (2,877 samples, 0.03%) + + + +@anon-func-435.5 (3,840 samples, 0.04%) + + + +go (880 samples, 0.01%) + + + +@anon-func-79.3 (2,880 samples, 0.03%) + + + +$lambda (1,184 samples, 0.01%) + + + +map (1,952 samples, 0.02%) + + + +interleave (1,760 samples, 0.02%) + + + +polySub (1,216 samples, 0.01%) + + + +encode (1,120 samples, 0.01%) + + + +@anon-func-51.11 (2,880 samples, 0.03%) + + + +map (3,424 samples, 0.03%) + + + +go (1,504 samples, 0.01%) + + + +@anon-func-30.36 (2,496 samples, 0.02%) + + + +rec (2,679 samples, 0.03%) + + + +@anon-func-435.5 (2,860 samples, 0.03%) + + + +@anon-func-435.5 (16,640 samples, 0.16%) + + + +@anon-func-453.5 (936 samples, 0.01%) + + + +@anon-func-173.5 (1,628 samples, 0.02%) + + + +map (1,952 samples, 0.02%) + + + +@anon-func-300.5 (2,384 samples, 0.02%) + + + +encode (1,636 samples, 0.02%) + + + +@anon-func-161.5 (2,975 samples, 0.03%) + + + +rec (226,981 samples, 2.24%) +rec + + +interleave (1,104 samples, 0.01%) + + + +go (1,216 samples, 0.01%) + + + +@anon-func-48.7 (1,152 samples, 0.01%) + + + +@anon-func-79.3 (1,730 samples, 0.02%) + + + +rec (4,833 samples, 0.05%) + + + +@anon-func-32.65 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-30.36 (864 samples, 0.01%) + + + +interleave (1,104 samples, 0.01%) + + + +@anon-func-79.3 (2,975 samples, 0.03%) + + + +@anon-func-79.3 (2,877 samples, 0.03%) + + + +encode (1,120 samples, 0.01%) + + + +polyAdd (4,992 samples, 0.05%) + + + +map (2,688 samples, 0.03%) + + + +polyDivMod (1,184 samples, 0.01%) + + + +polyZipWith (2,688 samples, 0.03%) + + + +@anon-func-48.7 (864 samples, 0.01%) + + + +@anon-func-481.5 (1,143 samples, 0.01%) + + + +encode (3,040 samples, 0.03%) + + + +@anon-func-51.11 (1,184 samples, 0.01%) + + + +map (2,592 samples, 0.03%) + + + +@anon-func-173.5 (4,493 samples, 0.04%) + + + +pathCoords (21,888 samples, 0.22%) + + + +@anon-func-51.11 (2,877 samples, 0.03%) + + + +@anon-func-300.5 (864 samples, 0.01%) + + + +@anon-func-48.7 (2,877 samples, 0.03%) + + + +pathCoords (2,975 samples, 0.03%) + + + +polyZipWith (1,104 samples, 0.01%) + + + +@anon-func-361.7 (2,975 samples, 0.03%) + + + +map (1,760 samples, 0.02%) + + + +pathCoords (2,975 samples, 0.03%) + + + +@anon-func-54.15 (2,975 samples, 0.03%) + + + +polyMulTerm (1,120 samples, 0.01%) + + + +@anon-func-435.5 (10,368 samples, 0.10%) + + + +@anon-func-48.7 (880 samples, 0.01%) + + + +encode (1,184 samples, 0.01%) + + + +@anon-func-79.3 (2,000 samples, 0.02%) + + + + diff --git a/flamegraphs/qr.svg b/flamegraphs/qr.svg new file mode 100644 index 00000000000..a6ac1f5a15c --- /dev/null +++ b/flamegraphs/qr.svg @@ -0,0 +1,16889 @@ + + + + + + + + + + + + + + +qr.mo + +Reset Zoom +Search + + + +@anon-func-453.5 (4,494 samples, 0.04%) + + + +correction (2,191,536 samples, 21.60%) +correction + + +revAppend (14,912 samples, 0.15%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-300.5 (1,125 samples, 0.01%) + + + +rec (12,892 samples, 0.13%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (3,892 samples, 0.04%) + + + +@anon-func-173.5 (650,095 samples, 6.41%) +@anon-fu.. + + +@anon-func-481.5 (2,846 samples, 0.03%) + + + +@anon-func-435.5 (132,658 samples, 1.31%) + + + +@anon-func-173.5 (8,690 samples, 0.09%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-300.5 (1,248 samples, 0.01%) + + + +formatVCoords (5,789 samples, 0.06%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (16,492 samples, 0.16%) + + + +@anon-func-300.5 (904 samples, 0.01%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (1,140 samples, 0.01%) + + + +rec (1,000 samples, 0.01%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +rec (2,458 samples, 0.02%) + + + +rec (12,767 samples, 0.13%) + + + +@anon-func-435.5 (38,074 samples, 0.38%) + + + +rec (45,426 samples, 0.45%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +$lambda (10,087,193 samples, 99.44%) +$lambda + + +@anon-func-173.5 (323,444 samples, 3.19%) +@an.. + + +@anon-func-161.5 (4,131 samples, 0.04%) + + + +rec (29,267 samples, 0.29%) + + + +@anon-func-435.5 (169,904 samples, 1.67%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (24,142 samples, 0.24%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (40,424 samples, 0.40%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (1,321,922 samples, 13.03%) +@anon-func-173.5 + + +elemMul (1,340 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-173.5 (470,461 samples, 4.64%) +@anon.. + + +rec (1,786 samples, 0.02%) + + + +rec (14,892 samples, 0.15%) + + + +@anon-func-173.5 (67,888 samples, 0.67%) + + + +@anon-func-435.5 (162,298 samples, 1.60%) + + + +rec (2,144 samples, 0.02%) + + + +rec (22,517 samples, 0.22%) + + + +@anon-func-173.5 (821,188 samples, 8.10%) +@anon-func-.. + + +rec (5,058 samples, 0.05%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +rec (22,585 samples, 0.22%) + + + +rec (24,017 samples, 0.24%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (801,363 samples, 7.90%) +@anon-func-.. + + +@anon-func-246.51 (21,975 samples, 0.22%) + + + +rec (1,925 samples, 0.02%) + + + +rec (4,642 samples, 0.05%) + + + +rec (2,236 samples, 0.02%) + + + +rec (11,892 samples, 0.12%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-161.5 (6,134 samples, 0.06%) + + + +rec (16,960 samples, 0.17%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +rec (8,892 samples, 0.09%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (31,444 samples, 0.31%) + + + +@anon-func-173.5 (38,840 samples, 0.38%) + + + +@anon-func-435.5 (66,358 samples, 0.65%) + + + +@anon-func-173.5 (23,038 samples, 0.23%) + + + +@anon-func-435.5 (88,978 samples, 0.88%) + + + +rec (1,450 samples, 0.01%) + + + +rec (4,388 samples, 0.04%) + + + +@anon-func-173.5 (361,664 samples, 3.57%) +@an.. + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-173.5 (220,250 samples, 2.17%) +@.. + + +@anon-func-173.5 (952,033 samples, 9.38%) +@anon-func-17.. + + +@anon-func-173.5 (23,566 samples, 0.23%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-435.5 (126,418 samples, 1.25%) + + + +@anon-func-173.5 (69,296 samples, 0.68%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (6,551 samples, 0.06%) + + + +@anon-func-161.5 (8,960 samples, 0.09%) + + + +@anon-func-173.5 (59,700 samples, 0.59%) + + + +@anon-func-300.5 (890 samples, 0.01%) + + + +rec (37,551 samples, 0.37%) + + + +rec (24,652 samples, 0.24%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (1,644 samples, 0.02%) + + + +rec (3,278 samples, 0.03%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-400.13 (2,933 samples, 0.03%) + + + +rec (3,308 samples, 0.03%) + + + +rec (1,624 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (8,604 samples, 0.08%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (781,565 samples, 7.70%) +@anon-func.. + + +rec (1,142 samples, 0.01%) + + + +scale (10,592 samples, 0.10%) + + + +go (18,484 samples, 0.18%) + + + +@anon-func-435.5 (41,194 samples, 0.41%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (21,660 samples, 0.21%) + + + +rec (25,642 samples, 0.25%) + + + +rec (34,856 samples, 0.34%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +interleave (2,519,321 samples, 24.83%) +interleave + + +rec (2,272 samples, 0.02%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (9,138 samples, 0.09%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-435.5 (5,274 samples, 0.05%) + + + +@anon-func-229.5 (5,309 samples, 0.05%) + + + +rec (1,650 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (3,028 samples, 0.03%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +B_add (1,944 samples, 0.02%) + + + +rec (25,767 samples, 0.25%) + + + +@anon-func-173.5 (12,608 samples, 0.12%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,179,182 samples, 11.62%) +@anon-func-173.5 + + +@anon-func-435.5 (149,038 samples, 1.47%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-300.5 (2,253,456 samples, 22.21%) +@anon-func-300.5 + + +@anon-func-173.5 (407,528 samples, 4.02%) +@ano.. + + +@anon-func-173.5 (115,535 samples, 1.14%) + + + +rec (22,272 samples, 0.22%) + + + +elemFromBits (1,726 samples, 0.02%) + + + +@anon-func-173.5 (258,470 samples, 2.55%) +@a.. + + +@anon-func-435.5 (153,718 samples, 1.52%) + + + +@anon-func-289.5 (26,594 samples, 0.26%) + + + +@anon-func-173.5 (174,386 samples, 1.72%) + + + +rec (4,892 samples, 0.05%) + + + +@anon-func-300.5 (1,446 samples, 0.01%) + + + +@anon-func-435.5 (113,938 samples, 1.12%) + + + +@anon-func-481.5 (21,384 samples, 0.21%) + + + +rec (16,017 samples, 0.16%) + + + +rec (17,272 samples, 0.17%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-435.5 (151,378 samples, 1.49%) + + + +map (5,413 samples, 0.05%) + + + +rec (23,852 samples, 0.24%) + + + +rec (1,925 samples, 0.02%) + + + +parse_idl_header (3,999 samples, 0.04%) + + + +@anon-func-173.5 (13,664 samples, 0.13%) + + + +rec (1,142 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (4,104 samples, 0.04%) + + + +rec (12,017 samples, 0.12%) + + + +rec (36,076 samples, 0.36%) + + + +@anon-func-481.5 (1,840 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (98,338 samples, 0.97%) + + + +elemMul (10,400 samples, 0.10%) + + + +@anon-func-229.5 (26,644 samples, 0.26%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +B_div (1,216 samples, 0.01%) + + + +columnwise (205,316 samples, 2.02%) +c.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (10,517 samples, 0.10%) + + + +rec (4,932 samples, 0.05%) + + + +@anon-func-435.5 (38,854 samples, 0.38%) + + + +rec (1,945 samples, 0.02%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-173.5 (52,438 samples, 0.52%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-453.5 (2,257 samples, 0.02%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-435.5 (7,310 samples, 0.07%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,343 samples, 0.01%) + + + +@anon-func-435.5 (133,438 samples, 1.32%) + + + +rec (2,196 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-173.5 (6,754 samples, 0.07%) + + + +rec (9,148 samples, 0.09%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (2,206 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (21,116 samples, 0.21%) + + + +@anon-func-435.5 (9,174 samples, 0.09%) + + + +@anon-func-173.5 (35,274 samples, 0.35%) + + + +go (31,348 samples, 0.31%) + + + +@anon-func-173.5 (435,829 samples, 4.30%) +@anon.. + + +@anon-func-173.5 (1,262,447 samples, 12.44%) +@anon-func-173.5 + + +rec (1,654 samples, 0.02%) + + + +@anon-func-173.5 (5,874 samples, 0.06%) + + + +rec (12,628 samples, 0.12%) + + + +polyPadLeft (34,755 samples, 0.34%) + + + +scale (10,592 samples, 0.10%) + + + +@anon-func-173.5 (789,468 samples, 7.78%) +@anon-func.. + + +@anon-func-173.5 (837,048 samples, 8.25%) +@anon-func-.. + + +@anon-func-246.51 (78,200 samples, 0.77%) + + + +rec (1,378 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +scale (1,022 samples, 0.01%) + + + +@anon-func-161.5 (120,840 samples, 1.19%) + + + +@anon-func-300.5 (1,540 samples, 0.02%) + + + +@anon-func-435.5 (59,134 samples, 0.58%) + + + +@anon-func-300.5 (890 samples, 0.01%) + + + +@anon-func-173.5 (9,968 samples, 0.10%) + + + +@anon-func-161.5 (1,570 samples, 0.02%) + + + +@anon-func-173.5 (19,296 samples, 0.19%) + + + +rec (30,908 samples, 0.30%) + + + +rec (14,642 samples, 0.14%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (1,465,806 samples, 14.45%) +@anon-func-173.5 + + +@anon-func-173.5 (604,231 samples, 5.96%) +@anon-f.. + + +@anon-func-173.5 (26,956 samples, 0.27%) + + + +@anon-func-481.5 (4,865 samples, 0.05%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (2,226 samples, 0.02%) + + + +@anon-func-173.5 (6,578 samples, 0.06%) + + + +rec (1,363 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-435.5 (52,114 samples, 0.51%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +rec (3,870 samples, 0.04%) + + + +rec (4,932 samples, 0.05%) + + + +@anon-func-246.51 (24,466 samples, 0.24%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (24,668 samples, 0.24%) + + + +rec (7,301 samples, 0.07%) + + + +elemToBits (2,626 samples, 0.03%) + + + +@anon-func-173.5 (1,430,121 samples, 14.10%) +@anon-func-173.5 + + +@anon-func-435.5 (61,084 samples, 0.60%) + + + +@anon-func-481.5 (21,384 samples, 0.21%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (991,683 samples, 9.78%) +@anon-func-173.5 + + +@anon-func-435.5 (20,094 samples, 0.20%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +natFromBits (1,827 samples, 0.02%) + + + +@anon-func-173.5 (3,364 samples, 0.03%) + + + +@anon-func-435.5 (34,564 samples, 0.34%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (2,874 samples, 0.03%) + + + +rec (39,051 samples, 0.38%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-173.5 (1,370,178 samples, 13.51%) +@anon-func-173.5 + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (17,360 samples, 0.17%) + + + +rec (4,159 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-435.5 (57,964 samples, 0.57%) + + + +@anon-func-173.5 (9,792 samples, 0.10%) + + + +B_add (864 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +render (5,331 samples, 0.05%) + + + +foldr (2,846 samples, 0.03%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (2,484 samples, 0.02%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (231,716 samples, 2.28%) +@.. + + +@anon-func-435.5 (34,864 samples, 0.34%) + + + +@anon-func-435.5 (45,874 samples, 0.45%) + + + +@anon-func-173.5 (56,884 samples, 0.56%) + + + +rec (19,767 samples, 0.19%) + + + +@anon-func-435.5 (10,344 samples, 0.10%) + + + +@anon-func-133.5 (23,741 samples, 0.23%) + + + +rec (12,693 samples, 0.13%) + + + +@anon-func-265.5 (5,822 samples, 0.06%) + + + +rec (1,582 samples, 0.02%) + + + +@anon-func-173.5 (4,420 samples, 0.04%) + + + +rec (1,000 samples, 0.01%) + + + +@anon-func-435.5 (118,618 samples, 1.17%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (18,416 samples, 0.18%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +elemMul (10,400 samples, 0.10%) + + + +B_eq (1,173 samples, 0.01%) + + + +rec (30,364 samples, 0.30%) + + + +@anon-func-173.5 (26,076 samples, 0.26%) + + + +rec (31,180 samples, 0.31%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (319,622 samples, 3.15%) +@an.. + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (18,124 samples, 0.18%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-229.5 (967 samples, 0.01%) + + + +@anon-func-173.5 (68,768 samples, 0.68%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (388,418 samples, 3.83%) +@ano.. + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (135,243 samples, 1.33%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +rec (1,242 samples, 0.01%) + + + +rec (9,971 samples, 0.10%) + + + +rec (6,272 samples, 0.06%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-161.5 (1,670 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-161.5 (3,069 samples, 0.03%) + + + +@anon-func-300.5 (1,125 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (24,267 samples, 0.24%) + + + +@anon-func-435.5 (67,138 samples, 0.66%) + + + +rec (6,017 samples, 0.06%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-453.5 (1,062 samples, 0.01%) + + + +rec (892 samples, 0.01%) + + + +@anon-func-435.5 (159,178 samples, 1.57%) + + + +@anon-func-173.5 (57,932 samples, 0.57%) + + + +elemToBits (2,620 samples, 0.03%) + + + +@anon-func-300.5 (879 samples, 0.01%) + + + +rec (23,267 samples, 0.23%) + + + +rec (3,288 samples, 0.03%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (365,486 samples, 3.60%) +@ano.. + + +@anon-func-73.5 (1,030 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (17,888 samples, 0.18%) + + + +rec (14,588 samples, 0.14%) + + + +@anon-func-173.5 (785,503 samples, 7.74%) +@anon-func.. + + +@anon-func-173.5 (1,457,876 samples, 14.37%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (40,600 samples, 0.40%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-173.5 (493,393 samples, 4.86%) +@anon-.. + + +rec (13,017 samples, 0.13%) + + + +@anon-func-161.5 (21,281 samples, 0.21%) + + + +@anon-func-173.5 (119,513 samples, 1.18%) + + + +@anon-func-435.5 (32,614 samples, 0.32%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (31,054 samples, 0.31%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,353 samples, 0.01%) + + + +@anon-func-173.5 (61,284 samples, 0.60%) + + + +rec (27,517 samples, 0.27%) + + + +@anon-func-161.5 (45,288 samples, 0.45%) + + + +@anon-func-173.5 (68,240 samples, 0.67%) + + + +@anon-func-244.5 (50,400 samples, 0.50%) + + + +rec (3,850 samples, 0.04%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (14,896 samples, 0.15%) + + + +@anon-func-481.5 (4,128 samples, 0.04%) + + + +@anon-func-481.5 (2,488 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-161.5 (12,254 samples, 0.12%) + + + +rec (1,142 samples, 0.01%) + + + +@anon-func-173.5 (1,449,946 samples, 14.29%) +@anon-func-173.5 + + +rec (4,432 samples, 0.04%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +@anon-func-435.5 (15,024 samples, 0.15%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (28,892 samples, 0.28%) + + + +@anon-func-300.5 (1,248 samples, 0.01%) + + + +@anon-func-173.5 (912,383 samples, 8.99%) +@anon-func-1.. + + +@anon-func-161.5 (953 samples, 0.01%) + + + +rec (3,004 samples, 0.03%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (57,588 samples, 0.57%) + + + +@anon-func-173.5 (928,243 samples, 9.15%) +@anon-func-17.. + + +@anon-func-62.5 (10,608 samples, 0.10%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-481.5 (9,589 samples, 0.09%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (102,238 samples, 1.01%) + + + +@anon-func-400.13 (5,866 samples, 0.06%) + + + +rec (2,982 samples, 0.03%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +rec (1,892 samples, 0.02%) + + + +@anon-func-435.5 (74,158 samples, 0.73%) + + + +rec (1,072 samples, 0.01%) + + + +log (4,448 samples, 0.04%) + + + +polyLen (66,776 samples, 0.66%) + + + +rec (2,058 samples, 0.02%) + + + +step (1,573 samples, 0.02%) + + + +@anon-func-173.5 (884,628 samples, 8.72%) +@anon-func-1.. + + +B_add (864 samples, 0.01%) + + + +@anon-func-161.5 (3,308 samples, 0.03%) + + + +rec (3,659 samples, 0.04%) + + + +@anon-func-453.5 (1,062 samples, 0.01%) + + + +@anon-func-289.5 (10,234 samples, 0.10%) + + + +@anon-func-435.5 (474,174 samples, 4.67%) +@anon.. + + +rec (3,288 samples, 0.03%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (23,142 samples, 0.23%) + + + +rec (1,363 samples, 0.01%) + + + +rec (1,062 samples, 0.01%) + + + +rec (2,164 samples, 0.02%) + + + +@anon-func-173.5 (58,292 samples, 0.57%) + + + +rec (14,044 samples, 0.14%) + + + +elemAdd (26,960 samples, 0.27%) + + + +natZipWith (25,392 samples, 0.25%) + + + +B_sub (1,120 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (423,375 samples, 4.17%) +@ano.. + + +@anon-func-173.5 (111,570 samples, 1.10%) + + + +scale (1,606 samples, 0.02%) + + + +@anon-func-173.5 (384,596 samples, 3.79%) +@ano.. + + +@anon-func-173.5 (57,940 samples, 0.57%) + + + +rec (11,267 samples, 0.11%) + + + +rec (10,267 samples, 0.10%) + + + +rec (3,552 samples, 0.04%) + + + +formatCoords (11,774 samples, 0.12%) + + + +rec (44,676 samples, 0.44%) + + + +@anon-func-435.5 (158,398 samples, 1.56%) + + + +@anon-func-173.5 (11,160 samples, 0.11%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (22,158 samples, 0.22%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (1,654 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +rec (1,668 samples, 0.02%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +scale (876 samples, 0.01%) + + + +rec (2,534 samples, 0.02%) + + + +@anon-func-435.5 (36,904 samples, 0.36%) + + + +@anon-func-173.5 (62,516 samples, 0.62%) + + + +@anon-func-133.5 (9,149 samples, 0.09%) + + + +@anon-func-161.5 (70,472 samples, 0.69%) + + + +@anon-func-173.5 (21,102 samples, 0.21%) + + + +@anon-func-435.5 (41,584 samples, 0.41%) + + + +@anon-func-173.5 (250,826 samples, 2.47%) +@a.. + + +rec (1,517 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +rec (1,072 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (110,818 samples, 1.09%) + + + +@anon-func-173.5 (53,716 samples, 0.53%) + + + +@anon-func-435.5 (7,224 samples, 0.07%) + + + +rec (1,654 samples, 0.02%) + + + +@anon-func-173.5 (24,492 samples, 0.24%) + + + +rec (10,392 samples, 0.10%) + + + +@anon-func-173.5 (6,050 samples, 0.06%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +elemAdd (27,390 samples, 0.27%) + + + +@anon-func-173.5 (1,195,042 samples, 11.78%) +@anon-func-173.5 + + +rec (1,363 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (573,655 samples, 5.65%) +@anon-f.. + + +rec (25,017 samples, 0.25%) + + + +@anon-func-393.5 (2,884 samples, 0.03%) + + + +B_pow (912 samples, 0.01%) + + + +padLeftTo (1,360 samples, 0.01%) + + + +rec (10,272 samples, 0.10%) + + + +rec (1,514 samples, 0.01%) + + + +rec (7,062 samples, 0.07%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-435.5 (103,798 samples, 1.02%) + + + +compacting_gc (23,902 samples, 0.24%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-300.5 (1,136 samples, 0.01%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +log (4,448 samples, 0.04%) + + + +rec (8,517 samples, 0.08%) + + + +rec (1,654 samples, 0.02%) + + + +@anon-func-161.5 (6,127 samples, 0.06%) + + + +@anon-func-173.5 (1,250,552 samples, 12.33%) +@anon-func-173.5 + + +@anon-func-173.5 (64,674 samples, 0.64%) + + + +@anon-func-173.5 (63,970 samples, 0.63%) + + + +B_add (1,944 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,517 samples, 0.01%) + + + +@anon-func-435.5 (137,338 samples, 1.35%) + + + +elemMul (1,206 samples, 0.01%) + + + +@anon-func-173.5 (944,103 samples, 9.31%) +@anon-func-17.. + + +rec (15,193 samples, 0.15%) + + + +@anon-func-173.5 (37,914 samples, 0.37%) + + + +rec (33,051 samples, 0.33%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +elemToBits (2,632 samples, 0.03%) + + + +@anon-func-173.5 (68,064 samples, 0.67%) + + + +@anon-func-435.5 (139,678 samples, 1.38%) + + + +@anon-func-435.5 (142,018 samples, 1.40%) + + + +@anon-func-481.5 (918 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (27,484 samples, 0.27%) + + + +@anon-func-435.5 (39,634 samples, 0.39%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-300.5 (900 samples, 0.01%) + + + +rec (2,330 samples, 0.02%) + + + +rec (16,272 samples, 0.16%) + + + +rec (1,922 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-173.5 (868,768 samples, 8.56%) +@anon-func-1.. + + +@anon-func-173.5 (23,742 samples, 0.23%) + + + +rec (12,267 samples, 0.12%) + + + +@anon-func-481.5 (28,455 samples, 0.28%) + + + +elemToBits (2,638 samples, 0.03%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (18,017 samples, 0.18%) + + + +@anon-func-362.41 (997 samples, 0.01%) + + + +@anon-func-173.5 (1,426,156 samples, 14.06%) +@anon-func-173.5 + + +@anon-func-435.5 (85,858 samples, 0.85%) + + + +@anon-func-173.5 (750,924 samples, 7.40%) +@anon-func.. + + +@anon-func-173.5 (462,817 samples, 4.56%) +@anon.. + + +B_rem (1,152 samples, 0.01%) + + + +elemFromBits (1,332 samples, 0.01%) + + + +@anon-func-435.5 (3,324 samples, 0.03%) + + + +rec (1,945 samples, 0.02%) + + + +finderTLCoords (16,698 samples, 0.16%) + + + +@anon-func-229.5 (16,380 samples, 0.16%) + + + +@anon-func-173.5 (959,963 samples, 9.46%) +@anon-func-17.. + + +rec (7,517 samples, 0.07%) + + + +@anon-func-435.5 (131,098 samples, 1.29%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (15,767 samples, 0.16%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (36,892 samples, 0.36%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (19,212 samples, 0.19%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (6,300 samples, 0.06%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (58,820 samples, 0.58%) + + + +@anon-func-481.5 (38,074 samples, 0.38%) + + + +@anon-func-244.5 (54,279 samples, 0.54%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +rec (1,017 samples, 0.01%) + + + +elemNew (1,168 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (27,862 samples, 0.27%) + + + +rec (26,017 samples, 0.26%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (554,545 samples, 5.47%) +@anon-f.. + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (1,076,092 samples, 10.61%) +@anon-func-173.5 + + +@anon-func-173.5 (531,613 samples, 5.24%) +@anon-.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (10,693 samples, 0.11%) + + + +rec (888 samples, 0.01%) + + + +rec (3,880 samples, 0.04%) + + + +rec (28,732 samples, 0.28%) + + + +@anon-func-73.5 (65,720 samples, 0.65%) + + + +@anon-func-393.5 (5,768 samples, 0.06%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-481.5 (16,660 samples, 0.16%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-246.51 (27,166 samples, 0.27%) + + + +rec (1,582 samples, 0.02%) + + + +@anon-func-173.5 (1,266,412 samples, 12.48%) +@anon-func-173.5 + + +pathCoords (7,531,662 samples, 74.25%) +pathCoords + + +@anon-func-435.5 (28,284 samples, 0.28%) + + + +@anon-func-300.5 (879 samples, 0.01%) + + + +B_add (3,375 samples, 0.03%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (39,544 samples, 0.39%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (19,120 samples, 0.19%) + + + +next (5,742 samples, 0.06%) + + + +rec (1,124 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (6,767 samples, 0.07%) + + + +B_rem (1,152 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (45,352 samples, 0.45%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-161.5 (7,547 samples, 0.07%) + + + +rec (40,551 samples, 0.40%) + + + +@anon-func-173.5 (1,191,077 samples, 11.74%) +@anon-func-173.5 + + +@anon-func-173.5 (797,398 samples, 7.86%) +@anon-func-.. + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-435.5 (94,438 samples, 0.93%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (2,154 samples, 0.02%) + + + +rec (1,922 samples, 0.02%) + + + +@anon-func-435.5 (20,484 samples, 0.20%) + + + +rec (2,058 samples, 0.02%) + + + +@anon-func-481.5 (11,936 samples, 0.12%) + + + +@anon-func-453.5 (4,484 samples, 0.04%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (809,293 samples, 7.98%) +@anon-func-.. + + +rec (65,432 samples, 0.65%) + + + +@anon-func-173.5 (1,341,747 samples, 13.23%) +@anon-func-173.5 + + +@anon-func-173.5 (69,398 samples, 0.68%) + + + +rec (4,524 samples, 0.04%) + + + +blob_of_principal (2,332 samples, 0.02%) + + + +rec (18,835 samples, 0.19%) + + + +@anon-func-173.5 (900,488 samples, 8.88%) +@anon-func-1.. + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +init (4,123 samples, 0.04%) + + + +rec (5,017 samples, 0.05%) + + + +rec (1,363 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-435.5 (19,314 samples, 0.19%) + + + +foldr (1,097 samples, 0.01%) + + + +@anon-func-173.5 (1,218,832 samples, 12.01%) +@anon-func-173.5 + + +rec (3,403 samples, 0.03%) + + + +B_gt (960 samples, 0.01%) + + + +rec (31,551 samples, 0.31%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,634 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (45,880 samples, 0.45%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-481.5 (11,936 samples, 0.12%) + + + +@anon-func-173.5 (856,873 samples, 8.45%) +@anon-func-1.. + + +@anon-func-362.41 (988 samples, 0.01%) + + + +rec (1,925 samples, 0.02%) + + + +rec (4,796 samples, 0.05%) + + + +@anon-func-435.5 (27,894 samples, 0.27%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (64,146 samples, 0.63%) + + + +rec (2,892 samples, 0.03%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-481.5 (7,212 samples, 0.07%) + + + +rec (1,650 samples, 0.02%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-481.5 (11,936 samples, 0.12%) + + + +@anon-func-435.5 (82,738 samples, 0.82%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (342,554 samples, 3.38%) +@an.. + + +@anon-func-173.5 (1,187,112 samples, 11.70%) +@anon-func-173.5 + + +polyPadRight (3,589 samples, 0.04%) + + + +motoko_rts::memory::ic::linear_memory::_$LT$impl$u20$motoko_rts..memory..Memory$u20$for$u20$motoko_rts..memory..ic..IcMemory$GT$::grow_memory::hc224903332a6c43e (1,810 samples, 0.02%) + + + +rec (25,740 samples, 0.25%) + + + +@anon-func-435.5 (79,618 samples, 0.78%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-435.5 (109,258 samples, 1.08%) + + + +@anon-func-173.5 (35,802 samples, 0.35%) + + + +@anon-func-435.5 (113,158 samples, 1.12%) + + + +rec (15,255 samples, 0.15%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (1,378 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (20,517 samples, 0.20%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natFromBits (1,347 samples, 0.01%) + + + +@anon-func-435.5 (68,624 samples, 0.68%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (3,926 samples, 0.04%) + + + +rec (42,426 samples, 0.42%) + + + +@anon-func-173.5 (331,088 samples, 3.26%) +@an.. + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (2,767 samples, 0.03%) + + + +@anon-func-173.5 (127,326 samples, 1.26%) + + + +@anon-func-173.5 (4,244 samples, 0.04%) + + + +@anon-func-173.5 (669,205 samples, 6.60%) +@anon-fu.. + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (1,925 samples, 0.02%) + + + +rec (1,017 samples, 0.01%) + + + +@anon-func-435.5 (40,804 samples, 0.40%) + + + +@anon-func-173.5 (646,273 samples, 6.37%) +@anon-fu.. + + +@anon-func-173.5 (12,784 samples, 0.13%) + + + +rec (1,392 samples, 0.01%) + + + +@anon-func-161.5 (12,305 samples, 0.12%) + + + +B_pow (912 samples, 0.01%) + + + +rec (1,925 samples, 0.02%) + + + +@anon-func-400.13 (5,866 samples, 0.06%) + + + +rec (15,642 samples, 0.15%) + + + +@anon-func-435.5 (43,534 samples, 0.43%) + + + +@anon-func-173.5 (296,690 samples, 2.92%) +@a.. + + +rec (2,659 samples, 0.03%) + + + +@anon-func-244.5 (44,174 samples, 0.44%) + + + +@anon-func-161.5 (1,895 samples, 0.02%) + + + +@anon-func-173.5 (9,042 samples, 0.09%) + + + +elemToBits (2,604 samples, 0.03%) + + + +@anon-func-173.5 (619,519 samples, 6.11%) +@anon-fu.. + + +rec (12,412 samples, 0.12%) + + + +@anon-func-173.5 (569,833 samples, 5.62%) +@anon-f.. + + +rec (3,028 samples, 0.03%) + + + +natToBits (1,188 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-435.5 (879,294 samples, 8.67%) +@anon-func-4.. + + +B_pow (912 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (2,154 samples, 0.02%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (4,909 samples, 0.05%) + + + +@anon-func-481.5 (9,589 samples, 0.09%) + + + +rec (29,642 samples, 0.29%) + + + +@anon-func-173.5 (1,027,446 samples, 10.13%) +@anon-func-173.5 + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (18,767 samples, 0.19%) + + + +rec (2,148 samples, 0.02%) + + + +@anon-func-173.5 (70,000 samples, 0.69%) + + + +@anon-func-435.5 (41,974 samples, 0.41%) + + + +@anon-func-412.5 (5,842 samples, 0.06%) + + + +elemFromBits (1,434 samples, 0.01%) + + + +@anon-func-173.5 (47,112 samples, 0.46%) + + + +@anon-func-173.5 (28,716 samples, 0.28%) + + + +rec (1,668 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (9,140 samples, 0.09%) + + + +@anon-func-173.5 (7,106 samples, 0.07%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (2,484 samples, 0.02%) + + + +rec (1,082 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (30,017 samples, 0.30%) + + + +rec (6,972 samples, 0.07%) + + + +B_pow (912 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (6,517 samples, 0.06%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (20,574 samples, 0.20%) + + + +@anon-func-435.5 (8,394 samples, 0.08%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-173.5 (162,920 samples, 1.61%) + + + +rec (5,642 samples, 0.06%) + + + +rec (43,551 samples, 0.43%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (1,925 samples, 0.02%) + + + +padLeftTo (1,348 samples, 0.01%) + + + +rec (5,748 samples, 0.06%) + + + +rec (2,159 samples, 0.02%) + + + +@anon-func-435.5 (23,604 samples, 0.23%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (6,642 samples, 0.07%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-173.5 (508,681 samples, 5.01%) +@anon-.. + + +B_pow (912 samples, 0.01%) + + + +rec (35,676 samples, 0.35%) + + + +map (2,236 samples, 0.02%) + + + +rec (1,142 samples, 0.01%) + + + +rec (8,693 samples, 0.09%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +B_gt (972 samples, 0.01%) + + + +rec (1,267 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (7,458 samples, 0.07%) + + + +@anon-func-246.51 (23,799 samples, 0.23%) + + + +rec (3,892 samples, 0.04%) + + + +rec (4,348 samples, 0.04%) + + + +elemMul (10,400 samples, 0.10%) + + + +log (4,448 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-435.5 (53,284 samples, 0.53%) + + + +rec (9,642 samples, 0.10%) + + + +rec (7,678 samples, 0.08%) + + + +@anon-func-229.5 (1,342 samples, 0.01%) + + + +@anon-func-173.5 (62,340 samples, 0.61%) + + + +@anon-func-300.5 (1,023 samples, 0.01%) + + + +@anon-func-161.5 (33,122 samples, 0.33%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (29,892 samples, 0.29%) + + + +rec (23,564 samples, 0.23%) + + + +@anon-func-435.5 (68,698 samples, 0.68%) + + + +@anon-func-173.5 (10,144 samples, 0.10%) + + + +@anon-func-244.5 (11,936 samples, 0.12%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +B_sub (1,120 samples, 0.01%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-300.5 (1,284 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (427,795 samples, 4.22%) +@anon.. + + +@anon-func-400.13 (2,933 samples, 0.03%) + + + +rec (8,267 samples, 0.08%) + + + +@anon-func-161.5 (42,199 samples, 0.42%) + + + +@anon-func-173.5 (25,724 samples, 0.25%) + + + +rec (35,260 samples, 0.35%) + + + +polyAddTerm (688,208 samples, 6.78%) +polyAddTerm + + +@anon-func-173.5 (88,508 samples, 0.87%) + + + +rec (15,017 samples, 0.15%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (60,404 samples, 0.60%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-300.5 (1,248 samples, 0.01%) + + + +@anon-func-435.5 (89,758 samples, 0.88%) + + + +rec (883 samples, 0.01%) + + + +rec (2,206 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +rec (26,267 samples, 0.26%) + + + +@anon-func-300.5 (1,728 samples, 0.02%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (562,189 samples, 5.54%) +@anon-f.. + + +@anon-func-173.5 (623,341 samples, 6.14%) +@anon-fu.. + + +rec (20,085 samples, 0.20%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (66,786 samples, 0.66%) + + + +@anon-func-173.5 (166,742 samples, 1.64%) + + + +rec (17,892 samples, 0.18%) + + + +@anon-func-173.5 (1,084,022 samples, 10.69%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (15,404 samples, 0.15%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (888 samples, 0.01%) + + + +@anon-func-435.5 (64,204 samples, 0.63%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (350,198 samples, 3.45%) +@an.. + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (18,520 samples, 0.18%) + + + +rec (1,106 samples, 0.01%) + + + +rec (11,613 samples, 0.11%) + + + +@anon-func-173.5 (54,420 samples, 0.54%) + + + +@anon-func-173.5 (31,340 samples, 0.31%) + + + +@anon-func-30.36 (2,371,122 samples, 23.37%) +@anon-func-30.36 + + +rec (26,119 samples, 0.26%) + + + +B_add (864 samples, 0.01%) + + + +rec (17,767 samples, 0.18%) + + + +@anon-func-173.5 (596,587 samples, 5.88%) +@anon-f.. + + +rec (19,392 samples, 0.19%) + + + +rec (46,926 samples, 0.46%) + + + +@anon-func-173.5 (936,173 samples, 9.23%) +@anon-func-17.. + + +@anon-func-173.5 (92,330 samples, 0.91%) + + + +@anon-func-173.5 (197,318 samples, 1.95%) +@.. + + +natToBits (1,572 samples, 0.02%) + + + +rec (1,378 samples, 0.01%) + + + +@anon-func-435.5 (22,044 samples, 0.22%) + + + +go (40,216 samples, 0.40%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (63,442 samples, 0.63%) + + + +rec (13,892 samples, 0.14%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-481.5 (37,843 samples, 0.37%) + + + +@anon-func-435.5 (35,344 samples, 0.35%) + + + +rec (1,082 samples, 0.01%) + + + +rec (22,476 samples, 0.22%) + + + +@anon-func-173.5 (50,502 samples, 0.50%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (2,194 samples, 0.02%) + + + +@anon-func-265.5 (6,917 samples, 0.07%) + + + +@anon-func-173.5 (392,240 samples, 3.87%) +@ano.. + + +rec (19,517 samples, 0.19%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (70,704 samples, 0.70%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (439,755 samples, 4.34%) +@anon.. + + +elemAdd (26,960 samples, 0.27%) + + + +revAppend (76,220 samples, 0.75%) + + + +@anon-func-173.5 (66,610 samples, 0.66%) + + + +rec (5,058 samples, 0.05%) + + + +@anon-func-173.5 (1,175,217 samples, 11.59%) +@anon-func-173.5 + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (2,058 samples, 0.02%) + + + +@anon-func-99.14 (896 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +log (4,448 samples, 0.04%) + + + +elemFromBits (1,445 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +rec (8,142 samples, 0.08%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-435.5 (36,514 samples, 0.36%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,031,489 samples, 10.17%) +@anon-func-173.5 + + +@anon-func-481.5 (23,761 samples, 0.23%) + + + +elemToBits (2,632 samples, 0.03%) + + + +rec (3,952 samples, 0.04%) + + + +next (5,742 samples, 0.06%) + + + +@anon-func-435.5 (161,518 samples, 1.59%) + + + +@anon-func-435.5 (6,834 samples, 0.07%) + + + +rec (3,552 samples, 0.04%) + + + +natXor (25,552 samples, 0.25%) + + + +natToBytes (7,168 samples, 0.07%) + + + +padLeftTo (1,008 samples, 0.01%) + + + +padLeftTo (2,210 samples, 0.02%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-173.5 (1,206,937 samples, 11.90%) +@anon-func-173.5 + + +@anon-func-435.5 (49,384 samples, 0.49%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (49,094 samples, 0.48%) + + + +rowwise (5,300,489 samples, 52.25%) +rowwise + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (1,343 samples, 0.01%) + + + +@anon-func-173.5 (1,199,007 samples, 11.82%) +@anon-func-173.5 + + +rec (36,426 samples, 0.36%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,286,237 samples, 12.68%) +@anon-func-173.5 + + +B_add (864 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +rec (20,392 samples, 0.20%) + + + +@anon-func-435.5 (18,144 samples, 0.18%) + + + +rec (3,844 samples, 0.04%) + + + +B_add (1,944 samples, 0.02%) + + + +rec (2,466 samples, 0.02%) + + + +@anon-func-173.5 (50,326 samples, 0.50%) + + + +@anon-func-173.5 (42,712 samples, 0.42%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-173.5 (1,333,817 samples, 13.15%) +@anon-func-173.5 + + +rec (3,017 samples, 0.03%) + + + +@anon-func-435.5 (63,034 samples, 0.62%) + + + +rec (8,454 samples, 0.08%) + + + +rec (1,378 samples, 0.01%) + + + +@anon-func-173.5 (1,015,473 samples, 10.01%) +@anon-func-173.5 + + +@anon-func-362.41 (1,088 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,072 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (1,062 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +elemMul (10,400 samples, 0.10%) + + + +rec (20,267 samples, 0.20%) + + + +rec (1,582 samples, 0.02%) + + + +remember_continuation (4,030 samples, 0.04%) + + + +polyPadRight (41,984 samples, 0.41%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (34,716 samples, 0.34%) + + + +@anon-func-161.5 (7,207 samples, 0.07%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (5,767 samples, 0.06%) + + + +parse (3,254 samples, 0.03%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-412.5 (2,921 samples, 0.03%) + + + +elemMul (10,400 samples, 0.10%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (5,068 samples, 0.05%) + + + +natToBytes (7,168 samples, 0.07%) + + + +B_div (1,216 samples, 0.01%) + + + +elemMul (1,608 samples, 0.02%) + + + +rec (23,517 samples, 0.23%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (155,278 samples, 1.53%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-73.5 (28,339 samples, 0.28%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +polyAdd (1,051,745 samples, 10.37%) +polyAdd + + +@anon-func-300.5 (1,248 samples, 0.01%) + + + +@anon-func-173.5 (63,794 samples, 0.63%) + + + +@anon-func-435.5 (42,364 samples, 0.42%) + + + +@anon-func-300.5 (1,168 samples, 0.01%) + + + +rec (29,548 samples, 0.29%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-173.5 (357,842 samples, 3.53%) +@an.. + + +@anon-func-173.5 (1,068,084 samples, 10.53%) +@anon-func-173.5 + + +rec (1,513 samples, 0.01%) + + + +@anon-func-435.5 (70,258 samples, 0.69%) + + + +@anon-func-173.5 (65,026 samples, 0.64%) + + + +@anon-func-435.5 (129,538 samples, 1.28%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (9,892 samples, 0.10%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +log (4,448 samples, 0.04%) + + + +rec (16,892 samples, 0.17%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (30,642 samples, 0.30%) + + + +rec (24,642 samples, 0.24%) + + + +B_add (864 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (2,484 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-161.5 (6,605 samples, 0.07%) + + + +@anon-func-173.5 (29,772 samples, 0.29%) + + + +@anon-func-435.5 (107,698 samples, 1.06%) + + + +rec (1,644 samples, 0.02%) + + + +toListWithLength (3,791 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +scale (10,592 samples, 0.10%) + + + +@anon-func-173.5 (481,927 samples, 4.75%) +@anon.. + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (15,948 samples, 0.16%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (892 samples, 0.01%) + + + +@anon-func-173.5 (51,910 samples, 0.51%) + + + +@anon-func-435.5 (52,894 samples, 0.52%) + + + +@anon-func-229.5 (23,472 samples, 0.23%) + + + +polyMulTerm (216,644 samples, 2.14%) +p.. + + +@anon-func-173.5 (28,892 samples, 0.28%) + + + +elemAdd (26,960 samples, 0.27%) + + + +revAppend (24,232 samples, 0.24%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-435.5 (575,454 samples, 5.67%) +@anon-f.. + + +@anon-func-393.5 (16,768 samples, 0.17%) + + + +rec (1,000 samples, 0.01%) + + + +next (5,742 samples, 0.06%) + + + +@anon-func-453.5 (2,227 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +rec (17,642 samples, 0.17%) + + + +@anon-func-173.5 (1,780 samples, 0.02%) + + + +rec (1,654 samples, 0.02%) + + + +rec (13,392 samples, 0.13%) + + + +rec (1,592 samples, 0.02%) + + + +@anon-func-435.5 (99,118 samples, 0.98%) + + + +elemToBits (2,588 samples, 0.03%) + + + +rec (23,732 samples, 0.23%) + + + +@anon-func-173.5 (54,068 samples, 0.53%) + + + +rec (29,517 samples, 0.29%) + + + +@anon-func-173.5 (14,192 samples, 0.14%) + + + +rec (2,602 samples, 0.03%) + + + +@anon-func-173.5 (50,288 samples, 0.50%) + + + +@anon-func-161.5 (28,956 samples, 0.29%) + + + +@anon-func-435.5 (37,684 samples, 0.37%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (967,893 samples, 9.54%) +@anon-func-17.. + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (4,596 samples, 0.05%) + + + +rec (2,148 samples, 0.02%) + + + +@anon-func-173.5 (55,652 samples, 0.55%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +elemFromBits (1,593 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (2,154 samples, 0.02%) + + + +@anon-func-133.5 (3,022 samples, 0.03%) + + + +@anon-func-161.5 (24,486 samples, 0.24%) + + + +@anon-func-173.5 (182,030 samples, 1.79%) + + + +polyTrim (28,864 samples, 0.28%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (7,516 samples, 0.07%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +polyLen (1,063 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +rec (24,108 samples, 0.24%) + + + +rec (33,900 samples, 0.33%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +padLeftTo (1,178 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (1,072 samples, 0.01%) + + + +@anon-func-173.5 (49,270 samples, 0.49%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (2,017 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (35,450 samples, 0.35%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +B_div (1,216 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-173.5 (1,210,902 samples, 11.94%) +@anon-func-173.5 + + +rec (26,892 samples, 0.27%) + + + +@anon-func-435.5 (47,044 samples, 0.46%) + + + +timingHCoords (1,435 samples, 0.01%) + + + +rec (6,392 samples, 0.06%) + + + +rec (3,718 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (61,636 samples, 0.61%) + + + +rec (9,420 samples, 0.09%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-435.5 (108,478 samples, 1.07%) + + + +scale (10,592 samples, 0.10%) + + + +elemFromBits (1,914 samples, 0.02%) + + + +@anon-func-161.5 (4,721 samples, 0.05%) + + + +rec (7,244 samples, 0.07%) + + + +flatten (68,928 samples, 0.68%) + + + +rec (1,353 samples, 0.01%) + + + +rec (18,210 samples, 0.18%) + + + +@anon-func-173.5 (1,278,307 samples, 12.60%) +@anon-func-173.5 + + +@anon-func-173.5 (158,929 samples, 1.57%) + + + +@anon-func-173.5 (26,252 samples, 0.26%) + + + +rec (31,392 samples, 0.31%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-435.5 (51,724 samples, 0.51%) + + + +@anon-func-44.5 (3,520 samples, 0.03%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (1,925 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +rec (2,206 samples, 0.02%) + + + +@anon-func-173.5 (872,733 samples, 8.60%) +@anon-func-1.. + + +@anon-func-161.5 (2,837 samples, 0.03%) + + + +rec (4,301 samples, 0.04%) + + + +@anon-func-173.5 (266,114 samples, 2.62%) +@a.. + + +@anon-func-173.5 (107,618 samples, 1.06%) + + + +rec (3,436 samples, 0.03%) + + + +rec (4,142 samples, 0.04%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (5,204 samples, 0.05%) + + + +@anon-func-435.5 (51,334 samples, 0.51%) + + + +@anon-func-173.5 (34,218 samples, 0.34%) + + + +@anon-func-412.5 (5,842 samples, 0.06%) + + + +rec (4,017 samples, 0.04%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-435.5 (778,014 samples, 7.67%) +@anon-func.. + + +rec (1,514 samples, 0.01%) + + + +rec (42,801 samples, 0.42%) + + + +@anon-func-362.41 (1,114 samples, 0.01%) + + + +@anon-func-173.5 (1,143,497 samples, 11.27%) +@anon-func-173.5 + + +@anon-func-173.5 (35,000 samples, 0.35%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (4,653 samples, 0.05%) + + + +@anon-func-173.5 (1,111,777 samples, 10.96%) +@anon-func-173.5 + + +@anon-func-173.5 (1,306,062 samples, 12.87%) +@anon-func-173.5 + + +@anon-func-244.5 (47,822 samples, 0.47%) + + + +rec (1,654 samples, 0.02%) + + + +rec (1,602 samples, 0.02%) + + + +@anon-func-173.5 (51,734 samples, 0.51%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (43,240 samples, 0.43%) + + + +B_gt (972 samples, 0.01%) + + + +@anon-func-173.5 (1,394,436 samples, 13.75%) +@anon-func-173.5 + + +@anon-func-435.5 (99,898 samples, 0.98%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-435.5 (4,494 samples, 0.04%) + + + +rec (10,193 samples, 0.10%) + + + +rec (20,142 samples, 0.20%) + + + +@anon-func-173.5 (13,312 samples, 0.13%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (71,408 samples, 0.70%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (29,004 samples, 0.29%) + + + +@anon-func-173.5 (1,517,781 samples, 14.96%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (96,778 samples, 0.95%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (33,004 samples, 0.33%) + + + +@anon-func-173.5 (208,784 samples, 2.06%) +@.. + + +@anon-func-173.5 (47,288 samples, 0.47%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (4,452 samples, 0.04%) + + + +@anon-func-161.5 (15,026 samples, 0.15%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (5,346 samples, 0.05%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +rec (2,874 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,890 samples, 0.04%) + + + +rec (30,392 samples, 0.30%) + + + +rec (1,905 samples, 0.02%) + + + +@anon-func-494.5 (1,466 samples, 0.01%) + + + +@anon-func-173.5 (189,674 samples, 1.87%) +@.. + + +rec (1,767 samples, 0.02%) + + + +@anon-func-173.5 (44,648 samples, 0.44%) + + + +step (4,352 samples, 0.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (1,892 samples, 0.02%) + + + +@anon-func-173.5 (63,618 samples, 0.63%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (1,000 samples, 0.01%) + + + +polyAdd (657,876 samples, 6.49%) +polyAdd + + +rec (34,551 samples, 0.34%) + + + +@anon-func-173.5 (47,464 samples, 0.47%) + + + +natToBits (1,386 samples, 0.01%) + + + +rec (2,194 samples, 0.02%) + + + +rec (40,926 samples, 0.40%) + + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-173.5 (1,127,637 samples, 11.12%) +@anon-func-173.5 + + +@anon-func-161.5 (9,431 samples, 0.09%) + + + +@anon-func-435.5 (117,838 samples, 1.16%) + + + +@anon-func-173.5 (42,360 samples, 0.42%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (52,790 samples, 0.52%) + + + +polyLen (66,776 samples, 0.66%) + + + +@anon-func-173.5 (6,226 samples, 0.06%) + + + +rec (4,388 samples, 0.04%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-173.5 (18,592 samples, 0.18%) + + + +rec (2,196 samples, 0.02%) + + + +@anon-func-435.5 (92,878 samples, 0.92%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +natToBits (1,578 samples, 0.02%) + + + +rec (2,206 samples, 0.02%) + + + +go (27,872 samples, 0.27%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (14,142 samples, 0.14%) + + + +B_pow (912 samples, 0.01%) + + + +elemFromBits (1,914 samples, 0.02%) + + + +@anon-func-173.5 (65,906 samples, 0.65%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-173.5 (829,118 samples, 8.17%) +@anon-func-.. + + +@anon-func-173.5 (3,188 samples, 0.03%) + + + +rec (14,017 samples, 0.14%) + + + +rec (1,654 samples, 0.02%) + + + +rec (45,801 samples, 0.45%) + + + +next (1,230 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,890 samples, 0.04%) + + + +rec (970 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (34,954 samples, 0.34%) + + + +rec (2,736 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (24,892 samples, 0.25%) + + + +@anon-func-435.5 (8,784 samples, 0.09%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (243,182 samples, 2.40%) +@.. + + +@anon-func-173.5 (44,120 samples, 0.43%) + + + +obj_idx<0> (2,448 samples, 0.02%) + + + +@anon-func-173.5 (10,320 samples, 0.10%) + + + +@anon-func-435.5 (57,184 samples, 0.56%) + + + +rec (3,552 samples, 0.04%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (920,313 samples, 9.07%) +@anon-func-17.. + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-173.5 (315,800 samples, 3.11%) +@an.. + + +rec (13,228 samples, 0.13%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (25,020 samples, 0.25%) + + + +rec (1,142 samples, 0.01%) + + + +rec (37,164 samples, 0.37%) + + + +rec (17,017 samples, 0.17%) + + + +rec (26,642 samples, 0.26%) + + + +@anon-func-435.5 (144,358 samples, 1.42%) + + + +scale (10,592 samples, 0.10%) + + + +@anon-func-161.5 (2,366 samples, 0.02%) + + + +rec (19,484 samples, 0.19%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (642,974 samples, 6.34%) +@anon-fu.. + + +B_add (864 samples, 0.01%) + + + +rec (13,642 samples, 0.13%) + + + +@anon-func-173.5 (15,072 samples, 0.15%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (26,556 samples, 0.26%) + + + +@anon-func-435.5 (16,584 samples, 0.16%) + + + +natZipWith (25,392 samples, 0.25%) + + + +natToBytes (7,168 samples, 0.07%) + + + +formatHCoords (3,997 samples, 0.04%) + + + +@anon-func-300.5 (1,125 samples, 0.01%) + + + +@anon-func-435.5 (56,794 samples, 0.56%) + + + +rec (3,572 samples, 0.04%) + + + +@anon-func-173.5 (13,136 samples, 0.13%) + + + +@anon-func-362.41 (900 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-453.5 (4,494 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (247,004 samples, 2.43%) +@a.. + + +@anon-func-173.5 (880,663 samples, 8.68%) +@anon-func-1.. + + +rec (4,267 samples, 0.04%) + + + +elemDiv (11,056 samples, 0.11%) + + + +@anon-func-173.5 (45,176 samples, 0.45%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (30,828 samples, 0.30%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +rec (65,432 samples, 0.65%) + + + +@anon-func-173.5 (17,008 samples, 0.17%) + + + +rec (1,668 samples, 0.02%) + + + +rec (14,550 samples, 0.14%) + + + +@anon-func-244.5 (19,401 samples, 0.19%) + + + +rec (11,142 samples, 0.11%) + + + +natXor (25,552 samples, 0.25%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-435.5 (63,814 samples, 0.63%) + + + +@anon-func-173.5 (876,698 samples, 8.64%) +@anon-func-1.. + + +@anon-func-300.5 (890 samples, 0.01%) + + + +rec (20,028 samples, 0.20%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-173.5 (96,152 samples, 0.95%) + + + +rec (1,267 samples, 0.01%) + + + +@anon-func-161.5 (146,024 samples, 1.44%) + + + +natFromBits (1,347 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (24,774 samples, 0.24%) + + + +rec (1,072 samples, 0.01%) + + + +rec (1,392 samples, 0.01%) + + + +natXor (25,982 samples, 0.26%) + + + +rec (22,267 samples, 0.22%) + + + +rec (7,788 samples, 0.08%) + + + +@anon-func-173.5 (25,372 samples, 0.25%) + + + +rec (11,052 samples, 0.11%) + + + +@anon-func-300.5 (1,446 samples, 0.01%) + + + +@anon-func-435.5 (22,824 samples, 0.22%) + + + +@anon-func-173.5 (684,493 samples, 6.75%) +@anon-fun.. + + +@anon-func-173.5 (21,454 samples, 0.21%) + + + +@anon-func-173.5 (62,164 samples, 0.61%) + + + +rec (11,693 samples, 0.12%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (37,738 samples, 0.37%) + + + +B_pow (912 samples, 0.01%) + + + +encode (33,897 samples, 0.33%) + + + +@anon-func-435.5 (34,174 samples, 0.34%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +@anon-func-173.5 (43,944 samples, 0.43%) + + + +@anon-func-173.5 (57,236 samples, 0.56%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +canister_init (6,016 samples, 0.06%) + + + +@anon-func-173.5 (72,640 samples, 0.72%) + + + +natFromBits (1,253 samples, 0.01%) + + + +@anon-func-173.5 (67,138 samples, 0.66%) + + + +@anon-func-173.5 (680,671 samples, 6.71%) +@anon-fun.. + + +@anon-func-173.5 (24,140 samples, 0.24%) + + + +@anon-func-173.5 (558,367 samples, 5.50%) +@anon-f.. + + +B_add (864 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (5,058 samples, 0.05%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-481.5 (7,212 samples, 0.07%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (58,468 samples, 0.58%) + + + +@anon-func-481.5 (26,098 samples, 0.26%) + + + +@anon-func-435.5 (61,474 samples, 0.61%) + + + +compacting_gc (1,431 samples, 0.01%) + + + +@serialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (1,387 samples, 0.01%) + + + +@anon-func-173.5 (611,875 samples, 6.03%) +@anon-fu.. + + +natToBits (1,584 samples, 0.02%) + + + +@anon-func-173.5 (1,214,867 samples, 11.98%) +@anon-func-173.5 + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (1,624 samples, 0.02%) + + + +@anon-func-173.5 (1,329,852 samples, 13.11%) +@anon-func-173.5 + + +@anon-func-300.5 (1,002 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-435.5 (237,854 samples, 2.34%) +@.. + + +@anon-func-173.5 (715,629 samples, 7.05%) +@anon-fun.. + + +scale (10,592 samples, 0.10%) + + + +rec (41,676 samples, 0.41%) + + + +B_gt (972 samples, 0.01%) + + + +@anon-func-435.5 (124,858 samples, 1.23%) + + + +B_add (864 samples, 0.01%) + + + +polyLen (36,200 samples, 0.36%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-173.5 (42,888 samples, 0.42%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +scale (10,592 samples, 0.10%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-300.5 (1,027 samples, 0.01%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-173.5 (60,580 samples, 0.60%) + + + +@anon-func-173.5 (7,298 samples, 0.07%) + + + +@anon-func-173.5 (65,554 samples, 0.65%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-173.5 (27,836 samples, 0.27%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-161.5 (15,104 samples, 0.15%) + + + +@anon-func-481.5 (7,212 samples, 0.07%) + + + +@anon-func-435.5 (84,298 samples, 0.83%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (1,448 samples, 0.01%) + + + +rec (12,684 samples, 0.13%) + + + +@anon-func-173.5 (955,998 samples, 9.42%) +@anon-func-17.. + + +rec (10,842 samples, 0.11%) + + + +rec (2,212 samples, 0.02%) + + + +@anon-func-173.5 (727,407 samples, 7.17%) +@anon-fun.. + + +@anon-func-173.5 (31,532 samples, 0.31%) + + + +@anon-func-393.5 (2,884 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (1,254,517 samples, 12.37%) +@anon-func-173.5 + + +@anon-func-173.5 (661,561 samples, 6.52%) +@anon-fu.. + + +@anon-func-435.5 (47,434 samples, 0.47%) + + + +@anon-func-453.5 (2,247 samples, 0.02%) + + + +@anon-func-173.5 (773,921 samples, 7.63%) +@anon-func.. + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (42,754 samples, 0.42%) + + + +rec (16,267 samples, 0.16%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +patternCoords (166,906 samples, 1.65%) + + + +@anon-func-161.5 (2,765 samples, 0.03%) + + + +@anon-func-173.5 (29,596 samples, 0.29%) + + + +@anon-func-173.5 (805,328 samples, 7.94%) +@anon-func-.. + + +rec (28,517 samples, 0.28%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,298 samples, 0.03%) + + + +@anon-func-435.5 (134,218 samples, 1.32%) + + + +@anon-func-173.5 (273,758 samples, 2.70%) +@a.. + + +rec (12,956 samples, 0.13%) + + + +rec (1,925 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +elemToBits (2,582 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +revAppend (9,320 samples, 0.09%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (300,512 samples, 2.96%) +@a.. + + +@anon-func-435.5 (136,144 samples, 1.34%) + + + +@anon-func-265.5 (11,297 samples, 0.11%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (27,100 samples, 0.27%) + + + +rec (1,082 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (888 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +rec (15,132 samples, 0.15%) + + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-435.5 (112,378 samples, 1.11%) + + + +rec (2,738 samples, 0.03%) + + + +rec (1,786 samples, 0.02%) + + + +@anon-func-173.5 (1,011,508 samples, 9.97%) +@anon-func-173.5 + + +rec (1,644 samples, 0.02%) + + + +rec (5,051 samples, 0.05%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (50,854 samples, 0.50%) + + + +@anon-func-453.5 (4,464 samples, 0.04%) + + + +@anon-func-481.5 (30,822 samples, 0.30%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (14,267 samples, 0.14%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-435.5 (304,944 samples, 3.01%) +@an.. + + +revAppend (5,208 samples, 0.05%) + + + +@anon-func-161.5 (57,880 samples, 0.57%) + + + +@anon-func-435.5 (9,564 samples, 0.09%) + + + +@anon-func-435.5 (9,954 samples, 0.10%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,017 samples, 0.01%) + + + +step (2,288 samples, 0.02%) + + + +polyOrder (62,288 samples, 0.61%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (932 samples, 0.01%) + + + +@anon-func-173.5 (1,107,812 samples, 10.92%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (65,202 samples, 0.64%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-173.5 (10,496 samples, 0.10%) + + + +rec (1,909 samples, 0.02%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (657,739 samples, 6.48%) +@anon-fu.. + + +rec (10,780 samples, 0.11%) + + + +@anon-func-435.5 (57,574 samples, 0.57%) + + + +@anon-func-481.5 (9,589 samples, 0.09%) + + + +rec (4,252 samples, 0.04%) + + + +rec (33,356 samples, 0.33%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (2,212 samples, 0.02%) + + + +@anon-func-173.5 (44,296 samples, 0.44%) + + + +@anon-func-435.5 (542,124 samples, 5.34%) +@anon-.. + + +rec (2,206 samples, 0.02%) + + + +@anon-func-453.5 (2,227 samples, 0.02%) + + + +@anon-func-161.5 (3,779 samples, 0.04%) + + + +natFromBits (1,245 samples, 0.01%) + + + +@anon-func-300.5 (872 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +rec (2,744 samples, 0.03%) + + + +@anon-func-435.5 (111,598 samples, 1.10%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +elemFromBits (1,434 samples, 0.01%) + + + +rec (2,236 samples, 0.02%) + + + +rec (2,196 samples, 0.02%) + + + +@anon-func-173.5 (71,056 samples, 0.70%) + + + +B_pow (912 samples, 0.01%) + + + +rec (32,301 samples, 0.32%) + + + +@anon-func-362.41 (1,023 samples, 0.01%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +rec (2,642 samples, 0.03%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +toList (3,824 samples, 0.04%) + + + +@anon-func-173.5 (18,240 samples, 0.18%) + + + +rec (10,892 samples, 0.11%) + + + +@anon-func-173.5 (227,894 samples, 2.25%) +@.. + + +@anon-func-173.5 (46,408 samples, 0.46%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (29,884 samples, 0.29%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-435.5 (81,178 samples, 0.80%) + + + +@anon-func-481.5 (33,169 samples, 0.33%) + + + +rec (1,925 samples, 0.02%) + + + +@anon-func-173.5 (455,173 samples, 4.49%) +@anon.. + + +@anon-func-435.5 (163,858 samples, 1.62%) + + + +rec (7,678 samples, 0.08%) + + + +@anon-func-173.5 (1,374,247 samples, 13.55%) +@anon-func-173.5 + + +rec (23,292 samples, 0.23%) + + + +@anon-func-435.5 (21,654 samples, 0.21%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-481.5 (19,037 samples, 0.19%) + + + +rec (2,466 samples, 0.02%) + + + +@anon-func-481.5 (26,098 samples, 0.26%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (478,105 samples, 4.71%) +@anon.. + + +rec (2,909 samples, 0.03%) + + + +@anon-func-173.5 (963,928 samples, 9.50%) +@anon-func-17.. + + +traceCoords (5,836,027 samples, 57.53%) +traceCoords + + +@anon-func-173.5 (48,742 samples, 0.48%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-300.5 (1,728 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (1,337,782 samples, 13.19%) +@anon-func-173.5 + + +rec (1,517 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +forIn (2,705 samples, 0.03%) + + + +go (36,326 samples, 0.36%) + + + +natXor (25,552 samples, 0.25%) + + + +B_rem (1,152 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (11,728 samples, 0.12%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-161.5 (1,424 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +rec (12,628 samples, 0.12%) + + + +@anon-func-481.5 (28,455 samples, 0.28%) + + + +B_sub (1,120 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +natToBits (1,584 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (1,082 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (32,764 samples, 0.32%) + + + +@anon-func-435.5 (203,664 samples, 2.01%) +@.. + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-435.5 (67,918 samples, 0.67%) + + + +@anon-func-481.5 (4,865 samples, 0.05%) + + + +rec (14,193 samples, 0.14%) + + + +@anon-func-435.5 (744,254 samples, 7.34%) +@anon-func.. + + +B_add (1,107 samples, 0.01%) + + + +@anon-func-481.5 (37,843 samples, 0.37%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-265.5 (16,772 samples, 0.17%) + + + +rec (2,738 samples, 0.03%) + + + +@anon-func-481.5 (35,506 samples, 0.35%) + + + +@anon-func-362.41 (1,023 samples, 0.01%) + + + +rec (32,540 samples, 0.32%) + + + +@anon-func-173.5 (747,037 samples, 7.36%) +@anon-func.. + + +@anon-func-173.5 (346,376 samples, 3.41%) +@an.. + + +rec (4,442 samples, 0.04%) + + + +@anon-func-161.5 (95,656 samples, 0.94%) + + + +@anon-func-435.5 (115,498 samples, 1.14%) + + + +@anon-func-412.5 (1,425 samples, 0.01%) + + + +@anon-func-435.5 (127,978 samples, 1.26%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (18,668 samples, 0.18%) + + + +B_add (864 samples, 0.01%) + + + +rec (3,636 samples, 0.04%) + + + +@anon-func-435.5 (39,244 samples, 0.39%) + + + +rec (1,017 samples, 0.01%) + + + +@anon-func-173.5 (43,064 samples, 0.42%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-481.5 (14,313 samples, 0.14%) + + + +@anon-func-161.5 (7,531,903 samples, 74.25%) +@anon-func-161.5 + + +@anon-func-173.5 (24,316 samples, 0.24%) + + + +rec (27,916 samples, 0.28%) + + + +@anon-func-300.5 (1,168 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-161.5 (9,185 samples, 0.09%) + + + +padLeftTo (917 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-481.5 (33,370 samples, 0.33%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (154,498 samples, 1.52%) + + + +rec (1,892 samples, 0.02%) + + + +rec (2,726 samples, 0.03%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-393.5 (5,768 samples, 0.06%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (254,648 samples, 2.51%) +@a.. + + +natToBytes (7,168 samples, 0.07%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (1,469,771 samples, 14.49%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (419,176 samples, 4.13%) +@ano.. + + +B_rem (1,152 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +rec (3,642 samples, 0.04%) + + + +@anon-func-173.5 (1,461,841 samples, 14.41%) +@anon-func-173.5 + + +@anon-func-435.5 (71,818 samples, 0.71%) + + + +@anon-func-173.5 (131,278 samples, 1.29%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (28,186 samples, 0.28%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (99,974 samples, 0.99%) + + + +@anon-func-173.5 (458,995 samples, 4.52%) +@anon.. + + +B_add (864 samples, 0.01%) + + + +rec (17,267 samples, 0.17%) + + + +@anon-func-173.5 (1,290,202 samples, 12.72%) +@anon-func-173.5 + + +@anon-func-435.5 (811,774 samples, 8.00%) +@anon-func-.. + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (6,428 samples, 0.06%) + + + +rec (3,028 samples, 0.03%) + + + +@anon-func-435.5 (474,174 samples, 4.67%) +@anon.. + + +@anon-func-54.15 (7,533,467 samples, 74.26%) +@anon-func-54.15 + + +alloc_words (2,115 samples, 0.02%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (21,264 samples, 0.21%) + + + +@anon-func-173.5 (57,764 samples, 0.57%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-51.11 (10,052,893 samples, 99.10%) +@anon-func-51.11 + + +@anon-func-173.5 (739,185 samples, 7.29%) +@anon-func.. + + +natZipWith (25,392 samples, 0.25%) + + + +rec (1,925 samples, 0.02%) + + + +rec (28,142 samples, 0.28%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (102,384 samples, 1.01%) + + + +rec (9,267 samples, 0.09%) + + + +rec (5,204 samples, 0.05%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (1,082 samples, 0.01%) + + + +rec (1,062 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (39,801 samples, 0.39%) + + + +rec (3,552 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-453.5 (2,227 samples, 0.02%) + + + +rec (24,924 samples, 0.25%) + + + +rec (71,900 samples, 0.71%) + + + +encode (33,949 samples, 0.33%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +@anon-func-435.5 (100,678 samples, 0.99%) + + + +@anon-func-173.5 (3,716 samples, 0.04%) + + + +motoko_rts::idl::parse_fields::h7550309913b4db63 (2,633 samples, 0.03%) + + + +rec (3,392 samples, 0.03%) + + + +@anon-func-173.5 (546,901 samples, 5.39%) +@anon-.. + + +B_div (1,216 samples, 0.01%) + + + +rec (23,752 samples, 0.23%) + + + +@anon-func-173.5 (216,428 samples, 2.13%) +@.. + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (1,106 samples, 0.01%) + + + +rec (1,082 samples, 0.01%) + + + +rec (34,856 samples, 0.34%) + + + +@anon-func-173.5 (1,023,403 samples, 10.09%) +@anon-func-173.5 + + +rec (10,142 samples, 0.10%) + + + +@anon-func-173.5 (311,978 samples, 3.08%) +@an.. + + +@anon-func-393.5 (37,184 samples, 0.37%) + + + +natXor (25,552 samples, 0.25%) + + + +rec (31,996 samples, 0.32%) + + + +@anon-func-173.5 (292,868 samples, 2.89%) +@a.. + + +rec (970 samples, 0.01%) + + + +@anon-func-435.5 (156,058 samples, 1.54%) + + + +@anon-func-435.5 (372,894 samples, 3.68%) +@ano.. + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (170,564 samples, 1.68%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-173.5 (20,398 samples, 0.20%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-133.5 (71,936 samples, 0.71%) + + + +motoko_rts::memory::ic::linear_memory::_$LT$impl$u20$motoko_rts..memory..Memory$u20$for$u20$motoko_rts..memory..ic..IcMemory$GT$::grow_memory::hc224903332a6c43e (2,172 samples, 0.02%) + + + +@anon-func-161.5 (9,855 samples, 0.10%) + + + +@anon-func-173.5 (1,386,428 samples, 13.67%) +@anon-func-173.5 + + +@anon-func-435.5 (86,638 samples, 0.85%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +natFromBits (1,827 samples, 0.02%) + + + +rec (2,738 samples, 0.03%) + + + +@anon-func-400.13 (2,933 samples, 0.03%) + + + +@anon-func-435.5 (15,804 samples, 0.16%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (1,267 samples, 0.01%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +@anon-func-173.5 (711,742 samples, 7.02%) +@anon-fun.. + + +rec (1,082 samples, 0.01%) + + + +@anon-func-133.5 (4,817 samples, 0.05%) + + + +@anon-func-435.5 (55,234 samples, 0.54%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-435.5 (14,634 samples, 0.14%) + + + +@anon-func-173.5 (36,682 samples, 0.36%) + + + +rec (3,176 samples, 0.03%) + + + +elemMul (10,400 samples, 0.10%) + + + +rec (2,696 samples, 0.03%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (1,124 samples, 0.01%) + + + +@anon-func-79.3 (10,087,003 samples, 99.44%) +@anon-func-79.3 + + +rec (2,236 samples, 0.02%) + + + +@anon-func-423.5 (164,658 samples, 1.62%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-435.5 (85,078 samples, 0.84%) + + + +@anon-func-246.51 (9,410 samples, 0.09%) + + + +@anon-func-173.5 (1,378,316 samples, 13.59%) +@anon-func-173.5 + + +rec (5,884 samples, 0.06%) + + + +elemFromBits (1,434 samples, 0.01%) + + + +@anon-func-133.5 (4,817 samples, 0.05%) + + + +rec (1,106 samples, 0.01%) + + + +@anon-func-173.5 (995,648 samples, 9.81%) +@anon-func-173.5 + + +natZipWith (25,392 samples, 0.25%) + + + +rec (2,206 samples, 0.02%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-173.5 (28,012 samples, 0.28%) + + + +@anon-func-173.5 (37,210 samples, 0.37%) + + + +@anon-func-435.5 (64,594 samples, 0.64%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (14,016 samples, 0.14%) + + + +rec (16,764 samples, 0.17%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (27,892 samples, 0.27%) + + + +@anon-func-435.5 (55,624 samples, 0.55%) + + + +@anon-func-173.5 (39,192 samples, 0.39%) + + + +@anon-func-173.5 (21,278 samples, 0.21%) + + + +rec (2,892 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (30,476 samples, 0.30%) + + + +@anon-func-173.5 (766,277 samples, 7.55%) +@anon-func.. + + +@anon-func-173.5 (535,435 samples, 5.28%) +@anon-.. + + +revAppend (23,772 samples, 0.23%) + + + +@anon-func-161.5 (37,585 samples, 0.37%) + + + +@anon-func-481.5 (2,762 samples, 0.03%) + + + +@anon-func-173.5 (1,445,981 samples, 14.25%) +@anon-func-173.5 + + +@anon-func-435.5 (145,138 samples, 1.43%) + + + +rec (21,267 samples, 0.21%) + + + +polyScale (172,696 samples, 1.70%) + + + +$lambda (14,137 samples, 0.14%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +polyLen (36,200 samples, 0.36%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (65,764 samples, 0.65%) + + + +@anon-func-173.5 (68,416 samples, 0.67%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-161.5 (133,432 samples, 1.32%) + + + +elemFromBits (1,434 samples, 0.01%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +elemMul (1,742 samples, 0.02%) + + + +@anon-func-173.5 (1,238,657 samples, 12.21%) +@anon-func-173.5 + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (7,282 samples, 0.07%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (2,870 samples, 0.03%) + + + +@deserialize_go<v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)> (1,035 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +rec (2,716 samples, 0.03%) + + + +rec (34,176 samples, 0.34%) + + + +rec (2,267 samples, 0.02%) + + + +polyLen (28,900 samples, 0.28%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-265.5 (10,202 samples, 0.10%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (9,142 samples, 0.09%) + + + +@anon-func-435.5 (507,934 samples, 5.01%) +@anon-.. + + +rec (1,353 samples, 0.01%) + + + +@anon-func-173.5 (38,664 samples, 0.38%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-435.5 (25,164 samples, 0.25%) + + + +@anon-func-173.5 (60,052 samples, 0.59%) + + + +@anon-func-435.5 (62,644 samples, 0.62%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-73.5 (35,144 samples, 0.35%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (22,434 samples, 0.22%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (17,308 samples, 0.17%) + + + +@anon-func-161.5 (8,766 samples, 0.09%) + + + +@anon-func-435.5 (18,534 samples, 0.18%) + + + +rec (1,343 samples, 0.01%) + + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-173.5 (735,259 samples, 7.25%) +@anon-func.. + + +@anon-func-246.51 (15,056 samples, 0.15%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (4,402 samples, 0.04%) + + + +@anon-func-173.5 (1,453,911 samples, 14.33%) +@anon-func-173.5 + + +natFromBits (1,827 samples, 0.02%) + + + +rec (9,017 samples, 0.09%) + + + +rec (2,284 samples, 0.02%) + + + +rec (44,301 samples, 0.44%) + + + +@anon-func-435.5 (46,654 samples, 0.46%) + + + +@anon-func-435.5 (45,094 samples, 0.44%) + + + +@anon-func-173.5 (2,132 samples, 0.02%) + + + +rec (1,082 samples, 0.01%) + + + +rec (33,426 samples, 0.33%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-173.5 (69,648 samples, 0.69%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (507,934 samples, 5.01%) +@anon-.. + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-133.5 (14,621 samples, 0.14%) + + + +B_add (864 samples, 0.01%) + + + +rec (3,844 samples, 0.04%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-412.5 (19,536 samples, 0.19%) + + + +@anon-func-173.5 (41,128 samples, 0.41%) + + + +rec (1,654 samples, 0.02%) + + + +rec (4,978 samples, 0.05%) + + + +rec (12,628 samples, 0.12%) + + + +rec (2,174 samples, 0.02%) + + + +@anon-func-173.5 (32,588 samples, 0.32%) + + + +rec (15,710 samples, 0.15%) + + + +rec (4,432 samples, 0.04%) + + + +rec (7,142 samples, 0.07%) + + + +rec (21,142 samples, 0.21%) + + + +@anon-func-173.5 (3,540 samples, 0.03%) + + + +leb128_decode (1,439 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-244.5 (30,999 samples, 0.31%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-289.5 (27,670 samples, 0.27%) + + + +@anon-func-173.5 (983,753 samples, 9.70%) +@anon-func-173.5 + + +rec (1,392 samples, 0.01%) + + + +rec (1,072 samples, 0.01%) + + + +rec (1,373 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (20,222 samples, 0.20%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +rec (12,642 samples, 0.12%) + + + +@anon-func-133.5 (26,591 samples, 0.26%) + + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-173.5 (193,496 samples, 1.91%) +@.. + + +rec (18,392 samples, 0.18%) + + + +@anon-func-173.5 (49,974 samples, 0.49%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (31,884 samples, 0.31%) + + + +@anon-func-246.51 (5,397 samples, 0.05%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (5,170 samples, 0.05%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (40,072 samples, 0.40%) + + + +@anon-func-173.5 (23,214 samples, 0.23%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (43,768 samples, 0.43%) + + + +next (3,206 samples, 0.03%) + + + +rec (29,017 samples, 0.29%) + + + +rec (25,468 samples, 0.25%) + + + +rec (20,300 samples, 0.20%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-173.5 (49,622 samples, 0.49%) + + + +@anon-func-481.5 (61,644 samples, 0.61%) + + + +@anon-func-161.5 (24,815 samples, 0.24%) + + + +rec (1,592 samples, 0.02%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (1,035,558 samples, 10.21%) +@anon-func-173.5 + + +rec (23,892 samples, 0.24%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-161.5 (54,914 samples, 0.54%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,072 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +rec (21,892 samples, 0.22%) + + + +rec (970 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +toTarget (73,298 samples, 0.72%) + + + +@anon-func-173.5 (61,988 samples, 0.61%) + + + +@anon-func-173.5 (48,344 samples, 0.48%) + + + +@anon-func-173.5 (69,120 samples, 0.68%) + + + +@anon-func-435.5 (106,138 samples, 1.05%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-435.5 (56,404 samples, 0.56%) + + + +@anon-func-435.5 (15,414 samples, 0.15%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natToBits (1,590 samples, 0.02%) + + + +rec (1,072 samples, 0.01%) + + + +@anon-func-173.5 (399,884 samples, 3.94%) +@ano.. + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +log (4,448 samples, 0.04%) + + + +@anon-func-173.5 (41,832 samples, 0.41%) + + + +rec (22,017 samples, 0.22%) + + + +@anon-func-435.5 (20,874 samples, 0.21%) + + + +rec (17,852 samples, 0.18%) + + + +rec (11,596 samples, 0.11%) + + + +@anon-func-300.5 (879 samples, 0.01%) + + + +@anon-func-400.13 (2,933 samples, 0.03%) + + + +@anon-func-173.5 (60,932 samples, 0.60%) + + + +rec (4,388 samples, 0.04%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (6,054 samples, 0.06%) + + + +rec (3,860 samples, 0.04%) + + + +rec (1,020 samples, 0.01%) + + + +timingCoords (4,501 samples, 0.04%) + + + +rec (1,945 samples, 0.02%) + + + +rec (9,192 samples, 0.09%) + + + +rec (20,710 samples, 0.20%) + + + +rec (2,616,868 samples, 25.80%) +rec + + +@anon-func-173.5 (55,124 samples, 0.54%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (18,642 samples, 0.18%) + + + +scale (10,592 samples, 0.10%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +log (4,448 samples, 0.04%) + + + +@anon-func-300.5 (1,139 samples, 0.01%) + + + +@anon-func-362.41 (997 samples, 0.01%) + + + +rec (2,206 samples, 0.02%) + + + +rec (1,915 samples, 0.02%) + + + +@anon-func-435.5 (47,824 samples, 0.47%) + + + +B_add (864 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-229.5 (2,092 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (21,908 samples, 0.22%) + + + +@anon-func-173.5 (8,162 samples, 0.08%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (5,748 samples, 0.06%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (8,004 samples, 0.08%) + + + +rec (2,236 samples, 0.02%) + + + +padLeftTo (1,348 samples, 0.01%) + + + +rec (27,267 samples, 0.27%) + + + +@anon-func-173.5 (8,514 samples, 0.08%) + + + +rec (1,021 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (731,333 samples, 7.21%) +@anon-func.. + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (892 samples, 0.01%) + + + +rec (2,058 samples, 0.02%) + + + +@anon-func-173.5 (1,313,992 samples, 12.95%) +@anon-func-173.5 + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (539,257 samples, 5.32%) +@anon-.. + + +@anon-func-61.36 (74,639 samples, 0.74%) + + + +rec (1,915 samples, 0.02%) + + + +@anon-func-173.5 (585,121 samples, 5.77%) +@anon-f.. + + +@anon-func-300.5 (1,146 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (1,274,342 samples, 12.56%) +@anon-func-173.5 + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (15,776 samples, 0.16%) + + + +@anon-func-173.5 (38,090 samples, 0.38%) + + + +rec (38,676 samples, 0.38%) + + + +@anon-func-173.5 (28,364 samples, 0.28%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (3,552 samples, 0.04%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (16,304 samples, 0.16%) + + + +@anon-func-173.5 (1,317,957 samples, 12.99%) +@anon-func-173.5 + + +@anon-func-435.5 (27,114 samples, 0.27%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-173.5 (70,176 samples, 0.69%) + + + +rec (2,738 samples, 0.03%) + + + +@anon-func-173.5 (185,852 samples, 1.83%) +@.. + + +rec (1,977 samples, 0.02%) + + + +@anon-func-173.5 (18,768 samples, 0.19%) + + + +@anon-func-435.5 (127,198 samples, 1.25%) + + + +@anon-func-435.5 (440,414 samples, 4.34%) +@anon.. + + +@anon-func-481.5 (1,423 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-481.5 (4,865 samples, 0.05%) + + + +rec (1,142 samples, 0.01%) + + + +@anon-func-435.5 (125,638 samples, 1.24%) + + + +rec (1,000 samples, 0.01%) + + + +rec (30,092 samples, 0.30%) + + + +rec (31,017 samples, 0.31%) + + + +rec (20,892 samples, 0.21%) + + + +@anon-func-173.5 (3,012 samples, 0.03%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +rec (1,654 samples, 0.02%) + + + +elemAdd (27,390 samples, 0.27%) + + + +elemAdd (26,960 samples, 0.27%) + + + +scale (10,592 samples, 0.10%) + + + +rec (7,392 samples, 0.07%) + + + +@anon-func-173.5 (932,208 samples, 9.19%) +@anon-func-17.. + + +B_pow (912 samples, 0.01%) + + + +rec (13,193 samples, 0.13%) + + + +rec (5,426 samples, 0.05%) + + + +generate (7,533,431 samples, 74.26%) +generate + + +@anon-func-173.5 (34,746 samples, 0.34%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (102,384 samples, 1.01%) + + + +@anon-func-481.5 (33,169 samples, 0.33%) + + + +@anon-func-453.5 (4,504 samples, 0.04%) + + + +rec (3,572 samples, 0.04%) + + + +@anon-func-453.5 (2,247 samples, 0.02%) + + + +rec (1,242 samples, 0.01%) + + + +rec (16,608 samples, 0.16%) + + + +rec (17,580 samples, 0.17%) + + + +rec (12,517 samples, 0.12%) + + + +@anon-func-173.5 (431,786 samples, 4.26%) +@anon.. + + +@anon-func-161.5 (8,489 samples, 0.08%) + + + +@anon-func-161.5 (18,370 samples, 0.18%) + + + +rec (2,143 samples, 0.02%) + + + +toList (17,874 samples, 0.18%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-393.5 (5,768 samples, 0.06%) + + + +rec (21,017 samples, 0.21%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-435.5 (136,558 samples, 1.35%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,288 samples, 0.03%) + + + +@anon-func-481.5 (23,761 samples, 0.23%) + + + +rec (4,734 samples, 0.05%) + + + +parse (4,295 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-435.5 (169,904 samples, 1.67%) + + + +rec (2,206 samples, 0.02%) + + + +rec (21,335 samples, 0.21%) + + + +@anon-func-173.5 (16,128 samples, 0.16%) + + + +@anon-func-173.5 (38,822 samples, 0.38%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-161.5 (3,609 samples, 0.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (23,767 samples, 0.23%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (22,767 samples, 0.22%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (1,650 samples, 0.02%) + + + +B_add (10,152 samples, 0.10%) + + + +rec (1,925 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-393.5 (16,740 samples, 0.17%) + + + +rec (14,612 samples, 0.14%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (66,962 samples, 0.66%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (3,909 samples, 0.04%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (27,767 samples, 0.27%) + + + +rec (22,892 samples, 0.23%) + + + +@anon-func-173.5 (27,660 samples, 0.27%) + + + +@anon-func-173.5 (30,300 samples, 0.30%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (139,221 samples, 1.37%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-481.5 (19,037 samples, 0.19%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (1,172 samples, 0.01%) + + + +@anon-func-435.5 (142,798 samples, 1.41%) + + + +rec (37,176 samples, 0.37%) + + + +rec (38,301 samples, 0.38%) + + + +@anon-func-173.5 (825,153 samples, 8.13%) +@anon-func-.. + + +rec (1,072 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (615,697 samples, 6.07%) +@anon-fu.. + + +@anon-func-173.5 (304,334 samples, 3.00%) +@an.. + + +rec (1,363 samples, 0.01%) + + + +@anon-func-400.13 (5,866 samples, 0.06%) + + + +@anon-func-435.5 (54,064 samples, 0.53%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (1,392 samples, 0.01%) + + + +@anon-func-362.41 (1,309 samples, 0.01%) + + + +@anon-func-173.5 (41,304 samples, 0.41%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-229.5 (2,392 samples, 0.02%) + + + +rec (10,642 samples, 0.10%) + + + +@anon-func-481.5 (28,616 samples, 0.28%) + + + +@anon-func-435.5 (62,254 samples, 0.61%) + + + +rec (1,396 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (114,718 samples, 1.13%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,425 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,952 samples, 0.04%) + + + +@anon-func-435.5 (53,674 samples, 0.53%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-173.5 (33,468 samples, 0.33%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (1,363 samples, 0.01%) + + + +natToBytes (7,598 samples, 0.07%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (136,144 samples, 1.34%) + + + +@anon-func-173.5 (1,167,287 samples, 11.51%) +@anon-func-173.5 + + +@anon-func-73.5 (11,549 samples, 0.11%) + + + +@anon-func-173.5 (64,850 samples, 0.64%) + + + +@anon-func-435.5 (54,844 samples, 0.54%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (13,488 samples, 0.13%) + + + +@anon-func-173.5 (31,180 samples, 0.31%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (11,324 samples, 0.11%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (1,497,956 samples, 14.77%) +@anon-func-173.5 + + +rec (1,654 samples, 0.02%) + + + +rec (3,850 samples, 0.04%) + + + +@anon-func-173.5 (489,571 samples, 4.83%) +@anon-.. + + +@anon-func-173.5 (1,521,746 samples, 15.00%) +@anon-func-173.5 + + +rec (3,844 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (31,724 samples, 0.31%) + + + +rec (8,454 samples, 0.08%) + + + +rec (5,801 samples, 0.06%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (27,372 samples, 0.27%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (305,374 samples, 3.01%) +@an.. + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (154,951 samples, 1.53%) + + + +@anon-func-173.5 (48,918 samples, 0.48%) + + + +__wasm_apply_data_relocs (981 samples, 0.01%) + + + +alog (1,568 samples, 0.02%) + + + +rec (1,267 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (1,082 samples, 0.01%) + + + +@anon-func-435.5 (40,414 samples, 0.40%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (15,272 samples, 0.15%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (848,943 samples, 8.37%) +@anon-func-.. + + +@anon-func-173.5 (14,720 samples, 0.15%) + + + +rec (2,034 samples, 0.02%) + + + +rec (25,517 samples, 0.25%) + + + +@anon-func-173.5 (61,754 samples, 0.61%) + + + +@anon-func-362.41 (1,036 samples, 0.01%) + + + +@anon-func-173.5 (21,630 samples, 0.21%) + + + +natZipWith (25,822 samples, 0.25%) + + + +@anon-func-173.5 (1,302,097 samples, 12.84%) +@anon-func-173.5 + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (52,614 samples, 0.52%) + + + +rec (2,206 samples, 0.02%) + + + +natToBits (1,392 samples, 0.01%) + + + +@anon-func-173.5 (916,348 samples, 9.03%) +@anon-func-17.. + + +rec (2,236 samples, 0.02%) + + + +rec (1,634 samples, 0.02%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (1,282,272 samples, 12.64%) +@anon-func-173.5 + + +rec (2,484 samples, 0.02%) + + + +rec (11,868 samples, 0.12%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (143,212 samples, 1.41%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-481.5 (2,488 samples, 0.02%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (60,756 samples, 0.60%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (56,532 samples, 0.56%) + + + +rec (4,422 samples, 0.04%) + + + +@anon-func-173.5 (25,900 samples, 0.26%) + + + +B_add (864 samples, 0.01%) + + + +rec (11,767 samples, 0.12%) + + + +B_sub (1,120 samples, 0.01%) + + + +rec (18,517 samples, 0.18%) + + + +rec (35,804 samples, 0.35%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,767 samples, 0.02%) + + + +rec (1,945 samples, 0.02%) + + + +rec (10,767 samples, 0.11%) + + + +@anon-func-435.5 (97,558 samples, 0.96%) + + + +@anon-func-173.5 (888,593 samples, 8.76%) +@anon-func-1.. + + +rec (1,072 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +elemMul (10,400 samples, 0.10%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (7,267 samples, 0.07%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-173.5 (43,592 samples, 0.43%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-300.5 (4,437 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (10,842 samples, 0.11%) + + + +@anon-func-173.5 (17,712 samples, 0.17%) + + + +B_add (864 samples, 0.01%) + + + +rec (1,654 samples, 0.02%) + + + +errorPoly (5,395 samples, 0.05%) + + + +@anon-func-161.5 (46,526 samples, 0.46%) + + + +rec (1,082 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (13,364 samples, 0.13%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (148,258 samples, 1.46%) + + + +revAppend (27,112 samples, 0.27%) + + + +@anon-func-362.41 (1,036 samples, 0.01%) + + + +rec (9,192 samples, 0.09%) + + + +rec (8,272 samples, 0.08%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +@anon-func-173.5 (53,892 samples, 0.53%) + + + +rec (1,378 samples, 0.01%) + + + +@anon-func-173.5 (642,451 samples, 6.33%) +@anon-fu.. + + +rec (2,756 samples, 0.03%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (46,584 samples, 0.46%) + + + +go (3,476 samples, 0.03%) + + + +@anon-func-173.5 (1,151,427 samples, 11.35%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-481.5 (5,410 samples, 0.05%) + + + +rec (892 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-435.5 (33,784 samples, 0.33%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (1,659 samples, 0.02%) + + + +@anon-func-300.5 (1,446 samples, 0.01%) + + + +@anon-func-173.5 (512,503 samples, 5.05%) +@anon-.. + + +rec (20,572 samples, 0.20%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (2,330 samples, 0.02%) + + + +elemMul (1,876 samples, 0.02%) + + + +@anon-func-173.5 (1,064,041 samples, 10.49%) +@anon-func-173.5 + + +rec (2,194 samples, 0.02%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (50,164 samples, 0.49%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (1,106 samples, 0.01%) + + + +@anon-func-173.5 (32,940 samples, 0.32%) + + + +rec (1,940 samples, 0.02%) + + + +@anon-func-173.5 (26,604 samples, 0.26%) + + + +rec (2,212 samples, 0.02%) + + + +@anon-func-173.5 (39,896 samples, 0.39%) + + + +@anon-func-173.5 (72,112 samples, 0.71%) + + + +rec (3,552 samples, 0.04%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-481.5 (47,542 samples, 0.47%) + + + +rec (2,142 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-173.5 (39,720 samples, 0.39%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (36,330 samples, 0.36%) + + + +@anon-func-173.5 (24,566 samples, 0.24%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (1,017 samples, 0.01%) + + + +rec (29,392 samples, 0.29%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (1,258,482 samples, 12.41%) +@anon-func-173.5 + + +@anon-func-173.5 (1,345,790 samples, 13.27%) +@anon-func-173.5 + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +@anon-func-173.5 (634,807 samples, 6.26%) +@anon-fu.. + + +rec (14,550 samples, 0.14%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (65,378 samples, 0.64%) + + + +rec (1,072 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +B_rem (2,880 samples, 0.03%) + + + +@anon-func-300.5 (1,125 samples, 0.01%) + + + +rec (2,216 samples, 0.02%) + + + +@anon-func-161.5 (876 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +alloc_words (2,538 samples, 0.03%) + + + +@anon-func-173.5 (373,130 samples, 3.68%) +@ano.. + + +padLeftTo (2,210 samples, 0.02%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-173.5 (1,485,631 samples, 14.65%) +@anon-func-173.5 + + +rec (30,636 samples, 0.30%) + + + +rec (30,767 samples, 0.30%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-265.5 (3,632 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (2,134 samples, 0.02%) + + + +@anon-func-173.5 (18,944 samples, 0.19%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (8,866 samples, 0.09%) + + + +elemFromBits (1,336 samples, 0.01%) + + + +@anon-func-289.5 (24,063 samples, 0.24%) + + + +@anon-func-173.5 (70,528 samples, 0.70%) + + + +@anon-func-173.5 (16,480 samples, 0.16%) + + + +@anon-func-229.5 (3,472 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (67,712 samples, 0.67%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +natToBytes (7,168 samples, 0.07%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (18,064 samples, 0.18%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (24,517 samples, 0.24%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-173.5 (1,325,887 samples, 13.07%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,514 samples, 0.01%) + + + +@anon-func-173.5 (11,552 samples, 0.11%) + + + +@anon-func-362.41 (997 samples, 0.01%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +rec (23,017 samples, 0.23%) + + + +rec (6,156 samples, 0.06%) + + + +@anon-func-173.5 (7,986 samples, 0.08%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (46,056 samples, 0.45%) + + + +@anon-func-173.5 (43,416 samples, 0.43%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-173.5 (308,156 samples, 3.04%) +@an.. + + +memcpy (3,080 samples, 0.03%) + + + +@anon-func-173.5 (447,529 samples, 4.41%) +@anon.. + + +@anon-func-435.5 (35,734 samples, 0.35%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-173.5 (1,604 samples, 0.02%) + + + +natXor (25,552 samples, 0.25%) + + + +rec (21,388 samples, 0.21%) + + + +@anon-func-435.5 (48,214 samples, 0.48%) + + + +obj_idx<0> (2,754 samples, 0.03%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +B_rem (1,152 samples, 0.01%) + + + +finderBLCoords (16,657 samples, 0.16%) + + + +rec (888 samples, 0.01%) + + + +rec (5,748 samples, 0.06%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (36,348 samples, 0.36%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (72,598 samples, 0.72%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (13,267 samples, 0.13%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-133.5 (2,616,886 samples, 25.80%) +@anon-func-133.5 + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (262,292 samples, 2.59%) +@a.. + + +rec (2,272 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +polyPadRight (21,984 samples, 0.22%) + + + +@anon-func-173.5 (1,402,366 samples, 13.82%) +@anon-func-173.5 + + +rec (970 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (27,017 samples, 0.27%) + + + +@anon-func-173.5 (39,016 samples, 0.38%) + + + +@anon-func-435.5 (69,478 samples, 0.68%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (17,392 samples, 0.17%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-435.5 (110,038 samples, 1.08%) + + + +rec (3,517 samples, 0.03%) + + + +rec (17,585 samples, 0.17%) + + + +rec (4,432 samples, 0.04%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (5,640 samples, 0.06%) + + + +rec (7,678 samples, 0.08%) + + + +@anon-func-435.5 (11,124 samples, 0.11%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (68,944 samples, 0.68%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-173.5 (1,099,882 samples, 10.84%) +@anon-func-173.5 + + +rec (1,642 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +elemToBits (2,576 samples, 0.03%) + + + +@anon-func-173.5 (40,248 samples, 0.40%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (14,244 samples, 0.14%) + + + +@anon-func-362.41 (1,166 samples, 0.01%) + + + +rec (3,159 samples, 0.03%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +rec (13,142 samples, 0.13%) + + + +@anon-func-173.5 (35,098 samples, 0.35%) + + + +rec (1,082 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,019,438 samples, 10.05%) +@anon-func-173.5 + + +@anon-func-435.5 (2,544 samples, 0.03%) + + + +@anon-func-481.5 (2,488 samples, 0.02%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-173.5 (762,455 samples, 7.52%) +@anon-func.. + + +@anon-func-300.5 (879 samples, 0.01%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +rec (37,926 samples, 0.37%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (36,124 samples, 0.36%) + + + +@anon-func-173.5 (64,322 samples, 0.63%) + + + +@anon-func-173.5 (44,472 samples, 0.44%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-173.5 (45,704 samples, 0.45%) + + + +@anon-func-62.5 (1,326 samples, 0.01%) + + + +polyDivMod (2,066,495 samples, 20.37%) +polyDivMod + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (17,142 samples, 0.17%) + + + +@anon-func-435.5 (152,158 samples, 1.50%) + + + +encode (10,096,967 samples, 99.53%) +encode + + +rec (1,082 samples, 0.01%) + + + +rec (24,392 samples, 0.24%) + + + +rec (2,716 samples, 0.03%) + + + +parse (4,417 samples, 0.04%) + + + +rec (23,210 samples, 0.23%) + + + +scale (2,190 samples, 0.02%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (21,392 samples, 0.21%) + + + +@anon-func-173.5 (32,060 samples, 0.32%) + + + +rec (2,726 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (147,034 samples, 1.45%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (54,110 samples, 0.53%) + + + +rec (1,343 samples, 0.01%) + + + +@anon-func-133.5 (1,739 samples, 0.02%) + + + +@anon-func-173.5 (1,956 samples, 0.02%) + + + +@anon-func-453.5 (4,514 samples, 0.04%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (44,824 samples, 0.44%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +scale (1,460 samples, 0.01%) + + + +rec (29,142 samples, 0.29%) + + + +rec (2,148 samples, 0.02%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (704,033 samples, 6.94%) +@anon-fun.. + + +rec (4,660 samples, 0.05%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (3,572 samples, 0.04%) + + + +rec (11,642 samples, 0.11%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (21,806 samples, 0.21%) + + + +@anon-func-173.5 (1,059,972 samples, 10.45%) +@anon-func-173.5 + + +@anon-func-435.5 (406,654 samples, 4.01%) +@ano.. + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +rec (6,926 samples, 0.07%) + + + +@anon-func-173.5 (22,510 samples, 0.22%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (4,653 samples, 0.05%) + + + +@anon-func-173.5 (11,200 samples, 0.11%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (22,862 samples, 0.23%) + + + +@anon-func-435.5 (68,624 samples, 0.68%) + + + +@anon-func-435.5 (19,704 samples, 0.19%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (2,773 samples, 0.03%) + + + +rec (2,392 samples, 0.02%) + + + +padLeftTo (1,008 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-300.5 (1,168 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (10,017 samples, 0.10%) + + + +@anon-func-173.5 (16,832 samples, 0.17%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +polyOrder (1,395 samples, 0.01%) + + + +@anon-func-99.14 (4,592 samples, 0.05%) + + + +rec (45,051 samples, 0.44%) + + + +rec (1,082 samples, 0.01%) + + + +rec (11,517 samples, 0.11%) + + + +rec (16,335 samples, 0.16%) + + + +@anon-func-289.5 (2,646,203 samples, 26.09%) +@anon-func-289.5 + + +rec (25,392 samples, 0.25%) + + + +scale (10,592 samples, 0.10%) + + + +natFromBits (1,249 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +polyLeadCoeff (31,840 samples, 0.31%) + + + +@anon-func-435.5 (122,518 samples, 1.21%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (1,353,902 samples, 13.35%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (7,634 samples, 0.08%) + + + +rec (1,062 samples, 0.01%) + + + +elemMul (10,400 samples, 0.10%) + + + +rec (1,925 samples, 0.02%) + + + +rec (3,552 samples, 0.04%) + + + +rec (1,922 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +elemMul (10,400 samples, 0.10%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (25,267 samples, 0.25%) + + + +rec (3,298 samples, 0.03%) + + + +natToBits (1,200 samples, 0.01%) + + + +@anon-func-173.5 (36,858 samples, 0.36%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-435.5 (119,398 samples, 1.18%) + + + +elemToBits (2,632 samples, 0.03%) + + + +rec (6,300 samples, 0.06%) + + + +@anon-func-481.5 (23,902 samples, 0.24%) + + + +rec (18,267 samples, 0.18%) + + + +@anon-func-173.5 (1,489,596 samples, 14.68%) +@anon-func-173.5 + + +@anon-func-173.5 (695,959 samples, 6.86%) +@anon-fun.. + + +rec (11,017 samples, 0.11%) + + + +@anon-func-265.5 (8,012 samples, 0.08%) + + + +@anon-func-173.5 (41,656 samples, 0.41%) + + + +@anon-func-173.5 (1,505,886 samples, 14.84%) +@anon-func-173.5 + + +@anon-func-173.5 (47,816 samples, 0.47%) + + + +rec (1,644 samples, 0.02%) + + + +rec (1,786 samples, 0.02%) + + + +rec (14,550 samples, 0.14%) + + + +rec (2,736 samples, 0.03%) + + + +rec (14,272 samples, 0.14%) + + + +@anon-func-173.5 (723,481 samples, 7.13%) +@anon-fun.. + + +@anon-func-173.5 (1,349,833 samples, 13.31%) +@anon-func-173.5 + + +@deserialize<v(Version:N)v(H:u,L:u,M:u,Q:u)v(Alphanumeric:u,EightBit:u,Kanji:u,Numeric:u)t> (8,066 samples, 0.08%) + + + +@anon-func-173.5 (904,453 samples, 8.92%) +@anon-func-1.. + + +rec (4,663 samples, 0.05%) + + + +rec (1,945 samples, 0.02%) + + + +rec (2,154 samples, 0.02%) + + + +rec (26,517 samples, 0.26%) + + + +@anon-func-435.5 (58,744 samples, 0.58%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-62.5 (11,934 samples, 0.12%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (22,392 samples, 0.22%) + + + +@anon-func-173.5 (20,926 samples, 0.21%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-393.5 (2,884 samples, 0.03%) + + + +polyNew (5,504 samples, 0.05%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (50,150 samples, 0.49%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (7,892 samples, 0.08%) + + + +polyTrim (32,402 samples, 0.32%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (14,860 samples, 0.15%) + + + +@anon-func-173.5 (47,640 samples, 0.47%) + + + +@anon-func-435.5 (37,294 samples, 0.37%) + + + +@anon-func-173.5 (71,584 samples, 0.71%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (15,517 samples, 0.15%) + + + +@anon-func-173.5 (12,080 samples, 0.12%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (70,880 samples, 0.70%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-44.5 (1,430 samples, 0.01%) + + + +@anon-func-173.5 (49,446 samples, 0.49%) + + + +@anon-func-173.5 (550,723 samples, 5.43%) +@anon-f.. + + +@anon-func-173.5 (56,180 samples, 0.55%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (43,926 samples, 0.43%) + + + +rec (1,935 samples, 0.02%) + + + +rec (7,767 samples, 0.08%) + + + +@anon-func-173.5 (1,226,762 samples, 12.09%) +@anon-func-173.5 + + +@anon-func-173.5 (57,412 samples, 0.57%) + + + +polyNew (2,894 samples, 0.03%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (777,743 samples, 7.67%) +@anon-func.. + + +rec (9,971 samples, 0.10%) + + + +@anon-func-161.5 (18,018 samples, 0.18%) + + + +@anon-func-173.5 (443,642 samples, 4.37%) +@anon.. + + +rec (22,748 samples, 0.22%) + + + +rec (30,267 samples, 0.30%) + + + +@anon-func-435.5 (160,738 samples, 1.58%) + + + +rec (20,642 samples, 0.20%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (17,184 samples, 0.17%) + + + +B_add (1,107 samples, 0.01%) + + + +rec (1,020 samples, 0.01%) + + + +timingHCoords (1,435 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (30,652 samples, 0.30%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +elemFromBits (1,914 samples, 0.02%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +rec (2,330 samples, 0.02%) + + + +rec (2,194 samples, 0.02%) + + + +@anon-func-300.5 (1,125 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-38.11 (2,253,371 samples, 22.21%) +@anon-func-38.11 + + +@anon-func-481.5 (19,168 samples, 0.19%) + + + +@anon-func-435.5 (40,024 samples, 0.39%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,517 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,392 samples, 0.01%) + + + +rec (29,276 samples, 0.29%) + + + +link_start (1,079 samples, 0.01%) + + + +@anon-func-453.5 (2,372 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-173.5 (20,046 samples, 0.20%) + + + +rec (1,592 samples, 0.02%) + + + +rec (34,988 samples, 0.34%) + + + +@anon-func-173.5 (1,131,602 samples, 11.16%) +@anon-func-173.5 + + +log (4,448 samples, 0.04%) + + + +rec (7,017 samples, 0.07%) + + + +rec (5,058 samples, 0.05%) + + + +@anon-func-173.5 (123,504 samples, 1.22%) + + + +step (5,894 samples, 0.06%) + + + +rec (23,020 samples, 0.23%) + + + +@anon-func-173.5 (224,072 samples, 2.21%) +@.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (26,724 samples, 0.26%) + + + +@anon-func-453.5 (4,494 samples, 0.04%) + + + +scale (2,044 samples, 0.02%) + + + +rec (2,206 samples, 0.02%) + + + +natZipWith (25,822 samples, 0.25%) + + + +@anon-func-173.5 (15,600 samples, 0.15%) + + + +@anon-func-173.5 (62,868 samples, 0.62%) + + + +@anon-func-173.5 (4,772 samples, 0.05%) + + + +@anon-func-173.5 (592,765 samples, 5.84%) +@anon-f.. + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (5,392 samples, 0.05%) + + + +@anon-func-435.5 (609,214 samples, 6.01%) +@anon-fu.. + + +rec (2,196 samples, 0.02%) + + + +@anon-func-173.5 (900 samples, 0.01%) + + + +@anon-func-173.5 (68,592 samples, 0.68%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,300 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (36,506 samples, 0.36%) + + + +@anon-func-435.5 (13,074 samples, 0.13%) + + + +rec (36,051 samples, 0.36%) + + + +@anon-func-173.5 (10,672 samples, 0.11%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-44.5 (3,520 samples, 0.03%) + + + +@anon-func-300.5 (1,248 samples, 0.01%) + + + +@anon-func-435.5 (13,464 samples, 0.13%) + + + +@anon-func-173.5 (55,476 samples, 0.55%) + + + +rec (1,030 samples, 0.01%) + + + +@anon-func-289.5 (22,239 samples, 0.22%) + + + +@anon-func-435.5 (124,078 samples, 1.22%) + + + +log (4,448 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (5,267 samples, 0.05%) + + + +rec (19,460 samples, 0.19%) + + + +rec (43,176 samples, 0.43%) + + + +rec (6,892 samples, 0.07%) + + + +B_add (864 samples, 0.01%) + + + +rec (3,980 samples, 0.04%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (78,838 samples, 0.78%) + + + +rec (20,767 samples, 0.20%) + + + +@anon-func-173.5 (21,452 samples, 0.21%) + + + +@anon-func-435.5 (88,198 samples, 0.87%) + + + +rec (2,517 samples, 0.02%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (2,660 samples, 0.03%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (4,660 samples, 0.05%) + + + +@anon-func-435.5 (156,838 samples, 1.55%) + + + +Array_tabulate (2,186 samples, 0.02%) + + + +rec (1,450 samples, 0.01%) + + + +@anon-func-435.5 (372,894 samples, 3.68%) +@ano.. + + +rec (4,033 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (13,380 samples, 0.13%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (42,008 samples, 0.41%) + + + +polyPadLeft (39,160 samples, 0.39%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-133.5 (941 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-435.5 (117,058 samples, 1.15%) + + + +rec (29,820 samples, 0.29%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (104,578 samples, 1.03%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +scale (10,592 samples, 0.10%) + + + +rec (16,392 samples, 0.16%) + + + +@anon-func-161.5 (19,850 samples, 0.20%) + + + +rec (1,198 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (15,424 samples, 0.15%) + + + +@anon-func-435.5 (78,058 samples, 0.77%) + + + +@anon-func-412.5 (5,842 samples, 0.06%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +rec (22,142 samples, 0.22%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-289.5 (95,896 samples, 0.95%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (2,466 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (1,072 samples, 0.01%) + + + +@anon-func-173.5 (1,398,401 samples, 13.79%) +@anon-func-173.5 + + +@anon-func-435.5 (101,458 samples, 1.00%) + + + +@anon-func-173.5 (908,418 samples, 8.95%) +@anon-func-1.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (212,606 samples, 2.10%) +@.. + + +rec (1,142 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (9,193 samples, 0.09%) + + + +@anon-func-435.5 (16,194 samples, 0.16%) + + + +@anon-func-435.5 (64,984 samples, 0.64%) + + + +B_add (864 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-435.5 (26,334 samples, 0.26%) + + + +polyTrim (3,538 samples, 0.03%) + + + +rec (1,242 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +natFromBits (1,347 samples, 0.01%) + + + +rec (1,082 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (19,017 samples, 0.19%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (47,301 samples, 0.47%) + + + +rec (18,142 samples, 0.18%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (29,767 samples, 0.29%) + + + +rec (4,659 samples, 0.05%) + + + +@anon-func-173.5 (1,481,666 samples, 14.61%) +@anon-func-173.5 + + +forIn (12,579 samples, 0.12%) + + + +B_add (864 samples, 0.01%) + + + +rec (19,142 samples, 0.19%) + + + +@anon-func-173.5 (16,656 samples, 0.16%) + + + +@anon-func-173.5 (55,300 samples, 0.55%) + + + +rec (1,082 samples, 0.01%) + + + +@anon-func-44.5 (2,255 samples, 0.02%) + + + +@anon-func-435.5 (6,444 samples, 0.06%) + + + +rec (2,602 samples, 0.03%) + + + +@anon-func-404.5 (1,430 samples, 0.01%) + + + +@anon-func-173.5 (665,383 samples, 6.56%) +@anon-fu.. + + +rec (9,693 samples, 0.10%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (8,193 samples, 0.08%) + + + +@anon-func-161.5 (9,902 samples, 0.10%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-173.5 (1,039,627 samples, 10.25%) +@anon-func-173.5 + + +rec (1,267 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-435.5 (163,078 samples, 1.61%) + + + +rec (2,409 samples, 0.02%) + + + +rec (5,476 samples, 0.05%) + + + +@anon-func-161.5 (7,676 samples, 0.08%) + + + +@anon-func-412.5 (2,921 samples, 0.03%) + + + +@anon-func-435.5 (146,698 samples, 1.45%) + + + +@anon-func-435.5 (80,398 samples, 0.79%) + + + +@anon-func-173.5 (527,791 samples, 5.20%) +@anon-.. + + +rec (2,206 samples, 0.02%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +rec (6,267 samples, 0.06%) + + + +@anon-func-173.5 (692,137 samples, 6.82%) +@anon-fun.. + + +rec (16,608 samples, 0.16%) + + + +rec (9,692 samples, 0.10%) + + + +rec (32,812 samples, 0.32%) + + + +rec (1,945 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (5,340 samples, 0.05%) + + + +@anon-func-300.5 (1,259 samples, 0.01%) + + + +alog (1,568 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (673,027 samples, 6.63%) +@anon-fun.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (135,778 samples, 1.34%) + + + +@anon-func-173.5 (30,124 samples, 0.30%) + + + +@anon-func-133.5 (4,761 samples, 0.05%) + + + +rec (2,756 samples, 0.03%) + + + +@anon-func-173.5 (793,433 samples, 7.82%) +@anon-func-.. + + +@anon-func-173.5 (1,043,696 samples, 10.29%) +@anon-func-173.5 + + +natFromBits (1,347 samples, 0.01%) + + + +rec (1,335 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,525,711 samples, 15.04%) +@anon-func-173.5 + + +@anon-func-173.5 (1,477,701 samples, 14.57%) +@anon-func-173.5 + + +rec (3,552 samples, 0.04%) + + + +rec (2,196 samples, 0.02%) + + + +rec (4,462 samples, 0.04%) + + + +rec (3,142 samples, 0.03%) + + + +@anon-func-435.5 (103,018 samples, 1.02%) + + + +rec (5,159 samples, 0.05%) + + + +@anon-func-265.5 (14,582 samples, 0.14%) + + + +@anon-func-412.5 (17,360 samples, 0.17%) + + + +@anon-func-300.5 (890 samples, 0.01%) + + + +@anon-func-300.5 (1,002 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (813,258 samples, 8.02%) +@anon-func-.. + + +rec (34,926 samples, 0.34%) + + + +B_add (1,107 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (1,294,167 samples, 12.76%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (676,849 samples, 6.67%) +@anon-fun.. + + +rec (15,392 samples, 0.15%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (54,772 samples, 0.54%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,708 samples, 0.04%) + + + +@anon-func-435.5 (71,038 samples, 0.70%) + + + +rec (2,602 samples, 0.03%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-244.5 (167,904 samples, 1.66%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natToBits (15,750 samples, 0.16%) + + + +rec (28,267 samples, 0.28%) + + + +@anon-func-173.5 (45,528 samples, 0.45%) + + + +rec (8,017 samples, 0.08%) + + + +@anon-func-246.51 (2,624,315 samples, 25.87%) +@anon-func-246.51 + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-173.5 (754,811 samples, 7.44%) +@anon-func.. + + +rec (46,176 samples, 0.46%) + + + +rec (15,267 samples, 0.15%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,106 samples, 0.01%) + + + +@anon-func-435.5 (52,504 samples, 0.52%) + + + +@anon-func-133.5 (23,770 samples, 0.23%) + + + +@anon-func-173.5 (24,844 samples, 0.24%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (25,352 samples, 0.25%) + + + +rec (1,010 samples, 0.01%) + + + +rec (17,517 samples, 0.17%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (892 samples, 0.01%) + + + +@anon-func-435.5 (138,118 samples, 1.36%) + + + +@anon-func-265.5 (9,107 samples, 0.09%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (9,192 samples, 0.09%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-44.5 (3,520 samples, 0.03%) + + + +@anon-func-173.5 (1,246,587 samples, 12.29%) +@anon-func-173.5 + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +@anon-func-173.5 (707,855 samples, 6.98%) +@anon-fun.. + + +rec (1,010 samples, 0.01%) + + + +@anon-func-481.5 (6,692 samples, 0.07%) + + + +@anon-func-161.5 (158,616 samples, 1.56%) + + + +B_rem (1,152 samples, 0.01%) + + + +alog (1,078 samples, 0.01%) + + + +@anon-func-173.5 (29,420 samples, 0.29%) + + + +@anon-func-173.5 (51,558 samples, 0.51%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (770,099 samples, 7.59%) +@anon-func.. + + +rec (2,874 samples, 0.03%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (411,350 samples, 4.05%) +@ano.. + + +@anon-func-173.5 (71,936 samples, 0.71%) + + + +rec (1,922 samples, 0.02%) + + + +@anon-func-435.5 (95,998 samples, 0.95%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (19,267 samples, 0.19%) + + + +@anon-func-173.5 (1,242,622 samples, 12.25%) +@anon-func-173.5 + + +@anon-func-173.5 (1,410,296 samples, 13.90%) +@anon-func-173.5 + + +@anon-func-300.5 (1,417 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +elemMul (1,072 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-435.5 (152,938 samples, 1.51%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (817,223 samples, 8.06%) +@anon-func-.. + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (3,164 samples, 0.03%) + + + +@anon-func-173.5 (1,473,736 samples, 14.53%) +@anon-func-173.5 + + +rec (22,204 samples, 0.22%) + + + +@anon-func-173.5 (4,068 samples, 0.04%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-435.5 (17,754 samples, 0.18%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (285,224 samples, 2.81%) +@a.. + + +@anon-func-173.5 (46,760 samples, 0.46%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,020 samples, 0.01%) + + + +rec (2,982 samples, 0.03%) + + + +@anon-func-173.5 (758,633 samples, 7.48%) +@anon-func.. + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (103,796 samples, 1.02%) + + + +@anon-func-435.5 (44,704 samples, 0.44%) + + + +natXor (25,552 samples, 0.25%) + + + +elemMul (10,400 samples, 0.10%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (2,726 samples, 0.03%) + + + +@anon-func-435.5 (83,518 samples, 0.82%) + + + +@anon-func-435.5 (10,734 samples, 0.11%) + + + +rec (3,952 samples, 0.04%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (2,982 samples, 0.03%) + + + +@anon-func-265.5 (1,442 samples, 0.01%) + + + +@anon-func-173.5 (630,985 samples, 6.22%) +@anon-fu.. + + +@anon-func-173.5 (948,068 samples, 9.35%) +@anon-func-17.. + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (28,188 samples, 0.28%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (688,315 samples, 6.79%) +@anon-fun.. + + +B_rem (1,152 samples, 0.01%) + + + +rec (20,017 samples, 0.20%) + + + +rec (1,000 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (3,267 samples, 0.03%) + + + +rec (34,172 samples, 0.34%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +B_add (864 samples, 0.01%) + + + +go (2,064,475 samples, 20.35%) +go + + +rec (1,396 samples, 0.01%) + + + +@anon-func-453.5 (4,524 samples, 0.04%) + + + +@anon-func-229.5 (47,526 samples, 0.47%) + + + +@anon-func-435.5 (164,638 samples, 1.62%) + + + +rec (1,396 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-453.5 (2,227 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (18,272 samples, 0.18%) + + + +@anon-func-173.5 (354,020 samples, 3.49%) +@an.. + + +rec (2,058 samples, 0.02%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (46,936 samples, 0.46%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (31,267 samples, 0.31%) + + + +rec (1,062 samples, 0.01%) + + + +rec (13,517 samples, 0.13%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +$loop/1 (13,921 samples, 0.14%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-173.5 (1,222,797 samples, 12.05%) +@anon-func-173.5 + + +@anon-func-173.5 (40,776 samples, 0.40%) + + + +@anon-func-435.5 (32,224 samples, 0.32%) + + + +@anon-func-173.5 (52,086 samples, 0.51%) + + + +@anon-func-62.5 (4,266 samples, 0.04%) + + + +@anon-func-173.5 (53,540 samples, 0.53%) + + + +@anon-func-173.5 (277,580 samples, 2.74%) +@a.. + + +rec (26,284 samples, 0.26%) + + + +toListWithLength (17,775 samples, 0.18%) + + + +rec (24,767 samples, 0.24%) + + + +@anon-func-244.5 (5,263,125 samples, 51.88%) +@anon-func-244.5 + + +rec (5,795 samples, 0.06%) + + + +rec (5,517 samples, 0.05%) + + + +@anon-func-173.5 (22,686 samples, 0.22%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,082 samples, 0.01%) + + + +step (5,772 samples, 0.06%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (979,788 samples, 9.66%) +@anon-func-173.5 + + +@anon-func-435.5 (338,704 samples, 3.34%) +@an.. + + +@anon-func-265.5 (15,677 samples, 0.15%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,509,851 samples, 14.88%) +@anon-func-173.5 + + +@anon-func-173.5 (38,266 samples, 0.38%) + + + +rec (5,612 samples, 0.06%) + + + +@anon-func-435.5 (33,394 samples, 0.33%) + + + +@anon-func-173.5 (504,859 samples, 4.98%) +@anon-.. + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (1,003,578 samples, 9.89%) +@anon-func-173.5 + + +B_add (864 samples, 0.01%) + + + +rec (1,353 samples, 0.01%) + + + +@anon-func-453.5 (2,257 samples, 0.02%) + + + +@anon-func-173.5 (29,068 samples, 0.29%) + + + +@anon-func-173.5 (51,206 samples, 0.50%) + + + +@anon-func-435.5 (147,478 samples, 1.45%) + + + +rec (2,736 samples, 0.03%) + + + +alog (1,568 samples, 0.02%) + + + +rec (15,142 samples, 0.15%) + + + +rec (12,193 samples, 0.12%) + + + +@anon-func-173.5 (841,013 samples, 8.29%) +@anon-func-.. + + +rec (33,628 samples, 0.33%) + + + +@anon-func-229.5 (18,472 samples, 0.18%) + + + +rec (23,392 samples, 0.23%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-362.41 (1,023 samples, 0.01%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (72,464 samples, 0.71%) + + + +rec (13,500 samples, 0.13%) + + + +polyZipWith (1,051,585 samples, 10.37%) +polyZipWith + + +rec (12,628 samples, 0.12%) + + + +natFromBits (1,827 samples, 0.02%) + + + +@anon-func-173.5 (497,215 samples, 4.90%) +@anon-.. + + +rec (2,330 samples, 0.02%) + + + +scale (1,752 samples, 0.02%) + + + +@anon-func-173.5 (51,030 samples, 0.50%) + + + +rec (2,206 samples, 0.02%) + + + +rec (3,636 samples, 0.04%) + + + +@anon-func-173.5 (376,952 samples, 3.72%) +@ano.. + + +@anon-func-173.5 (833,083 samples, 8.21%) +@anon-func-.. + + +@anon-func-173.5 (501,037 samples, 4.94%) +@anon-.. + + +@anon-func-173.5 (520,147 samples, 5.13%) +@anon-.. + + +rec (4,409 samples, 0.04%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (25,944 samples, 0.26%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (23,896 samples, 0.24%) + + + +rec (1,363 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-435.5 (28,674 samples, 0.28%) + + + +rec (2,874 samples, 0.03%) + + + +@anon-func-265.5 (12,392 samples, 0.12%) + + + +@anon-func-173.5 (26,780 samples, 0.26%) + + + +@anon-func-173.5 (10,848 samples, 0.11%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-393.5 (16,768 samples, 0.17%) + + + +@anon-func-435.5 (116,278 samples, 1.15%) + + + +@anon-func-173.5 (69,472 samples, 0.68%) + + + +@anon-func-173.5 (1,055,903 samples, 10.41%) +@anon-func-173.5 + + +rec (6,700 samples, 0.07%) + + + +@anon-func-173.5 (975,823 samples, 9.62%) +@anon-func-173.5 + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (33,116 samples, 0.33%) + + + +@anon-func-173.5 (1,390,471 samples, 13.71%) +@anon-func-173.5 + + +rec (9,964 samples, 0.10%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (81,958 samples, 0.81%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +natFromBits (1,506 samples, 0.01%) + + + +@anon-func-161.5 (10,816 samples, 0.11%) + + + +log (4,448 samples, 0.04%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-435.5 (48,994 samples, 0.48%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (12,432 samples, 0.12%) + + + +rec (28,642 samples, 0.28%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-173.5 (27,308 samples, 0.27%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (1,767 samples, 0.02%) + + + +rec (10,236 samples, 0.10%) + + + +rec (1,925 samples, 0.02%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (1,450 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (4,400 samples, 0.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (150,986 samples, 1.49%) + + + +rec (11,613 samples, 0.11%) + + + +rec (1,650 samples, 0.02%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +revAppend (2,621,858 samples, 25.85%) +revAppend + + +@anon-func-161.5 (5,663 samples, 0.06%) + + + +rec (1,730 samples, 0.02%) + + + +rec (3,767 samples, 0.04%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-435.5 (30,664 samples, 0.30%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-173.5 (451,351 samples, 4.45%) +@anon.. + + +@anon-func-173.5 (65,576 samples, 0.65%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-173.5 (1,080,057 samples, 10.65%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (25,548 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (4,932 samples, 0.05%) + + + +@anon-func-173.5 (864,803 samples, 8.53%) +@anon-func-1.. + + +@anon-func-393.5 (18,944 samples, 0.19%) + + + +@anon-func-173.5 (19,870 samples, 0.20%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (15,770 samples, 0.16%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-300.5 (1,446 samples, 0.01%) + + + +rec (31,926 samples, 0.31%) + + + +rec (1,915 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (4,676 samples, 0.05%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (653,917 samples, 6.45%) +@anon-fu.. + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-115.39 (1,639 samples, 0.02%) + + + +@anon-func-173.5 (54,596 samples, 0.54%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +rec (30,142 samples, 0.30%) + + + +@anon-func-173.5 (35,626 samples, 0.35%) + + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-435.5 (60,694 samples, 0.60%) + + + +rec (1,654 samples, 0.02%) + + + +@anon-func-173.5 (48,168 samples, 0.47%) + + + +@anon-func-173.5 (35,978 samples, 0.35%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-300.5 (1,016 samples, 0.01%) + + + +@anon-func-173.5 (1,139,532 samples, 11.23%) +@anon-func-173.5 + + +@anon-func-173.5 (47,992 samples, 0.47%) + + + +@anon-func-173.5 (33,292 samples, 0.33%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-173.5 (37,386 samples, 0.37%) + + + +@anon-func-173.5 (281,402 samples, 2.77%) +@a.. + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (971,858 samples, 9.58%) +@anon-func-17.. + + +@anon-func-435.5 (1,764 samples, 0.02%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (26,828 samples, 0.26%) + + + +rec (1,072 samples, 0.01%) + + + +rec (1,644 samples, 0.02%) + + + +@anon-func-173.5 (60,228 samples, 0.59%) + + + +@anon-func-173.5 (5,522 samples, 0.05%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (1,010 samples, 0.01%) + + + +@anon-func-173.5 (61,460 samples, 0.61%) + + + +rec (11,193 samples, 0.11%) + + + +@anon-func-435.5 (29,494 samples, 0.29%) + + + +rec (41,301 samples, 0.41%) + + + +@anon-func-173.5 (1,051,834 samples, 10.37%) +@anon-func-173.5 + + +rec (3,870 samples, 0.04%) + + + +@anon-func-435.5 (440,414 samples, 4.34%) +@anon.. + + +@anon-func-435.5 (16,974 samples, 0.17%) + + + +@anon-func-229.5 (1,342 samples, 0.01%) + + + +rec (1,020 samples, 0.01%) + + + +@anon-func-289.5 (1,528,707 samples, 15.07%) +@anon-func-289.5 + + +@anon-func-265.5 (17,867 samples, 0.18%) + + + +@anon-func-300.5 (1,150 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +elemMul (1,474 samples, 0.01%) + + + +rec (1,940 samples, 0.02%) + + + +@anon-func-173.5 (84,686 samples, 0.83%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-481.5 (16,660 samples, 0.16%) + + + +rec (1,642 samples, 0.02%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (31,834 samples, 0.31%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (4,422 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-79.3 (10,052,943 samples, 99.10%) +@anon-func-79.3 + + +rec (1,654 samples, 0.02%) + + + +@anon-func-173.5 (700,211 samples, 6.90%) +@anon-fun.. + + +@anon-func-173.5 (73,220 samples, 0.72%) + + + +@anon-func-173.5 (1,072,127 samples, 10.57%) +@anon-func-173.5 + + +@anon-func-173.5 (1,513,816 samples, 14.92%) +@anon-func-173.5 + + +rec (23,642 samples, 0.23%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (2,206 samples, 0.02%) + + + +@anon-func-173.5 (69,824 samples, 0.69%) + + + +rec (13,767 samples, 0.14%) + + + +natFromBits (1,347 samples, 0.01%) + + + +rec (6,300 samples, 0.06%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (12,272 samples, 0.12%) + + + +rec (3,308 samples, 0.03%) + + + +@anon-func-161.5 (171,208 samples, 1.69%) + + + +rec (1,650 samples, 0.02%) + + + +rec (16,590 samples, 0.16%) + + + +@anon-func-173.5 (289,046 samples, 2.85%) +@a.. + + +@anon-func-173.5 (31,004 samples, 0.31%) + + + +rec (26,392 samples, 0.26%) + + + +@anon-func-173.5 (29,948 samples, 0.30%) + + + +@anon-func-173.5 (66,082 samples, 0.65%) + + + +@anon-func-435.5 (18,924 samples, 0.19%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (9,767 samples, 0.10%) + + + +@anon-func-173.5 (1,115,742 samples, 11.00%) +@anon-func-173.5 + + +rec (32,676 samples, 0.32%) + + + +@anon-func-173.5 (999,613 samples, 9.85%) +@anon-func-173.5 + + +@anon-func-435.5 (149,818 samples, 1.48%) + + + +@anon-func-300.5 (879 samples, 0.01%) + + + +@anon-func-300.5 (16,251 samples, 0.16%) + + + +@anon-func-173.5 (743,111 samples, 7.33%) +@anon-func.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (13,854 samples, 0.14%) + + + +@anon-func-435.5 (541,694 samples, 5.34%) +@anon-.. + + +@anon-func-435.5 (984 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +B_sub (1,120 samples, 0.01%) + + + +@anon-func-481.5 (2,064 samples, 0.02%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (19,756 samples, 0.19%) + + + +@anon-func-412.5 (17,295 samples, 0.17%) + + + +@anon-func-161.5 (8,018 samples, 0.08%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-173.5 (14,368 samples, 0.14%) + + + +@anon-func-173.5 (1,234,692 samples, 12.17%) +@anon-func-173.5 + + +@anon-func-173.5 (32,236 samples, 0.32%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +rec (2,216 samples, 0.02%) + + + +@anon-func-435.5 (58,354 samples, 0.58%) + + + +@anon-func-173.5 (600,409 samples, 5.92%) +@anon-f.. + + +rec (1,267 samples, 0.01%) + + + +@anon-func-412.5 (881 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (16,767 samples, 0.17%) + + + +@anon-func-173.5 (42,644 samples, 0.42%) + + + +@anon-func-173.5 (1,183,147 samples, 11.66%) +@anon-func-173.5 + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (13,772 samples, 0.14%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +rec (1,124 samples, 0.01%) + + + +@anon-func-161.5 (32,696 samples, 0.32%) + + + +rec (1,072 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-435.5 (128,758 samples, 1.27%) + + + +@anon-func-435.5 (1,374 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (34,444 samples, 0.34%) + + + +@anon-func-173.5 (42,184 samples, 0.42%) + + + +@anon-func-62.5 (1,248 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +map (74,721 samples, 0.74%) + + + +rec (4,517 samples, 0.04%) + + + +rec (4,472 samples, 0.04%) + + + +@anon-func-173.5 (852,908 samples, 8.41%) +@anon-func-1.. + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (516,325 samples, 5.09%) +@anon-.. + + +rec (3,088 samples, 0.03%) + + + +polyGrow (77,120 samples, 0.76%) + + + +rec (26,142 samples, 0.26%) + + + +@anon-func-173.5 (1,087,987 samples, 10.73%) +@anon-func-173.5 + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +polyZipWith (657,716 samples, 6.48%) +polyZipW.. + + +rec (26,012 samples, 0.26%) + + + +@anon-func-173.5 (77,042 samples, 0.76%) + + + +@anon-func-173.5 (33,820 samples, 0.33%) + + + +rec (8,332 samples, 0.08%) + + + +elemMul (10,400 samples, 0.10%) + + + +@anon-func-173.5 (59,348 samples, 0.59%) + + + +@anon-func-435.5 (2,934 samples, 0.03%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (50,678 samples, 0.50%) + + + +rec (16,220 samples, 0.16%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (39,368 samples, 0.39%) + + + +rec (1,642 samples, 0.02%) + + + +rec (10,508 samples, 0.10%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (4,116 samples, 0.04%) + + + +rec (1,517 samples, 0.01%) + + + +@anon-func-173.5 (65,730 samples, 0.65%) + + + +@anon-func-300.5 (1,446 samples, 0.01%) + + + +@anon-func-173.5 (61,108 samples, 0.60%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (50,944 samples, 0.50%) + + + +@anon-func-435.5 (65,374 samples, 0.64%) + + + +rec (42,051 samples, 0.41%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +map (2,371,204 samples, 23.37%) +map + + +rec (30,517 samples, 0.30%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (43,924 samples, 0.43%) + + + +natZipWith (25,392 samples, 0.25%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-435.5 (59,914 samples, 0.59%) + + + +rec (7,062 samples, 0.07%) + + + +rec (12,392 samples, 0.12%) + + + +@anon-func-173.5 (201,140 samples, 1.98%) +@.. + + +@anon-func-173.5 (26,428 samples, 0.26%) + + + +@anon-func-173.5 (22,334 samples, 0.22%) + + + +finderTRCoords (16,370 samples, 0.16%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (14,392 samples, 0.14%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (21,932 samples, 0.22%) + + + +@anon-func-173.5 (4,164 samples, 0.04%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-435.5 (23,994 samples, 0.24%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +padLeftTo (1,008 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-435.5 (11,904 samples, 0.12%) + + + +@anon-func-173.5 (56,004 samples, 0.55%) + + + +@anon-func-173.5 (59,876 samples, 0.59%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-435.5 (63,424 samples, 0.63%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-161.5 (28,620 samples, 0.28%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +__wasm_call_ctors (987 samples, 0.01%) + + + +@anon-func-161.5 (83,064 samples, 0.82%) + + + +rec (1,925 samples, 0.02%) + + + +padLeftTo (1,008 samples, 0.01%) + + + +@anon-func-173.5 (892,558 samples, 8.80%) +@anon-func-1.. + + +@anon-func-300.5 (1,407 samples, 0.01%) + + + +@anon-func-173.5 (566,011 samples, 5.58%) +@anon-f.. + + +rec (1,786 samples, 0.02%) + + + +rec (1,786 samples, 0.02%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-161.5 (108,248 samples, 1.07%) + + + +padLeftTo (1,008 samples, 0.01%) + + + +rec (1,892 samples, 0.02%) + + + +rec (26,767 samples, 0.26%) + + + +@anon-func-435.5 (157,618 samples, 1.55%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-435.5 (134,998 samples, 1.33%) + + + +elemFromBits (1,340 samples, 0.01%) + + + +@anon-func-173.5 (327,266 samples, 3.23%) +@an.. + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (7,642 samples, 0.08%) + + + +@anon-func-173.5 (11,024 samples, 0.11%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (1,068 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (54,244 samples, 0.53%) + + + +rec (2,148 samples, 0.02%) + + + +@anon-func-73.5 (35,144 samples, 0.35%) + + + +rec (3,552 samples, 0.04%) + + + +natToBytes (7,168 samples, 0.07%) + + + +rec (2,982 samples, 0.03%) + + + +rec (1,905 samples, 0.02%) + + + +@anon-func-173.5 (53,364 samples, 0.53%) + + + +@anon-func-300.5 (1,002 samples, 0.01%) + + + +rec (24,380 samples, 0.24%) + + + +@anon-func-173.5 (37,562 samples, 0.37%) + + + +@anon-func-173.5 (56,356 samples, 0.56%) + + + +@anon-func-173.5 (32,412 samples, 0.32%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (143,578 samples, 1.42%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +revAppend (21,948 samples, 0.22%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (3,952 samples, 0.04%) + + + +@anon-func-173.5 (719,555 samples, 7.09%) +@anon-fun.. + + +@anon-func-435.5 (91,318 samples, 0.90%) + + + +@anon-func-173.5 (11,376 samples, 0.11%) + + + +@anon-func-229.5 (1,967 samples, 0.02%) + + + +@anon-func-173.5 (71,760 samples, 0.71%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +natFromBits (1,827 samples, 0.02%) + + + +@anon-func-300.5 (1,006 samples, 0.01%) + + + +@anon-func-435.5 (145,918 samples, 1.44%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (4,660 samples, 0.05%) + + + +rec (28,392 samples, 0.28%) + + + +@anon-func-173.5 (485,749 samples, 4.79%) +@anon.. + + +@anon-func-173.5 (13,840 samples, 0.14%) + + + +@anon-func-494.5 (1,114 samples, 0.01%) + + + +rec (16,642 samples, 0.16%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (2,466 samples, 0.02%) + + + +@anon-func-435.5 (23,214 samples, 0.23%) + + + +@anon-func-173.5 (269,936 samples, 2.66%) +@a.. + + +rec (15,676 samples, 0.15%) + + + +@anon-func-435.5 (5,664 samples, 0.06%) + + + +@anon-func-173.5 (31,356 samples, 0.31%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (16,517 samples, 0.16%) + + + +@anon-func-173.5 (5,698 samples, 0.06%) + + + +@anon-func-173.5 (54,948 samples, 0.54%) + + + +rec (46,551 samples, 0.46%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (25,196 samples, 0.25%) + + + +rec (1,242 samples, 0.01%) + + + +@anon-func-173.5 (1,252 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-300.5 (1,168 samples, 0.01%) + + + +elemFromBits (1,914 samples, 0.02%) + + + +rec (12,140 samples, 0.12%) + + + +rec (970 samples, 0.01%) + + + +@anon-func-173.5 (2,308 samples, 0.02%) + + + +@anon-func-435.5 (24,384 samples, 0.24%) + + + +@anon-func-173.5 (9,616 samples, 0.09%) + + + +rec (7,678 samples, 0.08%) + + + +@anon-func-173.5 (62,692 samples, 0.62%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-481.5 (30,822 samples, 0.30%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (2,206 samples, 0.02%) + + + +@anon-func-173.5 (52,262 samples, 0.52%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (5,476 samples, 0.05%) + + + +elemAdd (26,960 samples, 0.27%) + + + +rec (2,738 samples, 0.03%) + + + +rec (36,620 samples, 0.36%) + + + +@anon-func-173.5 (924,278 samples, 9.11%) +@anon-func-17.. + + +@anon-func-481.5 (14,313 samples, 0.14%) + + + +rec (14,517 samples, 0.14%) + + + +@anon-func-393.5 (2,884 samples, 0.03%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (18,892 samples, 0.19%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-300.5 (1,154 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (1,373 samples, 0.01%) + + + +rec (24,602 samples, 0.24%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-435.5 (87,418 samples, 0.86%) + + + +rec (3,552 samples, 0.04%) + + + +rec (1,654 samples, 0.02%) + + + +rec (8,060 samples, 0.08%) + + + +@anon-func-173.5 (21,982 samples, 0.22%) + + + +rec (5,142 samples, 0.05%) + + + +rec (25,892 samples, 0.26%) + + + +@anon-func-173.5 (523,969 samples, 5.17%) +@anon-.. + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (28,460 samples, 0.28%) + + + +rec (33,084 samples, 0.33%) + + + +@anon-func-173.5 (71,232 samples, 0.70%) + + + +@anon-func-435.5 (17,364 samples, 0.17%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (6,930 samples, 0.07%) + + + +@anon-func-173.5 (27,132 samples, 0.27%) + + + +rec (1,935 samples, 0.02%) + + + +@anon-func-173.5 (15,952 samples, 0.16%) + + + +rec (5,204 samples, 0.05%) + + + +@anon-func-300.5 (1,002 samples, 0.01%) + + + +B_add (8,262 samples, 0.08%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-412.5 (881 samples, 0.01%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +natZipWith (25,392 samples, 0.25%) + + + +padLeft (1,739 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (7,693 samples, 0.08%) + + + +@anon-func-435.5 (74,938 samples, 0.74%) + + + +@anon-func-173.5 (1,047,765 samples, 10.33%) +@anon-func-173.5 + + +@anon-func-173.5 (627,163 samples, 6.18%) +@anon-fu.. + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (16,608 samples, 0.16%) + + + +@anon-func-412.5 (2,921 samples, 0.03%) + + + +rec (23,836 samples, 0.23%) + + + +polyGrow (103,243 samples, 1.02%) + + + +@anon-func-435.5 (159,958 samples, 1.58%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +natZipWith (25,392 samples, 0.25%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (4,392 samples, 0.04%) + + + +rec (1,945 samples, 0.02%) + + + +rec (2,164 samples, 0.02%) + + + +rec (12,142 samples, 0.12%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-435.5 (204,094 samples, 2.01%) +@.. + + +rec (1,572 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-265.5 (4,727 samples, 0.05%) + + + +rec (35,301 samples, 0.35%) + + + +rec (1,922 samples, 0.02%) + + + +@anon-func-173.5 (42,536 samples, 0.42%) + + + +@anon-func-435.5 (237,424 samples, 2.34%) +@.. + + +scale (1,898 samples, 0.02%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +@anon-func-393.5 (1,388 samples, 0.01%) + + + +rec (1,977 samples, 0.02%) + + + +@anon-func-265.5 (13,487 samples, 0.13%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,366,109 samples, 13.47%) +@anon-func-173.5 + + +@anon-func-161.5 (5,192 samples, 0.05%) + + + +B_add (864 samples, 0.01%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-435.5 (7,614 samples, 0.08%) + + + +rec (10,842 samples, 0.11%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +rec (1,654 samples, 0.02%) + + + +@anon-func-453.5 (5,009 samples, 0.05%) + + + +foldr (4,736 samples, 0.05%) + + + +@anon-func-173.5 (11,904 samples, 0.12%) + + + +@anon-func-453.5 (1,062 samples, 0.01%) + + + +rec (10,842 samples, 0.11%) + + + +rec (1,602 samples, 0.02%) + + + +B_div (1,216 samples, 0.01%) + + + +rec (8,392 samples, 0.08%) + + + +@anon-func-173.5 (7,810 samples, 0.08%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-173.5 (57,060 samples, 0.56%) + + + +timingVCoords (2,328 samples, 0.02%) + + + +rec (19,892 samples, 0.20%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +natFromBits (1,358 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (4,808 samples, 0.05%) + + + +natZipWith (25,392 samples, 0.25%) + + + +B_add (864 samples, 0.01%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (9,192 samples, 0.09%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +alog (1,568 samples, 0.02%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-435.5 (93,658 samples, 0.92%) + + + +rec (2,744 samples, 0.03%) + + + +rec (28,767 samples, 0.28%) + + + +rec (2,194 samples, 0.02%) + + + +@anon-func-173.5 (396,062 samples, 3.90%) +@ano.. + + +rec (20,844 samples, 0.21%) + + + +rec (31,142 samples, 0.31%) + + + +@anon-func-173.5 (46,232 samples, 0.46%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-173.5 (239,360 samples, 2.36%) +@.. + + +B_div (1,216 samples, 0.01%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-453.5 (4,534 samples, 0.04%) + + + +@anon-func-161.5 (4,250 samples, 0.04%) + + + +@anon-func-173.5 (1,310,027 samples, 12.91%) +@anon-func-173.5 + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,242 samples, 0.01%) + + + +@anon-func-44.5 (1,760 samples, 0.02%) + + + +@anon-func-173.5 (19,694 samples, 0.19%) + + + +@anon-func-161.5 (5,768 samples, 0.06%) + + + +@anon-func-435.5 (43,144 samples, 0.43%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (77,278 samples, 0.76%) + + + +@anon-func-453.5 (2,227 samples, 0.02%) + + + +@anon-func-173.5 (1,298,132 samples, 12.80%) +@anon-func-173.5 + + +@anon-func-435.5 (121,738 samples, 1.20%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-453.5 (2,227 samples, 0.02%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +natToBits (1,584 samples, 0.02%) + + + +@anon-func-173.5 (178,208 samples, 1.76%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +natXor (25,552 samples, 0.25%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (981 samples, 0.01%) + + + +rec (14,316 samples, 0.14%) + + + +@anon-func-173.5 (896,523 samples, 8.84%) +@anon-func-1.. + + +@anon-func-173.5 (1,103,847 samples, 10.88%) +@anon-func-173.5 + + +@anon-func-173.5 (1,357,971 samples, 13.39%) +@anon-func-173.5 + + +rec (13,380 samples, 0.13%) + + + +@anon-func-173.5 (1,434,086 samples, 14.14%) +@anon-func-173.5 + + +rec (1,915 samples, 0.02%) + + + +rec (1,634 samples, 0.02%) + + + +natZipWith (25,392 samples, 0.25%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-173.5 (40,952 samples, 0.40%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-173.5 (66,434 samples, 0.65%) + + + +B_add (19,224 samples, 0.19%) + + + +@anon-func-173.5 (1,406,331 samples, 13.86%) +@anon-func-173.5 + + +rec (27,644 samples, 0.27%) + + + +padLeft (1,739 samples, 0.02%) + + + +rec (3,552 samples, 0.04%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +@anon-func-173.5 (415,172 samples, 4.09%) +@ano.. + + +@anon-func-173.5 (588,943 samples, 5.81%) +@anon-f.. + + +rec (35,532 samples, 0.35%) + + + +elemMul (938 samples, 0.01%) + + + +@anon-func-435.5 (339,134 samples, 3.34%) +@an.. + + +rec (9,517 samples, 0.09%) + + + +rec (5,476 samples, 0.05%) + + + +@anon-func-173.5 (56,708 samples, 0.56%) + + + +@anon-func-73.5 (65,720 samples, 0.65%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (90,538 samples, 0.89%) + + + +@anon-func-300.5 (1,168 samples, 0.01%) + + + +@anon-func-435.5 (845,534 samples, 8.34%) +@anon-func-.. + + +rec (27,392 samples, 0.27%) + + + +rec (1,267 samples, 0.01%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-300.5 (890 samples, 0.01%) + + + +@anon-func-173.5 (59,172 samples, 0.58%) + + + +rec (1,642 samples, 0.02%) + + + +rec (4,808 samples, 0.05%) + + + +@anon-func-300.5 (1,728 samples, 0.02%) + + + +@anon-func-435.5 (120,178 samples, 1.18%) + + + +@anon-func-289.5 (7,101 samples, 0.07%) + + + +@anon-func-435.5 (271,184 samples, 2.67%) +@a.. + + +@anon-func-481.5 (56,940 samples, 0.56%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (14,693 samples, 0.14%) + + + +@anon-func-435.5 (105,358 samples, 1.04%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-133.5 (21,917 samples, 0.22%) + + + +@anon-func-173.5 (34,394 samples, 0.34%) + + + +rec (6,142 samples, 0.06%) + + + +@anon-func-173.5 (1,119,707 samples, 11.04%) +@anon-func-173.5 + + +@anon-func-435.5 (76,498 samples, 0.75%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (2,756 samples, 0.03%) + + + +B_div (3,040 samples, 0.03%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (63,266 samples, 0.62%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (54,454 samples, 0.54%) + + + +@anon-func-173.5 (58,644 samples, 0.58%) + + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +rec (11,392 samples, 0.11%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +elemMul (2,010 samples, 0.02%) + + + +rec (3,840 samples, 0.04%) + + + +rec (9,392 samples, 0.09%) + + + +@anon-func-481.5 (14,454 samples, 0.14%) + + + +@anon-func-435.5 (46,264 samples, 0.46%) + + + +@anon-func-435.5 (45,484 samples, 0.45%) + + + +rec (1,634 samples, 0.02%) + + + +@anon-func-173.5 (34,570 samples, 0.34%) + + + +padLeftTo (1,008 samples, 0.01%) + + + +rec (1,062 samples, 0.01%) + + + +@anon-func-173.5 (334,910 samples, 3.30%) +@an.. + + +rec (36,801 samples, 0.36%) + + + +rec (25,196 samples, 0.25%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (80,864 samples, 0.80%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +B_pow (912 samples, 0.01%) + + + +rec (1,017 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (49,798 samples, 0.49%) + + + +rec (2,310 samples, 0.02%) + + + +@anon-func-435.5 (48,604 samples, 0.48%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (123,298 samples, 1.22%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,362,040 samples, 13.43%) +@anon-func-173.5 + + +@anon-func-435.5 (75,718 samples, 0.75%) + + + +@anon-func-173.5 (543,079 samples, 5.35%) +@anon-.. + + +B_pow (912 samples, 0.01%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-362.41 (1,036 samples, 0.01%) + + + +rec (25,142 samples, 0.25%) + + + +rec (5,892 samples, 0.06%) + + + +rec (31,452 samples, 0.31%) + + + +@anon-func-453.5 (4,484 samples, 0.04%) + + + +@anon-func-173.5 (1,382,385 samples, 13.63%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (6,176 samples, 0.06%) + + + +@anon-func-173.5 (1,171,252 samples, 11.55%) +@anon-func-173.5 + + +@anon-func-173.5 (235,538 samples, 2.32%) +@.. + + +@anon-func-173.5 (12,256 samples, 0.12%) + + + +@anon-func-173.5 (1,438,051 samples, 14.18%) +@anon-func-173.5 + + +@anon-func-289.5 (16,360 samples, 0.16%) + + + +@anon-func-173.5 (58,116 samples, 0.57%) + + + +@anon-func-161.5 (50,700 samples, 0.50%) + + + +@anon-func-435.5 (676,734 samples, 6.67%) +@anon-fun.. + + +rec (4,116 samples, 0.04%) + + + +@anon-func-173.5 (37,034 samples, 0.37%) + + + +rec (4,116 samples, 0.04%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-173.5 (1,076 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-412.5 (2,921 samples, 0.03%) + + + +@anon-func-173.5 (380,774 samples, 3.75%) +@ano.. + + +B_rem (1,152 samples, 0.01%) + + + +rec (17,036 samples, 0.17%) + + + +@anon-func-173.5 (1,501,921 samples, 14.81%) +@anon-func-173.5 + + +B_rem (1,152 samples, 0.01%) + + + +rec (2,602 samples, 0.03%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-435.5 (106,918 samples, 1.05%) + + + +natZipWith (25,392 samples, 0.25%) + + + +rec (1,828 samples, 0.02%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (2,726 samples, 0.03%) + + + +B_rem (1,152 samples, 0.01%) + + + +natToBits (1,776 samples, 0.02%) + + + +rec (21,960 samples, 0.22%) + + + +rec (1,363 samples, 0.01%) + + + +@anon-func-161.5 (5,168 samples, 0.05%) + + + +@anon-func-173.5 (41,480 samples, 0.41%) + + + +rec (19,642 samples, 0.19%) + + + +@anon-func-362.41 (1,049 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (1,163,322 samples, 11.47%) +@anon-func-173.5 + + +natToBits (1,194 samples, 0.01%) + + + +@anon-func-435.5 (3,714 samples, 0.04%) + + + +rec (8,642 samples, 0.09%) + + + +rec (18,784 samples, 0.19%) + + + +elemFromBits (1,914 samples, 0.02%) + + + +rec (21,642 samples, 0.21%) + + + +log (4,448 samples, 0.04%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-435.5 (120,958 samples, 1.19%) + + + +B_sub (1,120 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (1,493,991 samples, 14.73%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-300.5 (1,728 samples, 0.02%) + + + +@anon-func-173.5 (45,000 samples, 0.44%) + + + +rec (26,582 samples, 0.26%) + + + +@anon-func-173.5 (55,828 samples, 0.55%) + + + +@anon-func-48.7 (10,086,953 samples, 99.43%) +@anon-func-48.7 + + +rec (2,196 samples, 0.02%) + + + +@anon-func-435.5 (131,878 samples, 1.30%) + + + +@anon-func-435.5 (49,774 samples, 0.49%) + + + +rec (1,514 samples, 0.01%) + + + +padLeftTo (1,348 samples, 0.01%) + + + +rec (27,642 samples, 0.27%) + + + +@anon-func-173.5 (72,288 samples, 0.71%) + + + +rec (21,517 samples, 0.21%) + + + +@anon-func-173.5 (844,978 samples, 8.33%) +@anon-func-.. + + +@anon-func-435.5 (61,864 samples, 0.61%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-79.3 (7,533,517 samples, 74.26%) +@anon-func-79.3 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-161.5 (7,076 samples, 0.07%) + + + +rec (5,795 samples, 0.06%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +rec (1,378 samples, 0.01%) + + + +@anon-func-435.5 (710,494 samples, 7.00%) +@anon-fun.. + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-173.5 (638,629 samples, 6.30%) +@anon-fu.. + + +rec (8,767 samples, 0.09%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (20,272 samples, 0.20%) + + + +rec (32,268 samples, 0.32%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (3,300 samples, 0.03%) + + + +natToBytes (7,168 samples, 0.07%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-435.5 (34,864 samples, 0.34%) + + + +rec (18,940 samples, 0.19%) + + + +@anon-func-173.5 (67,314 samples, 0.66%) + + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +scale (1,168 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (17,536 samples, 0.17%) + + + +rec (2,206 samples, 0.02%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +rec (892 samples, 0.01%) + + + +B_div (1,216 samples, 0.01%) + + + +@anon-func-435.5 (30,274 samples, 0.30%) + + + +@anon-func-173.5 (1,202,972 samples, 11.86%) +@anon-func-173.5 + + +rec (1,082 samples, 0.01%) + + + +scale (1,314 samples, 0.01%) + + + +@anon-func-435.5 (92,098 samples, 0.91%) + + + +@anon-func-173.5 (1,159,357 samples, 11.43%) +@anon-func-173.5 + + +B_rem (1,152 samples, 0.01%) + + + +rec (14,767 samples, 0.15%) + + + +rec (3,552 samples, 0.04%) + + + +B_pow (912 samples, 0.01%) + + + +rec (3,860 samples, 0.04%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (1,945 samples, 0.02%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +@anon-func-173.5 (6,402 samples, 0.06%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (1,270,377 samples, 12.52%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-173.5 (204,962 samples, 2.02%) +@.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +finderCoords (94,547 samples, 0.93%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +foldr (1,449 samples, 0.01%) + + + +rec (970 samples, 0.01%) + + + +@anon-func-173.5 (940,138 samples, 9.27%) +@anon-func-17.. + + +@anon-func-173.5 (403,706 samples, 3.98%) +@ano.. + + +rec (1,363 samples, 0.01%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-173.5 (1,920 samples, 0.02%) + + + +@anon-func-173.5 (1,135,567 samples, 11.19%) +@anon-func-173.5 + + +B_pow (912 samples, 0.01%) + + + +@anon-func-173.5 (608,053 samples, 5.99%) +@anon-f.. + + +@anon-func-173.5 (1,155,392 samples, 11.39%) +@anon-func-173.5 + + +rec (3,552 samples, 0.04%) + + + +rec (2,226 samples, 0.02%) + + + +@anon-func-435.5 (141,238 samples, 1.39%) + + + +rec (2,801 samples, 0.03%) + + + +@anon-func-173.5 (70,352 samples, 0.69%) + + + +@anon-func-173.5 (1,428 samples, 0.01%) + + + +rec (33,801 samples, 0.33%) + + + +@anon-func-300.5 (10,405 samples, 0.10%) + + + +rec (1,072 samples, 0.01%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +rec (28,017 samples, 0.28%) + + + +@anon-func-481.5 (35,506 samples, 0.35%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +rec (3,409 samples, 0.03%) + + + +next (1,230 samples, 0.01%) + + + +@anon-func-173.5 (12,960 samples, 0.13%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (40,176 samples, 0.40%) + + + +toBlocks (148,068 samples, 1.46%) + + + +rec (1,767 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-481.5 (52,256 samples, 0.52%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (61,812 samples, 0.61%) + + + +@anon-func-173.5 (14,544 samples, 0.14%) + + + +@anon-func-453.5 (2,267 samples, 0.02%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-161.5 (30,602 samples, 0.30%) + + + +B_add (19,224 samples, 0.19%) + + + +@anon-func-173.5 (474,283 samples, 4.68%) +@anon.. + + +@anon-func-173.5 (581,299 samples, 5.73%) +@anon-f.. + + +@anon-func-173.5 (1,095,917 samples, 10.80%) +@anon-func-173.5 + + +@anon-func-173.5 (53,188 samples, 0.52%) + + + +@anon-func-435.5 (27,504 samples, 0.27%) + + + +@anon-func-173.5 (338,732 samples, 3.34%) +@an.. + + +@anon-func-435.5 (138,898 samples, 1.37%) + + + +rec (3,308 samples, 0.03%) + + + +@anon-func-173.5 (66,258 samples, 0.65%) + + + +@anon-func-173.5 (1,422,191 samples, 14.02%) +@anon-func-173.5 + + +@anon-func-173.5 (1,091,952 samples, 10.76%) +@anon-func-173.5 + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +B_add (864 samples, 0.01%) + + + +rec (1,450 samples, 0.01%) + + + +@anon-func-173.5 (1,007,543 samples, 9.93%) +@anon-func-173.5 + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-435.5 (60,304 samples, 0.59%) + + + +elemAdd (26,960 samples, 0.27%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +@anon-func-453.5 (2,237 samples, 0.02%) + + + +rec (15,892 samples, 0.16%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (577,477 samples, 5.69%) +@anon-f.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,363 samples, 0.01%) + + + +rec (22,642 samples, 0.22%) + + + +natZipWith (25,392 samples, 0.25%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +@anon-func-435.5 (38,464 samples, 0.38%) + + + +@anon-func-173.5 (1,418,226 samples, 13.98%) +@anon-func-173.5 + + +@anon-func-173.5 (34,922 samples, 0.34%) + + + +rec (2,144 samples, 0.02%) + + + +@anon-func-173.5 (2,836 samples, 0.03%) + + + +@anon-func-173.5 (51,382 samples, 0.51%) + + + +rec (3,288 samples, 0.03%) + + + +@anon-func-300.5 (1,013 samples, 0.01%) + + + +@anon-func-173.5 (369,308 samples, 3.64%) +@ano.. + + +@anon-func-412.5 (17,360 samples, 0.17%) + + + +rec (1,925 samples, 0.02%) + + + +@anon-func-300.5 (1,002 samples, 0.01%) + + + +@anon-func-173.5 (59,524 samples, 0.59%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-161.5 (24,166 samples, 0.24%) + + + +@anon-func-435.5 (50,554 samples, 0.50%) + + + +rec (28,188 samples, 0.28%) + + + +@anon-func-435.5 (271,614 samples, 2.68%) +@a.. + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-62.5 (1,952 samples, 0.02%) + + + +@anon-func-481.5 (42,818 samples, 0.42%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (15,248 samples, 0.15%) + + + +rec (1,242 samples, 0.01%) + + + +@anon-func-173.5 (1,230,727 samples, 12.13%) +@anon-func-173.5 + + +B_div (1,216 samples, 0.01%) + + + +natToBytes (7,168 samples, 0.07%) + + + +B_pow (912 samples, 0.01%) + + + +rec (8,876 samples, 0.09%) + + + +rec (21,767 samples, 0.21%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +B_add (864 samples, 0.01%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +rec (2,602 samples, 0.03%) + + + +@anon-func-300.5 (4,432 samples, 0.04%) + + + +@anon-func-173.5 (1,442,016 samples, 14.22%) +@anon-func-173.5 + + +@anon-func-300.5 (1,728 samples, 0.02%) + + + +rec (1,644 samples, 0.02%) + + + +elemFromBits (1,434 samples, 0.01%) + + + +@anon-func-361.7 (1,526,943 samples, 15.05%) +@anon-func-361.7 + + +all (10,144,278 samples, 100%) + + + +@anon-func-435.5 (56,014 samples, 0.55%) + + + +rec (3,551 samples, 0.04%) + + + +@anon-func-173.5 (36,154 samples, 0.36%) + + + +@anon-func-173.5 (860,838 samples, 8.49%) +@anon-func-1.. + + +@anon-func-173.5 (1,147,462 samples, 11.31%) +@anon-func-173.5 + + +@anon-func-73.5 (3,840 samples, 0.04%) + + + +rec (2,236 samples, 0.02%) + + + +@anon-func-173.5 (8,338 samples, 0.08%) + + + +rec (3,300 samples, 0.03%) + + + +@anon-func-435.5 (406,654 samples, 4.01%) +@ano.. + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-435.5 (11,514 samples, 0.11%) + + + +@anon-func-435.5 (95,218 samples, 0.94%) + + + +@anon-func-362.41 (1,094 samples, 0.01%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +rec (1,106 samples, 0.01%) + + + +rec (4,272 samples, 0.04%) + + + +rec (2,330 samples, 0.02%) + + + +natFromBytes (6,016 samples, 0.06%) + + + +natFromBits (1,639 samples, 0.02%) + + + +@anon-func-435.5 (140,458 samples, 1.38%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (1,123,672 samples, 11.08%) +@anon-func-173.5 + + +rec (18,396 samples, 0.18%) + + + +@anon-func-435.5 (130,318 samples, 1.28%) + + + +rec (27,142 samples, 0.27%) + + + +@anon-func-173.5 (987,718 samples, 9.74%) +@anon-func-173.5 + + +rec (6,300 samples, 0.06%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-32.65 (7,531,816 samples, 74.25%) +@anon-func-32.65 + + +B_rem (1,152 samples, 0.01%) + + + +@anon-func-44.5 (2,190 samples, 0.02%) + + + +rec (1,363 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (73,378 samples, 0.72%) + + + +@anon-func-362.41 (945 samples, 0.01%) + + + +@anon-func-173.5 (28,540 samples, 0.28%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (16,142 samples, 0.16%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +@anon-func-435.5 (6,880 samples, 0.07%) + + + +rec (1,582 samples, 0.02%) + + + +rec (2,466 samples, 0.02%) + + + +@anon-func-173.5 (64,498 samples, 0.64%) + + + +@anon-func-435.5 (4,884 samples, 0.05%) + + + +rec (4,767 samples, 0.05%) + + + +@anon-func-173.5 (466,639 samples, 4.60%) +@anon.. + + +@anon-func-435.5 (150,598 samples, 1.48%) + + + +rec (1,335 samples, 0.01%) + + + +rec (2,017 samples, 0.02%) + + + +B_rem (1,152 samples, 0.01%) + + + +rec (2,164 samples, 0.02%) + + + +@anon-func-435.5 (12,294 samples, 0.12%) + + + +@anon-func-173.5 (20,750 samples, 0.20%) + + + +@anon-func-435.5 (25,554 samples, 0.25%) + + + +rec (892 samples, 0.01%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (892 samples, 0.01%) + + + +@anon-func-435.5 (44,314 samples, 0.44%) + + + +B_add (10,152 samples, 0.10%) + + + +@anon-func-265.5 (2,537 samples, 0.03%) + + + +@anon-func-173.5 (29,244 samples, 0.29%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +rec (11,495 samples, 0.11%) + + + +@anon-func-173.5 (31,708 samples, 0.31%) + + + +natXor (25,982 samples, 0.26%) + + + +@anon-func-44.5 (880 samples, 0.01%) + + + +polySub (1,051,889 samples, 10.37%) +polySub + + +rec (14,550 samples, 0.14%) + + + +rec (1,940 samples, 0.02%) + + + +@anon-func-62.5 (2,496 samples, 0.02%) + + + +@anon-func-362.41 (990 samples, 0.01%) + + + +rec (1,017 samples, 0.01%) + + + +@anon-func-412.5 (37,258 samples, 0.37%) + + + +rec (1,514 samples, 0.01%) + + + +@anon-func-173.5 (33,644 samples, 0.33%) + + + +log (4,448 samples, 0.04%) + + + +rec (39,426 samples, 0.39%) + + + +@anon-func-68.41 (3,072 samples, 0.03%) + + + +@anon-func-173.5 (23,390 samples, 0.23%) + + + +rec (13,693 samples, 0.13%) + + + +@anon-func-173.5 (58,996 samples, 0.58%) + + + +@anon-func-435.5 (12,684 samples, 0.13%) + + + +@anon-func-435.5 (1,104 samples, 0.01%) + + + +@anon-func-300.5 (890 samples, 0.01%) + + + +B_pow (912 samples, 0.01%) + + + +@anon-func-435.5 (59,524 samples, 0.59%) + + + +rec (30,892 samples, 0.30%) + + + +B_eq (1,048 samples, 0.01%) + + + +@anon-func-173.5 (1,414,261 samples, 13.94%) +@anon-func-173.5 + + +@anon-func-173.5 (46,466 samples, 0.46%) + + + +@anon-func-173.5 (9,218 samples, 0.09%) + + + + diff --git a/flamegraphs/reversi-reverse.svg b/flamegraphs/reversi-reverse.svg new file mode 100644 index 00000000000..17d70244590 --- /dev/null +++ b/flamegraphs/reversi-reverse.svg @@ -0,0 +1,2581 @@ + + + + + + + + + + + + + + +reversi.mo (reverse) + +Reset Zoom +Search + + + +flip (648 samples, 0.07%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (738 samples, 0.08%) + + + +sleb128_decode (1,242 samples, 0.13%) + + + +next (24,554 samples, 2.56%) +next + + +place (1,477 samples, 0.15%) + + + +$lambda (3,500 samples, 0.37%) + + + +place (600 samples, 0.06%) + + + +@deserialize<> (465 samples, 0.05%) + + + +place (11,502 samples, 1.20%) + + + +board (780 samples, 0.08%) + + + +valid_moves (2,916 samples, 0.30%) + + + +render (11,304 samples, 1.18%) + + + +canister_init (667 samples, 0.07%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (246 samples, 0.03%) + + + +compacting_gc (486 samples, 0.05%) + + + +$lambda (192 samples, 0.02%) + + + +flip (192 samples, 0.02%) + + + +eventually (3,456 samples, 0.36%) + + + +place (432 samples, 0.05%) + + + +board (15,652 samples, 1.63%) + + + +place (2,712 samples, 0.28%) + + + +canister_init (145 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (5,084 samples, 0.53%) + + + +render (1,260 samples, 0.13%) + + + +@deserialize<III> (468 samples, 0.05%) + + + +place (1,944 samples, 0.20%) + + + +place (468 samples, 0.05%) + + + +@deserialize<III> (108 samples, 0.01%) + + + +valid_moves (16,046 samples, 1.67%) + + + +place (3,408 samples, 0.36%) + + + +$lambda (1,414 samples, 0.15%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (568 samples, 0.06%) + + + +set_and_flip (276 samples, 0.03%) + + + +$lambda (522 samples, 0.05%) + + + +render (40,926 samples, 4.27%) +render + + +compacting_gc (568 samples, 0.06%) + + + +board (112 samples, 0.01%) + + + +place (87 samples, 0.01%) + + + +$lambda (232 samples, 0.02%) + + + +init (386 samples, 0.04%) + + + +idl_sub_buf_init (160 samples, 0.02%) + + + +opponent (14,067 samples, 1.47%) + + + +$lambda (108 samples, 0.01%) + + + +@deserialize<> (1,090 samples, 0.11%) + + + +flip (116 samples, 0.01%) + + + +board (9,596 samples, 1.00%) + + + +valid_moves (3,408 samples, 0.36%) + + + +board (372 samples, 0.04%) + + + +@serialize_go<t> (105 samples, 0.01%) + + + +$lambda (324 samples, 0.03%) + + + +set_and_flip (280 samples, 0.03%) + + + +$lambda (420 samples, 0.04%) + + + +@deserialize<III> (135 samples, 0.01%) + + + +canister_init (90 samples, 0.01%) + + + +board (84 samples, 0.01%) + + + +@deserialize<> (310 samples, 0.03%) + + + +render (6,329 samples, 0.66%) + + + +$lambda (868 samples, 0.09%) + + + +set_and_flip (432 samples, 0.05%) + + + +valid_moves (6,061 samples, 0.63%) + + + +canister_init (124 samples, 0.01%) + + + +place (852 samples, 0.09%) + + + +board (376 samples, 0.04%) + + + +@serialize<t> (658 samples, 0.07%) + + + +set_and_flip (576 samples, 0.06%) + + + +place (49,560 samples, 5.17%) +place + + +@deserialize<III> (621 samples, 0.06%) + + + +init (180 samples, 0.02%) + + + +place (116 samples, 0.01%) + + + +leb128_encode (105 samples, 0.01%) + + + +reset (90 samples, 0.01%) + + + +set_and_flip (576 samples, 0.06%) + + + +$lambda (5,001 samples, 0.52%) + + + +eventually (18,080 samples, 1.89%) +e.. + + +canister_init (1,728 samples, 0.18%) + + + +$lambda (840 samples, 0.09%) + + + +@serialize<t> (357 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (108 samples, 0.01%) + + + +trans_state4 (156 samples, 0.02%) + + + +set_and_flip (192 samples, 0.02%) + + + +place (5,562 samples, 0.58%) + + + +place (450 samples, 0.05%) + + + +$lambda (900 samples, 0.09%) + + + +$lambda (107,244 samples, 11.19%) +$lambda + + +parse_idl_header (108 samples, 0.01%) + + + +$lambda (5,562 samples, 0.58%) + + + +valid_moves (49,560 samples, 5.17%) +valid_.. + + +init (216 samples, 0.02%) + + + +$lambda (868 samples, 0.09%) + + + +obj_idx<0> (1,170 samples, 0.12%) + + + +canister_init (194 samples, 0.02%) + + + +@serialize<t> (105 samples, 0.01%) + + + +$lambda (14,144 samples, 1.48%) + + + +place (8,478 samples, 0.88%) + + + +place (93 samples, 0.01%) + + + +text_to_buf (7,936 samples, 0.83%) + + + +reset (3,913 samples, 0.41%) + + + +place (246 samples, 0.03%) + + + +place (3,102 samples, 0.32%) + + + +set_and_flip (216 samples, 0.02%) + + + +$lambda (16,046 samples, 1.67%) + + + +place (280 samples, 0.03%) + + + +$lambda (126,878 samples, 13.24%) +$lambda + + +board (104 samples, 0.01%) + + + +place (186 samples, 0.02%) + + + +canister_init (111 samples, 0.01%) + + + +reset (150 samples, 0.02%) + + + +compacting_gc (1,470 samples, 0.15%) + + + +board (5,956 samples, 0.62%) + + + +place (621 samples, 0.06%) + + + +reset (111 samples, 0.01%) + + + +$lambda (24,798 samples, 2.59%) +$l.. + + +board (11,304 samples, 1.18%) + + + +__wasm_call_ctors (981 samples, 0.10%) + + + +text_concat (112 samples, 0.01%) + + + +memset (1,518 samples, 0.16%) + + + +place (96 samples, 0.01%) + + + +$lambda (108 samples, 0.01%) + + + +@serialize<> (94 samples, 0.01%) + + + +motoko_rts::types::block_size::haa6e1a3c5243bd1b (288 samples, 0.03%) + + + +place (12,744 samples, 1.33%) + + + +board (14,144 samples, 1.48%) + + + +$lambda (364 samples, 0.04%) + + + +valid_moves (3,500 samples, 0.37%) + + + +motoko_rts::principal_id::enc_stash::hade07e1e4d51be16 (386 samples, 0.04%) + + + +set_and_flip (192 samples, 0.02%) + + + +compacting_gc (738 samples, 0.08%) + + + +valid_moves (2,430 samples, 0.25%) + + + +reset (218 samples, 0.02%) + + + +place (32,256 samples, 3.37%) +place + + +$lambda (1,260 samples, 0.13%) + + + +canister_init (124 samples, 0.01%) + + + +compacting_gc (288 samples, 0.03%) + + + +$lambda (87 samples, 0.01%) + + + +text_concat (84 samples, 0.01%) + + + +exists (16,512 samples, 1.72%) + + + +$lambda (486 samples, 0.05%) + + + +board (648 samples, 0.07%) + + + +text_concat (3,328 samples, 0.35%) + + + +$lambda (175 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (486 samples, 0.05%) + + + +bigint_sleb128_decode_word64 (468 samples, 0.05%) + + + +place (324 samples, 0.03%) + + + +place (126,878 samples, 13.24%) +place + + +reset (1,728 samples, 0.18%) + + + +valid_moves (30,600 samples, 3.19%) +val.. + + +board (208 samples, 0.02%) + + + +exists (122,796 samples, 12.82%) +exists + + +text_concat (25,472 samples, 2.66%) +te.. + + +alloc_blob (168 samples, 0.02%) + + + +parse_idl_header (621 samples, 0.06%) + + + +@deserialize<III> (621 samples, 0.06%) + + + +board (7,936 samples, 0.83%) + + + +$lambda (364 samples, 0.04%) + + + +place (945 samples, 0.10%) + + + +set_and_flip (116 samples, 0.01%) + + + +place (94 samples, 0.01%) + + + +reset (780 samples, 0.08%) + + + +$lambda (3,408 samples, 0.36%) + + + +place (576 samples, 0.06%) + + + +place (904 samples, 0.09%) + + + +$lambda (12,744 samples, 1.33%) + + + +place (14,568 samples, 1.52%) + + + +@deserialize<III> (612 samples, 0.06%) + + + +reset (124 samples, 0.01%) + + + +int_from_i32 (135 samples, 0.01%) + + + +@deserialize_go<I> (135 samples, 0.01%) + + + +place (396 samples, 0.04%) + + + +set_and_flip (2,040 samples, 0.21%) + + + +place (840 samples, 0.09%) + + + +$lambda (192 samples, 0.02%) + + + +memcmp (194 samples, 0.02%) + + + +flip (192 samples, 0.02%) + + + +valid_moves (945 samples, 0.10%) + + + +reset (2,518 samples, 0.26%) + + + +place (105 samples, 0.01%) + + + +place (108 samples, 0.01%) + + + +is_empty (382 samples, 0.04%) + + + +set_and_flip (2,034 samples, 0.21%) + + + +valid_moves (198 samples, 0.02%) + + + +is_empty (1,477 samples, 0.15%) + + + +place (192 samples, 0.02%) + + + +render (14,413 samples, 1.50%) + + + +place (708 samples, 0.07%) + + + +canister_init (175 samples, 0.02%) + + + +@deserialize<> (260 samples, 0.03%) + + + +flip (280 samples, 0.03%) + + + +init (599 samples, 0.06%) + + + +$lambda (141,444 samples, 14.76%) +$lambda + + +compacting_gc (35,229 samples, 3.68%) +comp.. + + +valid_moves (4,118 samples, 0.43%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (2,160 samples, 0.23%) + + + +render (13,419 samples, 1.40%) + + + +set_and_flip (87 samples, 0.01%) + + + +place (612 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,116 samples, 0.12%) + + + +$lambda (576 samples, 0.06%) + + + +@serialize<t> (420 samples, 0.04%) + + + +init (175 samples, 0.02%) + + + +@deserialize<III> (450 samples, 0.05%) + + + +init (1,728 samples, 0.18%) + + + +place (2,034 samples, 0.21%) + + + +render (25,472 samples, 2.66%) +re.. + + +exists (35,208 samples, 3.67%) +exists + + +place (3,132 samples, 0.33%) + + + +flip (324 samples, 0.03%) + + + +next (17,064 samples, 1.78%) + + + +$lambda (420 samples, 0.04%) + + + +board (4,416 samples, 0.46%) + + + +B_sub (57,260 samples, 5.98%) +B_sub + + +$lambda (5,832 samples, 0.61%) + + + +blob_of_principal (801 samples, 0.08%) + + + +eventually (4,640 samples, 0.48%) + + + +place (108 samples, 0.01%) + + + +place (141,444 samples, 14.76%) +place + + +place (696 samples, 0.07%) + + + +$lambda (648 samples, 0.07%) + + + +place (2,430 samples, 0.25%) + + + +bigint_sleb128_decode_word64 (135 samples, 0.01%) + + + +text_to_buf (17,625 samples, 1.84%) +t.. + + +valid_moves (33,060 samples, 3.45%) +val.. + + +canister_init (599 samples, 0.06%) + + + +eventually (3,840 samples, 0.40%) + + + +init (1,560 samples, 0.16%) + + + +$lambda (396 samples, 0.04%) + + + +$lambda (6,061 samples, 0.63%) + + + +$lambda (7,308 samples, 0.76%) + + + +place (372 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (738 samples, 0.08%) + + + +render (648 samples, 0.07%) + + + +$lambda (32,256 samples, 3.37%) +$la.. + + +render (1,024 samples, 0.11%) + + + +init (319 samples, 0.03%) + + + +text_concat (768 samples, 0.08%) + + + +canister_init (933 samples, 0.10%) + + + +$lambda (696 samples, 0.07%) + + + +$lambda (1,024 samples, 0.11%) + + + +place (621 samples, 0.06%) + + + +reset (5,001 samples, 0.52%) + + + +place (7,308 samples, 0.76%) + + + +$lambda (1,477 samples, 0.15%) + + + +@deserialize<III> (186 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (328 samples, 0.03%) + + + +eventually (1,008 samples, 0.11%) + + + +place (232 samples, 0.02%) + + + +@deserialize<III> (156 samples, 0.02%) + + + +@deserialize<> (520 samples, 0.05%) + + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (264 samples, 0.03%) + + + +Array_init (3,732 samples, 0.39%) + + + +render (3,888 samples, 0.41%) + + + +valid_moves (486 samples, 0.05%) + + + +init (194 samples, 0.02%) + + + +place (2,040 samples, 0.21%) + + + +$lambda (112 samples, 0.01%) + + + +$lambda (576 samples, 0.06%) + + + +board (40,926 samples, 4.27%) +board + + +render (112 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (35,229 samples, 3.68%) +moto.. + + +place (162 samples, 0.02%) + + + +place (522 samples, 0.05%) + + + +place (1,414 samples, 0.15%) + + + +place (276 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (486 samples, 0.05%) + + + +set_and_flip (324 samples, 0.03%) + + + +all (958,130 samples, 100%) + + + +exists (36,864 samples, 3.85%) +exists + + +render (364 samples, 0.04%) + + + +__set_hp (1,408 samples, 0.15%) + + + +@serialize_go<t> (364 samples, 0.04%) + + + +board (3,328 samples, 0.35%) + + + +$lambda (7,936 samples, 0.83%) + + + +valid_moves (126,878 samples, 13.24%) +valid_moves + + +text_to_buf (14,144 samples, 1.48%) + + + +alloc_blob (96 samples, 0.01%) + + + +place (198 samples, 0.02%) + + + +eventually (8,160 samples, 0.85%) + + + +$lambda (198 samples, 0.02%) + + + +render (1,736 samples, 0.18%) + + + +range (5,850 samples, 0.61%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (84 samples, 0.01%) + + + +blob_of_principal (194 samples, 0.02%) + + + +place (222 samples, 0.02%) + + + +init (4,772 samples, 0.50%) + + + +place (4,118 samples, 0.43%) + + + +@serialize<t> (518 samples, 0.05%) + + + +place (180 samples, 0.02%) + + + +@deserialize<III> (312 samples, 0.03%) + + + +board (14,413 samples, 1.50%) + + + +canister_init (801 samples, 0.08%) + + + +$lambda (658 samples, 0.07%) + + + +$lambda (768 samples, 0.08%) + + + +place (3,500 samples, 0.37%) + + + +$lambda (2,799 samples, 0.29%) + + + +$lambda (105 samples, 0.01%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (599 samples, 0.06%) + + + +canister_init (82 samples, 0.01%) + + + +valid_moves (3,408 samples, 0.36%) + + + +board (6,329 samples, 0.66%) + + + +$lambda (280 samples, 0.03%) + + + +$lambda (852 samples, 0.09%) + + + +B_gt (8,364 samples, 0.87%) + + + +eventually (3,840 samples, 0.40%) + + + +set_and_flip (696 samples, 0.07%) + + + +link_start (981 samples, 0.10%) + + + +canister_init (780 samples, 0.08%) + + + +board (328 samples, 0.03%) + + + +place (216 samples, 0.02%) + + + +alloc_array (264 samples, 0.03%) + + + +render (84 samples, 0.01%) + + + +place (2,799 samples, 0.29%) + + + +$lambda (40,926 samples, 4.27%) +$lambda + + +init (5,001 samples, 0.52%) + + + +canister_init (108 samples, 0.01%) + + + +set_and_flip (852 samples, 0.09%) + + + +valid_moves (11,502 samples, 1.20%) + + + +board (208 samples, 0.02%) + + + +canister_init (386 samples, 0.04%) + + + +$lambda (3,240 samples, 0.34%) + + + +text_concat (1,024 samples, 0.11%) + + + +place (6,061 samples, 0.63%) + + + +place (87 samples, 0.01%) + + + +$lambda (2,386 samples, 0.25%) + + + +board (1,024 samples, 0.11%) + + + +set_and_flip (432 samples, 0.05%) + + + +@serialize<t> (9,689 samples, 1.01%) + + + +$lambda (216 samples, 0.02%) + + + +$lambda (11,304 samples, 1.18%) + + + +reset (145 samples, 0.02%) + + + +valid_moves (2,799 samples, 0.29%) + + + +init (933 samples, 0.10%) + + + +place (5,832 samples, 0.61%) + + + +board (248 samples, 0.03%) + + + +render (768 samples, 0.08%) + + + +place (192 samples, 0.02%) + + + +$lambda (30,600 samples, 3.19%) +$la.. + + +place (324 samples, 0.03%) + + + +place (174 samples, 0.02%) + + + +board (25,472 samples, 2.66%) +bo.. + + +$lambda (98 samples, 0.01%) + + + +compacting_gc (1,116 samples, 0.12%) + + + +reset (2,386 samples, 0.25%) + + + +B_ge (35,280 samples, 3.68%) +B_ge + + +$lambda (3,888 samples, 0.41%) + + + +@deserialize_go<I> (468 samples, 0.05%) + + + +set_and_flip (904 samples, 0.09%) + + + +@deserialize<> (100 samples, 0.01%) + + + +init (350 samples, 0.04%) + + + +text_to_buf (14,564 samples, 1.52%) + + + +valid_moves (900 samples, 0.09%) + + + +reset (108 samples, 0.01%) + + + +$lambda (2,916 samples, 0.30%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (1,736 samples, 0.18%) + + + +$lambda (1,736 samples, 0.18%) + + + +place (156 samples, 0.02%) + + + +init (780 samples, 0.08%) + + + +__wasm_apply_data_relocs (981 samples, 0.10%) + + + +$lambda (3,408 samples, 0.36%) + + + +set_and_flip (420 samples, 0.04%) + + + +$lambda (420 samples, 0.04%) + + + +$lambda (432 samples, 0.05%) + + + +init (801 samples, 0.08%) + + + +set_and_flip (648 samples, 0.07%) + + + +$lambda (105 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (288 samples, 0.03%) + + + +eventually (3,920 samples, 0.41%) + + + +$lambda (518 samples, 0.05%) + + + +compacting_gc (108 samples, 0.01%) + + + +B_add (162,999 samples, 17.01%) +B_add + + +set_and_flip (840 samples, 0.09%) + + + +place (4,644 samples, 0.48%) + + + +$lambda (324 samples, 0.03%) + + + +init (3,456 samples, 0.36%) + + + +$lambda (2,034 samples, 0.21%) + + + +@serialize_go<t> (9,689 samples, 1.01%) + + + +init (124 samples, 0.01%) + + + +place (3,408 samples, 0.36%) + + + +valid_moves (5,562 samples, 0.58%) + + + +$lambda (3,328 samples, 0.35%) + + + +place (468 samples, 0.05%) + + + +place (900 samples, 0.09%) + + + +set_and_flip (708 samples, 0.07%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (386 samples, 0.04%) + + + +place (372 samples, 0.04%) + + + +init (145 samples, 0.02%) + + + +Array_init (264 samples, 0.03%) + + + +place (135 samples, 0.01%) + + + +$lambda (14,568 samples, 1.52%) + + + +set_and_flip (522 samples, 0.05%) + + + +board (364 samples, 0.04%) + + + +parse_idl_header (832 samples, 0.09%) + + + +alloc_blob (1,488 samples, 0.16%) + + + +place (1,458 samples, 0.15%) + + + +set_and_flip (396 samples, 0.04%) + + + +@serialize<t> (7,936 samples, 0.83%) + + + +$lambda (357 samples, 0.04%) + + + +$lambda (3,132 samples, 0.33%) + + + +blob_of_principal (124 samples, 0.01%) + + + +eventually (12,960 samples, 1.35%) + + + +canister_init (2,386 samples, 0.25%) + + + +render (3,240 samples, 0.34%) + + + +$lambda (276 samples, 0.03%) + + + +reset (82 samples, 0.01%) + + + +$lambda (11,502 samples, 1.20%) + + + +$lambda (658 samples, 0.07%) + + + +board (1,736 samples, 0.18%) + + + +place (420 samples, 0.04%) + + + +$lambda (432 samples, 0.05%) + + + +init (124 samples, 0.01%) + + + +valid_moves (7,308 samples, 0.76%) + + + +place (312 samples, 0.03%) + + + +set_and_flip (1,944 samples, 0.20%) + + + +$lambda (904 samples, 0.09%) + + + +$lambda (105 samples, 0.01%) + + + +flip (708 samples, 0.07%) + + + +place (282 samples, 0.03%) + + + +board (240 samples, 0.03%) + + + +set_and_flip (1,458 samples, 0.15%) + + + +@serialize<> (124 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,470 samples, 0.15%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (112 samples, 0.01%) + + + +place (33,060 samples, 3.45%) +place + + +valid_moves (3,132 samples, 0.33%) + + + +$lambda (7,519 samples, 0.78%) + + + +valid_moves (107,244 samples, 11.19%) +valid_moves + + +init (2,386 samples, 0.25%) + + + +$lambda (8,478 samples, 0.88%) + + + +$lambda (7,776 samples, 0.81%) + + + +board (204 samples, 0.02%) + + + +@buffer_size<t> (357 samples, 0.04%) + + + +parse_idl_header (496 samples, 0.05%) + + + +opponent (54,705 samples, 5.71%) +opponent + + +@serialize_go<t> (7,936 samples, 0.83%) + + + +reset (175 samples, 0.02%) + + + +text_concat (1,736 samples, 0.18%) + + + +$lambda (25,472 samples, 2.66%) +$l.. + + +next (8,364 samples, 0.87%) + + + +$lambda (13,419 samples, 1.40%) + + + +$lambda (49,560 samples, 5.17%) +$lambda + + +$lambda (14,144 samples, 1.48%) + + + +canister_init (440 samples, 0.05%) + + + +board (13,419 samples, 1.40%) + + + +place (107,244 samples, 11.19%) +place + + +$lambda (780 samples, 0.08%) + + + +set_and_flip (174 samples, 0.02%) + + + +board (3,888 samples, 0.41%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::h1f99226b92d7e984 (486 samples, 0.05%) + + + +board (7,776 samples, 0.81%) + + + +flip (904 samples, 0.09%) + + + +$lambda (1,944 samples, 0.20%) + + + +$lambda (8,244 samples, 0.86%) + + + +board (296 samples, 0.03%) + + + +valid_moves (5,832 samples, 0.61%) + + + +leb128_decode (1,248 samples, 0.13%) + + + +$lambda (708 samples, 0.07%) + + + +set_and_flip (232 samples, 0.02%) + + + +blob_of_principal (599 samples, 0.06%) + + + +place (24,798 samples, 2.59%) +pl.. + + +$lambda (84 samples, 0.01%) + + + +canister_init (124 samples, 0.01%) + + + +$lambda (9,689 samples, 1.01%) + + + +$lambda (1,458 samples, 0.15%) + + + +place (1,533 samples, 0.16%) + + + +memcpy (19,098 samples, 1.99%) +m.. + + +valid_moves (32,256 samples, 3.37%) +val.. + + +@serialize<t> (868 samples, 0.09%) + + + +reset (104 samples, 0.01%) + + + +set_and_flip (2,712 samples, 0.28%) + + + +set_and_flip (108 samples, 0.01%) + + + +board (1,248 samples, 0.13%) + + + +$lambda (174 samples, 0.02%) + + + +init (10,669 samples, 1.11%) + + + +render (7,776 samples, 0.81%) + + + +board (1,260 samples, 0.13%) + + + +place (11,739 samples, 1.23%) + + + +$lambda (518 samples, 0.05%) + + + +$lambda (2,712 samples, 0.28%) + + + +canister_init (568 samples, 0.06%) + + + +place (576 samples, 0.06%) + + + +$lambda (382 samples, 0.04%) + + + +@serialize<t> (14,144 samples, 1.48%) + + + +exists (38,628 samples, 4.03%) +exists + + +$lambda (2,430 samples, 0.25%) + + + +$lambda (357 samples, 0.04%) + + + +canister_init (3,925 samples, 0.41%) + + + +text_concat (364 samples, 0.04%) + + + +B_lt (36,864 samples, 3.85%) +B_lt + + +reset (93 samples, 0.01%) + + + +$lambda (94 samples, 0.01%) + + + +init (90 samples, 0.01%) + + + +@deserialize<III> (1,533 samples, 0.16%) + + + +valid_moves (1,414 samples, 0.15%) + + + +place (156 samples, 0.02%) + + + +$lambda (945 samples, 0.10%) + + + +$lambda (364 samples, 0.04%) + + + +@serialize_go<t> (14,144 samples, 1.48%) + + + +$lambda (98 samples, 0.01%) + + + +valid_moves (141,444 samples, 14.76%) +valid_moves + + +parse_idl_header (915 samples, 0.10%) + + + +blob_of_principal (386 samples, 0.04%) + + + +canister_init (150 samples, 0.02%) + + + +$lambda (33,060 samples, 3.45%) +$la.. + + +valid_moves (14,568 samples, 1.52%) + + + +init (108 samples, 0.01%) + + + +$lambda (14,413 samples, 1.50%) + + + +B_mul (59,711 samples, 6.23%) +B_mul + + +board (248 samples, 0.03%) + + + +$lambda (116 samples, 0.01%) + + + +$lambda (4,118 samples, 0.43%) + + + +board (496 samples, 0.05%) + + + +place (612 samples, 0.06%) + + + +place (432 samples, 0.05%) + + + +board (496 samples, 0.05%) + + + +place (648 samples, 0.07%) + + + +board (872 samples, 0.09%) + + + +motoko_rts::idl::check_typearg::h7a69986705540d34 (108 samples, 0.01%) + + + +render (3,328 samples, 0.35%) + + + +$lambda (145 samples, 0.02%) + + + +reset (124 samples, 0.01%) + + + +compacting_gc (2,160 samples, 0.23%) + + + +place (486 samples, 0.05%) + + + +$lambda (90 samples, 0.01%) + + + +$lambda (87 samples, 0.01%) + + + +@serialize<t> (364 samples, 0.04%) + + + +place (2,916 samples, 0.30%) + + + +$lambda (2,040 samples, 0.21%) + + + +place (186 samples, 0.02%) + + + +place (153 samples, 0.02%) + + + +board (216 samples, 0.02%) + + + +B_eq (48,511 samples, 5.06%) +B_eq + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (124 samples, 0.01%) + + + +@serialize_go<t> (420 samples, 0.04%) + + + +$lambda (648 samples, 0.07%) + + + +@deserialize_go<I> (612 samples, 0.06%) + + + +blob_of_principal (124 samples, 0.01%) + + + +exists (163,140 samples, 17.03%) +exists + + +flip (232 samples, 0.02%) + + + +place (30,600 samples, 3.19%) +place + + +trans_state5 (96 samples, 0.01%) + + + +valid_moves (24,798 samples, 2.59%) +va.. + + +board (768 samples, 0.08%) + + + +@serialize<t> (98 samples, 0.01%) + + + +$lambda (1,728 samples, 0.18%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (2,160 samples, 0.23%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (364 samples, 0.04%) + + + +board (3,240 samples, 0.34%) + + + +$lambda (6,329 samples, 0.66%) + + + +valid_moves (8,478 samples, 0.88%) + + + +board (416 samples, 0.04%) + + + +valid_moves (12,744 samples, 1.33%) + + + +place (16,046 samples, 1.67%) + + + +eventually (1,588 samples, 0.17%) + + + +set_and_flip (324 samples, 0.03%) + + + +__get_hp (1,134 samples, 0.12%) + + + +canister_init (5,001 samples, 0.52%) + + + +$lambda (9,689 samples, 1.01%) + + + +reset (94 samples, 0.01%) + + + +place (382 samples, 0.04%) + + + +board (128 samples, 0.01%) + + + +$lambda (7,936 samples, 0.83%) + + + + diff --git a/flamegraphs/reversi.svg b/flamegraphs/reversi.svg new file mode 100644 index 00000000000..4ccbcaa8438 --- /dev/null +++ b/flamegraphs/reversi.svg @@ -0,0 +1,1133 @@ + + + + + + + + + + + + + + +reversi.mo + +Reset Zoom +Search + + + +B_mul (145 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (207 samples, 0.02%) + + + +alloc_array (240 samples, 0.03%) + + + +obj_idx<0> (486 samples, 0.05%) + + + +B_ge (192 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (1,932 samples, 0.20%) + + + +@serialize<t> (33,708 samples, 3.52%) +@se.. + + +motoko_rts::types::block_size::haa6e1a3c5243bd1b (96 samples, 0.01%) + + + +exists (359,172 samples, 37.49%) +exists + + +bigint_sleb128_decode_word64 (603 samples, 0.06%) + + + +B_mul (4,118 samples, 0.43%) + + + +B_eq (174 samples, 0.02%) + + + +next (4,894 samples, 0.51%) + + + +memcpy (568 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (408 samples, 0.04%) + + + +B_add (1,944 samples, 0.20%) + + + +B_mul (232 samples, 0.02%) + + + +@serialize<t> (1,617 samples, 0.17%) + + + +leb128_decode (104 samples, 0.01%) + + + +B_lt (3,408 samples, 0.36%) + + + +init (10,469 samples, 1.09%) + + + +@buffer_size<t> (224 samples, 0.02%) + + + +__set_hp (112 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.01%) + + + +B_eq (1,414 samples, 0.15%) + + + +sleb128_decode (621 samples, 0.06%) + + + +exists (5,052 samples, 0.53%) + + + +compacting_gc (4,507 samples, 0.47%) + + + +B_sub (49,560 samples, 5.17%) +B_sub + + +$lambda (10,491 samples, 1.09%) + + + +@deserialize<III> (5,331 samples, 0.56%) + + + +B_sub (175 samples, 0.02%) + + + +valid_moves (663,637 samples, 69.26%) +valid_moves + + +B_gt (780 samples, 0.08%) + + + +link_start (1,079 samples, 0.11%) + + + +B_gt (3,888 samples, 0.41%) + + + +B_lt (32,256 samples, 3.37%) +B_lt + + +B_add (3,132 samples, 0.33%) + + + +B_eq (396 samples, 0.04%) + + + +B_mul (14,413 samples, 1.50%) + + + +range (90 samples, 0.01%) + + + +alloc_blob (456 samples, 0.05%) + + + +Array_init (3,039 samples, 0.32%) + + + +B_eq (94 samples, 0.01%) + + + +memset (468 samples, 0.05%) + + + +exists (39,896 samples, 4.16%) +exists + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (552 samples, 0.06%) + + + +@serialize_go<t> (489 samples, 0.05%) + + + +B_sub (175 samples, 0.02%) + + + +$lambda (4,719 samples, 0.49%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.01%) + + + +int_from_i32 (135 samples, 0.01%) + + + +leb128_decode (208 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (150 samples, 0.02%) + + + +init (14,550 samples, 1.52%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (13,800 samples, 1.44%) + + + +$lambda (692,225 samples, 72.25%) +$lambda + + +@serialize_go<t> (32,204 samples, 3.36%) +@se.. + + +B_lt (576 samples, 0.06%) + + + +B_mul (116 samples, 0.01%) + + + +text_concat (32,888 samples, 3.43%) +tex.. + + +B_add (108 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (1,248 samples, 0.13%) + + + +compacting_gc (5,087 samples, 0.53%) + + + +reset (18,547 samples, 1.94%) +r.. + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (207 samples, 0.02%) + + + +parse_idl_header (266 samples, 0.03%) + + + +B_eq (276 samples, 0.03%) + + + +B_mul (522 samples, 0.05%) + + + +__get_hp (84 samples, 0.01%) + + + +compacting_gc (19,012 samples, 1.98%) +c.. + + +is_empty (1,859 samples, 0.19%) + + + +place (716,366 samples, 74.77%) +place + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (544 samples, 0.06%) + + + +leb128_decode (416 samples, 0.04%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.01%) + + + +text_to_buf (22,080 samples, 2.30%) +t.. + + +B_lt (432 samples, 0.05%) + + + +opponent (4,400 samples, 0.46%) + + + +Array_init (1,013 samples, 0.11%) + + + +B_add (324 samples, 0.03%) + + + +alloc_blob (304 samples, 0.03%) + + + +@deserialize_go<I> (1,215 samples, 0.13%) + + + +B_add (324 samples, 0.03%) + + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (150 samples, 0.02%) + + + +memcpy (3,328 samples, 0.35%) + + + +flip (3,748 samples, 0.39%) + + + +B_ge (432 samples, 0.05%) + + + +text_to_buf (273 samples, 0.03%) + + + +B_sub (945 samples, 0.10%) + + + +motoko_rts::text::alloc_text_blob::h38617f18505d9ec7 (2,296 samples, 0.24%) + + + +B_mul (696 samples, 0.07%) + + + +init (10,469 samples, 1.09%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (5,081 samples, 0.53%) + + + +next (17,226 samples, 1.80%) + + + +sleb128_decode (621 samples, 0.06%) + + + +text_to_buf (31,916 samples, 3.33%) +tex.. + + +alloc_blob (608 samples, 0.06%) + + + +opponent (352 samples, 0.04%) + + + +B_gt (2,916 samples, 0.30%) + + + +B_mul (145 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (136 samples, 0.01%) + + + +@buffer_size<t> (168 samples, 0.02%) + + + +set_and_flip (20,944 samples, 2.19%) +s.. + + +leb128_decode (312 samples, 0.03%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (414 samples, 0.04%) + + + +B_add (1,728 samples, 0.18%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (276 samples, 0.03%) + + + +@deserialize<> (572 samples, 0.06%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (4,501 samples, 0.47%) + + + +memset (111 samples, 0.01%) + + + +exists (2,248 samples, 0.23%) + + + +memcpy (14,144 samples, 1.48%) + + + +leb128_decode (156 samples, 0.02%) + + + +B_add (5,832 samples, 0.61%) + + + +eventually (54,736 samples, 5.71%) +eventua.. + + +motoko_rts::principal_id::enc_stash::hade07e1e4d51be16 (386 samples, 0.04%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (18,988 samples, 1.98%) +m.. + + +B_eq (382 samples, 0.04%) + + + +B_sub (105 samples, 0.01%) + + + +B_eq (24,798 samples, 2.59%) +B_eq + + +opponent (62,304 samples, 6.50%) +opponent + + +B_add (108 samples, 0.01%) + + + +alloc_blob (152 samples, 0.02%) + + + +B_sub (3,500 samples, 0.37%) + + + +all (958,130 samples, 100%) + + + +memcpy (296 samples, 0.03%) + + + +B_sub (840 samples, 0.09%) + + + +__wasm_call_ctors (987 samples, 0.10%) + + + +board (202,039 samples, 21.09%) +board + + +__get_hp (768 samples, 0.08%) + + + +motoko_rts::memory::alloc_array::hfb4dad1bf9425cf5 (219 samples, 0.02%) + + + +memcpy (180 samples, 0.02%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (552 samples, 0.06%) + + + +opponent (1,056 samples, 0.11%) + + + +B_mul (33,060 samples, 3.45%) +B_mul + + +range (3,240 samples, 0.34%) + + + +parse_idl_header (1,698 samples, 0.18%) + + + +B_sub (1,260 samples, 0.13%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (276 samples, 0.03%) + + + +B_ge (30,600 samples, 3.19%) +B_ge + + +next (22,968 samples, 2.40%) +n.. + + +B_add (7,776 samples, 0.81%) + + + +alloc_blob (228 samples, 0.02%) + + + +B_eq (6,329 samples, 0.66%) + + + +next (4,894 samples, 0.51%) + + + +opponent (528 samples, 0.06%) + + + +memcpy (240 samples, 0.03%) + + + +__wasm_apply_data_relocs (981 samples, 0.10%) + + + +B_mul (87 samples, 0.01%) + + + +canister_init (20,099 samples, 2.10%) +c.. + + +idl_sub_buf_init (104 samples, 0.01%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::h1f99226b92d7e984 (216 samples, 0.02%) + + + +motoko_rts::gc::mark_compact::mark_stack::push_mark_stack::h1f99226b92d7e984 (162 samples, 0.02%) + + + +B_sub (420 samples, 0.04%) + + + +B_ge (3,408 samples, 0.36%) + + + +exists (6,780 samples, 0.71%) + + + +B_add (107,244 samples, 11.19%) +B_add + + +parse_idl_header (1,064 samples, 0.11%) + + + +B_eq (14,568 samples, 1.52%) + + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (1,140 samples, 0.12%) + + + +opponent (132 samples, 0.01%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.01%) + + + +B_add (13,419 samples, 1.40%) + + + +B_add (1,458 samples, 0.15%) + + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (414 samples, 0.04%) + + + +$lambda (174,319 samples, 18.19%) +$lambda + + +range (2,430 samples, 0.25%) + + + +range (90 samples, 0.01%) + + + +B_add (5,562 samples, 0.58%) + + + +B_lt (192 samples, 0.02%) + + + +B_ge (576 samples, 0.06%) + + + +B_add (11,502 samples, 1.20%) + + + +memset (111 samples, 0.01%) + + + +memset (780 samples, 0.08%) + + + +memcpy (222 samples, 0.02%) + + + +compacting_gc (13,818 samples, 1.44%) + + + +motoko_rts::idl::check_typearg::h7a69986705540d34 (108 samples, 0.01%) + + + +render (136,091 samples, 14.20%) +render + + +motoko_rts::memory::alloc_blob::hb6bafdc2f27d446b (138 samples, 0.01%) + + + +B_gt (780 samples, 0.08%) + + + +B_add (1,728 samples, 0.18%) + + + +$lambda (38,124 samples, 3.98%) +$lam.. + + +motoko_rts::gc::mark_compact::bitmap::BitmapIter::next::hf82f793b43efcee0 (612 samples, 0.06%) + + + +memcmp (194 samples, 0.02%) + + + +blob_of_principal (2,332 samples, 0.24%) + + + +motoko_rts::types::block_size::haa6e1a3c5243bd1b (128 samples, 0.01%) + + + +B_add (648 samples, 0.07%) + + + +motoko_rts::gc::mark_compact::mark_object::hb81f6542e95ca663 (136 samples, 0.01%) + + + +B_mul (6,061 samples, 0.63%) + + + +obj_idx<0> (648 samples, 0.07%) + + + +eventually (6,756 samples, 0.71%) + + + +@deserialize<> (2,288 samples, 0.24%) + + + +B_mul (87 samples, 0.01%) + + + +B_sub (280 samples, 0.03%) + + + +@serialize<> (343 samples, 0.04%) + + + +__set_hp (1,024 samples, 0.11%) + + + + diff --git a/flamegraphs/sha256-reverse.svg b/flamegraphs/sha256-reverse.svg new file mode 100644 index 00000000000..3df33527f74 --- /dev/null +++ b/flamegraphs/sha256-reverse.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + +sha256.mo (reverse) + +Reset Zoom +Search + + + +$lambda (1,441,792 samples, 13.35%) +$lambda + + +Digest (933 samples, 0.01%) + + + +go (1,489 samples, 0.01%) + + + +tabulate (1,441,792 samples, 13.35%) +tabulate + + +sha256 (2,231,846 samples, 20.67%) +sha256 + + +$lambda (2,231,846 samples, 20.67%) +$lambda + + +Array_tabulate (2,002,875 samples, 18.55%) +Array_tabulate + + +Array_init (1,082 samples, 0.01%) + + + +go (1,441,792 samples, 13.35%) +go + + +$lambda (5,111,846 samples, 47.33%) +$lambda + + +go (2,002,875 samples, 18.55%) +go + + +write (2,231,846 samples, 20.67%) +write + + +go (2,231,846 samples, 20.67%) +go + + +Array_tabulate (1,441,792 samples, 13.35%) +Array_tabulate + + +init (933 samples, 0.01%) + + + +link_start (981 samples, 0.01%) + + + +tabulate (2,002,875 samples, 18.55%) +tabulate + + +go (5,111,846 samples, 47.33%) +go + + +tabulate (7,343,692 samples, 68.00%) +tabulate + + +write (2,002,875 samples, 18.55%) +write + + +sha256 (2,002,875 samples, 18.55%) +sha256 + + +__wasm_apply_data_relocs (981 samples, 0.01%) + + + +all (10,799,604 samples, 100%) + + + +intToNat8Wrap (1,441,792 samples, 13.35%) +intToNat8Wrap + + +$lambda (2,002,875 samples, 18.55%) +$lambda + + +Array_tabulate (7,343,692 samples, 68.00%) +Array_tabulate + + +@anon-func-97.43 (2,002,875 samples, 18.55%) +@anon-func-97.43 + + +__wasm_call_ctors (981 samples, 0.01%) + + + +go (933 samples, 0.01%) + + + +sha256 (933 samples, 0.01%) + + + +$lambda (933 samples, 0.01%) + + + + diff --git a/flamegraphs/sha256.svg b/flamegraphs/sha256.svg new file mode 100644 index 00000000000..322eaf35a11 --- /dev/null +++ b/flamegraphs/sha256.svg @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + +sha256.mo + +Reset Zoom +Search + + + +@anon-func-97.43 (2,002,875 samples, 18.55%) +@anon-func-97.43 + + +motoko_rts::principal_id::principal_of_blob::h6560fd4a9cbb47b9 (1,140 samples, 0.01%) + + + +link_start (1,079 samples, 0.01%) + + + +__wasm_call_ctors (987 samples, 0.01%) + + + +Array_tabulate (4,235,169 samples, 39.22%) +Array_tabulate + + +Array_tabulate (6,554,086 samples, 60.69%) +Array_tabulate + + +sha256 (4,237,679 samples, 39.24%) +sha256 + + +blob_of_principal (2,332 samples, 0.02%) + + + +Digest (2,199 samples, 0.02%) + + + +write (4,235,411 samples, 39.22%) +write + + +__wasm_apply_data_relocs (981 samples, 0.01%) + + + +intToNat8Wrap (1,441,792 samples, 13.35%) +intToNat8Wrap + + +$lambda (10,791,839 samples, 99.93%) +$lambda + + +tabulate (6,554,095 samples, 60.69%) +tabulate + + +init (1,022 samples, 0.01%) + + + +all (10,799,604 samples, 100%) + + + +motoko_rts::gc::mark_compact::compacting_gc::h416bfa181cd1565b (1,047 samples, 0.01%) + + + +Array_init (1,013 samples, 0.01%) + + + +go (10,793,998 samples, 99.95%) +go + + +compacting_gc (1,053 samples, 0.01%) + + + +tabulate (4,235,178 samples, 39.22%) +tabulate + + +init (3,012 samples, 0.03%) + + + +canister_init (4,527 samples, 0.04%) + + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000000..aabe7c9fc7c --- /dev/null +++ b/index.html @@ -0,0 +1,49 @@ + + + + + + + Motoko build reports + + + +

Motoko build reports

+ .
+ |-- base-doc
+ |-- coverage
+ |-- docs
+ | |-- html
+ | | `-- motoko.html
+ | `-- overview-slides.html
+ `-- flamegraphs
+

+ +6 directories, 2 files + +

+
+

+ tree v2.1.1 (c) 1996 - 2023 by Steve Baker and Thomas Moore
+ HTML output hacked and copyleft (c) 1998 by Francesc Rocher
+ JSON output hacked and copyleft (c) 2014 by Florian Sesser
+ Charsets / OS/2 support (c) 2001 by Kyosuke Tokoro +

+ +